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

Improve to fetch packages for cross-compilation #4963

Merged
merged 6 commits into from
Apr 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions xmake/core/base/private/is_cross.lua
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ local os = require("base/os")

-- is cross-compilation?
function is_cross(plat, arch)
plat = plat or os.subhost()
arch = arch or os.subarch()
if os.host() == "windows" then
local host_arch = os.arch()
if plat == "windows" then
Expand Down
15 changes: 9 additions & 6 deletions xmake/core/package/package.lua
Original file line number Diff line number Diff line change
Expand Up @@ -1731,10 +1731,13 @@ function _instance:_fetch_library(opt)
local fetchinfo
local on_fetch = self:script("fetch")
if on_fetch then
fetchinfo = on_fetch(self, {force = opt.force,
system = opt.system,
external = opt.external,
require_version = opt.require_version})
-- we cannot fetch it from system if it's cross-compilation package
if not opt.system or (opt.system and not self:is_cross()) then
fetchinfo = on_fetch(self, {force = opt.force,
system = opt.system,
external = opt.external,
require_version = opt.require_version})
end
if fetchinfo and opt.require_version and opt.require_version:find(".", 1, true) then
local version = fetchinfo.version
if not (version and (version == opt.require_version or semver.satisfies(version, opt.require_version))) then
Expand Down Expand Up @@ -1947,8 +1950,8 @@ function _instance:fetch(opt)
end
end

-- fetch it from the system and external package sources (disabled for cross-compilation)
if not fetchinfo and system ~= false and not self:is_cross() then
-- fetch it from the system and external package sources
if not fetchinfo and system ~= false then
fetchinfo = self:_fetch_library({system = true, require_version = require_ver, external = external, force = opt.force})
if fetchinfo then
is_system = true
Expand Down
23 changes: 23 additions & 0 deletions xmake/core/sandbox/modules/import/private/core/base/is_cross.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
--!A cross-platform build utility based on Lua
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
-- http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
--
-- Copyright (C) 2015-present, TBOOX Open Source Group.
--
-- @author ruki
-- @file is_cross.lua
--

return require("base/private/is_cross")


8 changes: 2 additions & 6 deletions xmake/modules/package/manager/apt/find_package.lua
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import("core.base.option")
import("core.project.config")
import("core.project.target")
import("lib.detect.find_tool")
import("private.core.base.is_cross")
import("package.manager.pkgconfig.find_package", {alias = "find_package_from_pkgconfig"})

-- find package
Expand Down Expand Up @@ -129,19 +130,14 @@ end
-- @param opt the options, e.g. {verbose = true, version = "1.12.0")
--
function main(name, opt)

-- check
opt = opt or {}
if not is_host(opt.plat) or os.arch() ~= opt.arch then
if is_cross(opt.plat, opt.arch) then
return
end

-- find dpkg
local dpkg = find_tool("dpkg")
if not dpkg then
return
end

-- find package
return _find_package(dpkg, name, opt)
end
6 changes: 5 additions & 1 deletion xmake/modules/package/manager/brew/find_package.lua
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import("lib.detect.find_path")
import("lib.detect.pkgconfig")
import("core.project.target")
import("package.manager.find_package")
import("private.core.base.is_cross")

-- get the root directory of the brew packages
function _brew_pkg_rootdir()
Expand Down Expand Up @@ -92,9 +93,12 @@ end
-- @param opt the options, e.g. {verbose = true, version = "1.12.x")
--
function main(name, opt)
opt = opt or {}
if is_cross(opt.plat, opt.arch) then
return
end

-- find the prefix directory of brew
opt = opt or {}
local brew_pkg_rootdir = _brew_pkg_rootdir()
if not brew_pkg_rootdir then
return
Expand Down
27 changes: 7 additions & 20 deletions xmake/modules/package/manager/find_package.lua
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import("core.base.semver")
import("core.base.option")
import("core.project.config")
import("lib.detect.find_tool")
import("private.core.base.is_cross")

-- Is the current version matched?
function _is_match_version(current_version, require_version)
Expand Down Expand Up @@ -53,37 +54,23 @@ function _find_package_with_builtin_rule(package_name, opt)

-- find system package if be not disabled
if opt.system ~= false then

-- find it from homebrew
if not is_host("windows") then
local plat = opt.plat
local arch = opt.arch
local find_from_host = not is_cross(plat, arch)
if find_from_host and not is_host("windows") then
table.insert(managers, "brew")
end

-- find it from vcpkg (support multi-platforms/architectures)
-- vcpkg/conan support multi-platforms/architectures
table.insert(managers, "vcpkg")

