Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

support general packagedeps parameter #1854

Closed
xq114 opened this issue Nov 23, 2021 · 5 comments
Closed

support general packagedeps parameter #1854

xq114 opened this issue Nov 23, 2021 · 5 comments

Comments

@xq114
Copy link
Contributor

xq114 commented Nov 23, 2021

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

目前只有import("package.tools.cmake").install(package)才支持packagedeps,而且支持的方式是cmake特定的。然而,利用环境变量 #1762 ,只需要对不同的编译器msvc/gcc设置环境变量就可以让依赖包被当作系统包一样处理,所以可以实现对不同的安装方法都支持的packagedeps参数。

现在对autoconf的packagedeps是这么实现:

        local cflags = {}
        local ldflags = {}
        for _, dep in ipairs(package:orderdeps()) do
            local fetchinfo = dep:fetch()
            if fetchinfo then
                for _, includedir in ipairs(fetchinfo.includedirs or fetchinfo.sysincludedirs) do
                    table.insert(cflags, "-I" .. includedir)
                end
                for _, linkdir in ipairs(fetchinfo.linkdirs) do
                    table.insert(ldflags, "-L" .. linkdir)
                end
                for _, link in ipairs(fetchinfo.links) do
                    table.insert(ldflags, "-l" .. link)
                end
            end
        end
        import("package.tools.autoconf").install(package, configs, {cflags = cflags, ldflags = ldflags})

对meson的packagedeps是这么实现:

        local envs = meson.buildenvs(package)
        if package:is_plat("windows") then
            for _, dep in ipairs(package:orderdeps()) do
                local fetchinfo = dep:fetch()
                if fetchinfo then
                    for _, includedir in ipairs(fetchinfo.includedirs or fetchinfo.sysincludedirs) do
                        envs.INCLUDE = (envs.INCLUDE or "") .. path.envsep() .. includedir
                    end
                    for _, linkdir in ipairs(fetchinfo.linkdirs) do
                        envs.LIB = (envs.LIB or "") .. path.envsep() .. linkdir
                    end
                end
            end
        end
        meson.install(package, configs, {envs = envs})

现在对xmake的项目也可以用环境变量支持 #1776 实际上完全不需要使用构建工具特定的方法来传入第三方依赖,直接用环境变量模拟系统包即可

描述可能的解决方案

添加一个通用的

import("package.tools.utils").buildenvs(envs, {packagedeps={...}})

之后调用就可以直接从环境变量

import("package.tools.xxx")
import("package.tools.utils")
local envs = xxx.buildenvs(package)
envs = utils.buildenvs(envs, {packagedeps={...}})
xxx.install(package, configs, {envs=envs})

同时如果对某些包环境变量不生效了,还可以切回构建工具特定的packagedeps实现

描述你认为的候选方案

使用环境变量提供meson/autoconf/make/nmake等工具的packagedeps

@waruqi
Copy link
Member

waruqi commented Nov 23, 2021

对其他的加上也是可以的,不管还是看时间吧,最近没啥搞头,都没时间碰电脑。。

@waruqi waruqi added this to the v2.6.1 milestone Nov 23, 2021
@waruqi
Copy link
Member

waruqi commented Nov 24, 2021

import("package.tools.utils").buildenvs(envs, {packagedeps={...}})

这个加可以加,但是我感觉不同构建工具 对环境变量的适配力度 还是多少会有差异,就但 autoconf 里面就遇到过一些坑,需要特殊绕下才能过掉部分检测。。cmake/meson 能否在相同环境envs 支持到相同效果还难说,只能等后续压测后才知道。。

短期内,还是得挨个构建工具加自己的 buildenvs,通用的可以也放个,暂时做测试

@waruqi
Copy link
Member

waruqi commented Nov 24, 2021

而且 还有一些 cmake 等特有的 buildenvs,CMAKE_PREFIX_PATH 等等,用纯通用 buildenvs,还是没法完全替换,到最后还得做 buildenvs 的 merge。。

@waruqi
Copy link
Member

waruqi commented Nov 24, 2021

autoconf 的 packagedeps 我已经加上了

@waruqi
Copy link
Member

waruqi commented Nov 24, 2021

meson 的 packagedeps 我也加上了,不过这个我没测试验证,按理可以,你可以试试,有问题请及时反馈,这里先 close 了

@waruqi waruqi closed this as completed Nov 24, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants