# Flags. CXXFLAGS = -Wall -g CPPFLAGS = -MMD $(INCLUDES) INCLUDES = -I$(SRCDIR) -I. # Tests de coverage (man gcov). ifeq ($(COV),) CXXFLAGS += -O2 else CXXFLAGS += -fprofile-arcs -ftest-coverage endif # Profiling (man gprof). ifneq ($(PROF),) CXXFLAGS += -pg LDFLAGS += -pg endif # Messages sur une ligne. CXXFLAGS += -fmessage-length=0 SUBDIRS = utils utils/meta \ parser \ interpreter config tester \ log serial timer \ data scheduler \ proto asserv es \ motor socket # Répertoire où placer les objets. OBJ_DIR := obj # Utilise le compilateur C++ pour l'édition des liens. LINK.o = $(CXX) $(LDFLAGS) $(TARGET_ARCH) # Et les outils GNU pour lex et yacc. LEX := flex YACC := bison # Où trouver les sources, apdmc. vpath %.cc $(SUBDIRS:%=$(SRCDIR)/%) $(EXTRA_SUBDIRS) vpath %.ll $(SUBDIRS:%=$(SRCDIR)/%) $(EXTRA_SUBDIRS) vpath %.yy $(SUBDIRS:%=$(SRCDIR)/%) $(EXTRA_SUBDIRS) # régle par défault. Le build-all permet de reporter à plus tard sa # définition. all: build-all # Inclus les autres répertoires. include $(SUBDIRS:%=$(SRCDIR)/%/Makefile.defs) \ $(EXTRA_SUBDIRS:%=%/Makefile.defs) OBJECTS := $(filter %.o,$(foreach PROGRAM,$(PROGRAMS),$($(PROGRAM)_OBJECTS))) OBJECTS := $(OBJECTS:%.o=$(OBJ_DIR)/%.o) build-all: $(PROGRAMS) utest: $(UTESTS:%=%.utest) # Fabrique les règles pour créer les exécutables. define PROGRAMS_template $(1): $$($(1)_OBJECTS:%.o=$$(OBJ_DIR)/%.o) $$(LINK.o) $$^ $$(LOADLIBES) $$(LDLIBS) -o $$@ endef $(foreach prog,$(PROGRAMS),$(eval $(call PROGRAMS_template,$(prog)))) # Creation of utest rules define UTESTS_template ifndef $(1)_UTEST $(1)_UTEST = PATH=$$(PATH):. $$^ endif $(1).utest: @echo "$$($(1)_UTEST)"; \ $$($(1)_UTEST); \ RETVAL=$$$$?; \ echo -n "$(1).utest: "; \ if [ "$$$$RETVAL" -eq "0" ]; \ then \ echo "Succeed"; \ else \ echo "Failed"; \ fi; \ exit $$$$RETVAL endef $(foreach utest,$(UTESTS),$(eval $(call UTESTS_template,$(utest)))) # Régles implicites. %.cc: %.ll $(LEX) $< %.cc: %.yy $(YACC) -o $@ $< $(OBJ_DIR)/%.o: %.cc @mkdir -p $(OBJ_DIR) $(COMPILE.cc) $(OUTPUT_OPTION) $< # Dépendances. -include $(OBJECTS:%.o=%.d) # Ménage. clean: rm -f $(OBJ_DIR)/*.o $(OBJ_DIR)/*.d $(PROGRAMS) rm -f *.bbg *.bb *.da *.gcov rm -f gmon.out rm -f $(EXTRA_CLEAN) rmdir --ignore-fail-on-non-empty $(OBJ_DIR) .PHONY: all build-all clean .SUFFIXES: