diff --git a/xmake/core/base/os.lua b/xmake/core/base/os.lua index 592e4d2a8de..38ef683bf3a 100644 --- a/xmake/core/base/os.lua +++ b/xmake/core/base/os.lua @@ -746,6 +746,28 @@ function os.execv(program, argv, opt) end end + -- run shell file? parse `#!/usr/bin/env bash` in xx.sh + -- + -- e.g. os.execv("./configure", {"--help"}) => os.execv("/usr/bin/env", {"bash", "./configure", "--help"}) + if opt.shell and os.isfile(filename) then + local shellfile = filename + local file = io.open(filename, 'r') + local head = file:read("l") + if head and head:startswith("#!") then + head = head:sub(3) + local shellargv = {} + local splitinfo = head:split("%s") + filename = splitinfo[1] + if #splitinfo > 1 then + shellargv = table.slice(splitinfo, 2) + end + table.insert(shellargv, shellfile) + table.join2(shellargv, argv) + argv = shellargv + end + file:close() + end + -- uses the given environments? local envs = nil if opt.envs then diff --git a/xmake/modules/package/tools/autoconf.lua b/xmake/modules/package/tools/autoconf.lua index 216b05f1bd3..b8429e9f5f5 100644 --- a/xmake/modules/package/tools/autoconf.lua +++ b/xmake/modules/package/tools/autoconf.lua @@ -392,16 +392,16 @@ function configure(package, configs, 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)}) + os.vrunv("./autogen.sh", {}, {shell = true, envs = autogen_envs(package, opt)}) elseif os.isfile("configure.ac") or os.isfile("configure.in") then local autoreconf = find_tool("autoreconf") assert(autoreconf, "autoreconf not found!") - os.vrunv("sh", {autoreconf.program, "--install", "--symlink"}, {envs = autogen_envs(package, opt)}) + os.vrunv(autoreconf.program, {"--install", "--symlink"}, {shell = true, envs = autogen_envs(package, opt)}) end end -- pass configurations - local argv = {"./configure"} + local argv = {} for name, value in pairs(_get_configs(package, configs)) do value = tostring(value):trim() if value ~= "" then @@ -414,7 +414,7 @@ function configure(package, configs, opt) end -- do configure - os.vrunv("sh", argv, {envs = envs}) + os.vrunv("./configure", argv, {shell = true, envs = envs}) end -- do make diff --git a/xmake/modules/private/action/trybuild/autotools.lua b/xmake/modules/private/action/trybuild/autotools.lua index fe484c98e37..bacd24a049d 100644 --- a/xmake/modules/private/action/trybuild/autotools.lua +++ b/xmake/modules/private/action/trybuild/autotools.lua @@ -220,18 +220,18 @@ function build() -- generate configure if not os.isfile("configure") then if os.isfile("autogen.sh") then - os.vexecv("sh", {"./autogen.sh"}) + os.vexecv("./autogen.sh", {}, {shell = true}) elseif os.isfile("configure.ac") or os.isfile("configure.in") then local autoreconf = find_tool("autoreconf") assert(autoreconf, "autoreconf not found!") - os.vexecv("sh", {autoreconf.program, "--install", "--symlink"}) + os.vexecv(autoreconf.program, {"--install", "--symlink"}, {shell = true}) end end -- do configure local configfile = find_file("[mM]akefile", os.curdir()) if not configfile or os.mtime(config.filepath()) > os.mtime(configfile) then - os.vexecv("sh", table.join("./configure", _get_configs(artifacts_dir)), {envs = _get_buildenvs()}) + os.vexecv("./configure", _get_configs(artifacts_dir), {shell = true, envs = _get_buildenvs()}) end -- do build