如何将 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
文件中针对不同平台使用 if
s,如下所示:
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(...))
- APPLE 也是 UNIX,所以当我们实际指的是 Linux
时,我们不需要 APPLE
实际上,我的项目有这个文件:
/ 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
文件中针对不同平台使用 if
s,如下所示:
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(...))
- APPLE 也是 UNIX,所以当我们实际指的是 Linux 时,我们不需要 APPLE