## ## Template makefile for Standard, Profile, Debug, Release, and Release-static versions ## ## eg: "make rs" for a statically linked release version. ## "make d" for a debug version (no optimizations). ## "make" for the standard version (optimized, but with debug information and assertions active) PWD = $(shell pwd) EXEC ?= $(notdir $(PWD)) CSRCS = $(wildcard $(PWD)/*.cc) DSRCS = $(foreach dir, $(DEPDIR), $(filter-out $(MROOT)/$(dir)/Main.cc, $(wildcard $(MROOT)/$(dir)/*.cc))) CHDRS = $(wildcard $(PWD)/*.h) COBJS = $(CSRCS:.cc=.o) $(DSRCS:.cc=.o) PCOBJS = $(addsuffix p, $(COBJS)) DCOBJS = $(addsuffix d, $(COBJS)) RCOBJS = $(addsuffix r, $(COBJS)) CXX ?= g++ CFLAGS ?= -Wall -Wno-parentheses -std=c++11 LFLAGS ?= -Wall -lpthread COPTIMIZE ?= -O3 CFLAGS += -I$(MROOT) -D __STDC_LIMIT_MACROS -D __STDC_FORMAT_MACROS LFLAGS += -lz .PHONY : s p d r rs clean s: $(EXEC) p: $(EXEC)_profile d: $(EXEC)_debug r: $(EXEC)_release rs: $(EXEC)_static libs: lib$(LIB)_standard.a libp: lib$(LIB)_profile.a libd: lib$(LIB)_debug.a libr: lib$(LIB)_release.a ## Compile options %.o: CFLAGS +=$(COPTIMIZE) -g -D DEBUG %.op: CFLAGS +=$(COPTIMIZE) -pg -g -D NDEBUG %.od: CFLAGS +=-O0 -g -D DEBUG %.or: CFLAGS +=$(COPTIMIZE) -g -D NDEBUG ## Link options $(EXEC): LFLAGS += -g $(EXEC)_profile: LFLAGS += -g -pg $(EXEC)_debug: LFLAGS += -g #$(EXEC)_release: LFLAGS += ... $(EXEC)_static: LFLAGS += --static ## Dependencies $(EXEC): $(COBJS) $(EXEC)_profile: $(PCOBJS) $(EXEC)_debug: $(DCOBJS) $(EXEC)_release: $(RCOBJS) $(EXEC)_static: $(RCOBJS) lib$(LIB)_standard.a: $(filter-out */Main.o, $(COBJS)) lib$(LIB)_profile.a: $(filter-out */Main.op, $(PCOBJS)) lib$(LIB)_debug.a: $(filter-out */Main.od, $(DCOBJS)) lib$(LIB)_release.a: $(filter-out */Main.or, $(RCOBJS)) ## Build rule %.o %.op %.od %.or: %.cc @echo Compiling: $(subst $(MROOT)/,,$@) @$(CXX) $(CFLAGS) -c -o $@ $< ## Linking rules (standard/profile/debug/release) $(EXEC) $(EXEC)_profile $(EXEC)_debug $(EXEC)_release $(EXEC)_static: @echo Linking: "$@ ( $(foreach f,$^,$(subst $(MROOT)/,,$f)) )" @$(CXX) $^ $(LFLAGS) -o $@ ## Library rules (standard/profile/debug/release) lib$(LIB)_standard.a lib$(LIB)_profile.a lib$(LIB)_release.a lib$(LIB)_debug.a: @echo Making library: "$@ ( $(foreach f,$^,$(subst $(MROOT)/,,$f)) )" @$(AR) -rcsv $@ $^ ## Library Soft Link rule: libs libp libd libr: @echo "Making Soft Link: $^ -> lib$(LIB).a" @ln -sf $^ lib$(LIB).a ## Clean rule allclean: clean @rm -f ../simp/*.o ../simp/*.or ../simp/*.od ../core/*.o ../core/*.or ../core/*.od clean: rm -f $(EXEC) $(EXEC)_profile $(EXEC)_debug $(EXEC)_release $(EXEC)_static \ $(COBJS) $(PCOBJS) $(DCOBJS) $(RCOBJS) *.core depend.mk ## Make dependencies depend.mk: $(CSRCS) $(CHDRS) @echo Making dependencies @$(CXX) $(CFLAGS) -I$(MROOT) \ $(CSRCS) -MM | sed 's|\(.*\):|$(PWD)/\1 $(PWD)/\1r $(PWD)/\1d $(PWD)/\1p:|' > depend.mk @for dir in $(DEPDIR); do \ if [ -r $(MROOT)/$${dir}/depend.mk ]; then \ echo Depends on: $${dir}; \ cat $(MROOT)/$${dir}/depend.mk >> depend.mk; \ fi; \ done -include $(MROOT)/mtl/config.mk -include depend.mk