允许 automake 生成可选的编译规则

Posted

技术标签:

【中文标题】允许 automake 生成可选的编译规则【英文标题】:Allow automake to generate optional compile rules 【发布时间】:2016-12-03 01:08:20 【问题描述】:

我已对一个程序进行了更改,该程序是使用英特尔性能基元的更大项目的一部分。事实证明,我最近的更改使用了仅在最新版本的 IPP 上可用的调用,而许多用户仍在使用旧版本。有问题的程序不是必需的,所以我想让它成为可选的,而不是向后移植到最旧版本的 IPP(IPP 多年来对 API 进行了很多更改)。

我们使用 automake/autoconf 来生成 Makefile。理想情况下,我的特定程序(C 中的单个源文件)不会默认编译,除非有人专门运行“make myprog”。

有没有办法做到这一点,还是我必须支持配置脚本的“--with-myprog”选项?

Makefile.am 目前有(我认为这是所有相关的)

bin_PROGRAMS = \
    stripVDIF \
    snip
    generateVDIF 

generateVDIF_SOURCES = \
    generateVDIF.c

generateVDIF_LDADD = $(IPP_LIBS) $(LDADD)

我的程序是 generateVDIF

【问题讨论】:

【参考方案1】:

如果您不想安装它,您可以简单地将其声明为 EXTRA_PROGRAMS 而不是 bin_PROGRAMS,这应该完全符合您的要求(仅适用于 make myprog)。

如果你想安装它,你必须在 configure.ac 中使用 AC_ARG_WITHAM_CONDITIONAL 然后有类似的东西

bin_PROGRAMS = ....

if ENABLE_MYPROG
  bin_PROGRAMS += myprog
endif

其余的保持不变。

【讨论】:

EXTRA_PRORGRAMS 完全符合我的要求。请注意, check_PROGRAMS 似乎也是如此。然而,我意识到缺少安装选项很痛苦,因此在 configure.ac 中添加了 --with-myprog 选项。 check_PROGRAMS 是在make checkmake distcheck 期间构建的,它们是“测试”选项(也是少数几个未安装的前缀之一)。 EXTRA_ 前缀是可选的,未安装。【参考方案2】:

这样做的正确方法是将构建的可选 程序在./configure 选项的控制下,所以./configure 可以适当管理。参见例如how to add configure options

如果这听起来太像艰苦的工作,您可以利用以下事实: Makefile.am 中的附加 make 代码简单地传递给 生成Makefile

所以,例如如果以下是目标fooMakefile.am

EXTRA_DIST = README 
bin_PROGRAMS = foo
foo_SOURCES = foo.c

并且你想添加一个非托管目标bar,一个从bar.c构建的程序, 那么您可以将Makefile.am 扩展为:

EXTRA_DIST = README bar.c
bin_PROGRAMS = foo
foo_SOURCES = foo.c

bar: bar.o
    $(CC) $(LDFLAGS) -o$@ $< $(LDLIBS)

自动工具包将支持make bar,您可以记录这一事实 对于用户,有适当的注意事项 - 尤其是缺少通常的自动工具 installuninstall

显然,此快捷方式会损害知识渊博的用户的印象 你的专业印章。

【讨论】:

虽然我可以在这里看到您想要实现的目标,但我无法让它工作,因为“手动”make 行不包含编译所需的各种其他依赖项。我确信它可以工作,但 Diego 的解决方案毫不费力地实现了同样的效果。

以上是关于允许 automake 生成可选的编译规则的主要内容,如果未能解决你的问题,请参考以下文章

Automake flex 输出命名

Makefile文件的基本单元 —— 规则

JSON解析器json-c

Laravel:如何使用验证规则之前和之后验证两个可选的日期字段

生成一个 Makefile,使用 Automake 一步编译和链接所有源文件

Excel vba 编译错误 - 参数不是可选的,