]> rtime.felk.cvut.cz Git - omk.git/blob - snippets/Makefile.rules.test
d16e073a20df1315c97099ff60d07b06cdd62b8e
[omk.git] / snippets / Makefile.rules.test
1 # -*- makefile-gmake -*-
2 include base #omkbuild
3
4 USER_INCLUDE_DIR := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/include
5 USER_LIB_DIR     := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/lib
6 USER_UTILS_DIR   := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/bin-utils
7 USER_TESTS_DIR   := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/bin-tests
8 USER_BIN_DIR     := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/bin
9 USER_BUILD_DIR   := $(OUTPUT_DIR)/$(BUILD_DIR_NAME)/user
10 LINK_BUILD_DIR   := $(OUTPUT_DIR)/$(BUILD_DIR_NAME)/link
11
12 # Avoid double slash at the end in the top-level directory
13 USER_OBJS_DIR = $(USER_BUILD_DIR)$(RELATIVE_DIR:%=/%)
14 KERN_OBJS_DIR = $(KERN_BUILD_DIR)$(RELATIVE_DIR:%=/%)
15
16 ############
17 # Programs #
18 ############
19
20 # Check GCC version for user build
21 ifndef CC_MAJOR_VERSION
22 CC_MAJOR_VERSION := $(shell $(CC) -dumpversion | sed -e 's/\([^.]\)\..*/\1/')
23 endif
24 # Prepare suitable define for dependency building
25 ifeq ($(CC_MAJOR_VERSION),2)
26 CC_DEPFLAGS = -Wp,-MD,"$$@.d.tmp"
27 else
28 CC_DEPFLAGS = -MT $$@ -MD -MP -MF "$$@.d.tmp"
29 endif
30
31 c_o_COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
32         $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -DOMK_FOR_USER
33
34 c_o_cmd = \
35         if $(c_o_COMPILE) $(CC_DEPFLAGS) -o $$@ -c $$< ; \
36         then mv -f "$$@.d.tmp" "$$@.d"; \
37         else rm -f "$$@.d.tmp"; exit 1; \
38         fi
39
40
41 # Usage: $(call program_template,<executable-name>,<bin|utils|test>)
42 define program_template
43 $(1)_OBJS += $$(patsubst %.c,%.o,$$(filter %.c,$$($(1)_SOURCES)))
44 $(1)_OBJS := $$(addprefix $(USER_OBJS_DIR)/,$$(sort $$($(1)_OBJS:%/=%)))
45
46 USER_OBJS  += $$($(1)_OBJS)
47 USER_SOURCES += $$($(1)_SOURCES)
48
49 $$(eval $$(call prepare_rule_goal,\
50         $(USER_BIN_DIR)/$(1)$(EXE_SUFFIX),\
51         $$($(1)_OBJS),\
52         "LINK    ",\
53         $$(call program_cmd,$(1))))
54 endef
55
56 program_cmd = set -e; $(if $(filter %.cc,$($(1)_SOURCES)),$(CXX),$(CC)) \
57         $($(1)_OBJS) $($(1)_LIBS:%=-l%) $(LOADLIBES) $(LDFLAGS) -Wl,-rpath-link,$(USER_LIB_DIR) \
58         -Wl,-Map,$(USER_OBJS_DIR)/$(1).exe.map -o $$@; \
59         echo "$$@: \\" >$(USER_OBJS_DIR)/$(1).exe.d; \
60         sed -n -e 's|^LOAD \(.*\)$$$$|  \1  \&|p' $(USER_OBJS_DIR)/$(1).exe.map|tr '&' '\134'  >>$(USER_OBJS_DIR)/$(1).exe.d; \
61         echo >>$(USER_OBJS_DIR)/$(1).exe.d
62
63 prepare-pass: create-build-dirs
64 create-build-dirs::
65 ifneq ($(bin_PROGRAMS),)
66 create-build-dirs::
67         @$(call mkdir_def,$(USER_OBJS_DIR))
68 endif
69 $(foreach prog,$(bin_PROGRAMS),$(eval $(call program_template,$(prog),bin)))
70 #$(foreach prog,$(bin_PROGRAMS),$(info >>>$(call program_template,$(prog),bin)<<<))
71 $(foreach src,$(filter %.c,$(USER_SOURCES)),\
72         $(eval $(call prepare_rule,\
73                 $(USER_OBJS_DIR)/$(src:%.c=%.o),\
74                 $(SOURCES_DIR)/$(src),\
75                 "CC      ",\
76                 $(c_o_cmd))))
77
78 # $(eval $(call prepare_rule_goal,\
79 #               $(USER_OBJS_DIR)/test.X.o,\
80 #               $(SOURCES_DIR)/test.c,\
81 #               "CC      ",\
82 #               $(c_o_cmd)))
83
84 check-dir::
85         @$(call mkdir_def,$(USER_BUILD_DIR))
86         @$(call mkdir_def,$(USER_INCLUDE_DIR))
87         @$(call mkdir_def,$(USER_LIB_DIR))
88         @$(call mkdir_def,$(USER_BIN_DIR))
89         @$(call mkdir_def,$(USER_UTILS_DIR))
90         @$(call mkdir_def,$(USER_TESTS_DIR))
91