允许 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_WITH
和 AM_CONDITIONAL
然后有类似的东西
bin_PROGRAMS = ....
if ENABLE_MYPROG
bin_PROGRAMS += myprog
endif
其余的保持不变。
【讨论】:
EXTRA_PRORGRAMS 完全符合我的要求。请注意, check_PROGRAMS 似乎也是如此。然而,我意识到缺少安装选项很痛苦,因此在 configure.ac 中添加了 --with-myprog 选项。check_PROGRAMS
是在make check
和make distcheck
期间构建的,它们是“测试”选项(也是少数几个未安装的前缀之一)。 EXTRA_
前缀是可选的,未安装。【参考方案2】:
这样做的正确方法是将构建的可选
程序在./configure
选项的控制下,所以./configure
可以适当管理。参见例如how to add configure options
如果这听起来太像艰苦的工作,您可以利用以下事实:
Makefile.am
中的附加 make
代码简单地传递给
生成Makefile
。
所以,例如如果以下是目标foo
的Makefile.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
,您可以记录这一事实
对于用户,有适当的注意事项 - 尤其是缺少通常的自动工具 install
和 uninstall
。
显然,此快捷方式会损害知识渊博的用户的印象 你的专业印章。
【讨论】:
虽然我可以在这里看到您想要实现的目标,但我无法让它工作,因为“手动”make 行不包含编译所需的各种其他依赖项。我确信它可以工作,但 Diego 的解决方案毫不费力地实现了同样的效果。以上是关于允许 automake 生成可选的编译规则的主要内容,如果未能解决你的问题,请参考以下文章
Laravel:如何使用验证规则之前和之后验证两个可选的日期字段