cmake - 我可以控制 CMake 中 target_sources 的源排除吗?
问题描述
我是 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
)
我想根据名为 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
)
解决方案
您不能将 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 ()
另一个更具声明性的选项是使用生成器表达式,如下所示:
target_sources(
myTarget
PRIVATE
myDir1/src/a.c
myDir2/src/b.c
$<$<BOOL:${myFlag}>:myDir3/src/c.c>
)
推荐阅读
- xcode - 重命名后,XCode 项目不会在 mac 启动时自动加载
- spring-boot - 如何将待办事项中的属性标签的资源值放入application.properties
- android - Android SharedPreferences 漏洞
- linux - 如何确定在对配方进行位烘焙时生成哪个二进制文件
- linux - 无法在 bash 脚本中声明数组
- excel - 如何根据所述分隔符之间的第一个字母对 Excel 中两个分隔符之间的值求和?
- java - 如何转换json?
- material-ui - 是否可以将 InputLabel 与 TextField 以外的其他元素一起使用?
- jpa - Eclipselink JPA 3.0 和独立数据库的连接错误
- html - 我如何将这些照片叠加在一起?