我知道变量可以导出到子makefile:Communicating Variables to a Sub-make
示例:
生成文件:
export PWD := $(shell pwd)
target:
@echo $(PWD)
@cd somewhere; $(MAKE)
某处/生成文件
target:
@echo $(PWD)
假设第一个Makefile位于/path/to/first/makefile
,上面的代码将打印:
/path/to/first/makefile
/path/to/first/makefile
我的问题是:有没有办法让子变量文件中的变量PWD 隐式评估? 输出应如下所示:
/path/to/first/makefile
/path/to/first/makefile/somewhere
到目前为止,我只能想到:
eval
.SECONDEXPANSION
所有这些解决方案都是明确的:它们意味着要添加到子makefile中的代码。 我正在搜索的是一个隐式解决方案,它只会改变第一个Makefile中的代码。
另外,老实说......前两个解决方案太难看了,我宁愿在每个子makefile中手动声明PWD。
[编辑]
只是为了说清楚:变量PWD只是一个例子,我不是想获取每个Makefile的路径。
答案 0 :(得分:0)
使用${MAKEFILE_LIST}
变量并让你更改目录:
[max@earth:~/tmp]$ cat Makefile
target:
@echo $(abspath $(lastword ${MAKEFILE_LIST}))
${MAKE} -C somewhere $@
[max@earth:~/tmp]$ cat somewhere/Makefile
target:
@echo $(abspath $(lastword ${MAKEFILE_LIST}))
[max@earth:~/tmp]$ make target
/home/max/tmp/Makefile
make -C somewhere target
make[1]: Entering directory '/home/max/tmp/somewhere'
/home/max/tmp/somewhere/Makefile
make[1]: Leaving directory '/home/max/tmp/somewhere'
打印正在处理的makefile的完整路径。使用$(dir $(abspath $(lastword ${MAKEFILE_LIST})))
切断文件名Makefile
。