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:
156
makefile.library
156
makefile.library
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user