2024-02-19 18:24:29 +08:00
|
|
|
|
global function apiVersion(): ApiVersion
|
|
|
|
|
return {
|
|
|
|
|
kind = "compiler_hint",
|
|
|
|
|
major = 0,
|
2024-03-07 15:55:51 +08:00
|
|
|
|
minor = 2,
|
2024-02-19 18:24:29 +08:00
|
|
|
|
}
|
|
|
|
|
end
|
|
|
|
|
|
2024-03-07 15:55:51 +08:00
|
|
|
|
local enum CompilerKind
|
|
|
|
|
"system"
|
|
|
|
|
"multilib"
|
|
|
|
|
"libx32"
|
|
|
|
|
"cross"
|
|
|
|
|
"mingw"
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local compilerNameTemplate: {CompilerKind:{string:string}} = {
|
|
|
|
|
system = {
|
|
|
|
|
en_US = "System %1, %2",
|
|
|
|
|
pt_BR = "%1 sistema, %2",
|
|
|
|
|
zh_CN = "系统 %1,%2",
|
|
|
|
|
zh_TW = "系統 %1,%2",
|
2024-02-19 18:24:29 +08:00
|
|
|
|
},
|
2024-03-07 15:55:51 +08:00
|
|
|
|
multilib = {
|
|
|
|
|
en_US = "Multilib %1, %2",
|
|
|
|
|
pt_BR = "%1 multilib, %2",
|
|
|
|
|
zh_CN = "Multilib %1,%2",
|
|
|
|
|
zh_TW = "Multilib %1,%2",
|
2024-02-19 18:24:29 +08:00
|
|
|
|
},
|
2024-03-07 15:55:51 +08:00
|
|
|
|
libx32 = {
|
|
|
|
|
en_US = "Libx32 %1, %2",
|
|
|
|
|
pt_BR = "%1 libx32, %2",
|
|
|
|
|
zh_CN = "Libx32 %1,%2",
|
|
|
|
|
zh_TW = "Libx32 %1,%2",
|
2024-02-19 18:24:29 +08:00
|
|
|
|
},
|
2024-03-07 15:55:51 +08:00
|
|
|
|
cross = {
|
|
|
|
|
en_US = "Cross %1 %3, %2",
|
|
|
|
|
pt_BR = "%1 cruzado %3, %2",
|
|
|
|
|
zh_CN = "交叉编译 %1 %3,%2",
|
|
|
|
|
zh_TW = "交叉編譯 %1 %3,%2",
|
2024-02-19 18:24:29 +08:00
|
|
|
|
},
|
2024-03-07 15:55:51 +08:00
|
|
|
|
mingw = {
|
|
|
|
|
en_US = "MinGW %1 %3, %2",
|
|
|
|
|
pt_BR = "MinGW %1 %3, %2",
|
|
|
|
|
zh_CN = "MinGW %1 %3,%2",
|
|
|
|
|
zh_TW = "MinGW %1 %3,%2",
|
2024-02-19 18:24:29 +08:00
|
|
|
|
},
|
2024-03-07 15:55:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
local enum Profile
|
|
|
|
|
"release"
|
|
|
|
|
"debug"
|
|
|
|
|
"debugWithAsan"
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local profileNameMap: {Profile:{string:string}} = {
|
2024-02-19 18:24:29 +08:00
|
|
|
|
release = {
|
2024-03-07 15:55:51 +08:00
|
|
|
|
en_US = "release",
|
|
|
|
|
pt_BR = "lançamento",
|
|
|
|
|
zh_CN = "发布",
|
|
|
|
|
zh_TW = "發佈",
|
2024-02-19 18:24:29 +08:00
|
|
|
|
},
|
|
|
|
|
debug = {
|
2024-03-07 15:55:51 +08:00
|
|
|
|
en_US = "debug",
|
|
|
|
|
pt_BR = "depuração",
|
|
|
|
|
zh_CN = "调试",
|
|
|
|
|
zh_TW = "偵錯",
|
2024-02-19 18:24:29 +08:00
|
|
|
|
},
|
|
|
|
|
debugWithAsan = {
|
2024-03-07 15:55:51 +08:00
|
|
|
|
en_US = "debug with ASan",
|
|
|
|
|
pt_BR = "depuração com ASan",
|
|
|
|
|
zh_CN = "ASan 调试",
|
|
|
|
|
zh_TW = "ASan 偵錯",
|
2024-02-19 18:24:29 +08:00
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-07 15:55:51 +08:00
|
|
|
|
local function nameGenerator(lang: string, name: string, kind: CompilerKind, profile: Profile, arch: string | nil): string
|
|
|
|
|
local template = compilerNameTemplate[kind][lang] or compilerNameTemplate[kind].en_US
|
|
|
|
|
local profileName = profileNameMap[profile][lang] or profileNameMap[profile].en_US
|
|
|
|
|
return C_Util.format(template, name, profileName, arch)
|
|
|
|
|
end
|
|
|
|
|
|
2024-02-19 18:24:29 +08:00
|
|
|
|
local function mergeCompilerSet(compilerSet: CompilerHint.CompilerSet, other: CompilerHint.CompilerSet)
|
|
|
|
|
local c = compilerSet as {string:any}
|
|
|
|
|
local o = other as {string:any}
|
|
|
|
|
for k, v in pairs(o) do
|
|
|
|
|
c[k] = v
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local record Config
|
|
|
|
|
customCompileParams: {string} | nil
|
|
|
|
|
customLinkParams: {string} | nil
|
2024-03-07 15:55:51 +08:00
|
|
|
|
arch: string | nil
|
2024-02-19 18:24:29 +08:00
|
|
|
|
triplet: string | nil
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function generateConfig(
|
2024-03-07 15:55:51 +08:00
|
|
|
|
lang: string, name: string, kind: CompilerKind,
|
2024-02-19 18:24:29 +08:00
|
|
|
|
cCompiler: string, cxxCompiler: string,
|
|
|
|
|
config: Config
|
|
|
|
|
): CompilerHint.CompilerSet, CompilerHint.CompilerSet, CompilerHint.CompilerSet
|
|
|
|
|
local commonOptions: CompilerHint.CompilerSet = {
|
|
|
|
|
cCompiler = cCompiler,
|
|
|
|
|
cxxCompiler = cxxCompiler,
|
|
|
|
|
debugger = "/usr/bin/gdb",
|
|
|
|
|
debugServer = "/usr/bin/gdbserver",
|
|
|
|
|
make = "/usr/bin/make",
|
2024-03-07 15:55:51 +08:00
|
|
|
|
compilerType = name:sub(1, 5) == "Clang" and "Clang" or "GCC_UTF8",
|
2024-02-19 18:24:29 +08:00
|
|
|
|
preprocessingSuffix = ".i",
|
|
|
|
|
compilationProperSuffix = ".s",
|
|
|
|
|
assemblingSuffix = ".o",
|
2024-03-07 15:55:51 +08:00
|
|
|
|
executableSuffix = kind == "mingw" and ".exe" or "",
|
2024-02-19 18:24:29 +08:00
|
|
|
|
compilationStage = 3,
|
|
|
|
|
ccCmdOptUsePipe = "on",
|
|
|
|
|
ccCmdOptWarningAll = "on",
|
|
|
|
|
ccCmdOptWarningExtra = "on",
|
|
|
|
|
ccCmdOptCheckIsoConformance = "on",
|
|
|
|
|
binDirs = {"/usr/bin"},
|
|
|
|
|
}
|
2024-03-07 15:55:51 +08:00
|
|
|
|
if kind == "multilib" then
|
2024-02-19 18:24:29 +08:00
|
|
|
|
commonOptions.ccCmdOptPointerSize = "32"
|
|
|
|
|
end
|
2024-03-07 15:55:51 +08:00
|
|
|
|
if kind == "mingw" then
|
2024-02-19 18:24:29 +08:00
|
|
|
|
commonOptions.resourceCompiler = "/usr/bin/" .. config.triplet .. "-windres"
|
|
|
|
|
end
|
|
|
|
|
if config.customCompileParams then
|
|
|
|
|
commonOptions.customCompileParams = config.customCompileParams
|
|
|
|
|
end
|
|
|
|
|
if config.customLinkParams then
|
|
|
|
|
commonOptions.customLinkParams = config.customLinkParams
|
|
|
|
|
end
|
|
|
|
|
local release = {
|
2024-03-07 15:55:51 +08:00
|
|
|
|
name = nameGenerator(lang, name, kind, "release", config.arch),
|
2024-02-19 18:24:29 +08:00
|
|
|
|
staticLink = true,
|
|
|
|
|
linkCmdOptStripExe = "on",
|
|
|
|
|
ccCmdOptOptimize = "2",
|
|
|
|
|
}
|
|
|
|
|
local debug_ = {
|
2024-03-07 15:55:51 +08:00
|
|
|
|
name = nameGenerator(lang, name, kind, "debug", config.arch),
|
2024-02-19 18:24:29 +08:00
|
|
|
|
ccCmdOptDebugInfo = "on",
|
|
|
|
|
}
|
|
|
|
|
local debugWithAsan = {
|
2024-03-07 15:55:51 +08:00
|
|
|
|
name = nameGenerator(lang, name, kind, "debugWithAsan", config.arch),
|
2024-02-19 18:24:29 +08:00
|
|
|
|
ccCmdOptDebugInfo = "on",
|
|
|
|
|
ccCmdOptAddressSanitizer = "address",
|
|
|
|
|
}
|
|
|
|
|
mergeCompilerSet(release, commonOptions)
|
|
|
|
|
mergeCompilerSet(debug_, commonOptions)
|
|
|
|
|
mergeCompilerSet(debugWithAsan, commonOptions)
|
|
|
|
|
return release, debug_, debugWithAsan
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
global function main(): CompilerHint
|
|
|
|
|
local arch = C_System.osArch()
|
|
|
|
|
local libexecDir = C_System.appLibexecDir()
|
|
|
|
|
local lang = C_Desktop.language()
|
|
|
|
|
|
|
|
|
|
local compilerList = {}
|
|
|
|
|
|
2024-03-07 15:55:51 +08:00
|
|
|
|
local gccDumpVersion = C_System.popen("/usr/bin/gcc", {"-dumpfullversion"})
|
|
|
|
|
gccDumpVersion = gccDumpVersion:match("^[0-9.]+")
|
|
|
|
|
local gccFsVersion = C_System.popen("/usr/bin/gcc", {"-dumpversion"})
|
|
|
|
|
gccFsVersion = gccFsVersion:match("^[0-9.]+")
|
|
|
|
|
local clangDumpVersion: string
|
|
|
|
|
|
2024-02-19 18:24:29 +08:00
|
|
|
|
do
|
|
|
|
|
local release, debug_, debugWithAsan = generateConfig(
|
2024-03-07 15:55:51 +08:00
|
|
|
|
lang, "GCC (" .. gccDumpVersion .. ")", "system", "/usr/bin/gcc", "/usr/bin/g++",
|
|
|
|
|
{}
|
|
|
|
|
)
|
|
|
|
|
table.insert(compilerList, release)
|
|
|
|
|
table.insert(compilerList, debug_)
|
|
|
|
|
table.insert(compilerList, debugWithAsan)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local versionedGccs = C_FileSystem.matchFiles("/usr/bin", "^gcc-[0-9]+$")
|
|
|
|
|
for _, gcc in ipairs(versionedGccs) do
|
|
|
|
|
local version = gcc:sub(5)
|
|
|
|
|
local name = "GCC " .. version
|
|
|
|
|
local release, debug_, debugWithAsan = generateConfig(
|
|
|
|
|
lang, name, "system", "/usr/bin/" .. gcc, "/usr/bin/g++-" .. version,
|
2024-02-19 18:24:29 +08:00
|
|
|
|
{}
|
|
|
|
|
)
|
|
|
|
|
table.insert(compilerList, release)
|
|
|
|
|
table.insert(compilerList, debug_)
|
|
|
|
|
table.insert(compilerList, debugWithAsan)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if C_FileSystem.isExecutable("/usr/bin/clang") then
|
2024-03-07 15:55:51 +08:00
|
|
|
|
clangDumpVersion = C_System.popen("/usr/bin/clang", {"-dumpversion"})
|
|
|
|
|
clangDumpVersion = clangDumpVersion:match("^[0-9.]+")
|
2024-02-19 18:24:29 +08:00
|
|
|
|
local release, debug_, debugWithAsan = generateConfig(
|
2024-03-07 15:55:51 +08:00
|
|
|
|
lang, "Clang (" .. clangDumpVersion .. ")", "system", "/usr/bin/clang", "/usr/bin/clang++",
|
|
|
|
|
{}
|
2024-02-19 18:24:29 +08:00
|
|
|
|
)
|
|
|
|
|
table.insert(compilerList, release)
|
|
|
|
|
table.insert(compilerList, debug_)
|
|
|
|
|
table.insert(compilerList, debugWithAsan)
|
|
|
|
|
end
|
|
|
|
|
|
2024-03-07 15:55:51 +08:00
|
|
|
|
local versionedClangs = C_FileSystem.matchFiles("/usr/bin", "^clang-[0-9]+$")
|
|
|
|
|
for _, clang in ipairs(versionedClangs) do
|
|
|
|
|
local version = clang:sub(7)
|
|
|
|
|
local name = "Clang " .. version
|
|
|
|
|
local release, debug_, debugWithAsan = generateConfig(
|
|
|
|
|
lang, name, "system", "/usr/bin/" .. clang, "/usr/bin/clang++-" .. version,
|
|
|
|
|
{}
|
|
|
|
|
)
|
|
|
|
|
table.insert(compilerList, release)
|
|
|
|
|
table.insert(compilerList, debug_)
|
|
|
|
|
table.insert(compilerList, debugWithAsan)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- with lib32stdc++-dev installed, system GCC and Clang can target 32-bit
|
|
|
|
|
if arch == "x86_64" and C_FileSystem.exists("/usr/lib/gcc/x86_64-linux-gnu/" .. gccFsVersion .. "/32/libstdc++.a") then
|
|
|
|
|
do
|
|
|
|
|
local release, debug_, debugWithAsan = generateConfig(
|
|
|
|
|
lang, "GCC (" .. gccDumpVersion .. ")", "multilib", "/usr/bin/gcc", "/usr/bin/g++",
|
|
|
|
|
{}
|
|
|
|
|
)
|
|
|
|
|
table.insert(compilerList, release)
|
|
|
|
|
table.insert(compilerList, debug_)
|
|
|
|
|
table.insert(compilerList, debugWithAsan)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if C_FileSystem.isExecutable("/usr/bin/clang") then
|
|
|
|
|
local release, debug_, debugWithAsan = generateConfig(
|
|
|
|
|
lang, "Clang (" .. clangDumpVersion .. ")", "multilib", "/usr/bin/clang", "/usr/bin/clang++",
|
|
|
|
|
{}
|
|
|
|
|
)
|
|
|
|
|
table.insert(compilerList, release)
|
|
|
|
|
table.insert(compilerList, debug_)
|
|
|
|
|
table.insert(compilerList, debugWithAsan)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- with libx32stdc++-dev installed, system GCC and Clang can target x32
|
|
|
|
|
if arch == "x86_64" and C_FileSystem.exists("/usr/lib/gcc/x86_64-linux-gnu/" .. gccFsVersion .. "/x32/libstdc++.a") then
|
2024-02-19 18:24:29 +08:00
|
|
|
|
do
|
|
|
|
|
local release, debug_, debugWithAsan = generateConfig(
|
2024-03-07 15:55:51 +08:00
|
|
|
|
lang, "GCC (" .. gccDumpVersion .. ")", "libx32", "/usr/bin/gcc", "/usr/bin/g++",
|
|
|
|
|
{
|
|
|
|
|
customCompileParams = {"-mx32"},
|
|
|
|
|
customLinkParams = {"-mx32"},
|
|
|
|
|
}
|
2024-02-19 18:24:29 +08:00
|
|
|
|
)
|
|
|
|
|
table.insert(compilerList, release)
|
|
|
|
|
table.insert(compilerList, debug_)
|
|
|
|
|
table.insert(compilerList, debugWithAsan)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if C_FileSystem.isExecutable("/usr/bin/clang") then
|
|
|
|
|
local release, debug_, debugWithAsan = generateConfig(
|
2024-03-07 15:55:51 +08:00
|
|
|
|
lang, "Clang (" .. clangDumpVersion .. ")", "libx32", "/usr/bin/clang", "/usr/bin/clang++",
|
|
|
|
|
{
|
|
|
|
|
customCompileParams = {"-mx32"},
|
|
|
|
|
customLinkParams = {"-mx32"},
|
|
|
|
|
}
|
2024-02-19 18:24:29 +08:00
|
|
|
|
)
|
|
|
|
|
table.insert(compilerList, release)
|
|
|
|
|
table.insert(compilerList, debug_)
|
|
|
|
|
table.insert(compilerList, debugWithAsan)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- with wine or WSL init registered in binfmt_misc, Windows binaries can run seamlessly
|
|
|
|
|
if (
|
|
|
|
|
arch == "x86_64" and (
|
|
|
|
|
C_FileSystem.exists("/proc/sys/fs/binfmt_misc/DOSWin") or
|
|
|
|
|
C_FileSystem.exists("/proc/sys/fs/binfmt_misc/WSLInterop")
|
|
|
|
|
)
|
|
|
|
|
) then
|
|
|
|
|
if C_FileSystem.isExecutable("/usr/bin/x86_64-w64-mingw32-gcc") then
|
|
|
|
|
do
|
|
|
|
|
local release, _, _ = generateConfig(
|
2024-03-07 15:55:51 +08:00
|
|
|
|
lang, "GCC", "mingw",
|
2024-02-19 18:24:29 +08:00
|
|
|
|
"/usr/bin/x86_64-w64-mingw32-gcc", "/usr/bin/x86_64-w64-mingw32-g++",
|
|
|
|
|
{
|
2024-03-07 15:55:51 +08:00
|
|
|
|
arch = "x86_64",
|
2024-02-19 18:24:29 +08:00
|
|
|
|
triplet = "x86_64-w64-mingw32",
|
2024-03-07 16:28:45 +08:00
|
|
|
|
customLinkParams = {},
|
2024-02-19 18:24:29 +08:00
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
table.insert(compilerList, release)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if C_FileSystem.isExecutable("/usr/bin/i686-w64-mingw32-gcc") then
|
|
|
|
|
do
|
|
|
|
|
local release, _, _ = generateConfig(
|
2024-03-07 15:55:51 +08:00
|
|
|
|
lang, "GCC", "mingw",
|
2024-02-19 18:24:29 +08:00
|
|
|
|
"/usr/bin/i686-w64-mingw32-gcc", "/usr/bin/i686-w64-mingw32-g++",
|
|
|
|
|
{
|
2024-03-07 15:55:51 +08:00
|
|
|
|
arch = "i686",
|
2024-02-19 18:24:29 +08:00
|
|
|
|
triplet = "i686-w64-mingw32",
|
2024-03-07 16:28:45 +08:00
|
|
|
|
customLinkParams = {},
|
2024-02-19 18:24:29 +08:00
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
table.insert(compilerList, release)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local result = {
|
|
|
|
|
compilerList = compilerList,
|
|
|
|
|
noSearch = {
|
|
|
|
|
"/usr/bin",
|
|
|
|
|
"/usr/lib/ccache",
|
|
|
|
|
},
|
|
|
|
|
preferCompiler = 3, -- System GCC Debug with ASan
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
end
|