1 -f与-C
选项 | 含义 |
---|---|
-f | 读取指定的文件并执行(给出所指定的文件的pathname即可) |
-C | 到指定目录下读取Makefile文件并执行(给出指定的目录的路径) |
-f
对文件名没有要求,但文件内容必须符合make的语法;-C
则是在进入指定的目录读取Makefile文件之前,先执行切换目录的操作,且文件名必须是makefile
、Makefile
等。
由于-C
选项需要先执行切换目录的操作,因此-C
指定的Makfile文件中内建变量CURDIR
为指定Makefile文件所在的目录;而-f
指定的文件中内建变量CURDIR
仍然为上一层Makefile文件所在目录。两者都可以获得上层Makefile定义的变量,但必须要在上层Makefile中先进行export
。
2 -e
-e
参数的作用是覆盖Makefile中的变量,具体的说,有两点:
- shell中
export
变量A
,Makefile中也定义了变量A
,则优先从环境变量中获得变量A
的值; - 上层Makefile中
export
变量A
,子层Makefile中也定义了变量A
,则子层Makefile优先使用上层Makefile导出的。
这里再额外总结以下与-e
选项有关的内容:
2.1 令行传参
要想实现变量的传递或覆盖,还可以通过命令行传参的方式,如执行:
make A="-a=bbb -c=ddd"
如果要传递或覆盖的变量比较少,那么命令行的方式更为方便,比较多的话,-e
选项更合适。
2.2 Makefile和shell的export
两者的export
是有区别的,shell的export是导出到环境变量;而Makefile的export是向子层Makefile导出变量(同一级别的Makefile不行)。
发现一个让人有点困惑的现象,这里也一并记录一下:
顶层Makefile:
A := TOP_A
all:
@echo ${A}
make -e -C ./test_sub
make -e -f ./test_sub/Makefile
子目录test_sub
下的Makefile:
all:
@echo ${A}
@echo ${CURDIR}
执行make后,打印如下:
TOP_A
make[1]: Entering directory '/home/lenny/test/test_sub'
/home/lenny/test/test_sub
make[1]: Leaving directory '/home/lenny/test/test_sub'
make[1]: Entering directory '/home/lenny/test'
/home/lenny/test
make[1]: Leaving directory '/home/lenny/test'
因为再顶层Makefile没有导出变量A
,所以这当然符合预期。可如果此时在shell中执行export A=xxx
,然后再执行make,得到的打印如下:
TOP_A
make[1]: Entering directory '/home/lenny/test/test_sub'
TOP_A
/home/lenny/test/test_sub
make[1]: Leaving directory '/home/lenny/test/test_sub'
make[1]: Entering directory '/home/lenny/test'
TOP_A
/home/lenny/test
make[1]: Leaving directory '/home/lenny/test'
这算什么?
3 -j
指定工作线程数,也即并行执行Makefile。
4 -I
-I dir
,指定dir
为Makefile所include的文件的搜索目录。
5 -B
无条件执行所有的目标。