我有两个名为A
和B
的项目,它们具有完整的CMakeLists.txt项目,每个项目都可以完全构建而不会出错。我想在CMake中定义一个master
项目,它将构建A
和B
(最终可能还有其他一百个)。
我的顶级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_64
和k1om
编译了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编写的所有项目。
答案 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 ""
)