1、為每個源檔案產生一個可執行程式
使用情境:目錄下的所有源檔案都能產生可執行程式。如在做《C++ Primer》練習時,每個練習都是一個獨立的小程式,不必為每個練習編寫一個Makefile,也不必為每個練習執行g++編譯。
CC :=gcc CFLAGS := -g -Wall SOURCES := $(wildcard *.c)TARGETS := $(patsubst %.c,%,$(SOURCES))#define a functiondefine MAKE_EACH_SRC_BIN$1:$1.c$(CC) $(CFLAGS) $< -o $@endefall:$(TARGETS)$(foreach target,$(TARGETS),$(call MAKE_EACH_SRC_BIN $(target)))clean:rm -rf $(TARGETS)
2、通用性較強的Makefile
使用情境:可以應對大多數類型的工程,包含多個目錄的工程,不必為每個目錄編寫一個Makefile。自動產生標頭檔依賴,不必因改變標頭檔而make clean。
GROOT :=$(shell pwd)PROGRAM := ikedSRCDIRS := . ./isakmp ./ikev1 ./cryptoSRCEXTS := .c .ccCPPFLAGS := -Wall -Werror -g -m32CFLAGS := CFLAGS += CXXFLAGS := -I/usr/local/openssl/includeCXXFLAGS += -I$(GROOT)/ -I$(GROOT)/isakmp -I$(GROOT)/crypto -I$(GROOT)/ikev1LDFLAGS := -lpthread -L/usr/local/openssl/lib -lcrypto -ldlLDFLAGS += -m32 #CC = gcc #CXX = g++ #CC = $(CXX) #CFLAGS = $(CXXFLAGS) #RM = rm -fSHELL = /bin/sh SOURCES = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS)))) OBJS = $(foreach x,$(SRCEXTS), $(patsubst %$(x),%.o,$(filter %$(x),$(SOURCES))))DEPS = $(patsubst %.o,%.d,$(OBJS)) .PHONY : all objs clean cleanall rebuild all : $(PROGRAM) %.d : %.c @$(CC) -MM -MT ${@:%.d=%.o} -MD $(CXXFLAGS) $< -o $@%.d : %.C @$(CC) -MM -MT ${@:%.d=%.o} -MD $(CXXFLAGS) $< -o $@%.d : %.cc @$(CC) -MM -MT ${@:%.d=%.o} -MD $(CXXFLAGS) $< -o $@%.d : %.cpp @$(CC) -MM -MT ${@:%.d=%.o} -MD $(CXXFLAGS) $< -o $@%.d : %.CPP @$(CC) -MM -MT ${@:%.d=%.o} -MD $(CXXFLAGS) $< -o $@%.d : %.c++ @$(CC) -MM -MT ${@:%.d=%.o} -MD $(CXXFLAGS) $< -o $@%.d : %.cp @$(CC) -MM -MT ${@:%.d=%.o} -MD $(CXXFLAGS) $< -o $@%.d : %.cxx @$(CC) -MM -MT ${@:%.d=%.o} -MD $(CXXFLAGS) $< -o $@objs : $(OBJS) %.o : %.c $(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@ %.o : %.C $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ %.o : %.cc $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ %.o : %.cpp $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ %.o : %.CPP $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ %.o : %.c++ $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ %.o : %.cp $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ %.o : %.cxx $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ $(PROGRAM) : $(OBJS) ifeq ($(strip $(SRCEXTS)), .c) # C file $(CC) -o $(PROGRAM) $(OBJS) $(LDFLAGS) else # C++ file $(CXX) -o $(PROGRAM) $(OBJS) $(LDFLAGS) endif -include $(DEPS) rebuild: clean all clean : @$(RM) $(OBJS) $(DEPS) cleanall: clean @$(RM) $(PROGRAM) $(PROGRAM).exe