nda*_*ess 1 cmake cmake-language cmakelists-options
我是 CMake 的新手,我想知道是否有可能target_sources()
根据变量排除某些来源。
假设我在下面有这个
target_sources(myTarget
PUBLIC
PRIVATE
myDir1/src/a.c
myDir2/src/b.c
myDir3/src/c.c
INTERFACE
)
target_include_directories(myTarget
PUBLIC
PRIVATE
myDir1/inc
myDir2/inc
myDir3/inc
INTERFACE
)
Run Code Online (Sandbox Code Playgroud)
我想根据名为 ie 的标志从 myDir3 中排除/包含源/目录myFlag
。我怎样才能做到这一点?
target_sources(myTarget
PUBLIC
PRIVATE
myDir1/src/a.c
myDir2/src/b.c
if(DEFINED myFlag)
myDir3/src/c.c
endif()
INTERFACE
)
target_include_directories(myTarget
PUBLIC
PRIVATE
myDir1/inc
myDir2/inc
if(DEFINED myFlag)
myDir3/inc
endif()
INTERFACE
)
Run Code Online (Sandbox Code Playgroud)
您不能将 if 语句放在命令的参数列表中。这些target_*
命令不会覆盖,而是追加,因此最简单的解决方案如下:
target_sources(
myTarget
PRIVATE
myDir1/src/a.c
myDir2/src/b.c
)
if (myFlag)
target_sources(myTarget PRIVATE myDir3/src/c.c)
endif ()
target_include_directories(
myTarget
PRIVATE
myDir1/inc
myDir2/inc
)
if (myFlag)
target_include_directories(myTarget PRIVATE myDir3/inc)
endif ()
Run Code Online (Sandbox Code Playgroud)
另一个更具声明性的选项是使用生成器表达式,如下所示:
target_sources(
myTarget
PRIVATE
myDir1/src/a.c
myDir2/src/b.c
$<$<BOOL:${myFlag}>:myDir3/src/c.c>
)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
108 次 |
最近记录: |