LIBGL := -lGL -lGLU LIBSDL := `sdl-config --libs` LIBS := ${LIBSDL} ${LIBGL} OPTFLAGS := -O2 DBGFLAGS := -ggdb PRFFLAGS := ${DBGFLAGS} -pg MYFLAGS := -Wall -pedantic -ansi VALFLAGS := --leak-check=full CXXFLAGS := ${MYFLAGS} ${DBGFLAGS} CXX := g++ DIRS := # := start SRCSDIR := src/ SRCS := # := start OBJSDIR := objsd/ OBJS := # := start DEPSDIR := deps/ DEPS := # := start # include all of the dir.mk DIRMK := dir.mk include ${SRCSDIR}${DIRMK} WORKINGDIR := bind/ CFGDIRNAME := configs/ SRCCFGDIR := ${CFGDIRNAME} DSTCFGDIR := ${WORKINGDIR}${CFGDIRNAME} CFGS := # := start CFGS += keys.cfg CFGS := $(addprefix ${DSTCFGDIR},${CFGS}) TARGETNAME := run_physics TARGETTMP := ${OBJSDIR}${TARGETNAME} TARGET := ${WORKINGDIR}${TARGETNAME} DEPSBLDDIRS := ${DEPSDIR} $(addprefix ${DEPSDIR},${DIRS}) OBJSBLDDIRS := ${OBJSDIR} $(addprefix ${OBJSDIR},${DIRS}) BLDDIRS := ${OBJSBLDDIRS} ${DEPSBLDDIRS} ${WORKINGDIR} ${DSTCFGDIR} INCDIRS := ${SRCSDIR} PRNTFMT := printf "%-5s: %s\n" VERBOSE := 0 ifeq (${VERBOSE},0) # quiet the printf command Q1 := @ # quiet the command that is `replaced' by an echo Q2 := @ else # EAT the printf command as if it was not there Q1 := @true # NOTE: the space between @true and the # is VERY important!! # do not quiet the command output Q2 := endif .PHONY: all all: ${TARGET} ${CFGS} # how to link the main target ${TARGETTMP}: ${OBJS} ${Q1}${PRNTFMT} "${CXX}" "$@" ${Q2}${CXX} ${CXXFLAGS} -o $@ $^ ${LIBS} # rule to copy tmp target to working directory ${TARGET}: ${TARGETTMP} | ${WORKINGDIR} ${Q1}${PRNTFMT} "cp" "$@" ${Q2}cp $< $@ # how to make a directory ${BLDDIRS}: ${Q1}${PRNTFMT} "mkdir" "$@" ${Q2}mkdir -p $@ #${SRCSDIR}%.cpp: ${SRCSDIR}%.h # cause the below directory rules to work out .SECONDEXPANSION: # rule to make an object file from a .cpp ${OBJSDIR}%.o: ${SRCSDIR}%.cpp | $$(dir $$@) ${Q1}${PRNTFMT} "${CXX}" "$@" ${Q2}${CXX} ${CXXFLAGS} -c -o $@ $< -I "${INCDIRS}" # rule to make a depend file from a .cpp # be clever and escape the / chars in file paths # DON'T simply use another sed delimiter or it can't appear in the file paths ${DEPSDIR}%.d: ${SRCSDIR}%.cpp | $$(dir $$@) ${Q1}${PRNTFMT} "DEP" "$@" ${Q2}${CXX} -MM ${CXXFLAGS} $< -I "${INCDIRS}" | \ sed 's/\(^.*\):/$(subst /,\/,${OBJSDIR}\1 $@):/' > $@ # rule to copy the config files into the working directory ${DSTCFGDIR}%.cfg: ${SRCCFGDIR}%.cfg | $$(dir $$@) ${Q1}${PRNTFMT} "cp" "$@" ${Q2}cp $< $@ .PHONY: clean clean: ${Q1}${PRNTFMT} "rm" "${OBJSDIR}" ${Q2}rm -rf ${OBJSDIR} ${Q1}${PRNTFMT} "rm" "${TARGET} ${TARGETTMP}" ${Q2}rm -f ${TARGET} .PHONY: distclean distclean: clean ${Q1}${PRNTFMT} "rm" "${DEPSDIR}" ${Q2}rm -rf ${DEPSDIR} ${Q1}${PRNTFMT} "rm" "tags prof gmon.out" ${Q2}rm -f tags prof gmon.out .PHONY: gitclean gitclean: ${Q1}${PRNTFMT} "git clean" "showing; use gitcleanf to force removal" ${Q2}git clean -nxd .PHONY: gitcleanf gitcleanf: ${Q1}${PRNTFMT} "git clean" "forcing" ${Q2}git clean -fxd .PHONY: tar tar: physics.tar.bz2 .PHONY: physics.tar.bz2 physics.tar.bz2: @${PRNTFMT} "git archive" "Warning, archives HEAD not current" ${Q1}${PRNTFMT} "git archive" "physics.tar.bz2" ${Q2}git archive --prefix=physics/ HEAD | bzip2 > physics.tar.bz2 .PHONY: run run: all cd ${WORKINGDIR}; ./${TARGETNAME} .PHONY: gdb gdb: all cd ${WORKINGDIR}; gdb ${TARGETNAME} .PHONY: cgdb cgdb: all cd ${WORKINGDIR}; cgdb ${TARGETNAME} .PHONY: val val: all cd ${WORKINGDIR}; valgrind ${VALFLAGS} ./${TARGETNAME} .PHONY: prof prof: run cd ${WORKINGDIR}; gprof -b ${TARGETNAME} > prof cd ${WORKINGDIR}; kprof -f prof MINGMAKEARGS := "LIBGL := -lopengl32 -lglu32" \ "LIBSDL := `/usr/mingw32/bin/sdl-config --libs`" \ "CXXFLAGS := ${OPTFLAGS}" \ "CXX := mingw32-g++" \ "OBJSDIR := objs-mingw32/" \ "WORKINGDIR := bin-mingw32/" \ "TARGETNAME := run_physics.exe" .PHONY: mingw32 mingw32: ${Q1}${PRNTFMT} "make" "mingw32" ${Q2}${MAKE} ${MINGMAKEARGS} clean all FINALMAKEARGS := "CXXFLAGS := ${OPTFLAGS}" \ "OBJSDIR := objs/" \ "WORKINGDIR := bin/" .PHONY: final final: ${Q1}${PRNTFMT} "make" "final" ${Q2}${MAKE} ${FINALMAKEARGS} clean all -include ${DEPS}