diff --git a/makefile.basic b/makefile.basic index ea13728..20c770c 100644 --- a/makefile.basic +++ b/makefile.basic @@ -35,6 +35,7 @@ POST_TARGETS::= CLEAN_TARGETS::= RELEASE?=0 MEMCHK?=0 +SAVECFLAGS?=1 ifneq ($(WINDOWS),1) #*nix settings @@ -114,12 +115,19 @@ else COMPILER_FLAGS+=-O0 -g3 -ggdb endif +ifeq ($(SAVECFLAGS),1) + CFLAGS_TMPFILE::=.cflags.tmp + OLD_COMPILEFLAGS::=$(file <$(CFLAGS_TMPFILE)) +endif + #add dependency tracking and include directories INTERNAL_COMPILERFLAGS=-c $(foreach dir,$(INCLUDE_DIRS),-I"$(dir)") -MMD -MP -MF"$(DEPDIR)/$(notdir $(patsubst %.o,%.d,$@))" INTERNAL_LINKFLAGS=$(foreach dir,$(LIBDIRS),-L"$(dir)") THIS_MAKEFILE_NAME::=$(lastword $(MAKEFILE_LIST)) INTERNAL_SOURCES::=$(SOURCES) $(foreach source,$(SOURCE_DIRS),$(foreach ext,$(EXT),$(wildcard $(source)/*.$(ext)))) OBJECTS::=$(addprefix $(OBJDIR)/,$(subst \,.,$(subst /,.,$(addsuffix .o,$(INTERNAL_SOURCES))))) +ALL_COMPILEFLAGS=$(COMPILER_FLAGS) $(INTERNAL_COMPILERFLAGS) +ALL_LINKFLAGS=$(INTERNAL_LINKFLAGS) $(LDFLAGS) #Arguments to make submake use this makefile without "Entering directory" stuff SUBMAKE_ARGUMENTS::=--no-print-directory -f "$(THIS_MAKEFILE_NAME)" @@ -129,9 +137,16 @@ define \n endef +.PHONY: cflags-update +cflags-update: +ifeq ($(SAVECFLAGS),1) +ifneq ($(subst $(DEPDIR)/,$(DEPDIR)/cflags-update,$(ALL_COMPILEFLAGS)),$(OLD_COMPILEFLAGS)) + $(file >$(CFLAGS_TMPFILE),$(ALL_COMPILEFLAGS)) +endif +endif #default target: run targets in PRE_TARGETS, then the main executable, then POST_TARGETS .PHONY: all -all: +all: cflags-update $(foreach target,$(PRE_TARGETS),@$(MAKE) $(SUBMAKE_ARGUMENTS) "$(target)"$(\n)) @$(MAKE) $(SUBMAKE_ARGUMENTS) "$(MAIN_EXECUTABLE)" $(foreach target,$(POST_TARGETS),@$(MAKE) $(SUBMAKE_ARGUMENTS) "$(target)"$(\n)) @@ -143,16 +158,16 @@ do_strip: #Link executable $(MAIN_EXECUTABLE): $(OBJECTS) - $(COMPILER) $^ -o "$(basename $@)" $(INTERNAL_LINKFLAGS) $(LDFLAGS) $(LDLIBS) + $(COMPILER) $^ -o "$(basename $@)" $(ALL_LINKFLAGS) $(LDLIBS) #Object target recipe define GENERATE_OBJECTS -$$(OBJDIR)/$(subst \,.,$(subst /,.,$(1))).%.o: $(1)/% - $$(COMPILER) $$(COMPILER_FLAGS) $$(INTERNAL_COMPILERFLAGS) "$$<" -o "$$@" +$$(OBJDIR)/$(subst \,.,$(subst /,.,$(1))).%.o: $(1)/% $(CFLAGS_TMPFILE) + $$(COMPILER) $$(ALL_COMPILEFLAGS) "$$<" -o "$$@" endef define GENERATE_INDIVIDUAL_OBJECTS -$$(OBJDIR)/$(subst \,.,$(subst /,.,$(1))).o: $(1) - $$(COMPILER) $$(COMPILER_FLAGS) $$(INTERNAL_COMPILERFLAGS) "$$<" -o "$$@" +$$(OBJDIR)/$(subst \,.,$(subst /,.,$(1))).o: $(1) $(CFLAGS_TMPFILE) + $$(COMPILER) $$(ALL_COMPILEFLAGS) "$$<" -o "$$@" endef #Create targets for object files @@ -173,6 +188,9 @@ clean: $(call rmdir,"$(OBJDIR)") $(call rm,"$(MAIN_EXECUTABLE)") $(call rm,"$(MAIN_EXECUTABLE).exe") +ifeq ($(SAVECFLAGS),1) + $(call rm,"$(CFLAGS_TMPFILE)") +endif #header file dep tracking -include $(wildcard $(DEPDIR)/*.d) diff --git a/makefile.library b/makefile.library index cc084c3..6c0ef88 100644 --- a/makefile.library +++ b/makefile.library @@ -37,6 +37,7 @@ SHARED?=1 STATIC?=0 RELEASE?=0 MEMCHK?=0 +SAVECFLAGS?=1 ifneq ($(WINDOWS),1) #*nix settings @@ -122,6 +123,11 @@ else COMPILER_FLAGS+=-O0 -g3 -ggdb endif +ifeq ($(SAVECFLAGS),1) + CFLAGS_TMPFILE::=.cflags.tmp + OLD_COMPILEFLAGS::=$(file <$(CFLAGS_TMPFILE)) +endif + #add dependency tracking and include directories INTERNAL_COMPILERFLAGS=-c $(foreach dir,$(INCLUDE_DIRS),-I"$(dir)") -MMD -MP -MF"$(DEPDIR)/$(notdir $(patsubst %.o,%.d,$@))" INTERNAL_LINKFLAGS=$(foreach dir,$(LIBDIRS),-L"$(dir)") @@ -131,6 +137,8 @@ endif THIS_MAKEFILE_NAME::=$(lastword $(MAKEFILE_LIST)) INTERNAL_SOURCES::=$(SOURCES) $(foreach source,$(SOURCE_DIRS),$(foreach ext,$(EXT),$(wildcard $(source)/*.$(ext)))) OBJECTS::=$(addprefix $(OBJDIR)/,$(subst \,.,$(subst /,.,$(addsuffix .o,$(INTERNAL_SOURCES))))) +ALL_COMPILEFLAGS=$(COMPILER_FLAGS) $(INTERNAL_COMPILERFLAGS) +ALL_LINKFLAGS=$(INTERNAL_LINKFLAGS) $(LDFLAGS) #Arguments to make submake use this makefile without "Entering directory" stuff SUBMAKE_ARGUMENTS::=--no-print-directory -f "$(THIS_MAKEFILE_NAME)" @@ -140,9 +148,16 @@ define \n endef +.PHONY: cflags-update +cflags-update: +ifeq ($(SAVECFLAGS),1) +ifneq ($(subst $(DEPDIR)/,$(DEPDIR)/cflags-update,$(ALL_COMPILEFLAGS)),$(OLD_COMPILEFLAGS)) + $(file >$(CFLAGS_TMPFILE),$(ALL_COMPILEFLAGS)) +endif +endif #default target: run targets in PRE_TARGETS, then build the main library, then POST_TARGETS .PHONY: all -all: +all: cflags-update $(foreach target,$(PRE_TARGETS),@$(MAKE) $(SUBMAKE_ARGUMENTS) "$(target)"$(\n)) ifeq ($(SHARED),1) ifeq ($(WINDOWS),1) @@ -162,12 +177,12 @@ endif #static ifeq ($(WINDOWS),1) #target for windows shared library $(DLLOUT): $(OBJECTS) - $(COMPILER) -shared -o "$(DLLOUT)" $^ -Wl,--out-implib,"lib$(MAIN_LIBRARY).a" $(SHARED_LIBRARY_FLAGS) $(INTERNAL_LINKFLAGS) $(LDFLAGS) $(LDLIBS) + $(COMPILER) -shared -o "$(DLLOUT)" $^ -Wl,--out-implib,"lib$(MAIN_LIBRARY).a" $(SHARED_LIBRARY_FLAGS) $(ALL_LINKFLAGS) $(LDLIBS) else #windows #target for *nix shared library $(INTERNAL_SHARED_LIBRARY): $(OBJECTS) - $(COMPILER) -shared -o "$@" $^ $(COMPILER_FLAGS) $(SHARED_LIBRARY_FLAGS) $(INTERNAL_LINKFLAGS) $(LDFLAGS) $(LDLIBS) + $(COMPILER) -shared -o "$@" $^ $(COMPILER_FLAGS) $(SHARED_LIBRARY_FLAGS) $(ALL_LINKFLAGS) $(LDLIBS) endif #windows #target for static library @@ -188,12 +203,12 @@ endif #Object target recipe define GENERATE_OBJECTS -$$(OBJDIR)/$(subst \,.,$(subst /,.,$(1))).%.o: $(1)/% - $$(COMPILER) $$(COMPILER_FLAGS) $$(INTERNAL_COMPILERFLAGS) "$$<" -o "$$@" +$$(OBJDIR)/$(subst \,.,$(subst /,.,$(1))).%.o: $(1)/% $(CFLAGS_TMPFILE) + $$(COMPILER) $$(ALL_COMPILEFLAGS) "$$<" -o "$$@" endef define GENERATE_INDIVIDUAL_OBJECTS -$$(OBJDIR)/$(subst \,.,$(subst /,.,$(1))).o: $(1) - $$(COMPILER) $$(COMPILER_FLAGS) $$(INTERNAL_COMPILERFLAGS) "$$<" -o "$$@" +$$(OBJDIR)/$(subst \,.,$(subst /,.,$(1))).o: $(1) $(CFLAGS_TMPFILE) + $$(COMPILER) $$(ALL_COMPILEFLAGS) "$$<" -o "$$@" endef @@ -218,6 +233,9 @@ clean: object_clean $(call rm,"lib$(MAIN_LIBRARY).so") $(call rm,"lib$(MAIN_LIBRARY).a") $(call rm,"$(DLLOUT)") +ifeq ($(SAVECFLAGS),1) + $(call rm,"$(CFLAGS_TMPFILE)") +endif #header file dep tracking -include $(wildcard $(DEPDIR)/*.d)