summaryrefslogtreecommitdiff
path: root/i/marvin/src/Makefile.defs
blob: 45c40d714e172f76b564576b6c7e7216ee409a99 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# 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 \
	  tester \
	  log serial timer \
	  config data scheduler \
	  proto asserv \
	  motor 

# 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)

# 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))))

# 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: