# Last edited on 2011-09-15 17:32:12 by stolfilocal ############################################################################# # # Generic Makefile for C/C++ Program # # License: GPL (General Public License) # Author: whyglinux # Date: 2006/03/04 (version 0.1) # 2007/03/24 (version 0.2) # 2007/04/09 (version 0.3) # 2007/06/26 (version 0.4) # 2008/04/05 (version 0.5) # # Description: # ------------ # This is an easily customizable makefile template. The purpose is to # provide an instant building environment for C/C++ programs. # # It searches all the C/C++ source files in the specified directories, # makes dependencies, compiles and links to form an executable. # # Besides its default ability to build C/C++ programs which use only # standard C/C++ libraries, you can customize the Makefile to build # those using other libraries. Once done, without any changes you can # then build programs using the same or less libraries, even if source # files are renamed, added or removed. Therefore, it is particularly # convenient to use it to build codes for experimental or study use. # # GNU make is expected to use the Makefile. Other versions of makes # may or may not work. # # Usage: # ------ # 1. Copy the Makefile to your program directory. # 2. Customize in the "Customizable Section" only if necessary: # * to use non-standard C/C++ libraries, set pre-processor or compiler # options to and linker ones to # (See Makefile.gtk+-2.0 for an example) # * to search sources in more directories, set to # * to specify your favorite program name, set to # 3. Type make to start building your program. # # Make Target: # ------------ # The Makefile provides the following targets to make: # $ make compile and link # $ make NODEP=yes compile and link without generating dependencies # $ make objs compile only (no linking) # $ make tags create tags for Emacs editor # $ make ctags create ctags for VI editor # $ make clean clean objects and the executable file # $ make distclean clean objects, the executable and dependencies # $ make help get the usage of the makefile # #=========================================================================== ## Customizable Section: adapt those variables to suit your program. ##========================================================================== PROGRAMS := plotawavelet adamulcompdg # The pre-processor and compiler options. MY_CFLAGS := # The linker options. MY_LIBS := # The pre-processor options used by the cpp (man cpp for more). CPPFLAGS := -Wall -I. # The options used in linking as well as in any direct use of ld. LDFLAGS := -pg -O2 -lm -lrt # The directories in which source files reside. # If not specified, only the current directory will be serached. SRCDIRS := ## Implicit Section: change the following only when necessary. ##========================================================================== # The source file types (headers excluded). # .c indicates C source files, and others C++ ones. SRCEXTS := .c .C .cc .cpp .CPP .c++ .cxx .cp # The header file types. HDREXTS := .h .H .hh .hpp .HPP .h++ .hxx .hp # The pre-processor and compiler options. # Users can override those variables from the command line. CFLAGS := -O2 -pg -g CXXFLAGS:= -O2 -pg -g # The C program compiler. #CC := gcc # The C++ program compiler. #CXX := g++ # Un-comment the following line to compile C programs as C++ ones. #CC := $(CXX) # The command used to delete file. #RM := rm -f ETAGS := etags ETAGSFLAGS := CTAGS := ctags CTAGSFLAGS := ## Stable Section: usually no need to be changed. But you can add more. ##========================================================================== SHELL := /bin/sh EMPTY := SPACE := $(EMPTY) $(EMPTY) ifeq ($(SRCDIRS),) SRCDIRS := . endif SOURCES := $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS)))) HEADERS := $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(HDREXTS)))) SRC_CXX := $(filter-out %.c,$(SOURCES)) SRCNAMES := $(basename $(SOURCES)) OBJS := $(addsuffix .o, $(SRCNAMES)) DEPS := $(OBJS:.o=.d) ## Define some useful variables. DEP_OPT := $(shell if `$(CC) --version | grep "GCC" >/dev/null`; then \ echo "-MM -MP"; else echo "-M"; fi ) DEPEND := $(CC) $(DEP_OPT) $(MY_CFLAGS) $(CFLAGS) $(CPPFLAGS) DEPEND.d := $(subst -g ,,$(DEPEND)) COMPILE.c := $(CC) $(MY_CFLAGS) $(CFLAGS) $(CPPFLAGS) -c COMPILE.cxx := $(CXX) $(MY_CFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c LINK.c := $(CC) $(MY_CFLAGS) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) LINK.cxx := $(CXX) $(MY_CFLAGS) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) .PHONY: all objs tags ctags clean build-progs build-single distclean help show # Delete the default suffixes .SUFFIXES: all: build-progs build-progs: for p in ${PROGRAMS} ; do ${MAKE} PROGRAM=$$p build-single ; done # Rules for creating dependency files (.d). #------------------------------------------ %.d:%.c @echo -n $(dir $<) > $@ @$(DEPEND.d) $< >> $@ %.d:%.C @echo -n $(dir $<) > $@ @$(DEPEND.d) $< >> $@ %.d:%.cc @echo -n $(dir $<) > $@ @$(DEPEND.d) $< >> $@ %.d:%.cpp @echo -n $(dir $<) > $@ @$(DEPEND.d) $< >> $@ %.d:%.CPP @echo -n $(dir $<) > $@ @$(DEPEND.d) $< >> $@ %.d:%.c++ @echo -n $(dir $<) > $@ @$(DEPEND.d) $< >> $@ %.d:%.cp @echo -n $(dir $<) > $@ @$(DEPEND.d) $< >> $@ %.d:%.cxx @echo -n $(dir $<) > $@ @$(DEPEND.d) $< >> $@ # Rules for generating object files (.o). #---------------------------------------- objs:$(OBJS) %.o:%.c $(COMPILE.c) $< -o $@ %.o:%.C $(COMPILE.cxx) $< -o $@ %.o:%.cc $(COMPILE.cxx) $< -o $@ %.o:%.cpp $(COMPILE.cxx) $< -o $@ %.o:%.CPP $(COMPILE.cxx) $< -o $@ %.o:%.c++ $(COMPILE.cxx) $< -o $@ %.o:%.cp $(COMPILE.cxx) $< -o $@ %.o:%.cxx $(COMPILE.cxx) $< -o $@ # Rules for generating the tags. #------------------------------------- tags: $(HEADERS) $(SOURCES) $(ETAGS) $(ETAGSFLAGS) $(HEADERS) $(SOURCES) ctags: $(HEADERS) $(SOURCES) $(CTAGS) $(CTAGSFLAGS) $(HEADERS) $(SOURCES) # Rules for generating the executable. #------------------------------------- ifndef NODEP ifneq ($(DEPS),) sinclude $(DEPS) endif endif clean: $(RM) $(OBJS) $(PROGRAMS) $(PROGRAM).exe distclean: clean $(RM) $(DEPS) TAGS # Show help. help: @echo 'Generic Makefile for C/C++ Programs (gcmakefile) version 0.5' @echo 'Copyright (C) 2007, 2008 whyglinux ' @echo @echo 'Usage: make [TARGET]' @echo 'TARGETS:' @echo ' all (=make) compile and link.' @echo ' NODEP=yes make without generating dependencies.' @echo ' objs compile only (no linking).' @echo ' tags create tags for Emacs editor.' @echo ' ctags create ctags for VI editor.' @echo ' clean clean objects and the executable file.' @echo ' distclean clean objects, the executable and dependencies.' @echo ' show show variables (for debug use only).' @echo ' help print this message.' @echo @echo 'Report bugs to .' ######################################################################## # Section for recursive "make" - caller must define ${PROGRAM} ifneq "/${PROGRAM}" "/" build-single: $(PROGRAM) DOTPROGRAMS := $(addprefix ./,$(PROGRAMS)) MODULEOBJS := $(addsuffix .o,$(filter-out $(DOTPROGRAMS),$(SRCNAMES))) $(PROGRAM):$(MODULEOBJS) $(PROGRAM).o $(LINK.c) $(PROGRAM).o $(MODULEOBJS) $(MY_LIBS) -o $@ @echo Type ./$@ to execute the program. # Show variables (for debug use only.) show: @echo 'PROGRAMS :' $(PROGRAMS) @echo 'PROGRAM :' $(PROGRAM) @echo 'MODULEOBJS :' $(MODULEOBJS) @echo 'SRCDIRS :' $(SRCDIRS) @echo 'HEADERS :' $(HEADERS) @echo 'SRCNAMES :' $(SRCNAMES) @echo 'SOURCES :' $(SOURCES) @echo 'SRC_CXX :' $(SRC_CXX) @echo 'OBJS :' $(OBJS) @echo 'DEPS :' $(DEPS) @echo 'DEPEND :' $(DEPEND) @echo 'COMPILE.c :' $(COMPILE.c) @echo 'COMPILE.cxx :' $(COMPILE.cxx) @echo 'link.c :' $(LINK.c) @echo 'link.cxx :' $(LINK.cxx) endif # End recursive section ######################################################################## ## End of the Makefile ## Suggestions are welcome ## All rights reserved ## #############################################################################