Change basic makefiles to not use recursive invocations of make. This does potentially break some build behaviors (without tampering with some internals). So I'm keeping the recursive versions as new files

This commit is contained in:
rexy712
2020-03-20 12:52:41 -07:00
parent 9f03069ebe
commit 8e7fb0433b
4 changed files with 587 additions and 124 deletions

View File

@@ -30,14 +30,11 @@ CXXFLAGS::=-std=c++17 -Wall -pedantic -Wextra
EXT::=cpp
LANG::=$(EXT)
MAIN_LIBRARY::=tester
PRE_TARGETS::=
POST_TARGETS::=
CLEAN_TARGETS::=
SHARED?=1
STATIC?=0
RELEASE?=0
MEMCHK?=0
SAVECFLAGS?=1
SAVEFLAGS?=1
ifneq ($(WINDOWS),1)
#*nix settings
@@ -49,6 +46,9 @@ ifneq ($(WINDOWS),1)
RANLIB::=ranlib
AR::=ar
AS::=as
ifeq ($(SHARED),1)
INTERNAL_SHARED_LIBRARY::=lib$(MAIN_LIBRARY).so
endif
else #windows
#windows settings
#windows is a fuckwit
@@ -61,11 +61,29 @@ else #windows
RANLIB::=$(MINGW_PREFIX)ranlib
AR::=$(MINGW_PREFIX)ar
AS::=$(MINGW_PREFIX)as
ifeq ($(SHARED),1)
INTERNAL_SHARED_LIBRARY::=$(MAIN_LIBRARY).dll
endif
endif #windows
ifeq ($(STATIC),1)
INTERNAL_STATIC_LIBRARY::=lib$(MAIN_LIBRARY).a
endif
#Put your custom targets for PRE_TARGETS and POST_TARGETS here:
#default target
.PHONY: all
#pre targets
all::
all:: flags-update $(INTERNAL_STATIC_LIBRARY) $(INTERNAL_SHARED_LIBRARY)
#post targets
all::
#custom clean targets
clean::
###########################################################################################################
#Everything past this point is internal BS, probably best not to touch it unless you know what you're doing
@@ -74,16 +92,6 @@ endif #windows
.DEFAULT_GOAL::=all
#setup the actual output library name depending on shared/static and windows/anything else
ifeq ($(WINDOWS),1)
INTERNAL_SHARED_LIBRARY::=lib$(MAIN_LIBRARY).a
else
INTERNAL_SHARED_LIBRARY::=lib$(MAIN_LIBRARY).so
endif
SHARED_LIBRARY_FLAGS=-fPIC
DLLOUT::=$(MAIN_LIBRARY).dll
INTERNAL_STATIC_LIBRARY::=lib$(MAIN_LIBRARY).a
#system dependant bullshit
ifeq ($(OS),Windows_NT)
#windows' cmd commands
@@ -113,7 +121,6 @@ endif
ifeq ($(RELEASE),1)
#a lot of false strict aliasing warnings from gcc 9
COMPILER_FLAGS+=-O2 -Wno-strict-aliasing
POST_TARGETS+= do_strip
else ifeq ($(MEMCHK),1)
#use asan to check memory leaks/invalid accesses
LDFLAGS+=-fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls
@@ -123,118 +130,101 @@ else
COMPILER_FLAGS+=-O0 -g3 -ggdb
endif
ifeq ($(SAVECFLAGS),1)
ifeq ($(SAVEFLAGS),1)
CFLAGS_TMPFILE::=.cflags.tmp
LDFLAGS_TMPFILE::=.ldflags.tmp
OLD_COMPILEFLAGS::=$(file <$(CFLAGS_TMPFILE))
OLD_LINKFLAGS::=$(file <$(LDFLAGS_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,$@))"
ifeq ($(WINDOWS),1)
INTERNAL_LINKFLAGS=-Wl,--out-implib,"lib$(MAIN_LIBRARY).a" $(foreach dir,$(LIBDIRS),-L"$(dir)")
else
INTERNAL_LINKFLAGS=$(foreach dir,$(LIBDIRS),-L"$(dir)")
ifeq ($(SHARED),1)
INTERNAL_COMPILERFLAGS+=$(SHARED_LIBRARY_FLAGS)
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)))))
STATIC_OBJECTS::=$(addprefix $(OBJDIR)/static/,$(subst \,.,$(subst /,.,$(addsuffix .o,$(INTERNAL_SOURCES)))))
SHARED_OBJECTS::=$(addprefix $(OBJDIR)/shared/,$(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 -e -f "$(THIS_MAKEFILE_NAME)"
#just a variable for a newline
define \n
endef
.PHONY: cflags-update
cflags-update:
ifeq ($(SAVECFLAGS),1)
ifeq ($(SAVEFLAGS),1)
ifneq ($(subst -MF"$(DEPDIR)/",-MF"$(DEPDIR)/cflags-update",$(ALL_COMPILEFLAGS)),$(OLD_COMPILEFLAGS))
$(file >$(CFLAGS_TMPFILE),$(ALL_COMPILEFLAGS))
endif
$(CFLAGS_TMPFILE): cflags-update
endif
#default target: run targets in PRE_TARGETS, then build the main library, then POST_TARGETS
.PHONY: all
all: cflags-update
$(foreach target,$(PRE_TARGETS),@$(MAKE) $(SUBMAKE_ARGUMENTS) "$(target)"$(\n))
ifeq ($(SHARED),1)
ifeq ($(WINDOWS),1)
@$(MAKE) $(SUBMAKE_ARGUMENTS) "$(DLLOUT)"
else #windows
@$(MAKE) $(SUBMAKE_ARGUMENTS) "$(INTERNAL_SHARED_LIBRARY)"
endif #windows
endif #shared
ifeq ($(STATIC),1)
ifeq ($(SHARED),1)
@$(MAKE) $(SUBMAKE_ARGUMENTS) "object_clean"
endif #shared
@$(MAKE) $(SUBMAKE_ARGUMENTS) "$(INTERNAL_STATIC_LIBRARY)" SHARED=0
endif #static
$(foreach target,$(POST_TARGETS),@$(MAKE) $(SUBMAKE_ARGUMENTS) "$(target)"$(\n))
.PHONY: ldflags-update
ldflags-update:
ifeq ($(SAVEFLAGS),1)
ifneq ($(ALL_LINKFLAGS),$(OLD_LINKFLAGS))
$(file >$(LDFLAGS_TMPFILE),$(ALL_LINKFLAGS))
endif
$(LDFLAGS_TMPFILE): ldflags-update
endif
.PHONY: flags-update
flags-update: cflags-update ldflags-update
ifeq ($(WINDOWS),1)
#target for windows shared library
$(DLLOUT): $(OBJECTS)
$(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) $(ALL_LINKFLAGS) $(LDLIBS)
endif #windows
#target for shared library
$(INTERNAL_SHARED_LIBRARY): $(SHARED_OBJECTS) $(LDFLAGS_TMPFILE)
$(COMPILER) -shared -o "$@" $(SHARED_OBJECTS) -fPIC $(ALL_LINKFLAGS) $(LDLIBS)
ifeq ($(RELEASE),1)
$(STRIP) --strip-debug "$@"
endif
#target for static library
$(INTERNAL_STATIC_LIBRARY): $(OBJECTS)
$(INTERNAL_STATIC_LIBRARY): $(STATIC_OBJECTS)
$(AR) rcs "$@" $^
$(RANLIB) "$@"
#Called in POST_TARGETS when RELEASE=1
.PHONY: do_strip
do_strip:
ifeq ($(SHARED),1)
$(STRIP) --strip-debug "$(INTERNAL_SHARED_LIBRARY)"
endif
ifeq ($(STATIC),1)
$(STRIP) --strip-debug "$(INTERNAL_STATIC_LIBRARY)"
endif
#Object target recipe
define GENERATE_OBJECTS
$$(OBJDIR)/$(subst \,.,$(subst /,.,$(1))).%.o: $(1)/% $(CFLAGS_TMPFILE)
$$(COMPILER) $$(ALL_COMPILEFLAGS) "$$<" -o "$$@"
define GENERATE_SHARED_OBJECTS
$$(OBJDIR)/shared/$(subst \,.,$(subst /,.,$(1))).o: $(1) $(CFLAGS_TMPFILE)
$$(COMPILER) $$(ALL_COMPILEFLAGS) -fPIC "$$<" -o "$$@"
endef
define GENERATE_INDIVIDUAL_OBJECTS
$$(OBJDIR)/$(subst \,.,$(subst /,.,$(1))).o: $(1) $(CFLAGS_TMPFILE)
#Object target recipe
define GENERATE_STATIC_OBJECTS
$$(OBJDIR)/static/$(subst \,.,$(subst /,.,$(1))).o: $(1) $(CFLAGS_TMPFILE)
$$(COMPILER) $$(ALL_COMPILEFLAGS) "$$<" -o "$$@"
endef
#Create targets for object files
$(foreach dir,$(SOURCE_DIRS),$(eval $(call GENERATE_OBJECTS,$(dir))))
$(foreach src,$(SOURCES),$(eval $(call GENERATE_INDIVIDUAL_OBJECTS,$(src))))
$(OBJECTS): | $(OBJDIR) $(DEPDIR)
ifeq ($(SHARED),1)
$(foreach src,$(INTERNAL_SOURCES),$(eval $(call GENERATE_SHARED_OBJECTS,$(src))))
endif
ifeq ($(STATIC),1)
$(foreach src,$(INTERNAL_SOURCES),$(eval $(call GENERATE_STATIC_OBJECTS,$(src))))
endif
$(STATIC_OBJECTS): | $(OBJDIR)/static $(DEPDIR)
$(SHARED_OBJECTS): | $(OBJDIR)/shared $(DEPDIR)
$(OBJDIR):
$(call mkdir,"$@")
$(OBJDIR)/static: $(OBJDIR)
$(call mkdir,"$@")
$(OBJDIR)/shared: $(OBJDIR)
$(call mkdir,"$@")
$(DEPDIR):
$(call mkdir,"$@")
.PHONY: object_clean
object_clean:
$(call rmdir,"$(OBJDIR)")
.PHONY: clean
clean: object_clean
$(foreach target,$(CLEAN_TARGETS),@$(MAKE) $(SUBMAKE_ARGUMENTS) "$(target)"$(\n))
clean::
$(call rmdir,"$(OBJDIR)")
$(call rmdir,"$(DEPDIR)")
$(call rm,"lib$(MAIN_LIBRARY).so")
$(call rm,"lib$(MAIN_LIBRARY).a")
$(call rm,"$(DLLOUT)")
ifeq ($(SAVECFLAGS),1)
$(call rm,"$(MAIN_LIBRARY).dll")
ifeq ($(SAVEFLAGS),1)
$(call rm,"$(CFLAGS_TMPFILE)")
$(call rm,"$(LDFLAGS_TMPFILE)")
endif
#header file dep tracking