【问题标题】:Multiple build flags with autotools带有自动工具的多个构建标志
【发布时间】:2014-04-07 12:22:45
【问题描述】:

我正在使用带有 ncurses 的 C 应用程序为 CLI 工作,该 CLI 使用自动工具进行构建。除了实际的应用程序之外,还有一个测试框架(cutter)和一些预处理器常量,可以启用或禁用某些功能(例如,有一个常量 WINDOW 与所有 ncurses 窗口接壤 - 对于管理窗口布局很有用)。

当然,其中一些常量可以在编译时手动指定(即 make),但我希望有 2 个构建目标:调试和发布。另外,cutter有问题(配置检查它,如果要使用它应该会发生这种情况,但我不能要求普通用户安装cutter来编译)。因此,我在考虑以下设置:创建一个启用测试的配置标志(默认情况下禁用)和 2 个 make 目标(make 创建发布版本并进行调试,即调试版本)。这个工作流程是否正确或有更好的方法来做到这一点?

【问题讨论】:

  • 很多人使用like this 方法而不是单独的调试/发布版本。这通常允许在运行时性能和发布后调试之间进行很好的权衡。
  • 嗯,这与 -g 标志无关,因为它适用于应用程序开发和调试中使用的部分代码(例如删除一些检查以使应用程序的测试更多更容易,窗口周围的边框可以看到你在做什么等等)。这些由预处理器指令#ifdef 和#ifndef 处理,通过某些符号常量的存在或不存在来切换。
  • 您不能要求产品的普通用户安装切割机,但您绝对可以要求开发人员这样做。用户应该安装一个预先构建的二进制文件,并且不需要处理任何这些。 “开发人员”的一个相当宽松的定义可以包括任何想要运行“make check”的人,因此要求该人安装另一个工具是完全合理的,但也很容易简单地检查是否安装了切割器并缩小必要时进行测试(带有类似“测试不完整:请安装切割机”的警告)

标签: c linux autotools c-preprocessor


【解决方案1】:

如果是我,我会使用 AC_ARG_WITH 来设置切割器测试框架所在的位置(例如包含/库路径)和任何与切割器相关的东西(例如预处理器标志),以及一个或多个 @987654322 @ 变量(或可能是 AC_ARG_WITH)以启用其他预处理器指令。这样您就不必维护调试目标。

【讨论】:

  • 为什么使用 AC_ARG_ENABLE 比维护调试目标更好?
  • 如果您的应用程序非常简单(例如,单个可执行文件),维护调试目标可能同样容易。只需将文件列表复制到调试目标(使用调试预处理器标志,并添加/省略用于调试的翻译单元),并希望在主目标构建更改时记住维护调试目标。如果有额外的复杂性(例如依赖库),那么它们也必须被复制(和维护)。或者你可以在 AC_ARG_ENABLE 中 AC_DEFINE 你的调试预处理器变量并且没有调试目标。
  • 继续,至少这样设置用于调试的应用程序不会在主要目标构建发生变化时过时,因为它主要目标。不幸的是,这并不能保证“调试”版本不会被主版本的更改破坏。如果两个版本都要求始终可构建,则必须维护两个目标。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
相关资源
最近更新 更多