-- find it from conan (support multi-platforms/architectures)
table.insert(managers, "conan")

-- only support the current sub-host platform and sub-architecture, e.g. linux, macosx, or msys (subsystem)
local plat = opt.plat
local arch = opt.arch
if plat == os.subhost() and arch == os.subarch() then

-- find it from pkg-config
if find_from_host then
table.insert(managers, "pkgconfig")

-- find it from pacman
if is_subhost("linux", "msys") and plat ~= "windows" and find_tool("pacman") then
table.insert(managers, "pacman")
end

-- find it from portage
if is_subhost("linux", "msys") and plat ~= "windows" and find_tool("emerge") then
table.insert(managers, "portage")
end

-- find it from system
table.insert(managers, "system")
end
end
Expand Down
13 changes: 8 additions & 5 deletions xmake/modules/package/manager/pacman/find_package.lua
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import("core.base.option")
import("core.project.target")
import("lib.detect.find_tool")
import("private.core.base.is_cross")
import("package.manager.pkgconfig.find_package", {alias = "find_package_from_pkgconfig"})

-- get result from list of file inside pacman package
Expand Down Expand Up @@ -51,7 +52,7 @@ function _find_package_from_list(list, name, pacman, opt)
if line:find("/include/", 1, true) and (line:endswith(".h") or line:endswith(".hpp")) then
if not line:startswith("/usr/include/") then
local hpath = line
if is_subhost("msys") and opt.plat == "mingw" then
if is_subhost("msys") and opt.plat == "mingw" then
hpath = path.join(pathtomsys, line)
local basehpath = path.join(pathtomsys, msystem .. "/include")
table.insert(result.includedirs, basehpath)
Expand Down Expand Up @@ -103,9 +104,12 @@ end
-- @param opt the options, e.g. {verbose = true, version = "1.12.x")
--
function main(name, opt)
opt = opt or {}
if is_cross(opt.plat, opt.arch) then
return
end

-- find pacman
opt = opt or {}
local pacman = find_tool("pacman")
if not pacman then
return
Expand All @@ -125,13 +129,13 @@ function main(name, opt)
name = prefix .. arch .. name
end
end

-- get package files list
list = name and try { function() return os.iorunv(pacman.program, {"-Q", "-l", name}) end }
if not list then
return
end

-- parse package files list
local linkdirs = {}
local pkgconfig_files = {}
Expand Down Expand Up @@ -179,6 +183,5 @@ function main(name, opt)
-- if there is no .pc, we parse the package content to obtain the data we want
result = _find_package_from_list(list, name, pacman, opt)
end

return result
end
6 changes: 4 additions & 2 deletions xmake/modules/package/manager/portage/find_package.lua
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import("core.base.option")
import("lib.detect.find_file")
import("lib.detect.find_tool")
import("private.core.base.is_cross")
import("package.manager.pkgconfig.find_package", {alias = "find_package_from_pkgconfig"})

-- find package from the system directories
Expand All @@ -30,9 +31,10 @@ import("package.manager.pkgconfig.find_package", {alias = "find_package_from_pkg
-- @param opt the options, e.g. {verbose = true, version = "1.12.x")
--
function main(name, opt)

-- init options
opt = opt or {}
if is_cross(opt.plat, opt.arch) then
return
end

-- for msys2/mingw? mingw-w64-[i686|x86_64]-xxx
if opt.plat == "mingw" then
Expand Down
6 changes: 5 additions & 1 deletion xmake/modules/package/manager/system/find_package.lua
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

-- imports
import("core.language.language")
import("private.core.base.is_cross")
import("lib.detect.check_cxsnippets")

-- get package items
Expand Down Expand Up @@ -57,8 +58,11 @@ end
--
function main(name, opt)
opt = opt or {}
local configs = opt.configs or {}
if is_cross(opt.plat, opt.arch) then
return
end

local configs = opt.configs or {}
local items = _get_package_items()
local snippet_configs = {}
for _, name in ipairs(items) do
Expand Down
3 changes: 2 additions & 1 deletion xmake/modules/package/manager/zypper/find_package.lua
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import("core.base.option")
import("core.project.config")
import("core.project.target")
import("lib.detect.find_tool")
import("private.core.base.is_cross")
import("package.manager.pkgconfig.find_package", { alias = "find_package_from_pkgconfig" })

-- find package
Expand Down Expand Up @@ -137,7 +138,7 @@ end
--
function main(name, opt)
opt = opt or {}
if not is_host(opt.plat) or os.arch() ~= opt.arch then
if is_cross(opt.plat, opt.arch) then
return
end
local rpm = find_tool("rpm")
Expand Down