歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

一個通用的C/C++ Makefile

寫了一個通用的GNU/Linux環境下的Makefile。

該Makefile適用於最後生成若干個可執行文件的小型C/C++工程,只要將該Makefile放在源碼根目錄下make,它會自動查找該目錄下(包括子目錄)的所有源碼文件(支持.cpp .c .h格式)並自動生成正確的依賴關系,並且為了不污染源碼文件夾,源碼和編譯過程中的中間文件會分開(Debug模式編譯生成的中間文件在Debug目錄下,Release模式在Release目錄下)。

試了幾個之前寫過的Project,都是OK的。

###########################################################
#
# MAKEFILE FOR C/C++ PROJECT
# Author: swm8023 <[email protected]>
# Date:  2014/01/30
#
###########################################################

.PHONY: all clean
all:

# annotation when release version
DEBUG      := y
TARGET_PROG := main

# project directory 
DEBUG_DIR  := ./Debug
RELEASE_DIR := ./Release
BIN_DIR    := $(if $(DEBUG), $(DEBUG_DIR), $(RELEASE_DIR))

# shell command
CC    := gcc
CXX  := g++
RM    := rm -rf
MKDIR := mkdir -p
SED  := sed
MV    := mv

# init sources & objects & depends
sources_all := $(shell find . -name "*.c" -o -name "*.cpp" -o -name "*.h")
sources_c  := $(filter %.c, $(sources_all))
sources_cpp := $(filter %.cpp, $(sources_all))
sources_h  := $(filter %.h, $(sources_all))
objs        := $(addprefix $(BIN_DIR)/,$(strip $(sources_cpp:.cpp=.o) $(sources_c:.c=.o)))
deps        := $(addprefix $(BIN_DIR)/,$(strip $(sources_cpp:.cpp=.d) $(sources_c:.c=.d)))

# create directory
$(foreach dirname,$(sort $(dir $(sources_c) $(sources_cpp))),\
  $(shell $(MKDIR) $(BIN_DIR)/$(dirname)))

# complie & link variable
CFLAGS    := $(if $(DEBUG),-g -O, -O2)
CFLAGS    += $(addprefix -I ,$(sort $(dir $(sources_h))))
CXXFLAGS    = $(CFLAGS)
LDFLAGS    :=
LOADLIBES  += #-L/usr/include/mysql
LDLIBS    += #-lpthread -lmysqlclient

# add vpath
vpath %.h $(sort $(dir $(sources_h)))
vpath %.c $(sort $(dir $(sources_c)))
vpath %.cpp $(sort $(dir $(sources_cpp)))

# generate depend files
# actually generate after object generated, beacasue it only used when next make)
ifneq "$(MAKECMDGOALS)" "clean"
sinclude $(deps)
endif

# make-depend(depend-file,source-file,object-file,cc)
define make-depend
  $(RM) $1;                                    \
  $4 $(CFLAGS) -MM $2 |                        \
  $(SED) 's,\($(notdir $3)\): ,$3: ,' > $1.tmp; \
  $(SED) -e 's/#.*//'                          \
        -e 's/^[^:]*: *//'                    \
        -e 's/ *\\$$//'                        \
        -e '/^$$/ d'                          \
        -e 's/$$/ :/' < $1.tmp >> $1.tmp;      \
  $(MV) $1.tmp $1;
endef

# rules to generate objects file
$(BIN_DIR)/%.o: %.c
 @$(call make-depend,$(patsubst %.o,%.d,$@),$<,$@,$(CC))
 $(CC) $(CFLAGS) -o $@ -c $<

$(BIN_DIR)/%.o: %.cpp
 @$(call make-depend,$(patsubst %.o,%.d,$@),$<,$@,$(CXX))
 $(CXX) $(CXXFLAGS) -o $@ -c $<

# add-target(target,objs,cc)
define add-target
  REAL_TARGET += $(BIN_DIR)/$1
  $(BIN_DIR)/$1: $2
 $3 $(LDFLAGS) $$^ $(LOADLIBES) $(LDLIBS) -o $$@
endef

# call add-target
$(foreach targ,$(TARGET_PROG),$(eval $(call add-target,$(targ),$(objs),$(CXX))))

all: $(REAL_TARGET) $(TARGET_LIBS)

clean:
 $(RM) $(BIN_DIR)

用於編譯C/C++的一個通用Makefile文件  http://www.linuxidc.com/Linux/2011-09/43992.htm

Copyright © Linux教程網 All Rights Reserved