From 904ecb64b4dbde392b54361761e19490d4789642 Mon Sep 17 00:00:00 2001 From: rexy712 Date: Sat, 21 Dec 2019 18:02:10 -0800 Subject: [PATCH] Change makefile to choose between c and c++ settings based on LANG variable --- makefile.basic | 57 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/makefile.basic b/makefile.basic index 2f9d058..54e3340 100644 --- a/makefile.basic +++ b/makefile.basic @@ -24,12 +24,17 @@ OBJDIR::=obj DEPDIR::=$(OBJDIR)/dep LIBDIR::=lib INCLUDE_DIRS::=include +CFLAGS::=-g -std=c18 -Wall -pedantic -Wextra CXXFLAGS::=-g -std=c++17 -Wall -pedantic -Wextra EXT::=cpp +LANG::=$(EXT) MAIN_EXECUTABLE::=tester RELEASE?=0 +MEMCHK?=0 ifneq ($(WINDOWS),1) + #*nix settings + CC::=gcc CXX::=g++ LDLIBS::= LDFLAGS::= @@ -38,7 +43,9 @@ ifneq ($(WINDOWS),1) AR?=ar AS?=as else + #windows settings MINGW_PREFIX::=x86_64-w64-mingw32- + CC::=$(MINGW_PREFIX)gcc CXX::=$(MINGW_PREFIX)g++ LDLIBS::= LDFLAGS::= @@ -49,23 +56,15 @@ else MAIN_EXECUTABLE::=$(MAIN_EXECUTABLE).exe endif -ifeq ($(RELEASE),1) - #a lot of false strict aliasing warnings from gcc 9 - CXXFLAGS+=-O2 -Wno-strict-aliasing -else ifeq ($(MEMCHK),1) - LDFLAGS+=-fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls - CXXFLAGS+=-O0 -g3 -ggdb -fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls -else - CXXFLAGS+=-O0 -g3 -ggdb -endif - ifeq ($(OS),Windows_NT) + #windows' cmd commands mkdir=mkdir $(subst /,\,$(1)) > NUL 2>&1 rm=del /F $(1) > NUL 2>&1 rmdir=rd /S /Q $(1) > NUL 2>&1 move=move /Y $(subst /,\,$(1)) $(subst /,\,$(2)) > NUL 2>&1 copy=copy /Y /B $(subst /,\,$(1)) $(subst /,\,$(2)) > NUL 2>&1 else + #*nix terminal commands mkdir=mkdir -p $(1) rm=rm -f $(1) rmdir=rm -rf $(1) @@ -73,30 +72,53 @@ else copy=cp $(1) $(2) endif -INTERNAL_CXXFLAGS=-c $(foreach dir,$(INCLUDE_DIRS),-I"$(dir)") -MMD -MP -MF"$(DEPDIR)/$(notdir $(patsubst %.o,%.d,$@))" +#setup compiler and flags based on language +ifeq ($(LANG),cpp) + COMPILER_FLAGS::=$(CXXFLAGS) + COMPILER::=$(CXX) +else ifeq ($(LANG),c) + COMPILER_FLAGS::=$(CFLAGS) + COMPILER::=$(CC) +endif + +ifeq ($(RELEASE),1) + #a lot of false strict aliasing warnings from gcc 9 + COMPLIER_FLAGS+=-O2 -Wno-strict-aliasing +else ifeq ($(MEMCHK),1) + #use asan to check memory leaks/invalid accesses + LDFLAGS+=-fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls + COMPLIER_FLAGS+=-O0 -g3 -ggdb -fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls +else + #default target + COMPILER_FLAGS+=-O0 -g3 -ggdb +endif + +#add dependency tracking and include directories +INTERNAL_COMPILERFLAGS=-c $(foreach dir,$(INCLUDE_DIRS),-I"$(dir)") -MMD -MP -MF"$(DEPDIR)/$(notdir $(patsubst %.o,%.d,$@))" SOURCES::=$(foreach source,$(SOURCE_DIRS),$(foreach ext,$(EXT),$(wildcard $(source)/*.$(ext)))) OBJECTS::=$(addprefix $(OBJDIR)/,$(subst \,.,$(subst /,.,$(addsuffix .o,$(SOURCES))))) .PHONY: all all: $(MAIN_EXECUTABLE) ifeq ($(RELEASE),1) - $(CXX) $(LDFLAGS) $^ -o "$(basename $(MAIN_EXECUTABLE))" $(LDLIBS) $(STRIP) --strip-all "$(MAIN_EXECUTABLE)" endif +#Link executable $(MAIN_EXECUTABLE): $(OBJECTS) - $(CXX) $(LDFLAGS) $^ -o "$(basename $@)" $(LDLIBS) + $(COMPILER) $(LDFLAGS) $^ -o "$(basename $@)" $(LDLIBS) +#Object target recipe define GENERATE_OBJECTS - $$(OBJDIR)/$(subst \,.,$(subst /,.,$(1))).%.o: $(1)/% - $$(CXX) $$(CXXFLAGS) $$(INTERNAL_CXXFLAGS) "$$<" -o "$$@" - + $$(COMPILER) $$(COMPILER_FLAGS) $$(INTERNAL_COMPILERFLAGS) "$$<" -o "$$@" endef +#Create targets for object files $(foreach dir,$(SOURCE_DIRS),$(eval $(call GENERATE_OBJECTS,$(dir)))) $(OBJECTS): | $(OBJDIR) $(DEPDIR) +#Output directory creation $(OBJDIR): $(call mkdir,"$@") $(DEPDIR): @@ -107,9 +129,10 @@ clean: $(call rmdir,"$(DEPDIR)") $(call rmdir,"$(OBJDIR)") $(call rm,"$(MAIN_EXECUTABLE)") -ifneq ($(OS),Windows_NT) +ifneq ($(WINDOWS),1) $(call rm,"$(MAIN_EXECUTABLE).exe") endif +#header file dep tracking -include $(wildcard $(DEPDIR)/*.d)