【问题标题】:Is it possible to recompile some source files on make install using CMAKE是否可以使用 CMAKE 在 make install 上重新编译一些源文件
【发布时间】:2014-09-09 15:46:59
【问题描述】:

让我解释一下这个问题。我有一个 C 代码,其中附加插件的搜索路径包含在 C 字符串中。只要程序留在 cmake 的构建目录中,字符串就应该包括构建目录中的插件文件夹。例如

char *plugindir = "/home/.../myproject/build/plugins:/usr/share/myproject/plugins"; 

如果程序是通过make install 安装的,我想将此字符串更改为

char *plugindir = "/usr/share/myproject/plugins"; 

并在安装之前重新编译/重新链接程序。如何使用 CMAKE 实现这种行为?

【问题讨论】:

  • 硬编译路径是邪恶的。有一天,您会希望将程序移至新目录或具有不同目录结构的新机器。使用初始化文件。
  • @DoxyLover: 但是你怎么找到初始化文件呢?
  • 此答案用于查找包含可执行文件的目录:stackoverflow.com/questions/1023306/…。您也可以使用环境变量。
  • 在我看来,使用诸如确定自己的可执行文件名称之类的东西似乎很棘手,并且取决于平台。通常在 Linux/BSD/*nix 系统上,一旦安装程序或共享库,您通常不会移动它。
  • 有时您需要硬编码路径。硬编码的路径是邪恶的。我建议尽可能减少它们的数量。理想情况下到单个配置文件。安装时重新编译是可能的,但是您是否考虑过使用 cmake 头文件生成器并链接两个不同的版本(虽然这是一个邪恶的 hack,它会困扰您多年)。

标签: c makefile cmake


【解决方案1】:

有很多解决方案,我可以告诉你2个:

  1. 使用配置文件,因此 plugindir 不是硬编码的,而是从配置文件中动态获取的。 这是更好的解决方案,但您可以找到。这涉及到使用一些库,如this one

  2. 使用 # 指令。这是一个更简单的解决方案。在源文件中添加如下内容:

    #ifdef DIST

    char *plugindir = "/usr/share/myproject/plugins";

    #else

    char *plugindir = "/home/.../myproject/build/plugins:/usr/share/myproject/plugins";

    #endif

您可以使用 DIST 预处理器变量(在 C 代码或 Makefile 中)来区分开发或“安装”代码版本。

【讨论】:

  • 1.然后是硬编码配置文件的一些可能路径的问题,例如/etc, /usr/local/etc,... 这会导致我之前提到的类似问题。在开发过程中,配置文件位于构建路径中的某个位置,而 make install 需要更改。 2.这部分很清楚,但问题是如何使CMAKE实现这种行为,以便在我调用make install时重新编译受定义DIST影响的部分代码
  • 1.是的,这就是为什么在这种情况下您也必须将配置文件路径作为命令行参数。 2. 在make install 期间不会使用它,而是在make 期间使用它。您可以创建一个新的 make 目标,即称其为“dist”。它将 DIST 变量使用添加到 GCC 调用中使用的 CFLAGS。因此,当您发出make install 命令时,您将安装在前一个make dist 阶段硬编码的正确路径的代码。
  • 命令行参数不是我需要的项目的选项,因为上述问题存在于共享库中,无法向用户提供 library_init... 函数,因为这个会破坏与我项目以前版本的 API 兼容性,这是不可能的,所以我需要硬编码路径。此外,我不直接使用 make 。我使用 CMAKE 作为 makefile 生成器,它应该在 CMAKE 的帮助下工作。用户的最终工作流程应该是“cmake .; make; make install”而不是“cmake .; make ; make something_else_to_install”。
  • 我所说的流程不是“cmake .; make; make somthing_else_to_install”,而是:“cmake .;make dist; make install”。无论如何,如果你想要更多“cmake-ish”的东西,我想你可以阅读这个:cmake.org/cmake/help/cmake_tutorial.html。请参阅 add_custom_command 部分。它可能很有用。
  • 使用add_custom命令修改路径是没有问题的,但是不能依赖cmake的安装目标,这样就可以在安装前修改一段代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 2011-12-03
相关资源
最近更新 更多