Makefile - 将声明导出到子makefile文件

时间:2016-09-29 10:30:02

标签: makefile

我知道变量可以导出到子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中的代码。

另外,老实说......前两个解决方案太难看了,我宁愿在每个子makefile中手动声明PWD。

[编辑]

只是为了说清楚:变量PWD只是一个例子,我不是想获取每个Makefile的路径。

1 个答案:

答案 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