summaryrefslogtreecommitdiff
path: root/xmake/modules
diff options
context:
space:
mode:
authorruki <[email protected]>2025-12-15 22:41:55 +0800
committerruki <[email protected]>2025-12-15 22:41:55 +0800
commit0edd8ff4b884eebc30ab04870ab0ea2bb9e4bb60 (patch)
tree84a39e33c6483f459e5b97cc3b46e9619bb3e9db /xmake/modules
parentf23872ba7f507474cd3ee77e718f3ff5e30035a9 (diff)
improve cosmocc for binutils
Diffstat (limited to 'xmake/modules')
-rw-r--r--xmake/modules/cli/binutils/bin2obj.lua3
-rw-r--r--xmake/modules/utils/binary/bin2obj.lua29
2 files changed, 31 insertions, 1 deletions
diff --git a/xmake/modules/cli/binutils/bin2obj.lua b/xmake/modules/cli/binutils/bin2obj.lua
index 6ee6c2158..06493143a 100644
--- a/xmake/modules/cli/binutils/bin2obj.lua
+++ b/xmake/modules/cli/binutils/bin2obj.lua
@@ -31,7 +31,8 @@ local options = {
{'p', "plat", "kv", nil, "Set the target platform (macosx, iphoneos, etc.)."},
{nil, "target_minver", "kv", nil, "Set the target minimum version (e.g., 10.0, 18.2)."},
{nil, "xcode_sdkver", "kv", nil, "Set the Xcode SDK version (e.g., 10.0, 18.2)."},
- {nil, "zeroend", "k", nil, "Append a null terminator ('\\0') at the end of data."}
+ {nil, "zeroend", "k", nil, "Append a null terminator ('\\0') at the end of data."},
+ {nil, "cosmocc", "k", nil, "Enable cosmocc support (generate concomitant object file)."}
}
function main(...)
diff --git a/xmake/modules/utils/binary/bin2obj.lua b/xmake/modules/utils/binary/bin2obj.lua
index 13ff633e1..e77cfad6f 100644
--- a/xmake/modules/utils/binary/bin2obj.lua
+++ b/xmake/modules/utils/binary/bin2obj.lua
@@ -49,6 +49,35 @@ function main(binarypath, outputpath, opt)
-- do conversion
binutils.bin2obj(binarypath, outputpath, opt)
+ -- generate concomitant object file for cosmocc
+ if opt.cosmocc then
+ local arch = opt.arch or "x86_64"
+ local arch_concomitant
+ local objectfile_concomitant
+ if arch == "x86_64" or arch == "x64" then
+ arch_concomitant = "aarch64"
+ objectfile_concomitant = path.join(path.directory(outputpath), ".aarch64", path.filename(outputpath))
+ elseif arch == "aarch64" or arch == "arm64" then
+ arch_concomitant = "x86_64"
+ objectfile_concomitant = path.join(path.directory(outputpath), ".x86_64", path.filename(outputpath))
+ end
+
+ if arch_concomitant and objectfile_concomitant then
+
+ -- clone options for concomitant
+ local opt_concomitant = table.clone(opt)
+ opt_concomitant.arch = arch_concomitant
+ opt_concomitant.cosmocc = false
+
+ -- trace
+ print("converting binary file %s to %s object file %s ..", binarypath, format or "coff", objectfile_concomitant)
+
+ -- do conversion
+ os.mkdir(path.directory(objectfile_concomitant))
+ binutils.bin2obj(binarypath, objectfile_concomitant, opt_concomitant)
+ end
+ end
+
-- trace
cprint("${bright}%s generated!", outputpath)
end