summaryrefslogtreecommitdiff
path: root/cesar/common/make/build.mk
blob: 4ff67afd8549fc84ad1710c5b065122899a84e86 (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
# Define build rules.

# No default implicit rules.
.SUFFIXES:

HOST_CC ?= $(CC)
HOST_CXX ?= $(CXX)
TARGET_CC ?= $(CROSS_COMPILE)gcc
TARGET_CXX ?= $(CROSS_COMPILE)g++

HOST_COMPILE.c = $(HOST_CC) $(HOST_CPPFLAGS) $(HOST_CFLAGS) -c
HOST_COMPILE.cpp = $(HOST_CXX) $(HOST_CPPFLAGS) $(HOST_CXXFLAGS) -c
HOST_COMPILE.S = $(HOST_CC) $(HOST_CPPFLAGS) $(HOST_ASFLAGS) -c
HOST_LINK = $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS)
HOST_LINK_CXX = $(HOST_CXX) $(HOST_CXXFLAGS) $(HOST_LDFLAGS)

TARGET_COMPILE.c = $(TARGET_CC) $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) -c
TARGET_COMPILE.cpp = $(TARGET_CXX) $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) -c
TARGET_COMPILE.S = $(TARGET_CC) $(TARGET_CPPFLAGS) $(TARGET_ASFLAGS) -c
TARGET_LINK = $(TARGET_CC) $(TARGET_CFLAGS) $(TARGET_LDFLAGS)
TARGET_LINK_CXX = $(TARGET_CXX) $(TARGET_CXXFLAGS) $(TARGET_LDFLAGS)

.PHONY: build.all host.all target.all build.clean

build.all: host.all target.all

host.all: $(HOST_EXES)

target.all: $(TARGET_ELFS)

# For each program, define the link rule.
PROGRAM_rule_template_echo := "LINK"
PROGRAM_rule_template_echo_CXX := "LDXX"
define PROGRAM_rule_template
.PHONY: $1
$1: $$(call prog2exe,$1,$2)
$$(call prog2exe,$1,$2): $$($1_OBJECTS) $$($1_MODULES_OBJECTS) $$($(call type2var,$2)_LINK_DEPS)
	@echo $(PROGRAM_rule_template_echo$3)" [$2] $$@"
	$Q$$($(call type2var,$2)_LINK$3) $$($1_OBJECTS) $$($1_MODULES_OBJECTS) $$($(call type2var,$2)_LDLIBS) $$($1_LDLIBS) -o $$@
endef
$(foreach program,$(HOST_PROGRAMS),$(eval $(call PROGRAM_rule_template,$(program),host,$(call iscxx,$(program)))))
$(foreach program,$(TARGET_PROGRAMS),$(eval $(call PROGRAM_rule_template,$(program),target,$(call iscxx,$(program)))))

# For each source, define the compile rule.
SOURCE_rule_template_echo.c := "CC  "
SOURCE_rule_template_echo.cpp := "CXX "
SOURCE_rule_template_echo.S := "AS  "
define SOURCE_rule_template
$$(call src2obj,$1,$2): $1 | $$(OBJ_DIR_STAMP) $$($(call type2var,$2)_COMPILE_DEPS)
	@echo $(SOURCE_rule_template_echo$3)" [$2] $$<"
	$Q$$($(call type2var,$2)_COMPILE$3) -I$$(dir $$<).. -MMD -MP -MF $$(@:.o=.d) -MQ $$@ -o $$@ $$<
endef
$(foreach source,$(HOST_SOURCES),$(eval $(call SOURCE_rule_template,$(source),host,$(suffix $(source)))))
$(foreach source,$(TARGET_SOURCES),$(eval $(call SOURCE_rule_template,$(source),target,$(suffix $(source)))))

# Include deps.
-include $(call src2dep,$(HOST_SOURCES),host)
-include $(call src2dep,$(TARGET_SOURCES),target)

# Clean rules.
build.clean:
	rm -f $(HOST_EXES) $(TARGET_ELFS) \
	      $(call src2obj,$(HOST_SOURCES),host) \
	      $(call src2obj,$(TARGET_SOURCES),target) \
	      $(call src2dep,$(HOST_SOURCES),host) \
	      $(call src2dep,$(TARGET_SOURCES),target)