【发布时间】:2021-09-30 18:00:02
【问题描述】:
我们希望为每个使用的库添加一个许可证文件,以及一个比较许可证以检测它们是否更改的机制。因此,我们向每个库(Boost、Qt 等)添加其许可文件并拥有一个签入副本。
我们认为我们可以为此添加一个我们自己的接口库,使用我们自己的名称,并将实际的 CMake 导入库链接到它,例如 Qt6::Core 或 Boost::filesystem。但是将许可证文件名添加为属性会导致错误。最后只链接到我们自己的接口库。
function(myNewExternal NAME)
_myParseExternalParameters(EXTARGS ${ARGN})
if(NOT DEFINED EXTARGS_TARGET)
message(FATAL_ERROR "myNewExternal missing TARGET")
endif()
add_library(${NAME} INTERFACE)
target_link_libraries(${NAME} INTERFACE ${EXTARGS_TARGET})
# add property for the original files
define_property(
TARGET
PROPERTY MY_LIC_ORIGINAL
BRIEF_DOCS "Original file name on system"
FULL_DOCS "...")
# add property for the checked-in files
define_property(
TARGET
PROPERTY MY_LIC_CHECKEDIN
BRIEF_DOCS "File name checked-in git (with md5sum appended on disk)"
FULL_DOCS "...")
# add property for the flags (checked(c), printed(p))
define_property(
TARGET
PROPERTY MY_LIC_FLAGS
BRIEF_DOCS "Flags for license checks or manual generation"
FULL_DOCS "...")
endfunction()
但是,设置目标的属性失败并出现错误
CMake Error at cmake/700-externals.cmake:39 (set_property):
INTERFACE_LIBRARY targets may only have whitelisted properties. The
property "MY_LIC_ORIGINAL" is not allowed.
我在这里做错了什么,“正确”的方式是什么?
【问题讨论】:
-
必须是
INTERFACE_MY_LIC_ORIGINAL -
@Alex 如果你能给出答案并解释理由,我会接受。