Portable Half-Life SDK. GoldSource and Xash3D. Crossplatform.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

241 lines
6.0 KiB

local m = {}
local toolsets = {gcc = {}, clang = {}, mingw = {}, msc = {}}
local toolset = nil
local cxx = nil
function toolsets.gcc.is_cxx_compileable(code, include_dirs)
local include_dirs = include_dirs or {}
local code_file_path = _MAIN_SCRIPT_DIR .. "/tmp.cpp"
local code_file = io.open(code_file_path, "w")
code_file:write(code)
code_file:close()
local include_dirs_str = ""
for _, include_dir in ipairs(include_dirs) do
include_dirs_str = include_dirs_str .. "-I" .. include_dir
end
local cmd = string.format("%s %s -c %s", cxx, include_dirs_str, code_file_path)
local _, _, rc = os.execute(cmd)
local result = false
if rc == 0 then
result = true
end
return result
end
function toolsets.msc.is_cxx_compileable(code, include_dirs)
local include_dirs = include_dirs or {}
local code_file_path = _XASHAIN_SCRIPT_DIR .. "/tmp.cpp"
local code_file = io.open(code_file_path, "w")
code_file:write(code)
code_file:close()
local include_dirs_str = ""
for _, include_dir in ipairs(include_dirs) do
include_dirs_str = include_dirs_str .. "/I" .. include_dir
end
local cmd = string.format("%s %s /c %s", cxx, include_dirs_str, code_file_path)
local _, _, rc = os.execute(cmd)
local result = false
if rc == 0 then
result = true
end
return result
end
toolsets.clang.is_cxx_compileable = toolsets.gcc.is_cxx_compileable
toolsets.mingw.is_cxx_compileable = toolsets.gcc.is_cxx_compileable
function m.is_cxx_symbol_defined(symbol, headers, include_dirs)
local headers = headers or {}
local include_dirs = include_dirs or {}
local code = ""
for _, header in ipairs(headers) do
code = code .. string.format("#include <%s>\n", header)
end
code = code .. string.format("#ifndef %s\n.\n#endif", symbol)
return m.is_cxx_compileable(code, include_dirs)
end
function m.is_cxx_header_exist(header, include_dirs)
local include_dirs = include_dirs or {}
local code = ""
code = code .. string.format("#include <%s>\n", header)
return m.is_cxx_compileable(code, include_dirs)
end
function m.get_arch()
local arch = m.arch
if not arch then
if m.is_cxx_symbol_defined("XASH_AMD64", {"build.h"}, {"public"}) then
arch = "amd64"
elseif m.is_cxx_symbol_defined("XASH_X86", {"build.h"}, {"public"}) then
arch = "x86"
elseif m.is_cxx_symbol_defined("XASH_ARM", {"build.h"}, {"public"}) then
if m.is_cxx_symbol_defined("XASH_64BIT", {"build.h"}, {"public"}) then
2 years ago
arch = "aarch64"
else
arch = "armv"
if m.is_cxx_symbol_defined("XASH_ARMv8", {"build.h"}, {"public"}) then
arch = arch .. "8_32"
elseif m.is_cxx_symbol_defined("XASH_ARMv7", {"build.h"}, {"public"}) then
arch = arch .. "7"
elseif m.is_cxx_symbol_defined("XASH_ARMv6", {"build.h"}, {"public"}) then
arch = arch .. "6"
elseif m.is_cxx_symbol_defined("XASH_ARMv5", {"build.h"}, {"public"}) then
arch = arch .. "5"
elseif m.is_cxx_symbol_defined("XASH_ARMv4", {"build.h"}, {"public"}) then
arch = arch .. "4"
end
if m.is_cxx_symbol_defined("XASH_ARM_HARDFP", {"build.h"}, {"public"}) then
arch = arch .. "hf"
else
arch = arch .. "l"
end
end
elseif m.is_cxx_symbol_defined("XASH_MIPS", {"build.h"}, {"public"}) then
arch = "mips"
if m.is_cxx_symbol_defined("XASH_64BIT", {"build.h"}, {"public"}) then
arch = arch .. "64"
end
if m.is_cxx_symbol_defined("XASH_LITTLE_ENDIAN", {"build.h"}, {"public"}) then
arch = arch .. "el"
end
elseif m.is_cxx_symbol_defined("XASH_RISCV", {"build.h"}, {"public"}) then
arch = "riscv"
if m.is_cxx_symbol_defined("XASH_64BIT", {"build.h"}, {"public"}) then
arch = arch .. "64"
else
arch = arch .. "32"
end
if m.is_cxx_symbol_defined("XASH_RISCV_DOUBLEFP", {"build.h"}, {"public"}) then
arch = arch .. "d"
else
arch = arch .. "f"
end
elseif m.is_cxx_symbol_defined("XASH_JS", {"build.h"}, {"public"}) then
arch = "javascript"
elseif m.is_cxx_symbol_defined("XASH_E2K", {"build.h"}, {"public"}) then
arch = "e2k"
end
end
return arch
end
function m.get_os()
local dest_os = os.target()
if dest_os == "bsd" then
dest_os = m.bsd_flavour
if not dest_os then
if m.is_cxx_symbol_defined("XASH_FREEBSD", {"build.h"}, {"public"}) then
dest_os = "freebsd"
elseif m.is_cxx_symbol_defined("XASH_NETBSD", {"build.h"}, {"public"}) then
dest_os = "netbsd"
elseif m.is_cxx_symbol_defined("XASH_OPENBSD", {"build.h"}, {"public"}) then
dest_os = "openbsd"
end
end
end
return dest_os
end
function m.get_lib_suffix()
local dest_os = m.get_os()
local arch = m.get_arch()
if dest_os == "windows" or dest_os == "linux" or dest_os == "macosx" then
dest_os = nil
elseif dest_os == "android" then
dest_os = nil
arch = nil
end
if arch == "x86" then
arch = nil
end
local suffix = ""
if dest_os and arch then
suffix = string.format("%s_%s", dest_os, arch)
elseif arch then
suffix = string.format("_%s", arch)
end
return suffix
end
function m.find_cxx_compiler()
local prefix = m.prefix or ""
local host_os = os.host()
toolset = _OPTIONS["cc"]
if not toolset then
if host_os == "windows" then
toolset = "msc"
elseif host_os == "macosx" then
toolset = "clang"
else
toolset = "gcc"
end
end
if toolset == "gcc" or "mingw" then
cxx = prefix .. "g++"
elseif toolset == "clang" then
cxx = prefix .. "clang++"
elseif toolset == "msc" then
cxx = "cl.exe"
end
local is_found = false
if cxx then
local cmd = ""
if toolset == "msc" then
cmd = cxx .. " /HELP"
else
cmd = cxx .. " --help"
end
_, _, rc = os.execute(cmd)
if rc == 0 then
is_found = true
m.is_cxx_compileable = toolsets[toolset].is_cxx_compileable
end
end
return is_found
end
return m