一个高级的makefile文件

该Makefile适用于最后生成若干个可执行文件的小型C/C++工程,只要将该Makefile放在源码根目录下make,它会自动查找该目录下(包括子目录)的所有源码文件(支持.cpp .c .h格式)并自动生成正确的依赖关系,并且为了不污染源码文件夹,源码和编译过程中的中间文件会分开(Debug模式编译生成的中间文件在Debug目录下,Release模式在Release目录下)。

 1 ###########################################################
 2 #
 3 # MAKEFILE FOR C/C++ PROJECT
 4 # Author: Abbey ([email protected])
 5 # Date:   2014/07/07
 6 #
 7 ###########################################################
 8
 9 .PHONY: all clean
10 all:
11
12 # annotation when release version
13 DEBUG       := y
14 TARGET_PROG := main
15
16 # project directory
17 DEBUG_DIR   := ./Debug
18 RELEASE_DIR := ./Release
19 BIN_DIR     := $(if $(DEBUG), $(DEBUG_DIR), $(RELEASE_DIR))
20
21 # shell command
22 CC    := gcc
23 CXX   := g++
24 RM    := rm -rf
25 MKDIR := mkdir -p
26 SED   := sed
27 MV    := mv
28
29 # init sources & objects & depends
30 sources_all := $(shell find . -name "*.c" -o -name "*.cpp" -o -name "*.h")
31 sources_c   := $(filter %.c, $(sources_all))
32 sources_cpp := $(filter %.cpp, $(sources_all))
33 sources_h   := $(filter %.h, $(sources_all))
34 objs        := $(addprefix $(BIN_DIR)/,$(strip $(sources_cpp:.cpp=.o) $(sources_c:.c=.o)))
35 deps        := $(addprefix $(BIN_DIR)/,$(strip $(sources_cpp:.cpp=.d) $(sources_c:.c=.d)))
36
37 # create directory
38 $(foreach dirname,$(sort $(dir $(sources_c) $(sources_cpp))),39   $(shell $(MKDIR) $(BIN_DIR)/$(dirname)))
40
41 # complie & link variable
42 CFLAGS     := $(if $(DEBUG),-g -O, -O2)
43 CFLAGS     += $(addprefix -I ,$(sort $(dir $(sources_h))))
44 CXXFLAGS    = $(CFLAGS)
45 LDFLAGS    :=
46 LOADLIBES  += #-L/usr/include/mysql
47 LDLIBS     += #-lpthread -lmysqlclient
48
49 # add vpath
50 vpath %.h $(sort $(dir $(sources_h)))
51 vpath %.c $(sort $(dir $(sources_c)))
52 vpath %.cpp $(sort $(dir $(sources_cpp)))
53
54 # generate depend files
55 # actually generate after object generated, beacasue it only used when next make)
56 ifneq "$(MAKECMDGOALS)" "clean"
57 sinclude $(deps)
58 endif
59
60 # make-depend(depend-file,source-file,object-file,cc)
61 define make-depend
62   $(RM) $1;                                     63   $4 $(CFLAGS) -MM $2 |                         64   $(SED) ‘s,\($(notdir $3)\): ,$3: ,‘ > $1.tmp; 65   $(SED) -e ‘s/#.*//‘                           66          -e ‘s/^[^:]*: *//‘                     67          -e ‘s/ *\\$//‘                        68          -e ‘/^$/ d‘                           69          -e ‘s/$/ :/‘ < $1.tmp >> $1.tmp;      70   $(MV) $1.tmp $1;
71 endef
72
73 # rules to generate objects file
74 $(BIN_DIR)/%.o: %.c
75         @$(call make-depend,$(patsubst %.o,%.d,[email protected]),[        DISCUZ_CODE_0        ]lt;,[email protected],$(CC))
76         $(CC) $(CFLAGS) -o [email protected] -c [        DISCUZ_CODE_0        ]lt;
77
78 $(BIN_DIR)/%.o: %.cpp
79         @$(call make-depend,$(patsubst %.o,%.d,[email protected]),[        DISCUZ_CODE_0        ]lt;,[email protected],$(CXX))
80         $(CXX) $(CXXFLAGS) -o [email protected] -c [        DISCUZ_CODE_0        ]lt;
81
82 # add-target(target,objs,cc)
83 define add-target
84   REAL_TARGET += $(BIN_DIR)/$1
85   $(BIN_DIR)/$1: $2
86         $3 $(LDFLAGS) $^ $(LOADLIBES) $(LDLIBS) -o [email protected]
87 endef
88
89 # call add-target
90 $(foreach targ,$(TARGET_PROG),$(eval $(call add-target,$(targ),$(objs),$(CXX))))
91
92 all: $(REAL_TARGET) $(TARGET_LIBS)
93
94 clean:
95         $(RM) $(BIN_DIR)

