1 # -*- makefile-gmake -*-
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
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:%=/%)
20 # Check GCC version for user build
21 ifndef CC_MAJOR_VERSION
22 CC_MAJOR_VERSION := $(shell $(CC) -dumpversion | sed -e 's/\([^.]\)\..*/\1/')
24 # Prepare suitable define for dependency building
25 ifeq ($(CC_MAJOR_VERSION),2)
26 CC_DEPFLAGS = -Wp,-MD,"$$@.d.tmp"
28 CC_DEPFLAGS = -MT $$@ -MD -MP -MF "$$@.d.tmp"
31 c_o_COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
32 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -DOMK_FOR_USER
35 if $(c_o_COMPILE) $(CC_DEPFLAGS) -o $$@ -c $$< ; \
36 then mv -f "$$@.d.tmp" "$$@.d"; \
37 else rm -f "$$@.d.tmp"; exit 1; \
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:%/=%)))
46 USER_OBJS += $$($(1)_OBJS)
47 USER_SOURCES += $$($(1)_SOURCES)
49 $$(eval $$(call prepare_rule_goal,\
50 $(USER_BIN_DIR)/$(1)$(EXE_SUFFIX),\
53 $$(call program_cmd,$(1))))
56 program_cmd = $(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 $$@
60 $(foreach prog,$(bin_PROGRAMS),$(eval $(call program_template,$(prog),bin)))
61 #$(foreach prog,$(bin_PROGRAMS),$(info >>>$(call program_template,$(prog),bin)<<<))
62 $(foreach src,$(filter %.c,$(USER_SOURCES)),\
63 $(eval $(call prepare_rule,\
64 $(USER_OBJS_DIR)/$(src:%.c=%.o),\
65 $(SOURCES_DIR)/$(src),\
69 $(eval $(call prepare_rule_goal,\
70 $(USER_OBJS_DIR)/test.X.o,\
71 $(SOURCES_DIR)/test.c,\
76 @$(call mkdir_def,$(USER_BUILD_DIR))
77 @$(call mkdir_def,$(USER_INCLUDE_DIR))
78 @$(call mkdir_def,$(USER_LIB_DIR))
79 @$(call mkdir_def,$(USER_BIN_DIR))
80 @$(call mkdir_def,$(USER_UTILS_DIR))
81 @$(call mkdir_def,$(USER_TESTS_DIR))