Skip to content

Commit

Permalink
Merge pull request #4963 from xmake-io/cross
Browse files Browse the repository at this point in the history
Improve to fetch packages for cross-compilation
  • Loading branch information
waruqi committed Apr 11, 2024
2 parents 0a28b27 + 3871415 commit 2288986
Show file tree
Hide file tree
Showing 10 changed files with 67 additions and 42 deletions.
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

0 comments on commit 2288986

Please sign in to comment.