CMake:当环境变量改变时触发重新生成 Makefiles。

4
我正在使用Linux、CMake和Conda,后者是一种包管理器,通过编辑$PATH来切换“环境”。这意味着当我在Conda中运行特殊命令时,$PATH指向不同的编译器,$CONDA_PREFIX也会改变。
默认情况下,CMake对这些更改不敏感。我希望它能够自动重新生成所有Makefile,当$PATH中找到不同的GCC,或者自上次明确的cmake调用以来$CONDA_PREFIX已经更改。这种重新生成类似于当您编辑顶层CMakeLists.txt文件时CMake所做的 - 下次运行make时它会重新生成所有内容。
如何使用CMake简单地实现这一点?

自然的方法似乎是为每个额外的“环境”创建新的构建树。 - Tsyvarev
@Tsyvarev:我理解你的意思,但这并不能解决问题——如果用户不小心进入错误(不匹配)的Conda环境和CMake构建树,那么构建可能会有缺陷。我正在努力确保构建永远不会出现不匹配的情况。 - John Zwinck
2
您可以通过add_custom_target添加目标,该目标将检查构建树是否与当前环境相对应。对于不匹配的构建,目标可能会简单地失败并显示适当的消息。如果需要部分重新配置,则强制CMake重新运行(请参见,例如,此邮件)可能很有用。但是,由于编译器已更改,您可能需要丢弃所有与编译器相关的缓存,这实际上是一个干净的配置(在干净的构建目录上调用cmake)。 - Tsyvarev
看起来像是CMake的缺陷。它应该是一个高级构建工具,但却让你自己处理如此微不足道的变化,例如编译器命令明确依赖于环境或编译器本身。 - Victor Sergienko
2个回答

2
我今天最终没有需要解决问题的代码,但是这里有个想法。它不是通用的——它要求您明确指定构建所依赖的变量。
  • 创建一个CMake包装脚本,接收影响我的特定构建的环境变量名称。
  • echo 所有变量以 VARIABLE=value 格式写入到 ${CMAKE_CURRENT_BINARY_DIR}/buildvars.environment 文件中。仅在文件不存在或其内容不同时执行此操作。
  • 调用 cmake 时,添加 cmake -DCMAKE_CONFIGURE_DEPENDS=<build_direcotry>/buildvars.environment 以触发重新配置(如果该文件比构建配置更新)。

参考:

相关问题:如何在输出命令更改时触发CMake重新配置


0
简而言之,生成的构建目录不应再依赖于环境。
如果用户意外地处于错误(不匹配)的Conda环境与CMake构建树相比,则构建可能存在缺陷。
如果您使用find_program()命令确定您正在使用的所有工具的路径,则永远不会发生这种情况。对于每个环境设置都使用完整路径和一个构建目录是处理此问题的首选方法。

CMake完全将构建环境管理交给用户,但规定了我们应该如何做(“不要依赖于环境变量”)。如果您在答案前加上“CMake的(糟糕的)环境管理想法是...”,那么可能会将那个踩的赞成。 - Victor Sergienko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接