Makefile之大型工程项目子目录Makefile的一种通用写法
管理Linux环境下的C/C++大型项目,如果有一个智能的Build System会起到事半功倍的效果,本文描述Linux环境下大型工程项目子目录Makefile的一种通用写法,使用该方法,当该子目录内的文件有增删时无需对Makefile进行改动,可以说相当的智能。
下面先贴代码(为减小篇幅,一些非关键的代码被去掉,本方法的局限是用于一个C文件生成一个可执行文件的场合):
ROOTDIR = .
EXE_DIR = ./bin
CFLAGS = -I$(INCLUDE_DIR) -I$(LIB_INC) -Wall
LFLAGS = -L$(LIB_DIR)
objects := $(patsubst %.c,%.o,$(wildcard *.c))
executables := $(patsubst %.c,%,$(wildcard *.c))
all : $(objects)
$(objects) :%.o : %.c
@mkdir -p ./bin$
$(CROSS_COMPILE)gcc -c $(CFLAGS) $< -o $@
$(CROSS_COMPILE)gcc $(CFLAGS) $< -o $(subst .o, ,$(EXE_DIR)/$@) $(LFLAGS) $(LIBS)
clean:
@rm -f *.o rm -f $(executables)
@rm -rf ./bin
distclean: clean
假如当前目录里面有a.c b.c两个文件
Makefile 里的函数跟它的变量很相似——使用的时候,你用一个$符号跟左圆括号,函数名,空格后跟一列由逗号分隔的参数,最后用右圆括号结束。例如,在GNU Make里有一个叫'wildcard' 的函数,它有一个参数,功能是展开成一列所有符合由其参数描述的文件名,文件间以空格间隔。像这个命令:
objects= $(wildcard *.c)
会产生一个所有以'.c' 结尾的文件列表(本例结果为a.c b.c),然后存入变量objects里。
另一个有用的函数是 patsubst ( patten substitude,匹配替换的缩写)函数。它需要3个参数——第一个是一个需要匹配的式样,第二个表示用什么来替换它,第三个是一个需要处理由空格分隔的序列。我们将两个函数合起来用:
objects := $(patsubst %.c,%.o,$(wildcard *.c))
会被处理为:
objects := a.o b.o
同理:
executables := $(patsubst %.c,%,$(wildcard *.c))
会被处理为:
executables := a b
%o:所有以“.o”结尾的目标,也就是a.o b.o
依赖模式“%.c”:取模式“%.o”的%,也就是foo bar,并为其加上.c后缀,即a.c,b.c
$<:表示所有依赖目标集,也就是a.c b.c
$@:表示目标集,也就是a.o b.o
命令前加@,表示在终端中不打印,如@mkdir -p ./bin
$(objects) : %.o: %.c
$(CROSS_COMPILE)gcc -c $(CFLAGS) $< -o $@
即可翻译为:
a.o b.o : a.c b.c $(CROSS_COMPILE)gcc -c $(CFLAGS) (a.c b.c) -o (a.o b.o)
明白了这些,这种Makefile的写法就可以完全掌握了。
注:当前目录直接make的两种写法见 Makefile之写demo时的通用Makefile写法 http://www.linuxidc.com/Linux/2013-05/84679.htm
Makefile之大型工程项目子目录Makefile的一种通用写法的更多相关文章
- 代码片段--Makefile之大型工程项目子目录Makefile的一种通用写法
转载:http://blog.csdn.net/mo_hui123456/article/details/8929615 管理Linux环境下的C/C++大型项目,如果有一个智能的Build Syst ...
- Makefile之大型工程项目子目录Makefile的一种通用写法【转】
转自:http://www.cnblogs.com/skyofbitbit/p/3680753.html 管理Linux环境下的C/C++大型项目,如果有一个智能的Build System会起到事半功 ...
- u-boot子目录Makefile分析
一.概述 u-boot的子目录Makefile是整个Makefile体系的重要组成部分,决定了对应子目录的编译过程. 二.分析 以cpu/arm920t/Makefile为例进行说明 (1)首先,调用 ...
- make 与makefile(会不会写 makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。)
跟我一起写 Makefile /**/ 陈皓 (CSDN) 概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉 ...
- Makefile学习与进阶之Makefile.am和$$(M)的意思
(1)makefile 中,出现$$(M) 是什么意思,发现还是看实际的Makefile长知识啊 在makefile中,会经常使用shell命令,也经常见到$var 和 $$var的情况,有什么区别呢 ...
- make :err Makefile.ssl is older than Makefile.org. Reconfigure the source tree (via './config' or 'perl Configure'), please.
内核编译时出现错误 Makefile.ssl is older than Makefile.org. Reconfigure the source tree (via './config' or 'p ...
- Can't locate Log/Dispatch.pm in @INC /Makefile out-of-date with respect to Makefile.PL
mha check的时候报错问题解决: # masterha_check_ssh --conf=/data/mha/app1.cnf Can't locate Log/Dispatch.pm in ...
- Spark 论文篇-大型集群上的快速和通用数据处理架构(中英双语)
论文内容: 待整理 参考文献: An Architecture for Fast and General Data Processing on Large Clusters. Matei Zahari ...
- project管理之makefile与自己主动创建makefile文件过程
(风雪之隅 http://www.laruence.com/2009/11/18/1154.html) Linux Makefile自己主动编译和链接使用的环境 想知道到Linux Makefile系 ...
随机推荐
- 11.m进制转十进制
Strlen是字符串有多长就是多长,包括所有的元素和\0这个结束符 题目描述 Description 将m进制数n转化成一个十进制数 m<=16 题目保证转换后的十进制数<=100 输入描 ...
- Java高级架构师(一)第43节:Varnish简介、安装和基本使用
第一部分:Varnish简介 Varnish是一款开源的.高性能的HTTP加速器和反向代理服务器. Varnish反向代理的能力远不如Nginx. Varnish主要作用是HTTP的加速器,主要通过缓 ...
- python开发_copy(浅拷贝|深拷贝)_博主推荐
在python中,有着深拷贝和浅拷贝,即copy模块 下面我们就来聊一下: 运行效果: ================================================== 代码部分: ...
- python 读写txt文件并用jieba库进行中文分词
python用来批量处理一些数据的第一步吧. 对于我这样的的萌新.这是第一步. #encoding=utf-8 file='test.txt' fn=open(file,"r") ...
- EntityFramework:EF Migrations Command Reference
Entity Framework Migrations are handled from the package manager console in Visual Studio. The usage ...
- MySQL数据库的概念
学习数据库的一些知识.写写博客方便梳理以及巩固知识. 关于什么是数据库就举一个样例来说明,说的可能不够准确,仅仅要明确一个大概的意思就够了.深刻的学习还是要去看书的. 讲讲生活中有关数据的样例:在一个 ...
- telnet用法 测试端口号
Telnet是进行远程登录的标准协议和主要方式它为用户提供了在本地计算机上完成远程主机工作的能力.可以用telnet命令来测试端口号是否正常打开还是关闭状态. 工具/原料 电脑 cmd命令 方法/步骤 ...
- calibre怎么转换文件格式
首先打开calibre软件,需要转换的书目不在列表的按照上一个教程将文件导入书籍列表. 选中需要转化格式的书籍之后右击,会跳出一个比较长的菜单栏,找到转换书籍选项,此处有两个选项,一个是逐个转换,另外 ...
- hadoop压缩框架
一般来说,计算机处理的数据都存在一些冗余度,同时数据中间,尤其是相邻数据间存在着相关性,所以可以通过一些有别于原始编码的特殊编码方式来保存数据,使数据占用的存储空间比较小,这个过程一般叫压缩.和压缩对 ...
- Python基础(12)--模块
本文地址:http://www.cnblogs.com/archimedes/p/python-modules.html,转载请注明源地址. 模块简介 如果你退出 Python 解释器重新进入,以前创 ...