如何在 autotools 项目中传播配置选项?

Posted

技术标签:

【中文标题】如何在 autotools 项目中传播配置选项?【英文标题】:How to propagate an configure option in an autotools project? 【发布时间】:2020-12-22 15:58:08 【问题描述】:

我有一个自动工具项目。 我可以为我的*** configure.ac 定义一个自定义选项(“--enable-XX”选项,使用 AC_ARG_ENABLE 和 AM_CONDTIONNAL)。没关系。

但是现在,我想将此选项传播到我的所有子目录。

我该怎么做? :

我必须在每个子目录 configure.ac 中定义 AC_ARG_ENABLE/AM_CONDTIONAL 吗?

//// 编辑 ////

这是我的工作目录的架构:

Project
  | configure.ac
  | Makefile.am
  | Component_1
      | configure.ac
      | Makefile.am (*)
      | src
          | Makefile.am
  | Component_2
      | configure.ac
      | Makefile.am (*)
      | src
          | Makefile.am

(*) SUBDIRS = src

【问题讨论】:

【参考方案1】:

使用子目录不需要创建子项目

在典型的 Autotools 项目中,只有顶层目录有 configure.acconfigure 脚本。如果在子目录中有要配置的 makefile 或其他工件,那么这一切都由一个***脚本处理。有了这样的安排,你的问题就没有实际意义了——没有地方可以传播选项,也没有理由想要传播它们。

另一方面,有时一个项目会包含一个单独的完整项目。如果该合并项目是 Autotools 项目,那么它将有自己的 configure 脚本,该脚本应在运行***项目时运行。这是通过使用***项目的configure.ac 中的AC_CONFIG_SUBDIRS 宏来安排的。每个指定子目录中的configure 脚​​本将使用与运行***configure 相同的命令行参数运行;您无需执行任何其他操作即可转发选项。

但是,将任何特定选项转发到子项目configure 脚本是否有意义,这是一个单独的问题。自定义configure 选项的含义(如果有)特定于每个configure 脚本。如果您有一个想要以特定方式对特定自定义选项做出反应的子项目,那么它需要自己的 AC_ARG_ENABLE / AC_ARG_WITH 以及其他任何需要的东西。但是,如果您随意修改子项目以添加此类内容,那么它可能根本不应该是子项目,而是完全集成,以便直接由***脚本配置。

【讨论】:

因为听起来您已经有效地遵循了一个-configure 路线,尽管存在多个configure.ac 文件。请记住configure 的基本工作是从模板构建文件——尤其是Makefiles,但有时也包括其他文件。如果您已经有一个 configure 脚本为整个树完成这项工作,那么您认为还有什么要做才能获得单项目替代方案? Automake 的 subdir-objects 选项仅在您的项目被构造为使用非递归 make 时才相关。这在很大程度上是一个单独的考虑因素。 @YopAndMail,问题再次是每个组件configure.ac 文件的用途是什么,因为根目录中的文件设置了整个树中的所有makefile。如果子目录configure.ac 文件实际上没有配置任何东西,那么是的,它们是无关的。 或者换个角度看,configure.ac 以及 Autoconf 从中构建的脚本和工件是 per-project 资产。如果您的各种组件作为一个统一项目一起开发和发布,那么拥有多个configure.ac 文件是没有意义的。 @YopAndMail,是的,按照您的描述,按照惯例设置一个***configure.ac。它应该构建项目所需的所有 makefile。这并不一定意味着每个子目录中都有一个 makefile,但它所做的含义是特定于您的项目的。

以上是关于如何在 autotools 项目中传播配置选项?的主要内容,如果未能解决你的问题,请参考以下文章

autotools:如何测试需要配置文件的程序?

在 autotools 项目中包含(仅标头)库

【转】GNU autotools(二)关于autogen.sh的说明

如何配置 autotools/gcc 以使用绝对路径打印警告和错误?

Autotools:如何设置全局编译标志

如何在 c++ Autotools 项目中使用不同版本的 g++ 进行编译