xmake icon indicating copy to clipboard operation
xmake copied to clipboard

xmake 引入 private/interface 的 add_deps

Open Parallel-Paradox opened this issue 9 months ago • 3 comments

你在什么场景下需要该功能?

写的时候发现 add_deps 这个函数好像不能像 cmake 的 target_link_library 一样设置作用域,于是研读了一下文档弄出了一个应该是等价的怪异写法,也看看能不能有更好的做法。

对于一些库,我们希望仅引入而不暴露给外部使用者,这就是 private 引入;而自己不允许使用,仅外部使用者可以使用,这就是 interface 引入。

在 xmake 中有类似的功能:

https://github.com/xmake-io/xmake/issues/368

然而针对 add_deps 这个接口,这个功能是不生效的,偏偏又有很多库是通过 add_deps 而不是 add_links 引入的。

https://xmake.io/#/manual/project_target?id=targetadd_deps

对于 cmake 来说,我们可以直接这样写:

target_link_libraries(lib_1 PUBLIC|PRIVATE|INTERFACE lib_2)

这样就可以以任意形式链接了。

而在 xmake 中,public 的情况比较简单,只需要:

target("lib_1")
  add_deps("lib_2")

而对 private 和 interface 的情况:

target("lib_1")
  add_deps("lib_2", {inherit = false})
  on_config(function (target)
    local targetdir = path.translate("$(projectdir)/"..target:targetdir())
    print(targetdir)
    target:add("linkdirs", targetdir)
    target:add("rpathdirs", targetdir)
  end)
  add_links("lib_2", {private = true})
  --add_links("lib_2", {interface = true})

这段代码主要是通过 inherit = false 关闭了所有的自动引入,然后通过 on_config 的脚本将原本自动配置的链接路径手动配置好,之后就可以通过add_links 来操纵链接过程了。

另外,这种方法仅适用于 lib_1 和 lib_2 共用同一个 targetdir 的情况,如果不共用的话要在 lib_1 中获取到 lib_2 的路径去做拼接,还会引入更多的复杂度。

有点繁琐,不知道能不能改进一下,或者也许有更好的写法?

描述可能的解决方案

也许类似 add_deps("lib_2", {private = true}) 这样的语法糖?

描述你认为的候选方案

No response

其他信息

No response

Parallel-Paradox avatar May 22 '25 06:05 Parallel-Paradox

Bot detected the issue body's language is not English, translate it automatically.


Title: xmake introduces add_deps for private/interface

Issues-translate-bot avatar May 22 '25 06:05 Issues-translate-bot

暂时不考虑,不太好实现。

waruqi avatar May 29 '25 15:05 waruqi

Bot detected the issue body's language is not English, translate it automatically.


Not considering it for the time being, it is not easy to achieve.

Issues-translate-bot avatar May 29 '25 15:05 Issues-translate-bot