一个高级的makefile文件,布布扣,bubuko.com

时间: 2024-10-10 07:26:32

一个高级的makefile文件的相关文章

编写一个通用的Makefile文件

1.1在这之前,我们需要了解程序的编译过程 a.预处理:检查语法错误,展开宏,包含头文件等 b.编译:*.c-->*.S c.汇编:*.S-->*.o d.链接:.o +库文件=*.exe 1.2体验在VC下程序的编译 a.先编译,在链接 b.修改了哪个文件,就单独编译此文件,在链接 c.修改了哪个头文件,就单独编译使用该头文件的源文件,在链接 1.3在linux下实现上述要求 2.编写一个测试的Makefile 2.1直接编译链接 1 gcc -o test a.c b.c 缺点:改变其中一

Linux C编程学习4---多文件项目管理、Makefile、一个通用的Makefile

GNU Make简介 大型项目的开发过程中,往往会划分出若干个功能模块,这样可以保证软件的易维护性. 作为项目的组成部分,各个模块不可避免的存在各种联系,如果其中某个模块发生改动,那么其他的模块需要相应的更新.如果通过手动去完成这个工作的话,对于小型的项目可能还行,但是对于比较大型的项目就几乎是不可能的. 因此Linux 系统提供了一个自动维护和生成目标程序的工具 make,它可以根据各个模块的更改情况去重新编译连接目标代码 Make 工具的作用就是实现编译连接过程的自动化.它定义了一种语言,用

工程管理之makefile与自动创建makefile文件过程

(风雪之隅 http://www.laruence.com/2009/11/18/1154.html) Linux Makefile自动编译和链接使用的环境 想知道到Linux Makefile系统的真相么,想知道Linux Makefile系统中藏有的内在奥义么,只有我来给大家全面讲解介绍Linux Makefile系统作为Linux下的程序开发人员,大家一定都遇到过Linux Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Linux Mak

教会你如何编写makefile文件

最近一直在学习makefile是如何编写的.当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷.linux有一个自带的make命令,它让你的工作省去了很大的力气,但是你要学习如何编写makefile文件. makefile是一种特殊的文件格式,他将会帮你自动管理你的项目,很强大. 下面通过实例一步步讲解如何使用makefile.下面的四段代码. //main.cpp #include "functions.h" int mai

自建工程makefile文件

自建工程makefile文件 前言:本人是linux开发C++工程师,最近心血来潮从0学习了Makefile.在网上搜索了N篇资料.终于写了一个符合自己需求的Makefile. 需求: 自建一个工程,工程目录树: . ├── bin │   └── libPubClass.so ├── Makefile ├── objs │   ├── pubclass │   │   └── deamon │   └── util │   └── deamon │   ├── deamon.d │   └──

如何编写makefile文件

最近一直在学习makefile是如何编写的. 当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷.linux有一个自带的make命令,它让你的工作省去了很大的力气,但是你要学习如何编写makefile文件. makefile是一种特殊的文件格式,他将会帮你自动管理你的项目,很强大.它是这样工作的: 1.make会在当前目录下找名字叫“Makefile”或“makefile”的文件.    2.如果找到,它会找文件中的第一个目标文件(ta

【LINUX网络编程】Makefile文件

<Linux网络编程>(第二版) 第2章的一些读书笔记 ↓ Makefile:在一个含有较多文件的工程中,定义一系列规则来指定编译文件的顺序,可用于管理工程. Makefile指定了工程中的哪些源文件需要编译以及如何编译.需要创建那些库文件以及如何创建这些库文件.如何最后产生我们想要的可执行文件.为工程编写Makefile 的好处是能够使用一行命令来完成“自动化编译”,编译整个工程你所要做的唯一的一件事就是在shell 提示符下输入make命令,整个工程就完全自动编译. 首先来看一下Linux

[转]makefile文件的编写规则及实例

http://xueqi.iteye.com/blog/1567866 1.一个简单的makefile例子 假设一个程序有两个文件file1.c,file2.c,每个文件都包含head.h,生成file可执行文件 file:file1.o file2.o                  附属行(文件的依存关系) gcc -o file1.o file2.o            命令行 file1.o:file1.c head.h gcc -c file1.c file2.o:file2.c

project管理之makefile与自己主动创建makefile文件过程

(风雪之隅 http://www.laruence.com/2009/11/18/1154.html) Linux Makefile自己主动编译和链接使用的环境 想知道到Linux Makefile系统的真相么,想知道Linux Makefile系统中藏有的内在奥义么,仅仅有我来给大家全面解说介绍Linux Makefile系统作为Linux下的程序开发者,大家一定都遇到过Linux Makefile,用make命令来编译自己写的程序确实是非常方便.普通情况下,大家都是手工写一个简单Linux