使用 automake 将文件复制为默认目标的一部分

Using automake to copy a file as part of the default target

我正在处理一个使用 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 $< $@

EXTRA_SOURCES 中列出 .orig 文件可确保在您 make dist 时包含它,我 认为 您需要明确如果您希望它受到 make clean.

的影响,请将构建文件命名为 CLEANFILES

如果由于某种原因不能满足您的需求,那么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-localuninstall-local 以及 clean-localdistclean-local.

的部分或全部

顺便说一句,注意

  • 为构建的配置文件定义依赖关系,确保在模型文件更改时重新复制该文件。
  • 在构建规则中使用 $< 来引用模型配置文件。这有助于支持外源构建。