CMake与多个相互依存的项目

时间:2017-02-04 05:17:30

标签: visual-studio-2015 cmake

我的团队正在讨论如何在我们的开发环境中迁移到CMake。我们的软件包括(大部分)两个主要应用程序:

ProcessingHub - 从传感器获取信息,对其进行处理并进行广播。

客户端 - 从ProcessingHub接收数据广播,并提供友好的API来检索数据。

除了许多其他项目之外,这两个软件都使用静态库作为OS接口层;我将其称为OsInterfaceLib。

ProcessingHub还使用另外两个被认为是独立库的静态库,因为它们不仅仅用于ProcessingHub。我将它们称为ProcessingLib和SensorLib。

我们的SVN结构如下:

  • 躯干
    • ProcessingHub
    • 客户端
    • OsInterfaceLib
    • ProcessingLib
    • SensorLib

我们的磁盘工作区完全镜像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:

  1. 使用解决方案资源管理器中已有的必要项目生成ProcessingHub和客户端解决方案
  2. 为OsInterfaceLib使用相同的源代码和生成的项目文件
  3. 不需要重组我们的SVN /签出工作区

1 个答案:

答案 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将隐式添加一个启用默认语言(CCXX)的顶部。

所以AFAIK最好的办法是将ProcessingLib构建为external project而不是子目录:

include(ExternalProject)
ExternalProject_Add(ProcessingLib
    SOURCE_DIR /path/to/ProcessingLib
    CMAKE_ARGS -DCMAKE_CXX_COMPILER=/path/to/clang
)