【问题标题】:Custom Properties for Interface Libraries接口库的自定义属性
【发布时间】:2021-09-30 18:00:02
【问题描述】:

我们希望为每个使用的库添加一个许可证文件,以及一个比较许可证以检测它们是否更改的机制。因此,我们向每个库(Boost、Qt 等)添加其许可文件并拥有一个签入副本。

我们认为我们可以为此添加一个我们自己的接口库,使用我们自己的名称,并将实际的 CMake 导入库链接到它,例如 Qt6::CoreBoost::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 如果你能给出答案并解释理由,我会接受。

标签: cmake licensing


【解决方案1】:

INTERFACE 库的自定义属性必须以 INTERFACE_ 为前缀。这是一个用于验证的简单 CMakeLists.txt:

cmake_minimum_required(VERSION 3.21)
project(test NONE)

add_library(foo INTERFACE)
set_property(TARGET foo PROPERTY INTERFACE_CUSTOM "bar")

get_property(value TARGET foo PROPERTY INTERFACE_CUSTOM)
message(STATUS "foo.INTERFACE_CUSTOM = \"${value}\"")

在命令行:

$ cmake -S . -B build
-- foo.INTERFACE_CUSTOM = "bar"
-- Configuring done
-- Generating done
-- Build files have been written to: /home/alex/test/build

请注意,自定义 INTERFACE 属性不会传播,除非为其定义了一些简单的兼容性规则之一。有关详细信息,请参阅compatible interface properties

【讨论】:

  • 谢谢!我以为我尝试在我的名字前加上“INTERFACE”但没有用。这是一个新功能吗? “列入白名单”对我来说意味着可能的标识符的有限列表。否则我们将无法在有限时间内识别标识符是否在列表中
  • @JohannesSchaub-litb -- 我刚刚用 CMake 3.0.2 尝试了上面的代码,它产生了相同的输出,所以不,这不是一个新功能。你能制作 MRE 吗?
  • 我刚刚浏览了 CMake 源代码... 3.19.0 版完全删除了白名单,允许INTERFACE 目标上的任何属性。然而,早在 3.0.2 中,任何以 INTERFACE_ 为前缀的属性都已被允许。但是,如果您在此之前使用过某些东西...please don't.
  • 感谢 Alex,我想我可能只更改了我的一个属性设置器,而将另一个设置为无效名称。我会重新检查。同时,我会留下复选标记!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
相关资源
最近更新 更多