]> rtime.felk.cvut.cz Git - omk.git/blob - snippets/test
Devel test rules converted to snippets
[omk.git] / snippets / test
1 BUILD_DIR_NAME = _build
2 COMPILED_DIR_NAME = _compiled
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 OMK_WORK_DIR  = $(USER_OBJS_DIR)
16
17 ############
18 # Programs #
19 ############
20
21 # Check GCC version for user build
22 ifndef CC_MAJOR_VERSION
23 CC_MAJOR_VERSION := $(shell $(CC) -dumpversion | sed -e 's/\([^.]\)\..*/\1/')
24 endif
25 # Prepare suitable define for dependency building
26 ifeq ($(CC_MAJOR_VERSION),2)
27 CC_DEPFLAGS = -Wp,-MD,"$$@.d.tmp"
28 else
29 CC_DEPFLAGS = -MT $$@ -MD -MP -MF "$$@.d.tmp"
30 endif
31
32 c_o_COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
33         $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -DOMK_FOR_USER
34
35 c_o_cmd = \
36         if $(c_o_COMPILE) $(CC_DEPFLAGS) -o $$@ -c $$< ; \
37         then mv -f "$$@.d.tmp" "$$@.d"; \
38         else rm -f "$$@.d.tmp"; exit 1; \
39         fi
40
41
42 # Usage: $(call program_template,<executable-name>,<bin|utils|test>)
43 define program_template
44 $(1)_OBJS += $$(patsubst %.c,%.o,$$(filter %.c,$$($(1)_SOURCES)))
45 $(1)_OBJS := $$(addprefix $(USER_OBJS_DIR)/,$$(sort $$($(1)_OBJS:%/=%)))
46
47 USER_OBJS  += $$($(1)_OBJS)
48 USER_SOURCES += $$($(1)_SOURCES)
49
50 $(call prepare_rule_goal,\
51         $(USER_BIN_DIR)/$(1)$(EXE_SUFFIX),\
52         $$($(1)_OBJS) $$($(1)_LIBS),\
53         "LINK    ",\
54         $(program_cmd))
55 endef
56
57 program_cmd = $(if $(filter %.cc,$$($(1)_SOURCES)),$(CXX),$(CC)) \
58         $($(1)_OBJS) $($(1)_LIBS:%=-l%) $(LOADLIBES) $(LDFLAGS) -Wl,-rpath-link,$(USER_LIB_DIR) \
59         -Wl,-Map,$(USER_OBJS_DIR)/$(1).exe.map -o $$@
60
61 $(foreach prog,$(bin_PROGRAMS),$(eval $(call program_template,$(prog),bin)))
62 #$(foreach prog,$(bin_PROGRAMS),$(info >>>$(call program_template,$(prog),bin)<<<))
63 $(foreach src,$(filter %.c,$(USER_SOURCES)),\
64         $(eval $(call prepare_rule,\
65                 $(USER_OBJS_DIR)/$(src:%.c=%.o),\
66                 $(SOURCES_DIR)/$(src),\
67                 "CC      ",\
68                 $(c_o_cmd))))
69
70 $(eval $(call prepare_rule_goal,\
71                 $(USER_OBJS_DIR)/test.X.o,\
72                 $(SOURCES_DIR)/test.c,\
73                 "CC      ",\
74                 $(c_o_cmd)))
75
76 # OUTPUT_DIR is not defined in Makefile.build so we has to pass it on
77 # command-line. After this file will be merged with Makefile.rules, it
78 # will not be necessary to pass it.
79 default: check-dir prepare-pass
80         -$(MAKE) -qp -f $(MAKERULES_DIR)/Makefile.rules build > make.db.build-pseudo-pass;
81         +@echo "make[omk]: build"
82         @$(MAKE) $(NO_PRINT_DIRECTORY) -f $(MAKERULES_DIR)/Makefile.rules build
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))