我正在开发一个使用 GNU Autotools 构建的项目。作为用户运行 ./configure && make
时默认完成的构建的一部分,我希望它将文件 config/foo.conf.orig
复制到 config/foo.conf
,生成用户可以编辑的示例配置。
我应该在 Makefile.am
文件中放入什么来实现这一点?
我已经尝试过:
EXTRA_PROGRAMS = localconf
localconf_SOURCES = conf/foo.conf.orig
.PHONY: localconf
localconf:
echo Creating local configuration...
cp conf/foo.conf/orig conf/foo.conf
但这没有任何效果。
执行 ./configure && make localconf
有效。但我不希望用户必须知道他们需要调用特殊目标;我希望它作为默认 ./configure && make
的一部分发生。
最佳答案
在 EXTRA_PROGRAMS
中命名程序不会导致它包含在构建中。此变量可以被视为程序的声明,可能包含在构建中,但没有在任何其他 *_PROGRAMS
中显式命名。多变的。实际上导致它们的构建通常涉及 configure
替换。这有助于满足 Automake 对所有目标的静态知识的需求。
如果要构建的文件是要与软件一起安装的文件(可能是在用户修改之后),那么要做的就是将其命名为普通目标,并为其提供构建规则。也许是这样的:
sysconf_DATA = config/foo.conf
EXTRA_SOURCES = config/foo.conf.orig
CLEANFILES = config/foo.conf
config/foo.conf: config/foo.conf.orig
cp -p $< $@
列出.orig
文件 EXTRA_SOURCES
确保当您 make dist
时它被包含在内,我认为您需要在 CLEANFILES
中显式命名构建文件如果你希望它受到 make clean
的影响.
如果由于某种原因不能满足您的需求,那么 Automake 有一些相当的 general provisions for attaching your own build rules 。使用这些,您可以以这种方式构建您的文件:
EXTRA_SOURCES = config/foo.conf.orig
all-local: config/foo.conf
config/foo.conf: config/foo.conf.orig
cp -p $< $@
您可能还想使用 install-data-local
的部分或全部, uninstall-local
,以及 clean-local
或distclean-local
.
顺便说一句,请注意
- 定义构建的配置文件的依赖项,确保在模型文件发生更改时重新复制该文件。
- 使用
$<
在构建规则中引用模型配置文件。这有助于支持外源构建。
关于autotools - 使用 automake 将文件复制为默认目标的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55410635/