# -*- makefile-gmake -*- include base #omkbuild USER_INCLUDE_DIR := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/include USER_LIB_DIR := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/lib USER_UTILS_DIR := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/bin-utils USER_TESTS_DIR := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/bin-tests USER_BIN_DIR := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/bin USER_BUILD_DIR := $(OUTPUT_DIR)/$(BUILD_DIR_NAME)/user LINK_BUILD_DIR := $(OUTPUT_DIR)/$(BUILD_DIR_NAME)/link # Avoid double slash at the end in the top-level directory USER_OBJS_DIR = $(USER_BUILD_DIR)$(RELATIVE_DIR:%=/%) KERN_OBJS_DIR = $(KERN_BUILD_DIR)$(RELATIVE_DIR:%=/%) ############ # Programs # ############ # Check GCC version for user build ifndef CC_MAJOR_VERSION CC_MAJOR_VERSION := $(shell $(CC) -dumpversion | sed -e 's/\([^.]\)\..*/\1/') endif # Prepare suitable define for dependency building ifeq ($(CC_MAJOR_VERSION),2) CC_DEPFLAGS = -Wp,-MD,"$$@.d.tmp" else CC_DEPFLAGS = -MT $$@ -MD -MP -MF "$$@.d.tmp" endif c_o_COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -DOMK_FOR_USER c_o_cmd = \ if $(c_o_COMPILE) $(CC_DEPFLAGS) -o $$@ -c $$< ; \ then mv -f "$$@.d.tmp" "$$@.d"; \ else rm -f "$$@.d.tmp"; exit 1; \ fi # Usage: $(call program_template,,) define program_template $(1)_OBJS += $$(patsubst %.c,%.o,$$(filter %.c,$$($(1)_SOURCES))) $(1)_OBJS := $$(addprefix $(USER_OBJS_DIR)/,$$(sort $$($(1)_OBJS:%/=%))) USER_OBJS += $$($(1)_OBJS) USER_SOURCES += $$($(1)_SOURCES) $$(eval $$(call prepare_rule_goal,\ $(USER_BIN_DIR)/$(1)$(EXE_SUFFIX),\ $$($(1)_OBJS),\ "LINK ",\ $$(call program_cmd,$(1)))) endef program_cmd = set -e; $(if $(filter %.cc,$($(1)_SOURCES)),$(CXX),$(CC)) \ $($(1)_OBJS) $($(1)_LIBS:%=-l%) $(LOADLIBES) $(LDFLAGS) -Wl,-rpath-link,$(USER_LIB_DIR) \ -Wl,-Map,$(USER_OBJS_DIR)/$(1).exe.map -o $$@; \ echo "$$@: \\" >$(USER_OBJS_DIR)/$(1).exe.d; \ sed -n -e 's|^LOAD \(.*\)$$$$| \1 \&|p' $(USER_OBJS_DIR)/$(1).exe.map|tr '&' '\134' >>$(USER_OBJS_DIR)/$(1).exe.d; \ echo >>$(USER_OBJS_DIR)/$(1).exe.d prepare-pass: create-build-dirs create-build-dirs:: ifneq ($(bin_PROGRAMS),) create-build-dirs:: @$(call mkdir_def,$(USER_OBJS_DIR)) endif $(foreach prog,$(bin_PROGRAMS),$(eval $(call program_template,$(prog),bin))) #$(foreach prog,$(bin_PROGRAMS),$(info >>>$(call program_template,$(prog),bin)<<<)) $(foreach src,$(filter %.c,$(USER_SOURCES)),\ $(eval $(call prepare_rule,\ $(USER_OBJS_DIR)/$(src:%.c=%.o),\ $(SOURCES_DIR)/$(src),\ "CC ",\ $(c_o_cmd)))) # $(eval $(call prepare_rule_goal,\ # $(USER_OBJS_DIR)/test.X.o,\ # $(SOURCES_DIR)/test.c,\ # "CC ",\ # $(c_o_cmd))) check-dir:: @$(call mkdir_def,$(USER_BUILD_DIR)) @$(call mkdir_def,$(USER_INCLUDE_DIR)) @$(call mkdir_def,$(USER_LIB_DIR)) @$(call mkdir_def,$(USER_BIN_DIR)) @$(call mkdir_def,$(USER_UTILS_DIR)) @$(call mkdir_def,$(USER_TESTS_DIR))