cmake:如何写CMakeLists.txt,方便Linux程序移植到Windows?

cmake: How to write CMakeLists.txt in order to facilitate the transplant on Linux programs to Windows?

我在Linux

上写了具有以下文件结构的CMakeLists.txt文件
-main
--include
--bin
--lib
----SRC
------CMakeLists.txt
------dir1
--------CMakeLists.txt
------dir2
--------CMakeLists.txt

dir1/CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
set(HOME "/workspace/main")
set(INCLUDE "${HOME}/include")
set(LIB "${HOME}/lib")
set(LIBRARY_OUTPUT_PATH "${HOME}/lib")
set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_COMPILER "g++")
set(CMAKE_C_FLAGS_DEBUG "xxx")
set(CMAKE_CXX_FLAGS_DEBUG "xxx")
include_directories(${INCLUDE} ${INCLUDE}/AR ${INCLUDE}/linux-x86_64)
add_library(video STATIC video.c video2.c)

dir2目录CMakeLists.txt相似内容

SRC/CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
add_subdirectory(dir1)
add_subdirectory(dir2)

我的问题是:如何写CMakeLists.txt方便Linux程序移植到Windows?

显然不要使用绝对路径。大多数 CMake 命令相对于 root CMakeLists.txt 工作,因此不需要定义 HOME.

变量CMAKE_SOURCE_DIR指的是顶级项目目录。使用此变量而不是 HOME 来引用项目中的目录。

或者,为了能够将子项目构建为独立项目,您可以使用 PROJECT_SOURCE_DIR 来引用当前项目的 目录 。请注意,对于此类子项目,您需要在 CMakeLists.txt 中包含 project()(否则大多数 CMake 命令将不起作用)。

lib/SRC/dir1/CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
project(dir1)
set(HOME "${PROJECT_SOURCE_DIR}/../../..")
...

此外,还有一个变量 CMAKE_CURRENT_SOURCE_DIR,它总是引用 当前源目录CMakeLists.txt 被执行)。

lib/SRC/dir1/CMakeLists.txt:

...
set(HOME "${CMAKE_CURRENT_SOURCE_DIR}/../../..")
...