5

多个目录编译的makefile的编写

 1 year ago
source link: https://blogread.cn/it/article/1766?f=hot1
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
您现在的位置首页 --> Linux --> 多个目录编译的makefile的编写

多个目录编译的makefile的编写

浏览:4968次  出处信息

最近工作忙的要死,明明积压了一大堆博文要写,结果却始终没有时间,也沉静不下心情来写。不过知识这种东西,如果不及时沉淀下来,恐怕很容易就会忘记了,所以还是赶紧写一下。

前几天在开小组例会,同事提到了一种makefile的写法,编译过大型工程的朋友应该都知道,当多个模块要协作编译的时候,通常要进入一个个目录去编译,所以,makefile可能如下所示:

all:
    cd dir1;make all;
    cd dir3;make all;
    cd dir2;make all;
clean:
    cd dir1;make clean;
    cd dir3;make clean;
    cd dir2;make clean;

当然,我们也可以用makefile自身的特性,即 make all/clean -C dir1来进行编译,但是实际上两种写法都避免不了3个问题:
1.当新加入一个模块的时候,要写入两句代码,一句是all,一句是clean,很容易漏掉。
2.没有办法进行并行编译。因为很可能这些模块之间是不互相依赖的,而并行编译可以极大的提高速度(如果你受得了make那蜗牛般的速度的话,可以无视掉这一条)
3.依赖关系不明显(可以看出是dir2依赖与dir3,但是没有明确的指出)

那么解决方法是怎样呢?有这样一个makefile

dirs = dir1 \
       dir2 \
       dir3
.PHONY: all clean $(dirs)
all: $(dirs)
clean: $(dirs)
$(dirs):
    $(MAKE) -j2 -C $@ $(MAKECMDGOALS)
dir2:dir3

在这个makefile的同级目录有3个目录,分别为dir1,dir2,dir3,其中每个目录的makefile就不说了,大家看图应该能明白,执行make后,结果如下:

QQ截图未命名

对于并行编译的-j选项,其实我也不是很清楚,不过同事说如果cpu是多核,那么开核数+1的并行编译数是最好的,据说测试过确实如此,所以我也就没有在深究了。

另附:
    Makefile的规则:http://www.linuxsir.org/main/doc/gnumake/GNUmake_v3.80-zh_CN_html/make-04.html
    代码下载

建议继续学习:

QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
  • 作者:Dante    来源: Vimer
  • 标签: makefile
  • 发布时间:2010-06-12 09:48:02

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK