我的团队正在讨论如何在我们的开发环境中迁移到CMake。我们的软件包括(大部分)两个主要应用程序:
ProcessingHub - 从传感器获取信息,对其进行处理并进行广播。
客户端 - 从ProcessingHub接收数据广播,并提供友好的API来检索数据。
除了许多其他项目之外,这两个软件都使用静态库作为OS接口层;我将其称为OsInterfaceLib。
ProcessingHub还使用另外两个被认为是独立库的静态库,因为它们不仅仅用于ProcessingHub。我将它们称为ProcessingLib和SensorLib。
我们的SVN结构如下:
我们的磁盘工作区完全镜像SVN。
目前,我们分别为Windows和Linux使用签入的Visual Studio和Eclipse项目。在Windows上,必须使用Clang构建ProcessingLib。 Windows是我们的主要平台,ProcessingHub / Client都有VS解决方案,其中包含必要的依赖项目,因为所有这些项目都在不断发展,能够通过项目无缝调试是至关重要的。
我花了整整一个全职工作周来研究CMake,似乎让CMake生成一个VS解决方案的唯一方法是使用add_subdirectory
命令来生成一个包含所有正确依赖项目的VS解决方案对于每个依赖。这与ProcessingLib失败,因为它必须使用与其他工具链不同的工具链构建。据我所知,工具链只能在cmake调用时设置,因此从顶级ProcessingHub或Client CMakeLists.txt一次生成所有内容将不起作用。
我的问题是:保持我们的项目是他们更好的声音,还是有干净,简单的方式来使用CMake:
答案 0 :(得分:1)
您可以通过变量CMAKE_CXX_COMPILER
设置C ++编译器,但请注意,这必须在任何project()
或enable_language()
命令之前完成。
一种天真的方法是在子目录中调用project()
:
顶级CMakeLists.txt:
add_subdirectory(ProcessingLib)
add_subdirecdory(Others)
ProcessingLib CMakeLists.txt:
set(CMAKE_CXX_COMPILER /path/to/clang)
project(ProcessingLib)
...
其他人CMakeLists.txt:
project(Others)
...
但是,查看project()
的文档:
项目的顶级
CMakeLists.txt
文件必须包含对project()
命令的文字直接调用;通过include()
命令加载一个是不够的。如果不存在此类调用,CMake将隐式添加一个启用默认语言(C
和CXX
)的顶部。
所以AFAIK最好的办法是将ProcessingLib
构建为external project而不是子目录:
include(ExternalProject)
ExternalProject_Add(ProcessingLib
SOURCE_DIR /path/to/ProcessingLib
CMAKE_ARGS -DCMAKE_CXX_COMPILER=/path/to/clang
)