+# -*- makefile-gmake -*-
include base #omkbuild
USER_INCLUDE_DIR := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/include
# 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:%=/%)
-OMK_WORK_DIR = $(USER_OBJS_DIR)
############
# Programs #
USER_OBJS += $$($(1)_OBJS)
USER_SOURCES += $$($(1)_SOURCES)
-$(call prepare_rule_goal,\
+$$(eval $$(call prepare_rule_goal,\
$(USER_BIN_DIR)/$(1)$(EXE_SUFFIX),\
- $$($(1)_OBJS) $$($(1)_LIBS),\
+ $$($(1)_OBJS),\
"LINK ",\
- $(program_cmd))
+ $$(call program_cmd,$(1))))
endef
-program_cmd = $(if $(filter %.cc,$$($(1)_SOURCES)),$(CXX),$(CC)) \
+program_cmd = $(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 $$@
"CC ",\
$(c_o_cmd)))
-# OUTPUT_DIR is not defined in Makefile.build so we has to pass it on
-# command-line. After this file will be merged with Makefile.rules, it
-# will not be necessary to pass it.
-default: check-dir prepare-pass
- -$(MAKE) -qp -f $(MAKERULES_DIR)/Makefile.rules build > make.db.build-pseudo-pass;
- +@echo "make[omk]: build"
- @$(MAKE) $(NO_PRINT_DIRECTORY) -f $(MAKERULES_DIR)/Makefile.rules build
-
check-dir::
@$(call mkdir_def,$(USER_BUILD_DIR))
@$(call mkdir_def,$(USER_INCLUDE_DIR))
OUTPUT_DIR := $(MAKERULES_DIR)
endif
-.PHONY: all default check-make-ver omkize
+.PHONY: all default check-make-ver omkize prepare build
ifdef W
ifeq ("$(origin W)", "command line")
endif
ifneq ($(OMK_WHOLE_TREE),1)
-all: check-make-ver default
+ ifndef omk_prereq_checked
+ omk_checks=check-make-ver check-dir
+ export omk_prereq_checked=1
+ endif
+all: build
+
+prepare: $(omk_checks) prepare-pass
+build: prepare
+ +@echo "make[omk]: build"
+ @$(MAKE) $(NO_PRINT_DIRECTORY) -f $(MAKERULES_DIR)/Makefile.rules build-pseudo-pass
@echo "Compilation finished"
+
+prepare-pass: $(omk_checks)
else
# Run make in the top-level directory
all:
OMK_INCLUDED := 1
endif
+
check-make-ver:
@GOOD_MAKE_VERSION=`echo $(MAKE_VERSION) | sed -n -e 's/^[4-9]\..*\|^3\.9[0-9].*\|^3\.8[1-9].*/y/p'` ; \
if [ x$$GOOD_MAKE_VERSION != xy ] ; then \
##################### -*- makefile-gmake -*-
# Build pseudo-pass #
#####################
-ifneq (,$(filter build,$(MAKECMDGOALS)))
-all: build-pseudo-pass
-
+ifneq (,$(filter build-pseudo-pass,$(MAKECMDGOALS)))
rule_targets = $(value $(1)_targets)
rule_deps = $(value $(1)_deps)
rule_msg = $(value $(1)_msg)
endef
# TODO: Include __goals.omk.inc only in the subtree
--include $(shell true; find $(USER_BUILD_DIR) -name '*.omk.inc') # `true' is a hack for MinGW
+-include $(shell true; find $(BUILD_OMK_DIR) -name '*.omk.inc') # `true' is a hack for MinGW
# FIXME: Disable automatic remake of included files
$(foreach rule,$(prepared_rules),$(eval $(call build_rule,$(rule))))
-.PHONY: build
-build: $(foreach target,$(omk_goals),$(target))
+.PHONY: build build-msg all-targets
+
+build-pseudo-pass: $(foreach target,$(omk_goals),$(target))
+
endif # (,$(filter build,$(MAKECMDGOALS)))
define prepare_rule
prepare-pass-local: $(omk_inc_file)
-$(omk_inc_file): FORCE
+.PHONY: $(omk_inc_file)
+$(omk_inc_file):
#TODO remove the next line
@echo " PREP "$$(call strip_out,$$@); \
echo 'prepared_rules += $(omk_inc_rule)' > $$@.tmp; \
prepare-pass-local: $(OMK_WORK_DIR)/__goals.omk.inc
$(OMK_WORK_DIR)/__goals.omk.inc: FORCE
- $(Q)echo 'omk_goals += $(prepared_goals)' > $@.tmp; \
+ @echo 'omk_goals += $(prepared_goals)' > $@.tmp; \
if cmp -s $@.tmp $@; then rm $@.tmp; else mv $@.tmp $@; fi