summaryrefslogtreecommitdiff
path: root/xmake/rules/c++/modules/modules_support
diff options
context:
space:
mode:
authorArthur LAURENT <[email protected]>2023-01-06 13:11:51 +0100
committerArthur LAURENT <[email protected]>2023-01-06 13:11:51 +0100
commit02307bd1ca30bc4bfcd6617966a68327157af007 (patch)
tree6c416332e9503ac428bffe018ad7393ca001cd65 /xmake/rules/c++/modules/modules_support
parent325d67461b1376a0073674e7dc694be5df804083 (diff)
improve metainfo handling
Diffstat (limited to 'xmake/rules/c++/modules/modules_support')
-rw-r--r--xmake/rules/c++/modules/modules_support/common.lua41
1 files changed, 35 insertions, 6 deletions
diff --git a/xmake/rules/c++/modules/modules_support/common.lua b/xmake/rules/c++/modules/modules_support/common.lua
index 25fcc89f3..e1ae05393 100644
--- a/xmake/rules/c++/modules/modules_support/common.lua
+++ b/xmake/rules/c++/modules/modules_support/common.lua
@@ -102,6 +102,35 @@ function patch_sourcebatch(target, sourcebatch)
end
end
+function parse_meta_info(target, metafile)
+ local metadata = json.loadfile(metafile)
+ if metadata._VENDOR_extension.xmake then
+ return metadata._VENDOR_extension.xmake.file, metadata._VENDOR_extension.xmake.name, metadata
+ end
+
+ local file = path.basename(metafile)
+ for _, ext in pairs({".mpp", ".mxx", ".cppm", ".ixx"}) do
+ if os.exists(path.join(path.directory(metafile), file .. ext)) then
+ file = file .. ext
+ break
+ end
+ end
+
+ local sourcecode = io.readfile(path.join(path.directory(metafile), file))
+ sourcecode = sourcecode:gsub("//.-\n", "\n")
+ sourcecode = sourcecode:gsub("/%*.-%*/", "")
+
+ local name
+ for _, line in ipairs(sourcecode:split("\n", {plain = true})) do
+ name = line:match("export%s+module%s+(.+)%s*;") or line:match("export%s+__preprocessed_module%s+(.+)%s*;")
+ if name then
+ break
+ end
+ end
+
+ return file, name, metadata
+end
+
-- extract packages modules dependencies
function get_all_package_modules(target, modules, opt)
local package_modules
@@ -110,11 +139,11 @@ function get_all_package_modules(target, modules, opt)
for name, package in pairs(target:pkgs()) do
package_modules = package_modules or {}
local modules_dir = path.join(package:installdir(), "modules", name)
- local meta_files = os.files(path.join(modules_dir, "**.meta-info"))
- for _, file in ipairs(meta_files) do
- local metadata = json.loadfile(file)
- package_modules[metadata._VENDOR_extension.name] = {
- file = path.join(modules_dir, metadata._VENDOR_extension.file),
+ local metafiles = os.files(path.join(modules_dir, "**.meta-info"))
+ for _, metafile in ipairs(metafiles) do
+ local modulefile, name, metadata = parse_meta_info(target, metafile)
+ package_modules[name] = {
+ file = path.join(modules_dir, modulefile),
metadata = metadata
}
end
@@ -662,7 +691,7 @@ function generate_meta_module_info(target, name, sourcefile, requires)
end
end
- module_metadata._VENDOR_extension = {name = name, file = path.filename(sourcefile)}
+ module_metadata._VENDOR_extension = { xmake = { name = name, file = path.filename(sourcefile) }}
return module_metadata
end