From a07938f51e94935fdf8d995969314e8296eaa619 Mon Sep 17 00:00:00 2001 From: Jérôme Leclercq Date: Tue, 17 Aug 2021 15:37:59 +0200 Subject: tools.make: add support of Windows MinGW --- xmake/modules/package/tools/make.lua | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'xmake/modules/package/tools/make.lua') diff --git a/xmake/modules/package/tools/make.lua b/xmake/modules/package/tools/make.lua index b236b9da6..5c58d9de6 100644 --- a/xmake/modules/package/tools/make.lua +++ b/xmake/modules/package/tools/make.lua @@ -104,6 +104,10 @@ function build(package, configs, opt) -- do build if is_host("bsd") then os.vrunv("gmake", argv, {envs = opt.envs or buildenvs(package)}) + elseif package:is_plat("mingw") and is_subhost("windows") then + local mingw = assert(package:build_getenv("mingw") or package:build_getenv("sdk"), "mingw not found!") + local make = path.join(mingw, "bin", "mingw32-make.exe") + os.vrunv(make, argv, {envs = opt.envs or buildenvs(package)}) else os.vrunv("make", argv, {envs = opt.envs or buildenvs(package)}) end @@ -123,6 +127,10 @@ function install(package, configs, opt) end if is_host("bsd") then os.vrunv("gmake", argv, {envs = opt.envs or buildenvs(package)}) + elseif package:is_plat("mingw") and is_subhost("windows") then + local mingw = assert(package:build_getenv("mingw") or package:build_getenv("sdk"), "mingw not found!") + local make = path.join(mingw, "bin", "mingw32-make.exe") + os.vrunv(make, argv, {envs = opt.envs or buildenvs(package)}) else os.vrunv("make", argv, {envs = opt.envs or buildenvs(package)}) end -- cgit v1.3.1 From ec8fcf0e879c6b047195ceb2499d75d0350b7ff4 Mon Sep 17 00:00:00 2001 From: Jérôme Leclercq Date: Tue, 17 Aug 2021 16:16:50 +0200 Subject: Update make.lua --- xmake/modules/package/tools/make.lua | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'xmake/modules/package/tools/make.lua') diff --git a/xmake/modules/package/tools/make.lua b/xmake/modules/package/tools/make.lua index 5c58d9de6..15158fad4 100644 --- a/xmake/modules/package/tools/make.lua +++ b/xmake/modules/package/tools/make.lua @@ -75,6 +75,11 @@ function buildenvs(package) end envs.ACLOCAL_PATH = path.joinenv(ACLOCAL_PATH) envs.PKG_CONFIG_PATH = path.joinenv(PKG_CONFIG_PATH) + -- some Makefile use ComSpec to detect Windows (e.g. Makefiles generated by Premake) and require this env + if is_subhost("windows") then + envs.ComSpec = os.getenv("ComSpec") + end + return envs end -- cgit v1.3.1 From 6b27b01a08c545e786a03c7062b1b3f9a6931c80 Mon Sep 17 00:00:00 2001 From: Jérôme Leclercq Date: Tue, 17 Aug 2021 16:19:17 +0200 Subject: make: add missing CXX env --- xmake/modules/package/tools/make.lua | 1 + 1 file changed, 1 insertion(+) (limited to 'xmake/modules/package/tools/make.lua') diff --git a/xmake/modules/package/tools/make.lua b/xmake/modules/package/tools/make.lua index 15158fad4..ff6dce8ed 100644 --- a/xmake/modules/package/tools/make.lua +++ b/xmake/modules/package/tools/make.lua @@ -44,6 +44,7 @@ function buildenvs(package) local cflags = table.join(table.wrap(package:build_getenv("cxflags")), package:build_getenv("cflags")) local cxxflags = table.join(table.wrap(package:build_getenv("cxflags")), package:build_getenv("cxxflags")) envs.CC = package:build_getenv("cc") + envs.CXX = package:build_getenv("cxx") envs.AS = package:build_getenv("as") envs.AR = package:build_getenv("ar") envs.LD = package:build_getenv("ld") -- cgit v1.3.1 From 0a271b992bb97a3d2e6b00d9facf1eb26ef2f899 Mon Sep 17 00:00:00 2001 From: ruki Date: Tue, 7 Sep 2021 00:55:33 +0800 Subject: improve njob --- xmake/actions/build/xmake.lua | 2 +- xmake/actions/require/xmake.lua | 2 +- .../modules/import/core/project/project.lua | 2 +- xmake/core/sandbox/modules/interpreter/os.lua | 43 +++++++++++----------- xmake/modules/package/tools/autoconf.lua | 2 +- xmake/modules/package/tools/cmake.lua | 2 +- xmake/modules/package/tools/make.lua | 2 +- xmake/modules/package/tools/ninja.lua | 4 +- xmake/modules/package/tools/scons.lua | 2 +- xmake/modules/private/xrepo/action/install.lua | 2 +- 10 files changed, 32 insertions(+), 31 deletions(-) (limited to 'xmake/modules/package/tools/make.lua') diff --git a/xmake/actions/build/xmake.lua b/xmake/actions/build/xmake.lua index 3323ac5b1..631536f24 100644 --- a/xmake/actions/build/xmake.lua +++ b/xmake/actions/build/xmake.lua @@ -47,7 +47,7 @@ task("build") , {nil, "dry-run", "k", nil , "Dry run to build target." } , {} - , {'j', "jobs", "kv", tostring(math.ceil(os.cpuinfo().ncpu * 3 / 2)), + , {'j', "jobs", "kv", tostring(os.default_njob()), "Set the number of parallel compilation jobs." } , {nil, "linkjobs", "kv", nil, "Set the number of parallel link jobs." } , {'w', "warning", "k", false , "Enable the warnings output." } diff --git a/xmake/actions/require/xmake.lua b/xmake/actions/require/xmake.lua index f33188f77..3ffd17fe3 100644 --- a/xmake/actions/require/xmake.lua +++ b/xmake/actions/require/xmake.lua @@ -46,7 +46,7 @@ task("require") " $ xmake require --clean", " $ xmake require --clean zlib tbox pcr*" } , {'f', "force", "k", nil, "Force to reinstall all package dependencies." } - , {'j', "jobs", "kv", tostring(math.ceil(os.cpuinfo().ncpu * 3 / 2)), + , {'j', "jobs", "kv", tostring(os.default_njob()), "Set the number of parallel compilation jobs." } , {nil, "linkjobs", "kv", nil, "Set the number of parallel link jobs." } , {nil, "shallow", "k", nil, "Does not install dependent packages." } diff --git a/xmake/core/sandbox/modules/import/core/project/project.lua b/xmake/core/sandbox/modules/import/core/project/project.lua index 34b5fa7ac..2330dccd0 100644 --- a/xmake/core/sandbox/modules/import/core/project/project.lua +++ b/xmake/core/sandbox/modules/import/core/project/project.lua @@ -110,7 +110,7 @@ function sandbox_core_project.check() end -- check all options - local jobs = baseoption.get("jobs") or math.ceil(os.cpuinfo().ncpu * 3 / 2) + local jobs = baseoption.get("jobs") or os.default_njob() import("private.async.runjobs", {anonymous = true})("check_options", instance:fork(checktask):script(), {total = #options, comax = jobs}) -- save all options to the cache file diff --git a/xmake/core/sandbox/modules/interpreter/os.lua b/xmake/core/sandbox/modules/interpreter/os.lua index 10c4b710c..dff4a14d7 100644 --- a/xmake/core/sandbox/modules/interpreter/os.lua +++ b/xmake/core/sandbox/modules/interpreter/os.lua @@ -27,27 +27,28 @@ local interpreter = require("base/interpreter") local sandbox_os = sandbox_os or {} -- export some readonly interfaces -sandbox_os.term = os.term -sandbox_os.host = os.host -sandbox_os.arch = os.arch -sandbox_os.subhost = os.subhost -sandbox_os.subarch = os.subarch -sandbox_os.date = os.date -sandbox_os.time = os.time -sandbox_os.mtime = os.mtime -sandbox_os.mclock = os.mclock -sandbox_os.getenv = os.getenv -sandbox_os.isdir = os.isdir -sandbox_os.isfile = os.isfile -sandbox_os.exists = os.exists -sandbox_os.curdir = os.curdir -sandbox_os.tmpdir = os.tmpdir -sandbox_os.cpuinfo = os.cpuinfo -sandbox_os.filesize = os.filesize -sandbox_os.programdir = os.programdir -sandbox_os.programfile = os.programfile -sandbox_os.projectdir = os.projectdir -sandbox_os.projectfile = os.projectfile +sandbox_os.term = os.term +sandbox_os.host = os.host +sandbox_os.arch = os.arch +sandbox_os.subhost = os.subhost +sandbox_os.subarch = os.subarch +sandbox_os.date = os.date +sandbox_os.time = os.time +sandbox_os.mtime = os.mtime +sandbox_os.mclock = os.mclock +sandbox_os.getenv = os.getenv +sandbox_os.isdir = os.isdir +sandbox_os.isfile = os.isfile +sandbox_os.exists = os.exists +sandbox_os.curdir = os.curdir +sandbox_os.tmpdir = os.tmpdir +sandbox_os.cpuinfo = os.cpuinfo +sandbox_os.default_njob = os.default_njob +sandbox_os.filesize = os.filesize +sandbox_os.programdir = os.programdir +sandbox_os.programfile = os.programfile +sandbox_os.projectdir = os.projectdir +sandbox_os.projectfile = os.projectfile -- match files function sandbox_os.files(pattern, ...) diff --git a/xmake/modules/package/tools/autoconf.lua b/xmake/modules/package/tools/autoconf.lua index 209e6c68a..9e4f8c4b4 100644 --- a/xmake/modules/package/tools/autoconf.lua +++ b/xmake/modules/package/tools/autoconf.lua @@ -299,7 +299,7 @@ function install(package, configs, opt) -- do make and install opt = opt or {} - local njob = opt.jobs or option.get("jobs") or tostring(math.ceil(os.cpuinfo().ncpu * 3 / 2)) + local njob = opt.jobs or option.get("jobs") or tostring(os.default_njob()) local argv = {"-j" .. njob} if option.get("verbose") then table.insert(argv, "V=1") diff --git a/xmake/modules/package/tools/cmake.lua b/xmake/modules/package/tools/cmake.lua index 73af75b32..857f859be 100644 --- a/xmake/modules/package/tools/cmake.lua +++ b/xmake/modules/package/tools/cmake.lua @@ -30,7 +30,7 @@ import("package.tools.ninja") -- get the number of parallel jobs function _get_parallel_njobs(opt) - return opt.jobs or option.get("jobs") or tostring(math.ceil(os.cpuinfo().ncpu * 3 / 2)) + return opt.jobs or option.get("jobs") or tostring(os.default_njob()) end -- translate paths diff --git a/xmake/modules/package/tools/make.lua b/xmake/modules/package/tools/make.lua index ff6dce8ed..a40cd57c1 100644 --- a/xmake/modules/package/tools/make.lua +++ b/xmake/modules/package/tools/make.lua @@ -91,7 +91,7 @@ function build(package, configs, opt) opt = opt or {} -- pass configurations - local njob = opt.jobs or option.get("jobs") or tostring(math.ceil(os.cpuinfo().ncpu * 3 / 2)) + local njob = opt.jobs or option.get("jobs") or tostring(os.default_njob()) local argv = {"-j" .. njob} if option.get("verbose") then table.insert(argv, "VERBOSE=1") diff --git a/xmake/modules/package/tools/ninja.lua b/xmake/modules/package/tools/ninja.lua index e1feccc14..e16731670 100644 --- a/xmake/modules/package/tools/ninja.lua +++ b/xmake/modules/package/tools/ninja.lua @@ -26,7 +26,7 @@ import("lib.detect.find_tool") function build(package, configs, opt) opt = opt or {} local buildir = opt.buildir or os.curdir() - local njob = opt.jobs or option.get("jobs") or tostring(math.ceil(os.cpuinfo().ncpu * 3 / 2)) + local njob = opt.jobs or option.get("jobs") or tostring(os.default_njob()) local ninja = assert(find_tool("ninja"), "ninja not found!") local argv = {"-C", buildir} if option.get("verbose") then @@ -44,7 +44,7 @@ end function install(package, configs, opt) opt = opt or {} local buildir = opt.buildir or os.curdir() - local njob = tostring(math.ceil(os.cpuinfo().ncpu * 3 / 2)) + local njob = tostring(os.default_njob()) local ninja = assert(find_tool("ninja"), "ninja not found!") local argv = {"install", "-C", buildir} if option.get("verbose") then diff --git a/xmake/modules/package/tools/scons.lua b/xmake/modules/package/tools/scons.lua index 386645bba..0c197933f 100644 --- a/xmake/modules/package/tools/scons.lua +++ b/xmake/modules/package/tools/scons.lua @@ -86,7 +86,7 @@ end function build(package, configs, opt) opt = opt or {} local buildir = opt.buildir or os.curdir() - local njob = opt.jobs or option.get("jobs") or tostring(math.ceil(os.cpuinfo().ncpu * 3 / 2)) + local njob = opt.jobs or option.get("jobs") or tostring(os.default_njob()) local scons = assert(find_tool("scons"), "scons not found!") local argv = {"-C", buildir, "-j", njob} configs = _get_configs(package, configs) diff --git a/xmake/modules/private/xrepo/action/install.lua b/xmake/modules/private/xrepo/action/install.lua index ccd14c839..f6f111185 100644 --- a/xmake/modules/private/xrepo/action/install.lua +++ b/xmake/modules/private/xrepo/action/install.lua @@ -40,7 +40,7 @@ function menu_options() "e.g.", " - xrepo install -f \"vs_runtime=MD\" zlib", " - xrepo install -f \"regex=true,thread=true\" boost"}, - {'j', "jobs", "kv", tostring(math.ceil(os.cpuinfo().ncpu * 3 / 2)), + {'j', "jobs", "kv", tostring(os.default_njob()), "Set the number of parallel compilation jobs."}, {nil, "linkjobs", "kv", nil, "Set the number of parallel link jobs."}, {nil, "includes", "kv", nil, "Includes extra lua configuration files.", -- cgit v1.3.1 From c360a739ba17f89f7f4d4f8ffbebc30576cd7dea Mon Sep 17 00:00:00 2001 From: ruki Date: Thu, 7 Oct 2021 00:47:50 +0800 Subject: improve make for tools/make/autoconf --- xmake/modules/detect/tools/find_make.lua | 53 ++++++++++++++++++++++++++++++++ xmake/modules/package/tools/autoconf.lua | 43 +++++++++++++++++++++----- xmake/modules/package/tools/make.lua | 39 ++++++++++++----------- 3 files changed, 109 insertions(+), 26 deletions(-) create mode 100644 xmake/modules/detect/tools/find_make.lua (limited to 'xmake/modules/package/tools/make.lua') diff --git a/xmake/modules/detect/tools/find_make.lua b/xmake/modules/detect/tools/find_make.lua new file mode 100644 index 000000000..eb2957d63 --- /dev/null +++ b/xmake/modules/detect/tools/find_make.lua @@ -0,0 +1,53 @@ +--!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 find_make.lua +-- + +-- imports +import("lib.detect.find_program") +import("lib.detect.find_programver") + +-- find make +-- +-- @param opt the argument options, e.g. {version = true} +-- +-- @return program, version +-- +-- @code +-- +-- local make = find_make() +-- +-- @endcode +-- +function main(opt) + + -- find program + opt = opt or {} + local program = find_program(opt.program or (is_host("bsd") and "gmake" or "make"), opt) + if not program and not opt.program and is_subhost("msys", "cygwin") then + program = find_program("mingw32-make.exe", opt) + end + + -- find program version + local version = nil + if program and opt and opt.version then + version = find_programver(program, opt) + end + return program, version +end + diff --git a/xmake/modules/package/tools/autoconf.lua b/xmake/modules/package/tools/autoconf.lua index b0607ac0d..f06a18bb0 100644 --- a/xmake/modules/package/tools/autoconf.lua +++ b/xmake/modules/package/tools/autoconf.lua @@ -23,6 +23,7 @@ import("core.base.option") import("core.project.config") import("core.tool.linker") import("core.tool.compiler") +import("lib.detect.find_tool") -- translate path function _translate_path(package, p) @@ -296,8 +297,25 @@ function configure(package, configs, opt) os.vrunv("sh", argv, {envs = envs}) end --- install package -function install(package, configs, opt) +-- do make +function make(package, argv, opt) + opt = opt or {} + local program + if package:is_plat("mingw") and is_subhost("windows") then + local mingw = assert(package:build_getenv("mingw") or package:build_getenv("sdk"), "mingw not found!") + program = path.join(mingw, "bin", "mingw32-make.exe") + else + local tool = find_tool("make") + if tool then + program = tool.program + end + end + assert(program, "make not found!") + os.vrunv(program, argv) +end + +-- build package +function build(package, configs, opt) -- do configure configure(package, configs, opt) @@ -309,12 +327,21 @@ function install(package, configs, opt) if option.get("verbose") then table.insert(argv, "V=1") end - if is_host("bsd") then - os.vrunv("gmake", argv) - os.vrun("gmake install") - else - os.vrunv("make", argv) - os.vrun("make install") + make(package, argv, opt) +end + +-- install package +function install(package, configs, opt) + + -- do build + opt = opt or {} + build(package, configs, opt) + + -- do install + local argv = {"install"} + if option.get("verbose") then + table.insert(argv, "V=1") end + make(package, argv, opt) end diff --git a/xmake/modules/package/tools/make.lua b/xmake/modules/package/tools/make.lua index a40cd57c1..af5f977fa 100644 --- a/xmake/modules/package/tools/make.lua +++ b/xmake/modules/package/tools/make.lua @@ -21,6 +21,7 @@ -- imports import("core.base.option") import("core.project.config") +import("lib.detect.find_tool") -- get the build environments function buildenvs(package) @@ -84,6 +85,24 @@ function buildenvs(package) return envs end +-- do make +function make(package, argv, opt) + opt = opt or {} + local program + local runenvs = opt.envs or buildenvs(package) + if package:is_plat("mingw") and is_subhost("windows") then + local mingw = assert(package:build_getenv("mingw") or package:build_getenv("sdk"), "mingw not found!") + program = path.join(mingw, "bin", "mingw32-make.exe") + else + local tool = find_tool("make", {envs = runenvs}) + if tool then + program = tool.program + end + end + assert(program, "make not found!") + os.vrunv(program, argv, {envs = runenvs}) +end + -- build package function build(package, configs, opt) @@ -108,15 +127,7 @@ function build(package, configs, opt) end -- do build - if is_host("bsd") then - os.vrunv("gmake", argv, {envs = opt.envs or buildenvs(package)}) - elseif package:is_plat("mingw") and is_subhost("windows") then - local mingw = assert(package:build_getenv("mingw") or package:build_getenv("sdk"), "mingw not found!") - local make = path.join(mingw, "bin", "mingw32-make.exe") - os.vrunv(make, argv, {envs = opt.envs or buildenvs(package)}) - else - os.vrunv("make", argv, {envs = opt.envs or buildenvs(package)}) - end + make(package, argv, opt) end -- install package @@ -131,13 +142,5 @@ function install(package, configs, opt) if option.get("verbose") then table.insert(argv, "VERBOSE=1") end - if is_host("bsd") then - os.vrunv("gmake", argv, {envs = opt.envs or buildenvs(package)}) - elseif package:is_plat("mingw") and is_subhost("windows") then - local mingw = assert(package:build_getenv("mingw") or package:build_getenv("sdk"), "mingw not found!") - local make = path.join(mingw, "bin", "mingw32-make.exe") - os.vrunv(make, argv, {envs = opt.envs or buildenvs(package)}) - else - os.vrunv("make", argv, {envs = opt.envs or buildenvs(package)}) - end + make(package, argv, opt) end -- cgit v1.3.1 From 86eaab2842abf6570895da359ed484805bf759a5 Mon Sep 17 00:00:00 2001 From: ruki Date: Wed, 8 Dec 2021 14:44:54 +0800 Subject: Update make.lua --- xmake/modules/package/tools/make.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'xmake/modules/package/tools/make.lua') diff --git a/xmake/modules/package/tools/make.lua b/xmake/modules/package/tools/make.lua index af5f977fa..cbc58c9e2 100644 --- a/xmake/modules/package/tools/make.lua +++ b/xmake/modules/package/tools/make.lua @@ -100,7 +100,7 @@ function make(package, argv, opt) end end assert(program, "make not found!") - os.vrunv(program, argv, {envs = runenvs}) + os.vrunv(program, argv, {envs = runenvs, curdir = opt.curdir}) end -- build package -- cgit v1.3.1 From f40be9121cbf87a3345801b27337ddb7ecdab3d8 Mon Sep 17 00:00:00 2001 From: ruki Date: Sat, 11 Dec 2021 18:54:53 +0800 Subject: Update make.lua --- xmake/modules/package/tools/make.lua | 337 +++++++++++++++++++++++++++++++---- 1 file changed, 306 insertions(+), 31 deletions(-) (limited to 'xmake/modules/package/tools/make.lua') diff --git a/xmake/modules/package/tools/make.lua b/xmake/modules/package/tools/make.lua index cbc58c9e2..12b94d64f 100644 --- a/xmake/modules/package/tools/make.lua +++ b/xmake/modules/package/tools/make.lua @@ -15,18 +15,148 @@ -- Copyright (C) 2015-present, TBOOX Open Source Group. -- -- @author ruki --- @file make.lua +-- @file autoconf.lua -- -- imports import("core.base.option") import("core.project.config") +import("core.tool.linker") +import("core.tool.compiler") import("lib.detect.find_tool") +-- translate paths +function _translate_paths(package, paths) + if paths and is_host("windows") and (package:is_plat("mingw") or package:is_plat("msys") or package:is_plat("cygwin")) then + if type(paths) == "string" then + return (paths:gsub("\\", "/")) + elseif type(paths) == "table" then + local result = {} + for _, p in ipairs(paths) do + table.insert(result, (p:gsub("\\", "/"))) + end + return result + end + end + return paths +end + +-- translate windows bin path +function _translate_windows_bin_path(bin_path) + if bin_path then + local argv = os.argv(bin_path) + argv[1] = argv[1]:gsub("\\", "/") .. ".exe" + return os.args(argv) + end +end + +-- map compiler flags +function _map_compflags(package, langkind, name, values) + return compiler.map_flags(langkind, name, values, {target = package}) +end + +-- map linker flags +function _map_linkflags(package, targetkind, sourcekinds, name, values) + return linker.map_flags(targetkind, sourcekinds, name, values, {target = package}) +end + +-- get configs +function _get_configs(package, configs) + + -- add prefix + local configs = configs or {} + table.insert(configs, "--prefix=" .. _translate_paths(package, package:installdir())) + + -- add host for cross-complation + if not configs.host and not package:is_plat(os.subhost()) then + if package:is_plat("iphoneos") then + local triples = + { + arm64 = "aarch64-apple-darwin", + arm64e = "aarch64-apple-darwin", + armv7 = "armv7-apple-darwin", + armv7s = "armv7s-apple-darwin", + i386 = "i386-apple-darwin", + x86_64 = "x86_64-apple-darwin" + } + table.insert(configs, "--host=" .. (triples[package:arch()] or triples.arm64)) + elseif package:is_plat("android") then + -- @see https://developer.android.com/ndk/guides/other_build_systems#autoconf + local triples = + { + ["armv5te"] = "arm-linux-androideabi", -- deprecated + ["armv7-a"] = "arm-linux-androideabi", -- deprecated + ["armeabi"] = "arm-linux-androideabi", -- removed in ndk r17 + ["armeabi-v7a"] = "arm-linux-androideabi", + ["arm64-v8a"] = "aarch64-linux-android", + i386 = "i686-linux-android", -- deprecated + x86 = "i686-linux-android", + x86_64 = "x86_64-linux-android", + mips = "mips-linux-android", -- removed in ndk r17 + mips64 = "mips64-linux-android" -- removed in ndk r17 + } + table.insert(configs, "--host=" .. (triples[package:arch()] or triples["armeabi-v7a"])) + elseif package:is_plat("mingw") then + local triples = + { + i386 = "i686-w64-mingw32", + x86_64 = "x86_64-w64-mingw32" + } + table.insert(configs, "--host=" .. (triples[package:arch()] or triples.i386)) + elseif package:is_plat("cross") then + local host = package:arch() + if package:is_arch("arm64") then + host = "aarch64" + elseif package:is_arch("arm.*") then + host = "arm" + end + host = host .. "-" .. package:targetos() + table.insert(configs, "--host=" .. host) + end + end + return configs +end + +-- get cflags from package deps +function _get_cflags_from_packagedeps(package, opt) + local result = {} + for _, depname in ipairs(opt.packagedeps) do + local dep = package:dep(depname) + if dep then + local fetchinfo = dep:fetch({external = false}) + if fetchinfo then + table.join2(result, _map_compflags(package, "cxx", "define", fetchinfo.defines)) + table.join2(result, _translate_paths(package, _map_compflags(package, "cxx", "includedir", fetchinfo.includedirs))) + table.join2(result, _translate_paths(package, _map_compflags(package, "cxx", "sysincludedir", fetchinfo.sysincludedirs))) + end + end + end + return result +end + +-- get ldflags from package deps +function _get_ldflags_from_packagedeps(package, opt) + local result = {} + for _, depname in ipairs(opt.packagedeps) do + local dep = package:dep(depname) + if dep then + local fetchinfo = dep:fetch({external = false}) + if fetchinfo then + table.join2(result, _translate_paths(package, _map_linkflags(package, "binary", {"cxx"}, "linkdir", fetchinfo.linkdirs))) + table.join2(result, _map_linkflags(package, "binary", {"cxx"}, "link", fetchinfo.links)) + table.join2(result, _translate_paths(package, _map_linkflags(package, "binary", {"cxx"}, "syslink", fetchinfo.syslinks))) + end + end + end + return result +end + -- get the build environments -function buildenvs(package) +function buildenvs(package, opt) + opt = opt or {} local envs = {} - if package:is_plat(os.host()) then + local cppflags = {} + if package:is_plat(os.subhost()) then local cflags = table.join(table.wrap(package:config("cxflags")), package:config("cflags")) local cxxflags = table.join(table.wrap(package:config("cxflags")), package:config("cxxflags")) local asflags = table.copy(table.wrap(package:config("asflags"))) @@ -37,15 +167,63 @@ function buildenvs(package) table.insert(asflags, "-m32") table.insert(ldflags, "-m32") end + table.join2(cflags, opt.cflags) + table.join2(cflags, opt.cxflags) + table.join2(cxxflags, opt.cxxflags) + table.join2(cxxflags, opt.cxflags) + table.join2(cppflags, opt.cppflags) -- @see https://github.com/xmake-io/xmake/issues/1688 + table.join2(asflags, opt.asflags) + table.join2(ldflags, opt.ldflags) + table.join2(cflags, _get_cflags_from_packagedeps(package, opt)) + table.join2(cxxflags, _get_cflags_from_packagedeps(package, opt)) + table.join2(cppflags, _get_cflags_from_packagedeps(package, opt)) + table.join2(ldflags, _get_ldflags_from_packagedeps(package, opt)) envs.CFLAGS = table.concat(cflags, ' ') envs.CXXFLAGS = table.concat(cxxflags, ' ') + envs.CPPFLAGS = table.concat(cppflags, ' ') envs.ASFLAGS = table.concat(asflags, ' ') envs.LDFLAGS = table.concat(ldflags, ' ') else - local cflags = table.join(table.wrap(package:build_getenv("cxflags")), package:build_getenv("cflags")) - local cxxflags = table.join(table.wrap(package:build_getenv("cxflags")), package:build_getenv("cxxflags")) + local cflags = table.join(table.wrap(package:build_getenv("cxflags")), package:build_getenv("cflags")) + local cxxflags = table.join(table.wrap(package:build_getenv("cxflags")), package:build_getenv("cxxflags")) + local asflags = table.copy(table.wrap(package:build_getenv("asflags"))) + local ldflags = table.copy(table.wrap(package:build_getenv("ldflags"))) + local shflags = table.copy(table.wrap(package:build_getenv("shflags"))) + local arflags = table.copy(table.wrap(package:build_getenv("arflags"))) + local defines = package:build_getenv("defines") + local includedirs = package:build_getenv("includedirs") + local sysincludedirs = package:build_getenv("sysincludedirs") + local links = package:build_getenv("links") + local syslinks = package:build_getenv("syslinks") + local linkdirs = package:build_getenv("linkdirs") + table.join2(cflags, opt.cflags) + table.join2(cflags, opt.cxflags) + table.join2(cxxflags, opt.cxxflags) + table.join2(cxxflags, opt.cxflags) + table.join2(cppflags, opt.cppflags) -- @see https://github.com/xmake-io/xmake/issues/1688 + table.join2(asflags, opt.asflags) + table.join2(ldflags, opt.ldflags) + table.join2(shflags, opt.shflags) + table.join2(cflags, _get_cflags_from_packagedeps(package, opt)) + table.join2(cxxflags, _get_cflags_from_packagedeps(package, opt)) + table.join2(cppflags, _get_cflags_from_packagedeps(package, opt)) + table.join2(ldflags, _get_ldflags_from_packagedeps(package, opt)) + table.join2(cflags, _map_compflags(package, "c", "define", defines)) + table.join2(cflags, _map_compflags(package, "c", "includedir", includedirs)) + table.join2(cflags, _map_compflags(package, "c", "sysincludedir", sysincludedirs)) + table.join2(asflags, _map_compflags(package, "as", "define", defines)) + table.join2(asflags, _map_compflags(package, "as", "includedir", includedirs)) + table.join2(asflags, _map_compflags(package, "as", "sysincludedir", sysincludedirs)) + table.join2(cxxflags, _map_compflags(package, "cxx", "define", defines)) + table.join2(cxxflags, _map_compflags(package, "cxx", "includedir", includedirs)) + table.join2(cxxflags, _map_compflags(package, "cxx", "sysincludedir", sysincludedirs)) + table.join2(ldflags, _map_linkflags(package, "binary", {"cxx"}, "link", links)) + table.join2(ldflags, _map_linkflags(package, "binary", {"cxx"}, "syslink", syslinks)) + table.join2(ldflags, _map_linkflags(package, "binary", {"cxx"}, "linkdir", linkdirs)) + table.join2(shflags, _map_linkflags(package, "shared", {"cxx"}, "link", links)) + table.join2(shflags, _map_linkflags(package, "shared", {"cxx"}, "syslink", syslinks)) + table.join2(shflags, _map_linkflags(package, "shared", {"cxx"}, "linkdir", linkdirs)) envs.CC = package:build_getenv("cc") - envs.CXX = package:build_getenv("cxx") envs.AS = package:build_getenv("as") envs.AR = package:build_getenv("ar") envs.LD = package:build_getenv("ld") @@ -54,10 +232,39 @@ function buildenvs(package) envs.RANLIB = package:build_getenv("ranlib") envs.CFLAGS = table.concat(cflags, ' ') envs.CXXFLAGS = table.concat(cxxflags, ' ') - envs.ASFLAGS = table.concat(table.wrap(package:build_getenv("asflags")), ' ') - envs.ARFLAGS = table.concat(table.wrap(package:build_getenv("arflags")), ' ') - envs.LDFLAGS = table.concat(table.wrap(package:build_getenv("ldflags")), ' ') - envs.SHFLAGS = table.concat(table.wrap(package:build_getenv("shflags")), ' ') + envs.CPPFLAGS = table.concat(cppflags, ' ') + envs.ASFLAGS = table.concat(asflags, ' ') + envs.ARFLAGS = table.concat(arflags, ' ') + envs.LDFLAGS = table.concat(ldflags, ' ') + envs.SHFLAGS = table.concat(shflags, ' ') + if package:is_plat("mingw") then + -- fix linker error, @see https://github.com/xmake-io/xmake/issues/574 + -- libtool: line 1855: lib: command not found + envs.ARFLAGS = nil + local ld = envs.LD + if ld then + if ld:endswith("x86_64-w64-mingw32-g++") then + envs.LD = path.join(path.directory(ld), is_host("windows") and "ld" or "x86_64-w64-mingw32-ld") + elseif ld:endswith("i686-w64-mingw32-g++") then + envs.LD = path.join(path.directory(ld), is_host("windows") and "ld" or "i686-w64-mingw32-ld") + end + end + if is_host("windows") then + envs.CC = _translate_windows_bin_path(envs.CC) + envs.AS = _translate_windows_bin_path(envs.AS) + envs.AR = _translate_windows_bin_path(envs.AR) + envs.LD = _translate_windows_bin_path(envs.LD) + envs.LDSHARED = _translate_windows_bin_path(envs.LDSHARED) + envs.CPP = _translate_windows_bin_path(envs.CPP) + envs.RANLIB = _translate_windows_bin_path(envs.RANLIB) + end + elseif package:is_plat("cross") then + -- only for cross-toolchain + envs.CXX = package:build_getenv("cxx") + if not envs.ARFLAGS or envs.ARFLAGS == "" then + envs.ARFLAGS = "-cr" + end + end end local ACLOCAL_PATH = {} local PKG_CONFIG_PATH = {} @@ -77,56 +284,111 @@ function buildenvs(package) end envs.ACLOCAL_PATH = path.joinenv(ACLOCAL_PATH) envs.PKG_CONFIG_PATH = path.joinenv(PKG_CONFIG_PATH) - -- some Makefile use ComSpec to detect Windows (e.g. Makefiles generated by Premake) and require this env - if is_subhost("windows") then - envs.ComSpec = os.getenv("ComSpec") - end + return envs +end +-- get the autogen environments +function autogen_envs(package, opt) + opt = opt or {} + local envs = {NOCONFIGURE = "yes"} + local ACLOCAL_PATH = {} + local PKG_CONFIG_PATH = {} + for _, dep in ipairs(package:orderdeps()) do + local pkgconfig = path.join(dep:installdir(), "lib", "pkgconfig") + if os.isdir(pkgconfig) then + table.insert(PKG_CONFIG_PATH, pkgconfig) + end + pkgconfig = path.join(dep:installdir(), "share", "pkgconfig") + if os.isdir(pkgconfig) then + table.insert(PKG_CONFIG_PATH, pkgconfig) + end + local aclocal = path.join(dep:installdir(), "share", "aclocal") + if os.isdir(aclocal) then + table.insert(ACLOCAL_PATH, aclocal) + end + end + envs.ACLOCAL_PATH = path.joinenv(ACLOCAL_PATH) + envs.PKG_CONFIG_PATH = path.joinenv(PKG_CONFIG_PATH) return envs end +-- configure package +function configure(package, configs, opt) + + -- init options + opt = opt or {} + + -- get envs + local envs = opt.envs or buildenvs(package, opt) + + -- generate configure file + if not os.isfile("configure") then + if os.isfile("autogen.sh") then + os.vrunv("sh", {"./autogen.sh"}, {envs = autogen_envs(package, opt)}) + elseif os.isfile("configure.ac") then + os.vrunv("sh", {"autoreconf", "--install", "--symlink"}, {envs = autogen_envs(package, opt)}) + end + end + + -- pass configurations + local argv = {"./configure"} + for name, value in pairs(_get_configs(package, configs)) do + value = tostring(value):trim() + if value ~= "" then + if type(name) == "number" then + table.insert(argv, value) + else + table.insert(argv, "--" .. name .. "=" .. value) + end + end + end + + -- do configure + os.vrunv("sh", argv, {envs = envs}) +end + -- do make function make(package, argv, opt) opt = opt or {} local program - local runenvs = opt.envs or buildenvs(package) if package:is_plat("mingw") and is_subhost("windows") then local mingw = assert(package:build_getenv("mingw") or package:build_getenv("sdk"), "mingw not found!") program = path.join(mingw, "bin", "mingw32-make.exe") else - local tool = find_tool("make", {envs = runenvs}) + local tool = find_tool("make") if tool then program = tool.program end end assert(program, "make not found!") - os.vrunv(program, argv, {envs = runenvs, curdir = opt.curdir}) + os.vrunv(program, argv) end -- build package function build(package, configs, opt) - -- init options - opt = opt or {} + -- do configure + configure(package, configs, opt) - -- pass configurations + -- do make and install + opt = opt or {} local njob = opt.jobs or option.get("jobs") or tostring(os.default_njob()) local argv = {"-j" .. njob} if option.get("verbose") then - table.insert(argv, "VERBOSE=1") + table.insert(argv, "V=1") end - for name, value in pairs(configs) do - value = tostring(value):trim() - if value ~= "" then - if type(name) == "number" then - table.insert(argv, value) - else - table.insert(argv, name .. "=" .. value) + if opt.makeconfigs then + for name, value in pairs(opt.makeconfigs) do + value = tostring(value):trim() + if value ~= "" then + if type(name) == "number" then + table.insert(argv, value) + else + table.insert(argv, name .. "=" .. value) + end end end end - - -- do build make(package, argv, opt) end @@ -140,7 +402,20 @@ function install(package, configs, opt) -- do install local argv = {"install"} if option.get("verbose") then - table.insert(argv, "VERBOSE=1") + table.insert(argv, "V=1") + end + if opt.makeconfigs then + for name, value in pairs(opt.makeconfigs) do + value = tostring(value):trim() + if value ~= "" then + if type(name) == "number" then + table.insert(argv, value) + else + table.insert(argv, name .. "=" .. value) + end + end + end end make(package, argv, opt) end + -- cgit v1.3.1 From 16c681c62506a2512ce8717ae377fa3e8d5d2f26 Mon Sep 17 00:00:00 2001 From: ruki Date: Sat, 11 Dec 2021 18:55:21 +0800 Subject: Update make.lua --- xmake/modules/package/tools/make.lua | 337 ++++------------------------------- 1 file changed, 31 insertions(+), 306 deletions(-) (limited to 'xmake/modules/package/tools/make.lua') diff --git a/xmake/modules/package/tools/make.lua b/xmake/modules/package/tools/make.lua index 12b94d64f..cbc58c9e2 100644 --- a/xmake/modules/package/tools/make.lua +++ b/xmake/modules/package/tools/make.lua @@ -15,148 +15,18 @@ -- Copyright (C) 2015-present, TBOOX Open Source Group. -- -- @author ruki --- @file autoconf.lua +-- @file make.lua -- -- imports import("core.base.option") import("core.project.config") -import("core.tool.linker") -import("core.tool.compiler") import("lib.detect.find_tool") --- translate paths -function _translate_paths(package, paths) - if paths and is_host("windows") and (package:is_plat("mingw") or package:is_plat("msys") or package:is_plat("cygwin")) then - if type(paths) == "string" then - return (paths:gsub("\\", "/")) - elseif type(paths) == "table" then - local result = {} - for _, p in ipairs(paths) do - table.insert(result, (p:gsub("\\", "/"))) - end - return result - end - end - return paths -end - --- translate windows bin path -function _translate_windows_bin_path(bin_path) - if bin_path then - local argv = os.argv(bin_path) - argv[1] = argv[1]:gsub("\\", "/") .. ".exe" - return os.args(argv) - end -end - --- map compiler flags -function _map_compflags(package, langkind, name, values) - return compiler.map_flags(langkind, name, values, {target = package}) -end - --- map linker flags -function _map_linkflags(package, targetkind, sourcekinds, name, values) - return linker.map_flags(targetkind, sourcekinds, name, values, {target = package}) -end - --- get configs -function _get_configs(package, configs) - - -- add prefix - local configs = configs or {} - table.insert(configs, "--prefix=" .. _translate_paths(package, package:installdir())) - - -- add host for cross-complation - if not configs.host and not package:is_plat(os.subhost()) then - if package:is_plat("iphoneos") then - local triples = - { - arm64 = "aarch64-apple-darwin", - arm64e = "aarch64-apple-darwin", - armv7 = "armv7-apple-darwin", - armv7s = "armv7s-apple-darwin", - i386 = "i386-apple-darwin", - x86_64 = "x86_64-apple-darwin" - } - table.insert(configs, "--host=" .. (triples[package:arch()] or triples.arm64)) - elseif package:is_plat("android") then - -- @see https://developer.android.com/ndk/guides/other_build_systems#autoconf - local triples = - { - ["armv5te"] = "arm-linux-androideabi", -- deprecated - ["armv7-a"] = "arm-linux-androideabi", -- deprecated - ["armeabi"] = "arm-linux-androideabi", -- removed in ndk r17 - ["armeabi-v7a"] = "arm-linux-androideabi", - ["arm64-v8a"] = "aarch64-linux-android", - i386 = "i686-linux-android", -- deprecated - x86 = "i686-linux-android", - x86_64 = "x86_64-linux-android", - mips = "mips-linux-android", -- removed in ndk r17 - mips64 = "mips64-linux-android" -- removed in ndk r17 - } - table.insert(configs, "--host=" .. (triples[package:arch()] or triples["armeabi-v7a"])) - elseif package:is_plat("mingw") then - local triples = - { - i386 = "i686-w64-mingw32", - x86_64 = "x86_64-w64-mingw32" - } - table.insert(configs, "--host=" .. (triples[package:arch()] or triples.i386)) - elseif package:is_plat("cross") then - local host = package:arch() - if package:is_arch("arm64") then - host = "aarch64" - elseif package:is_arch("arm.*") then - host = "arm" - end - host = host .. "-" .. package:targetos() - table.insert(configs, "--host=" .. host) - end - end - return configs -end - --- get cflags from package deps -function _get_cflags_from_packagedeps(package, opt) - local result = {} - for _, depname in ipairs(opt.packagedeps) do - local dep = package:dep(depname) - if dep then - local fetchinfo = dep:fetch({external = false}) - if fetchinfo then - table.join2(result, _map_compflags(package, "cxx", "define", fetchinfo.defines)) - table.join2(result, _translate_paths(package, _map_compflags(package, "cxx", "includedir", fetchinfo.includedirs))) - table.join2(result, _translate_paths(package, _map_compflags(package, "cxx", "sysincludedir", fetchinfo.sysincludedirs))) - end - end - end - return result -end - --- get ldflags from package deps -function _get_ldflags_from_packagedeps(package, opt) - local result = {} - for _, depname in ipairs(opt.packagedeps) do - local dep = package:dep(depname) - if dep then - local fetchinfo = dep:fetch({external = false}) - if fetchinfo then - table.join2(result, _translate_paths(package, _map_linkflags(package, "binary", {"cxx"}, "linkdir", fetchinfo.linkdirs))) - table.join2(result, _map_linkflags(package, "binary", {"cxx"}, "link", fetchinfo.links)) - table.join2(result, _translate_paths(package, _map_linkflags(package, "binary", {"cxx"}, "syslink", fetchinfo.syslinks))) - end - end - end - return result -end - -- get the build environments -function buildenvs(package, opt) - opt = opt or {} +function buildenvs(package) local envs = {} - local cppflags = {} - if package:is_plat(os.subhost()) then + if package:is_plat(os.host()) then local cflags = table.join(table.wrap(package:config("cxflags")), package:config("cflags")) local cxxflags = table.join(table.wrap(package:config("cxflags")), package:config("cxxflags")) local asflags = table.copy(table.wrap(package:config("asflags"))) @@ -167,63 +37,15 @@ function buildenvs(package, opt) table.insert(asflags, "-m32") table.insert(ldflags, "-m32") end - table.join2(cflags, opt.cflags) - table.join2(cflags, opt.cxflags) - table.join2(cxxflags, opt.cxxflags) - table.join2(cxxflags, opt.cxflags) - table.join2(cppflags, opt.cppflags) -- @see https://github.com/xmake-io/xmake/issues/1688 - table.join2(asflags, opt.asflags) - table.join2(ldflags, opt.ldflags) - table.join2(cflags, _get_cflags_from_packagedeps(package, opt)) - table.join2(cxxflags, _get_cflags_from_packagedeps(package, opt)) - table.join2(cppflags, _get_cflags_from_packagedeps(package, opt)) - table.join2(ldflags, _get_ldflags_from_packagedeps(package, opt)) envs.CFLAGS = table.concat(cflags, ' ') envs.CXXFLAGS = table.concat(cxxflags, ' ') - envs.CPPFLAGS = table.concat(cppflags, ' ') envs.ASFLAGS = table.concat(asflags, ' ') envs.LDFLAGS = table.concat(ldflags, ' ') else - local cflags = table.join(table.wrap(package:build_getenv("cxflags")), package:build_getenv("cflags")) - local cxxflags = table.join(table.wrap(package:build_getenv("cxflags")), package:build_getenv("cxxflags")) - local asflags = table.copy(table.wrap(package:build_getenv("asflags"))) - local ldflags = table.copy(table.wrap(package:build_getenv("ldflags"))) - local shflags = table.copy(table.wrap(package:build_getenv("shflags"))) - local arflags = table.copy(table.wrap(package:build_getenv("arflags"))) - local defines = package:build_getenv("defines") - local includedirs = package:build_getenv("includedirs") - local sysincludedirs = package:build_getenv("sysincludedirs") - local links = package:build_getenv("links") - local syslinks = package:build_getenv("syslinks") - local linkdirs = package:build_getenv("linkdirs") - table.join2(cflags, opt.cflags) - table.join2(cflags, opt.cxflags) - table.join2(cxxflags, opt.cxxflags) - table.join2(cxxflags, opt.cxflags) - table.join2(cppflags, opt.cppflags) -- @see https://github.com/xmake-io/xmake/issues/1688 - table.join2(asflags, opt.asflags) - table.join2(ldflags, opt.ldflags) - table.join2(shflags, opt.shflags) - table.join2(cflags, _get_cflags_from_packagedeps(package, opt)) - table.join2(cxxflags, _get_cflags_from_packagedeps(package, opt)) - table.join2(cppflags, _get_cflags_from_packagedeps(package, opt)) - table.join2(ldflags, _get_ldflags_from_packagedeps(package, opt)) - table.join2(cflags, _map_compflags(package, "c", "define", defines)) - table.join2(cflags, _map_compflags(package, "c", "includedir", includedirs)) - table.join2(cflags, _map_compflags(package, "c", "sysincludedir", sysincludedirs)) - table.join2(asflags, _map_compflags(package, "as", "define", defines)) - table.join2(asflags, _map_compflags(package, "as", "includedir", includedirs)) - table.join2(asflags, _map_compflags(package, "as", "sysincludedir", sysincludedirs)) - table.join2(cxxflags, _map_compflags(package, "cxx", "define", defines)) - table.join2(cxxflags, _map_compflags(package, "cxx", "includedir", includedirs)) - table.join2(cxxflags, _map_compflags(package, "cxx", "sysincludedir", sysincludedirs)) - table.join2(ldflags, _map_linkflags(package, "binary", {"cxx"}, "link", links)) - table.join2(ldflags, _map_linkflags(package, "binary", {"cxx"}, "syslink", syslinks)) - table.join2(ldflags, _map_linkflags(package, "binary", {"cxx"}, "linkdir", linkdirs)) - table.join2(shflags, _map_linkflags(package, "shared", {"cxx"}, "link", links)) - table.join2(shflags, _map_linkflags(package, "shared", {"cxx"}, "syslink", syslinks)) - table.join2(shflags, _map_linkflags(package, "shared", {"cxx"}, "linkdir", linkdirs)) + local cflags = table.join(table.wrap(package:build_getenv("cxflags")), package:build_getenv("cflags")) + local cxxflags = table.join(table.wrap(package:build_getenv("cxflags")), package:build_getenv("cxxflags")) envs.CC = package:build_getenv("cc") + envs.CXX = package:build_getenv("cxx") envs.AS = package:build_getenv("as") envs.AR = package:build_getenv("ar") envs.LD = package:build_getenv("ld") @@ -232,39 +54,10 @@ function buildenvs(package, opt) envs.RANLIB = package:build_getenv("ranlib") envs.CFLAGS = table.concat(cflags, ' ') envs.CXXFLAGS = table.concat(cxxflags, ' ') - envs.CPPFLAGS = table.concat(cppflags, ' ') - envs.ASFLAGS = table.concat(asflags, ' ') - envs.ARFLAGS = table.concat(arflags, ' ') - envs.LDFLAGS = table.concat(ldflags, ' ') - envs.SHFLAGS = table.concat(shflags, ' ') - if package:is_plat("mingw") then - -- fix linker error, @see https://github.com/xmake-io/xmake/issues/574 - -- libtool: line 1855: lib: command not found - envs.ARFLAGS = nil - local ld = envs.LD - if ld then - if ld:endswith("x86_64-w64-mingw32-g++") then - envs.LD = path.join(path.directory(ld), is_host("windows") and "ld" or "x86_64-w64-mingw32-ld") - elseif ld:endswith("i686-w64-mingw32-g++") then - envs.LD = path.join(path.directory(ld), is_host("windows") and "ld" or "i686-w64-mingw32-ld") - end - end - if is_host("windows") then - envs.CC = _translate_windows_bin_path(envs.CC) - envs.AS = _translate_windows_bin_path(envs.AS) - envs.AR = _translate_windows_bin_path(envs.AR) - envs.LD = _translate_windows_bin_path(envs.LD) - envs.LDSHARED = _translate_windows_bin_path(envs.LDSHARED) - envs.CPP = _translate_windows_bin_path(envs.CPP) - envs.RANLIB = _translate_windows_bin_path(envs.RANLIB) - end - elseif package:is_plat("cross") then - -- only for cross-toolchain - envs.CXX = package:build_getenv("cxx") - if not envs.ARFLAGS or envs.ARFLAGS == "" then - envs.ARFLAGS = "-cr" - end - end + envs.ASFLAGS = table.concat(table.wrap(package:build_getenv("asflags")), ' ') + envs.ARFLAGS = table.concat(table.wrap(package:build_getenv("arflags")), ' ') + envs.LDFLAGS = table.concat(table.wrap(package:build_getenv("ldflags")), ' ') + envs.SHFLAGS = table.concat(table.wrap(package:build_getenv("shflags")), ' ') end local ACLOCAL_PATH = {} local PKG_CONFIG_PATH = {} @@ -284,111 +77,56 @@ function buildenvs(package, opt) end envs.ACLOCAL_PATH = path.joinenv(ACLOCAL_PATH) envs.PKG_CONFIG_PATH = path.joinenv(PKG_CONFIG_PATH) - return envs -end - --- get the autogen environments -function autogen_envs(package, opt) - opt = opt or {} - local envs = {NOCONFIGURE = "yes"} - local ACLOCAL_PATH = {} - local PKG_CONFIG_PATH = {} - for _, dep in ipairs(package:orderdeps()) do - local pkgconfig = path.join(dep:installdir(), "lib", "pkgconfig") - if os.isdir(pkgconfig) then - table.insert(PKG_CONFIG_PATH, pkgconfig) - end - pkgconfig = path.join(dep:installdir(), "share", "pkgconfig") - if os.isdir(pkgconfig) then - table.insert(PKG_CONFIG_PATH, pkgconfig) - end - local aclocal = path.join(dep:installdir(), "share", "aclocal") - if os.isdir(aclocal) then - table.insert(ACLOCAL_PATH, aclocal) - end - end - envs.ACLOCAL_PATH = path.joinenv(ACLOCAL_PATH) - envs.PKG_CONFIG_PATH = path.joinenv(PKG_CONFIG_PATH) - return envs -end - --- configure package -function configure(package, configs, opt) - - -- init options - opt = opt or {} - - -- get envs - local envs = opt.envs or buildenvs(package, opt) - - -- generate configure file - if not os.isfile("configure") then - if os.isfile("autogen.sh") then - os.vrunv("sh", {"./autogen.sh"}, {envs = autogen_envs(package, opt)}) - elseif os.isfile("configure.ac") then - os.vrunv("sh", {"autoreconf", "--install", "--symlink"}, {envs = autogen_envs(package, opt)}) - end - end - - -- pass configurations - local argv = {"./configure"} - for name, value in pairs(_get_configs(package, configs)) do - value = tostring(value):trim() - if value ~= "" then - if type(name) == "number" then - table.insert(argv, value) - else - table.insert(argv, "--" .. name .. "=" .. value) - end - end + -- some Makefile use ComSpec to detect Windows (e.g. Makefiles generated by Premake) and require this env + if is_subhost("windows") then + envs.ComSpec = os.getenv("ComSpec") end - -- do configure - os.vrunv("sh", argv, {envs = envs}) + return envs end -- do make function make(package, argv, opt) opt = opt or {} local program + local runenvs = opt.envs or buildenvs(package) if package:is_plat("mingw") and is_subhost("windows") then local mingw = assert(package:build_getenv("mingw") or package:build_getenv("sdk"), "mingw not found!") program = path.join(mingw, "bin", "mingw32-make.exe") else - local tool = find_tool("make") + local tool = find_tool("make", {envs = runenvs}) if tool then program = tool.program end end assert(program, "make not found!") - os.vrunv(program, argv) + os.vrunv(program, argv, {envs = runenvs, curdir = opt.curdir}) end -- build package function build(package, configs, opt) - -- do configure - configure(package, configs, opt) - - -- do make and install + -- init options opt = opt or {} + + -- pass configurations local njob = opt.jobs or option.get("jobs") or tostring(os.default_njob()) local argv = {"-j" .. njob} if option.get("verbose") then - table.insert(argv, "V=1") + table.insert(argv, "VERBOSE=1") end - if opt.makeconfigs then - for name, value in pairs(opt.makeconfigs) do - value = tostring(value):trim() - if value ~= "" then - if type(name) == "number" then - table.insert(argv, value) - else - table.insert(argv, name .. "=" .. value) - end + for name, value in pairs(configs) do + value = tostring(value):trim() + if value ~= "" then + if type(name) == "number" then + table.insert(argv, value) + else + table.insert(argv, name .. "=" .. value) end end end + + -- do build make(package, argv, opt) end @@ -402,20 +140,7 @@ function install(package, configs, opt) -- do install local argv = {"install"} if option.get("verbose") then - table.insert(argv, "V=1") - end - if opt.makeconfigs then - for name, value in pairs(opt.makeconfigs) do - value = tostring(value):trim() - if value ~= "" then - if type(name) == "number" then - table.insert(argv, value) - else - table.insert(argv, name .. "=" .. value) - end - end - end + table.insert(argv, "VERBOSE=1") end make(package, argv, opt) end - -- cgit v1.3.1 From 7be1bc272914b757a4a7fe1792f7590de4a91cdf Mon Sep 17 00:00:00 2001 From: ruki Date: Sat, 18 Dec 2021 19:23:31 +0800 Subject: Update make.lua --- xmake/modules/package/tools/make.lua | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) (limited to 'xmake/modules/package/tools/make.lua') diff --git a/xmake/modules/package/tools/make.lua b/xmake/modules/package/tools/make.lua index cbc58c9e2..27e73b412 100644 --- a/xmake/modules/package/tools/make.lua +++ b/xmake/modules/package/tools/make.lua @@ -23,6 +23,14 @@ import("core.base.option") import("core.project.config") import("lib.detect.find_tool") +-- translate bin path +function _translate_bin_path(bin_path) + if is_host("windows") and bin_path then + return bin_path:gsub("\\", "/") .. ".exe" + end + return bin_path +end + -- get the build environments function buildenvs(package) local envs = {} @@ -44,14 +52,14 @@ function buildenvs(package) else local cflags = table.join(table.wrap(package:build_getenv("cxflags")), package:build_getenv("cflags")) local cxxflags = table.join(table.wrap(package:build_getenv("cxflags")), package:build_getenv("cxxflags")) - envs.CC = package:build_getenv("cc") - envs.CXX = package:build_getenv("cxx") - envs.AS = package:build_getenv("as") - envs.AR = package:build_getenv("ar") - envs.LD = package:build_getenv("ld") - envs.LDSHARED = package:build_getenv("sh") - envs.CPP = package:build_getenv("cpp") - envs.RANLIB = package:build_getenv("ranlib") + envs.CC = _translate_bin_path(package:build_getenv("cc")) + envs.CXX = _translate_bin_path(package:build_getenv("cxx")) + envs.AS = _translate_bin_path(package:build_getenv("as")) + envs.AR = _translate_bin_path(package:build_getenv("ar")) + envs.LD = _translate_bin_path(package:build_getenv("ld")) + envs.LDSHARED = _translate_bin_path(package:build_getenv("sh")) + envs.CPP = _translate_bin_path(package:build_getenv("cpp")) + envs.RANLIB = _translate_bin_path(package:build_getenv("ranlib")) envs.CFLAGS = table.concat(cflags, ' ') envs.CXXFLAGS = table.concat(cxxflags, ' ') envs.ASFLAGS = table.concat(table.wrap(package:build_getenv("asflags")), ' ') -- cgit v1.3.1