Automake:为什么我的Makefile从源目录而不是构建目录中选择文件?

时间:2016-12-01 04:48:59

标签: makefile gnu-make autotools automake

我正在使用Automake

我在dist_man1_MANS中列出了一些源文件,如下所示:

dist_man1_MANS = some-file.1 some-other-file.1

现在,Automake + configure最终会在Makefile生成此内容:

dist_man1_MANS = some-file.1 some-other-file.1

# ...

install-man1: $(dist_man1_MANS)
    # generated recipe here

由于我没有为.1 $(srcdir)前缀make文件,我假设,因为我从构建目录(当前工作目录)运行/tmp/build,它应该在构建目录中找到它们。

所以,我正在进行树外构建,例如/path/to/src/configure --prefix=$(pwd)/install make make install

make

并且构建成功,即install-man1: $(dist_man1_MANS) @echo ">>> $(^)" @echo "::: $(dist_man1_MANS)" # generated recipe here 找到手册页并安装它们。但是,它们不在构建目录中。我将它添加到生成的Makefile:

echo

现在,我假设两个$^打印相同的内容,因为>>> /path/to/src/some-file.1 /path/to/src/some-other-file.1 ::: some-file.1 some-other-file.1 表示the names of all the prerequisites, with spaces between them。令我惊讶的是,输出是:

make

所以:

  1. /path/to/src/如何准确找到$^前缀?在这种情况下,它来自哪里?
  2. 为什么$(dist_man1_MANS)context.Call()会有所不同?

1 个答案:

答案 0 :(得分:1)

我找到了答案。

Automake将Makefile生成的make变量设置为VPATH = /path/to/src ,这是VPATH的一个特殊变量,类似于:

make

来自之前的链接:

  

4.5.1 VPATH:所有先决条件的搜索路径

     

make变量VPATH的值指定了应搜索的目录列表。通常,目录应包含不在当前目录中的必备文件;但是,make使用some-file.1作为规则的先决条件和目标的搜索列表。

因此,some-other-file.1首先在当前工作目录中搜索/path/to/src/some-file.1/path/to/src/some-other-file.1先决条件,然后在$^$(dist_man1_MANS)中搜索首先找不到第一个那些。在这种情况下,我了解为什么$^与{{1}}不同:{{1}}是有效(已解决)先决条件的列表。