我正在重构一个cmake文件,以便在个人项目中使用现代cmake实践。但是,由于我不认为操作系统是一个广义变量,所以为了在CMAKE中测试操作系统,我必须执行以下操作(
based on this answer
):
if(UNIX AND NOT APPLE)
set(LINUX TRUE)
endif()
#...
if(LINUX)
set(MY_PROJECT_LINK_ARGUMENTS ...)
elseif(WIN32)
set(MY_PROJECT_LINK_ARGUMENTS ...)
else()
message( FATAL_ERROR "Unsupported operating system")
endif()
add_library(xxx STATIC)
#...
target_link_libraries(xxx INTERFACE ${MY_PROJECT_LINK_LIBRARIES} ...)
add_library(yyy STATIC)
#...
target_link_libraries(yyy INTERFACE ${MY_PROJECT_LINK_LIBRARIES} ...)
add_library(zzz STATIC)
#...
target_link_libraries(zzz INTERFACE ${MY_PROJECT_LINK_LIBRARIES} ...)
我所困惑的是如何在惯用的基于现代目标的CMAKE中实现这一点。由于我不知道存在一个通常封装操作系统的CVALE变量,所以我创建了一个OS变量。
if(UNIX AND NOT APPLE)
set(LINUX TRUE)
set(PROJECT_OS LINUX)
elseif(APPLE)
set(PROJECT_OS APPLE)
elseif(WIN32)
set(PROJECT_OS WIN32)
endif()
然后我创建一个生成器表达式
target_link_libraries(xxx INTERFACE
$<$<BOOL:$<PROJECT_OS:LINUX>>: ...>
$<$<BOOL:$<PROJECT_OS:WIN32>>: ...>
...)
但现在我已经创建了一个变量,如果我将相同的参数传递给每个目标(
xxx
,
yyy
,
zzz
)我会把同样的东西复制好几次。
我认为解决这个问题的唯一方法是使用变量,但是现代的CMAKE指南显然指出我们应该远离变量(例如
A
,
B
,和
C
),那么我该如何在没有他们的情况下完成这项任务呢?