【问题标题】:How can I propagate automake variables in a sub-package setup?如何在子包设置中传播 automake 变量?
【发布时间】:2012-04-18 21:25:02
【问题描述】:

我的 autotools 存储库中有一个子包设置,其中几个相关项目使用主 configure.ac 和 Makefile.am 粘合在一起。

除了通过 AC_CONFIG_SUBDIRS() 宏轻松完成的编译顺序之外,还需要导出这些过度耦合的子项目之间所需的头文件和库位置。

--- configure.ac
 |- Makefile.am
 |- subproj1 --- configure.ac
 |            |- Makefile.am
 |            |- src
 |            \- include
 [...]
 |
 \- subprojN --- configure.ac // requires -I${top_srcdir}/subprojX/include and
              |- Makefile.am  // -L${top_srcdir}/subprojX/src
              |- src
              \- include

不幸的是,将这些软件包重新组合为一个不是一种选择。我尝试使用 AC_SUBST() 和/或 make 的导出命令导出变量,但无济于事。

我可以将这些标志用于每个子项目 Makefile 的唯一方法是将 CPPFLAGS 和 LDFLAGS 传递到根配置调用(通过命令行)。但是,我希望有办法将这些值保存在 autotools 中,而不必为它们创建单独的脚本。

PS:类似于automake and project dependencies

【问题讨论】:

标签: autotools autoconf automake


【解决方案1】:

autotools 并不是真正设计成一个包管理系统,所以这是一个尴尬的用法,但可以在子项目中引用构建树之外的相对路径。也就是说,在 subprojN/Makefile.am 中,可以添加:

AM_CPPFLAGS = -I$(srcdir)/../subprojX/include
AM_LDFLAGS = -L$(srcdir)/../subprojX/lib

在这种情况下,如果 subprojN/configure 试图找到 libsubprojX,它将失败,除非您将 ../subprojX/{include,lib} 添加到 CPPFLAGS 和 LDFLAGS 进行配置,这可以在 configure.ac 中完成:

CPPFLAGS="$CPPFLAGS -I${srcdir}/../subprojX/include
LDFLAGS="$LDFLAGS -L${srcdir}/../subprojX/lib"

如果子项目的配置脚本没有检查耦合子项目中的库,那么在 Makefile.am 中指定 LDADD 以获取必要的库链接可能会更简洁。

【讨论】:

  • 有人建议 -L 标志应该引用 $builddir 而不是 $srcdir,我对这个想法有一些倾向。然而,这真的行不通,因为配置脚本会在构建之前尝试使用 builddir 中的东西。当然,通过同样的论点,配置脚本将尝试链接 srcdir 中可能尚不存在的库……这就是为什么不应该将自动工具用作包管理系统的原因。在 /usr/local 中安装依赖项,不再担心这些问题!
【解决方案2】:

CPPFLAGS 和 LDFLAGS 几乎不应该直接在命令行上传递(个人意见),而应该在 config.site 中设置。只需在 ${prefix}/share/config.site 或 $CONFIG_SITE 中进行分配(即在文件 $HOME/config.site 中并在运行 configure 的环境中设置 CONFIG_SITE=$HOME/config.site)并且该脚本将来自您的所有配置调用。我不确定您所说的“将这些值保留在 autotool 的东西中”到底是什么意思,但让我感到震惊的是,使用 config.site 可以满足这一点。 LDFLAGS 和 CPPFLAGS 是告诉您的配置脚本库的非标准位置的正确机制,因此任何不使用这些的解决方案都将超出自动工具的正常范围。 (当然,最好的解决方案是将库安装在标准位置,这样您的工具链就可以轻松找到它们。也许您正在使用 gcc 并且可以设置 LIBRARY_PATH 和 CPATH。)

【讨论】:

  • config.site 看起来不错,但我需要将它发送给需要构建相同组件的其他人。
  • 通过将东西保存在 autotools 中,我的意思是不必创建除了 configure.ac 和 Makefile.am 之外的其他东西,比如传递所需标志的 autogen.sh 脚本。
  • @milton--不,你不需要把它寄给别人。假设用户知道如何使用他们的系统。如果他们在标准位置安装库,他们不需要做任何事情。如果他们安装在非标准位置,他们需要告诉配置脚本,通常的方式是通过 LDFLAGS/CPPFLAGS。在你的情况下,维护者无事可做!
  • 也许我没有明确提出这个问题。这些标志集是声明子项目之间的依赖关系所必需的,因此它将被分发,因此用户不必弄清楚如何纠缠和构建它们。
  • 啊...我明白了这个问题。这是一个大杂烩(但使用 autotools 作为包管理系统是一个杂碎!),但在 subprojN/Makefile.am 中,您应该能够添加“AM_CPPFLAGS = -I$(srcdir)/../.. /subprojX/include"
猜你喜欢
  • 1970-01-01
  • 2021-11-06
  • 2018-01-23
  • 1970-01-01
  • 2013-11-07
  • 2010-12-11
  • 2019-03-31
  • 1970-01-01
  • 2019-01-22
相关资源
最近更新 更多