# # Makefile for the sources of Fiasco # .PHONY: all do-all all: do-all TOPDIR=.. include $(TOPDIR)/Makeconf srcdir = . include $(srcdir)/Makeconf # # Tools configuration # # configure the name of the C/C++ compiler (gcc, egcc) # (You should do this in $(L4DIR)/Makeconf.local or ./Makeconf.local, # not here.) #CC = $(SYSTEM_TARGET)egcc #CXX = $(CC) #CFLAGS := # only pass the -fno-exceptions argument to gcc if it understands it #CXXFLAGS := TOOLDIR=$(srcdir)/../tool MOVE_IF_CHANGE = $(TOOLDIR)/move-if-change SHOWDEPS = $(TOOLDIR)/showdeps PREPROCESS = $(TOOLDIR)/preprocess PREPROCESS_FLAGS ?= -i -L # # Source-code locations # MODULES_FILE = Modules $(MODULES_FILE): $(srcdir)/$(MODULES_FILE).in @if [ -f $@ -a -f $< ]; \ then \ echo "$@.in is newer -- please update $@"; exit 1; \ fi @if [ ! -f $@ ]; \ then \ echo "No user-specific modules file found -- trying $@.in"; \ cp $< $@; \ fi $(srcdir)/$(MODULES_FILE).in: include $(MODULES_FILE) ifdef SUBSYSTEMS _modules_read_ = true endif ifdef _modules_read_ GENERATED_MODULES = $(sort $(foreach subsys, $(SUBSYSTEMS), \ $(INTERFACES_$(subsys)))) $(foreach m, $(GENERATED_MODULES), auto/stamp-$(m).ready): $(MODULES_FILE) .PRECIOUS: .Modules.deps .Modules.deps: $(MODULES_FILE) @mkdir -p auto @echo "Creating $@" @($(foreach mod, $(GENERATED_MODULES), \ echo 'auto/stamp-$(mod).ready: \ $(addsuffix .cpp, $(if $($(mod)_IMPL), $($(mod)_IMPL), \ $(mod)))'; \ echo '$(patsubst %, auto/%.cc, \ $(if $($(mod)_IMPL), $($(mod)_IMPL), $(mod))): \ auto/stamp-$(mod).ready ; \ @[ -e $$@ ] || { rm -f $$<; $$(MAKE) $$<; }'; \ $(foreach impl, $(if $($(mod)_IMPL), $($(mod)_IMPL), $(mod)), \ echo '$(patsubst %, .%.cc.d, $(impl)): \ $(patsubst %, auto/%.cc, $(impl))';) \ )) > $@.new @($(foreach subsys, $(SUBSYSTEMS), \ echo 'IFDEPS += $(addprefix ., $(addsuffix .cc.d, \ $(foreach in,$(INTERFACES_$(subsys)), \ $(if $($(in)_IMPL), $($(in)_IMPL), \ $(in)))))' ; \ echo 'CXXSRC_$(subsys) += $(addsuffix .cc, \ $(foreach in,$(INTERFACES_$(subsys)), \ $(if $($(in)_IMPL), $($(in)_IMPL), \ $(in))))' ; \ echo 'OBJ_$(subsys) += $$(CXXSRC_$(subsys):.cc=.o) \ $$(CSRC_$(subsys):.c=.o)' ; ) ) >> $@.new @echo "_modules_deps_read_ = true" >> $@.new @mv $@.new $@ # Avoid attempts to update other Makefile fragments -- restart cleanly $(MAKE) $(MAKECMDGOALS) include .Modules.deps endif # _modules_read_ ifdef _modules_deps_read_ # Add srcdir to dirs in public variables modified by Modules file ifneq ($(srcdir),.) ifeq ($(VPATH),) VPATH := . endif VPATH := $(VPATH) $(addprefix $(srcdir)/, $(VPATH)) PRIVATE_INCDIR := $(PRIVATE_INCDIR) $(addprefix $(srcdir)/, $(PRIVATE_INCDIR)) endif VPATH += auto PRIVATE_INCDIR += auto SRCS = $(foreach subsys,$(SUBSYSTEMS),$(CXXSRC_$(subsys)) $(CSRC_$(subsys))) DEPS = $(patsubst %, .%.d, $(SRCS)) CRTN = $(word 1, $(wildcard $(OSKITDIR)/lib/crtn.o $(DROPS_STDLIBDIR)/flux_crt/crtn.o)) LIBGCC = $(shell $(CXX) --print-libgcc-file-name) # # Compilation flags # #OPT_FLAGS = -O6 SHARED_FLAGS += PROF_FLAGS = -pg ifdef PROFILE SHARED_FLAGS += $(PROF_FLAGS) CPPFLAGS += -DPROFILE endif # EXTRA_FLAGS can be stuff like: #EXTRA_FLAGS = -DNDEBUG -DNO_FRAME_PTR -fomit-frame-pointer CFLAGS += $(SHARED_FLAGS) $(EXTRA_FLAGS) CXXFLAGS += $(SHARED_FLAGS) $(EXTRA_FLAGS) ASFLAGS += $(SHARED_FLAGS) $(EXTRA_FLAGS) STD_LIBS = -L $(OSKITDIR)/lib -L $(DROPS_STDLIBDIR) -lkern -lmc -llmm $(LIBGCC) # # End of configuration settings -- rules follow # %.o: %.S $(COMP_MESSAGE) $(VERBOSE)$(CC) -c $(CPPFLAGS) $(ASFLAGS) $< -o $@ # # special: build certain sources without profiling flags # NOPROFILE_C = $(foreach cfile, $(addsuffix .c, $(NOPROFILE)), \ $(findstring $(cfile), $(filter %.c, $(SRCS)))) NOPROFILE_CC = $(foreach cfile, $(addsuffix .cc, $(NOPROFILE)), \ $(findstring $(cfile), $(filter %.cc, $(SRCS)))) NOOPT_C = $(foreach cfile, $(addsuffix .c, $(NOOPT)), \ $(findstring $(cfile), $(filter %.c, $(SRCS)))) NOOPT_CC = $(foreach cfile, $(addsuffix .cc, $(NOOPT)), \ $(findstring $(cfile), $(filter %.cc, $(SRCS)))) $(NOPROFILE_CC:.cc=.o) : %.o: %.cc $(COMP_MESSAGE) $(VERBOSE)$(CXX) $(filter-out $(PROF_FLAGS),$(CXXFLAGS) $(CPPFLAGS)) -c $< -o $@ $(NOPROFILE_C:.c=.o) : %.o: %.c $(COMP_MESSAGE) $(VERBOSE)$(CC) $(filter-out $(PROF_FLAGS),$(CFLAGS) $(CPPFLAGS)) -c $< -o $@ $(NOOPT_CC:.cc=.o) : %.o: %.cc $(COMP_MESSAGE) $(VERBOSE)$(CXX) $(filter-out $(OPT_FLAGS),$(CXXFLAGS) $(CPPFLAGS)) -c $< -o $@ $(NOOPT_C:.c=.o) : %.o: %.c $(COMP_MESSAGE) $(VERBOSE)$(CC) $(filter-out $(OPT_FLAGS),$(CFLAGS) $(CPPFLAGS)) -c $< -o $@ # # Subsystem-specific rules and targets # ALL = $(foreach subsys, $(SUBSYSTEMS), $($(subsys)) $($(subsys)_EXTRA)) do-all: $(ALL) OBJ = $(foreach subsys, $(SUBSYSTEMS), $(OBJ_$(subsys))) do-obj: $(OBJ) include $(foreach subsys, $(SUBSYSTEMS), Makerules.$(subsys)) # # Auto-created source files # .PRECIOUS: auto/stamp-%.ready # Basename of implementation files = Basename of first .cpp file impl_name = $(basename $(word 1, $(filter %.cpp, $(notdir $(1))))) $(foreach m, $(GENERATED_MODULES), auto/stamp-$(m).ready ): \ auto/stamp-%.ready: ifneq ($(VERBOSE),) @echo " ... Preprocessing $^" endif $(VERBOSE)$(PREPROCESS) $(PREPROCESS_FLAGS) -p auto/new_ \ -h $* -c $(call impl_name,$^) $(filter %.cpp, $^) @for i in $*.h $(call impl_name,$^)_i.h \ $(patsubst %.cpp, %.cc, $(filter %.cpp, $(notdir $^))); \ do \ $(MOVE_IF_CHANGE) auto/new_$$i auto/$$i || exit 1; \ done $(VERBOSE)touch $@ .PRECIOUS: %.cc %.h %_i.h auto: mkdir auto ### DEPS.dot: $(SRCS) rm -f $@.new for i in $^; \ do \ echo $$(basename $$i): $$(perl -n -e \ '/\#include\s+"(.*).h"/ && print "$$1 "; next;' \ $$i $$(dirname $$i)/$$(basename $$i .cc).h \ $$(dirname $$i)/$$(basename $$i .cc)_i.h); \ done | $(SHOWDEPS) dot \ | perl -pe '$$_ = "" if /(config|jdb|globals) ->/;\ $$_ = "" if /thread_i\b/;\ s/(lock_guard|atomic|kdb_ke|config|globals)(?!_);?(?!\s*->)//g;' > $@.new mv $@.new $@ DEPS: $(SRCS) for i in $^; \ do \ echo $$(basename $$i): $$(perl -n -e \ '/\#include\s+"(.*).h"/ && print "$$1 "; next;' \ $$i $$(dirname $$i)/$$(basename $$i .cc).h \ $$(dirname $$i)/$$(basename $$i .cc)_i.h); \ done | $(SHOWDEPS) > $@.new mv $@.new $@ ifneq ($(MAKECMDGOALS),clean) ifneq ($(MAKECMDGOALS),cleanall) include $(IFDEPS) -include $(filter-out $(IFDEPS), $(DEPS)) /dev/null endif # make cleanall endif # make clean else # ! _modules_deps_read_ do-all: endif # ! _modules_deps_read_ ### .PHONY: TAGS clean cleanall $(foreach subsys, $(SUBSYSTEMS), clean-$(subsys)) TAGS: ( find $(srcdir) $(filter-out auto,$(PRIVATE_INCDIR)) \ -type f -name '*.h' ; \ find $(srcdir) $(filter-out auto,$(PRIVATE_INCDIR)) \ -type f -name '*.cpp' -o -name '*.cc' -o -name '*.c'; \ ) | etags --members --language=c++ - clean: $(foreach subsys, $(SUBSYSTEMS), clean-$(subsys)) rm -f $(ALL) rm -f *.o rm -f auto/*.cc auto/*.h auto/stamp-*.ready cleanall: clean rm -f .*.d *~ rm -f .Modules.deps -include Makerules.local