Skip to content

xmake 引入 private/interface 的 add_deps #6489

Open
@Parallel-Paradox

Description

@Parallel-Paradox

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

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

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

在 xmake 中有类似的功能:

#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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions