Open
Description
你在什么场景下需要该功能?
写的时候发现 add_deps 这个函数好像不能像 cmake 的 target_link_library 一样设置作用域,于是研读了一下文档弄出了一个应该是等价的怪异写法,也看看能不能有更好的做法。
对于一些库,我们希望仅引入而不暴露给外部使用者,这就是 private 引入;而自己不允许使用,仅外部使用者可以使用,这就是 interface 引入。
在 xmake 中有类似的功能:
然而针对 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