if (CMAKE_BUILD_TYPE EQUAL "RELEASE")
但它行不通,因为当我使用以下命令构建时
cmake --build . --config Release
显然没有设置
CMAKE_BUILD_TYPE
。
用现代cmake检测发行版与调试构建的正确方法是什么?
(我找不到使用发电机表达式来有条件定义目标的方法)。我想仅在发布模式下构建目标。 [...](我找不到一种使用发电机表达式来有条件定义目标的方法)。
尽管您不能基于活动配置来定义目标,但您可以在某些配置中构建IT。 为了动机,您可以使用一个包含一些仅发行功能的库,例如扩展日志记录或遥测。我们将这个目标称为MyProject_Telemetry
。现在,让我们以
MyProject_TelemetryImpl
renamemane
对其进行更安全的链接更新其现在我们将创建一个有条件地链接到它的
add_library(MyProject_TelemetryImpl) add_library(MyProject::TelemetryImpl ALIAS MyProject_TelemetryImpl) # ... define the target here ...
wrapper图库:
INTERFACE
add_library(MyProject::Telemetry INTERFACE)
target_link_libraries(
MyProject::Telemetry
INTERFACE
"$<$<NOT:$<CONFIG:Debug>>:MyProject::TelemetryImpl>"
)
的任何东西现在都可以链接到此接口。此接口是空的,除了其对真实库的依赖性,但仅在发行模式中存在依赖关系(即释放,minsizerel和relwithdebinfo)。现在,如果用户构建了整个项目(通过
MyProject::Telemetry
,make
,vs中的所有目标等),它仍然会构建ninja
。要解决此问题,我们只需要设置一个属性:
TelemetryImpl
现在,仅当另一个目标取决于它时,真实库才能构建。正如我们确定的那样,只有在发布模式下才是正确的。