summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2022-09-17 00:35:29 +0800
committerruki <[email protected]>2022-09-17 00:35:29 +0800
commit831ff7f0334ad4d4ef12a6e122acb9b934c6e986 (patch)
tree19b927b7c28d46a36bbf26f5b64adfc4f09db614
parent758b77ba64701c8206d196c9396e436133e6b8de (diff)
improve trybuild/autotools envs
-rw-r--r--xmake/modules/private/action/trybuild/autotools.lua52
1 files changed, 47 insertions, 5 deletions
diff --git a/xmake/modules/private/action/trybuild/autotools.lua b/xmake/modules/private/action/trybuild/autotools.lua
index a2c1987c6..6847a84f2 100644
--- a/xmake/modules/private/action/trybuild/autotools.lua
+++ b/xmake/modules/private/action/trybuild/autotools.lua
@@ -66,6 +66,7 @@ end
-- get the build environments
function _get_buildenvs()
local envs = {}
+ local cross = false
if not _is_cross_compilation() then
local cflags = table.join(table.wrap(_get_buildenv("cxflags")), _get_buildenv("cflags"))
local cxxflags = table.join(table.wrap(_get_buildenv("cxflags")), _get_buildenv("cxxflags"))
@@ -82,6 +83,7 @@ function _get_buildenvs()
envs.ASFLAGS = table.concat(asflags, ' ')
envs.LDFLAGS = table.concat(ldflags, ' ')
else
+ cross = true
local cflags = table.join(table.wrap(_get_buildenv("cxflags")), _get_buildenv("cflags"))
local cxxflags = table.join(table.wrap(_get_buildenv("cxflags")), _get_buildenv("cxxflags"))
envs.CC = _get_buildenv("cc")
@@ -97,11 +99,11 @@ function _get_buildenvs()
envs.ARFLAGS = table.concat(table.wrap(_get_buildenv("arflags")), ' ')
envs.LDFLAGS = table.concat(table.wrap(_get_buildenv("ldflags")), ' ')
envs.SHFLAGS = table.concat(table.wrap(_get_buildenv("shflags")), ' ')
- if #envs.ARFLAGS == 0 then
- if envs.AR and envs.AR:endswith("ar") then
- envs.ARFLAGS = "-cr"
- end
- end
+ end
+
+ -- cross-compilation? pass the full build environments
+ if cross then
+ local ar = envs.AR
if is_plat("mingw") then
-- fix linker error, @see https://github.com/xmake-io/xmake/issues/574
-- libtool: line 1855: lib: command not found
@@ -123,8 +125,48 @@ function _get_buildenvs()
envs.CPP = _translate_windows_bin_path(envs.CPP)
envs.RANLIB = _translate_windows_bin_path(envs.RANLIB)
end
+ elseif is_plat("cross") or (ar and ar:find("ar")) then
+ -- only for cross-toolchain
+ envs.CXX = _get_buildenv("cxx")
+ if not envs.ARFLAGS or envs.ARFLAGS == "" then
+ envs.ARFLAGS = "-cr"
+ end
+ end
+
+ -- we should use ld as linker
+ --
+ -- @see
+ -- https://github.com/xmake-io/xmake-repo/pull/1043
+ -- https://github.com/libexpat/libexpat/issues/312
+ -- https://github.com/xmake-io/xmake/issues/2195
+ local ld = envs.LD
+ if ld then
+ local dir = path.directory(ld)
+ local name = path.filename(ld)
+ name = name:gsub("clang%+%+$", "ld")
+ name = name:gsub("clang%+%+%-%d+", "ld")
+ name = name:gsub("clang$", "ld")
+ name = name:gsub("clang%-%d+", "ld")
+ name = name:gsub("gcc$", "ld")
+ name = name:gsub("gcc-%d+", "ld")
+ name = name:gsub("g%+%+$", "ld")
+ name = name:gsub("g%+%+%-%d+", "ld")
+ envs.LD = dir and path.join(dir, name) or name
+ end
+ -- we need use clang++ as cxx, autoconf will use it as linker
+ -- https://github.com/xmake-io/xmake/issues/2170
+ local cxx = envs.CXX
+ if cxx then
+ local dir = path.directory(cxx)
+ local name = path.filename(cxx)
+ name = name:gsub("clang$", "clang++")
+ name = name:gsub("clang%-", "clang++-")
+ name = name:gsub("gcc$", "g++")
+ name = name:gsub("gcc%-", "g++-")
+ envs.CXX = dir and path.join(dir, name) or name
end
end
+
if option.get("verbose") then
print(envs)
end