如何将 CMake 文件构建为 OS 通用但又具体?

How to construct CMake files to be OS generic but specific too?

实际上,我的项目有这个文件:

/ cmake / CMakeLists.txt
/ sources / {my cpp headers ...}

然后我在每个 OS 下以相同的方式构建 "project"(makefile 或 .sln...),在此存储库的根目录下使用以下命令:

cmake ./cmake/

但它需要一些可选设置,例如每个 OS 上的 CMAKE_CXX_FLAGS 不同。

我选择将此变量放在 /cmake/CMakeCache.txt 中但不提交此文件(因为它在 OS 之间是不同的)。开发人员必须在每台机器上生成(编辑)这个文件。关于这个 CMakeCache 文件,我只在自述文件中给出了一些说明。

我怎样才能使 cmake 文件再次通用,但在提交的内容中也有这种差异?

您可以直接在 CMakeLists.txt 文件中针对不同平台使用 ifs,如下所示:

if (APPLE)
  # ...
elseif (UNIX)
  # ...
elseif (WIN32)
  # ...
endif()

在您的 CMakeLists.txt 中使用这样的代码:

if(UNIX AND NOT APPLE)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pthread")
elseif(WIN32)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWIN32_LEAN_AND_MEAN")
endif()

备注:

  • 将您的选项附加到 ${CMAKE_CXX_FLAGS} 以便 user-specified 设置也包括在内。
  • 您不能将 list(APPEND ...) 与编译器标志一起使用,因为它使用分号分隔参数(这就是为什么上面的代码使用带引号的 set(...))
  • A​​PPLE 也是 UNIX,所以当我们实际指的是 Linux
  • 时,我们不需要 APPLE