码迷,mamicode.com
首页 > 其他好文 > 详细

发现了一个通用的Makefile

时间:2015-11-16 18:57:36      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

即使有子文件夹也能处理。

Makefile:

.PHONY: clean all

# annotation when release version
DEBUG       :=  
TARGET_PROG := main.out

# 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))
    $(CXX) $(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)
    
clean: 
    $(RM) $(BIN_DIR)

 

看看示例工程的编译过程:

技术分享

 

编译完成后,我们看看是运行效果:

技术分享

 

 

示例工程见:百度网盘\软件源码\testGeneralMakefile.tar.gz

 

完。

 

发现了一个通用的Makefile

标签:

原文地址:http://www.cnblogs.com/liyou-blog/p/4969642.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!