如何使用CMake从一个主CMake项目构建多个平台,而不会出现缓存问题

时间:2015-03-17 22:55:07

标签: caching cmake multiplatform

我有两个名为AB的项目,它们具有完整的CMakeLists.txt项目,每个项目都可以完全构建而不会出错。我想在CMake中定义一个master项目,它将构建AB(最终可能还有其他一百个)。

我的顶级CMakeLists.txt项目看起来像

add_subdirectory(A build-A)
add_subdirectory(B build-B)

并且CMake可以解析所有文件,并且make可以开始构建得很好。

问题是项目A适用于一个架构(x86_64)而B适用于不同的架构(k1om),当CMake调用各种功能时,如< / p>

 find_package(Boost ....)

它缓存第一个体系结构的库路径的结果,并为所有后续体系结构重用它们(错误!)。我们为x86_64k1om编译了Boost。

通过完全使两个项目之间的缓存无效,有没有办法让CMake做我想做的事情?这样的事情就可以了:

add_subdirectory(A build-A)
cmake_invalidate_cache_and_forget_everthing_that_just_happened()
add_subdirectory(B build-B)
cmake_invalidate_cache_and_forget_everthing_that_just_happened()
...

我完全清楚我可以创建一个执行此操作的shell脚本,并在不同的输出目录中多次运行cmake,但是有一个统一的&#34;条目&#34真的很不错;指向用CMake编写的所有项目。

3 个答案:

答案 0 :(得分:3)

我建议使用“超级构建”设置,通过ExternalProject_Add而不是add_subdirectory包含每个子项目。这样可以在子项目的构建之间实现非常清晰的分离。我想通过尝试修改生成的CMakeCache.txt,你会非常努力地对抗CMake!

但是,我从未尝试过在子项目之间架构不同的情况下实际执行此操作。所以我所能做的就是建议你尝试一下 - 我认为它应该有效。

This article可能有帮助)。

答案 1 :(得分:1)

我认为使用ExternalProject,正如Fraser建议的那样是您设置的最佳做法,但我认为它不会解决您遇到的问题。如果我错了,请纠正我,但听起来你在两个平台上使用相同的构建树。那是对的吗?如果是这样,我无法从中获得什么。

如果我错了而您只是试图阻止某些项目在某些架构上进行配置,那么您应该查看CMake的架构块,例如if(WIN32)... if (CMAKE_SIZEOF_VOID_P 8)...还有许多其他方法可以根据编译器限制代码曝光,32对64 Windows,* nix,MAC等......

如果我仍然不理解,那么道歉,或许你可以尝试一个明确的解释。也许你只需要为缓存变量设置的unset命令,因为不同的体系结构在缓存中设置错误。请参阅:http://www.cmake.org/cmake/help/v3.0/command/unset.html

如果是这样的话,你真的应该重新考虑你的项目的设计,因为这种方法听起来像是一个难以维护的混乱。遗憾。

答案 2 :(得分:1)

我让它与ExternalProject_Add合作(谢谢你Fraser)。这是它的样子:

cmake_minimum_required(VERSION 2.8.4)
project(Demo1)
include(ExternalProject)

ExternalProject_Add(
  A-build 
  SOURCE_DIR ${CMAKE_SOURCE_DIR}/A
  INSTALL_COMMAND ""
)

ExternalProject_Add( 
  B-build   
  SOURCE_DIR ${CMAKE_SOURCE_DIR}/B
  INSTALL_COMMAND ""
)