我正在使用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
所以:
/path/to/src/
如何准确找到$^
前缀?在这种情况下,它来自哪里?$(dist_man1_MANS)
和context.Call()
会有所不同?答案 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}}是有效(已解决)先决条件的列表。