本文主要是介绍后知后觉Makefile之二(专谈并行编译),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
由来
写了后知后觉Makefile
后,觉得有必要对现存的Make
实现进行下梳理。
为了保证梳理在一个新的认知水平上,在梳理前对以前模糊的概念,通过阅读官网的手册进行了一些必要的理论脑补,使得修补技术,更符合Make
的原笔原意 😃
并行Make武器库
列举了修补使用到的技术要素
并行选项
- -j[jobs]
- -l [load]
建议编译环境独立使用的时间,选择
-j
选项进行充分并行;编译环境共享使用的时间,需要考虑负载因素,建议使用-l
选项
条件Make
Target
依赖条件选择Target
执行Recipes
指令进行条件执行immediate ?= deferred
变量条件赋值,选择性地赋值,以利于与集成Make环境协调
# 条件依赖
ifndef someconditionall: sometarget
endif# 指令条件执行
all:
ifndef somecondition@echo This statement will be excuted when var is not setted
endif# 共享变量条件赋值
sharedvar ?= default
适用场景:
- 使用条件语句使得某些依赖和某些执行指令,在集成编译的时间并不执行
- 在某些编译条件下,例如,独立组件编译的时间,需要进行执行和变量设定
更准确的规则
# 通用处理
%.o: %.c...# 对于特殊编译设置的文件,可以撰写更精确匹配的规则
special.o: special.c specail.h...
Sub-make要求
要求能够在独立的编译目录中进行编译,保证可以充分并行
Sub-make共享动作
对于各Sub-make
共享的动作,可以在Parent-make
中进行先期执行,使得Sub-make
可以充分并行起来,以避免后期重复执行,和竞争资源
export变量传递
使得与Sub-make
过程共享集成编译环境信息,例如,某些编译warning
转移ERROR
选项
特别地MAKEFLAGS变量
通过内置MAKEFLAGS
变量可以实现与Sub-make
间共享参数选项,避免再次重复手写
构建目标正确依赖关系
方法论: 选择自顶向下的构建方法,可以将所有
Target
列举在第一个层次,然后逐渐将被依赖的Target
下沉,直至无任何依赖。
建议将无任何依赖的
Target
集中在Makefile文件的底部,作为Make
构建的基石
.PHONY: all app lib cleanall: app
app: lib
lib: clean# 最下面的目标无任何依赖
clean:@echo $@ begin to run@echo $@ has done
参考
- GNU Make Manual
- GNU Make Parallel
- 通过变量与子Make通信
- 通过选项与子Make通信
- 约定俗成的一些Target
这篇关于后知后觉Makefile之二(专谈并行编译)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!