From cd41fd1b0a40da26d14ea9d3512436b7571f07dc Mon Sep 17 00:00:00 2001 From: ruki Date: Sat, 7 Jan 2023 00:07:14 +0800 Subject: fix xmake install --- core/src/xmake/os/syserror.c | 1 + xmake/actions/install/main.lua | 7 +++++-- xmake/actions/uninstall/main.lua | 7 +++++-- xmake/core/base/os.lua | 1 + xmake/core/sandbox/modules/os.lua | 1 + 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/core/src/xmake/os/syserror.c b/core/src/xmake/os/syserror.c index c93a4eeda..1ab6afb23 100644 --- a/core/src/xmake/os/syserror.c +++ b/core/src/xmake/os/syserror.c @@ -45,6 +45,7 @@ tb_int_t xm_os_syserror(lua_State* lua) { case TB_STATE_SYSERROR_NOT_PERM: err = 1; break; case TB_STATE_SYSERROR_NOT_FILEDIR: err = 2; break; + case TB_STATE_SYSERROR_NOT_ACCESS: err = 3; break; case TB_STATE_SYSERROR_UNKNOWN_ERROR: err = -1; break; } lua_pushinteger(lua, err); diff --git a/xmake/actions/install/main.lua b/xmake/actions/install/main.lua index 4f59c2b79..5d15a4c40 100644 --- a/xmake/actions/install/main.lua +++ b/xmake/actions/install/main.lua @@ -118,8 +118,11 @@ function main() cprint("${color.success}install ok!") ok = true end - if not ok and os.syserror() == os.SYSERR_NOT_PERM then - wprint("please pass the --admin parameter to `xmake install` to request administrator permissions!") + if not ok then + local syserror = os.syserror() + if syserror == os.SYSERR_NOT_PERM or syserror == os.SYSERR_NOT_ACCESS then + wprint("please pass the --admin parameter to `xmake install` to request administrator permissions!") + end end assert(ok, "install failed, %s", errors or "unknown reason") end diff --git a/xmake/actions/uninstall/main.lua b/xmake/actions/uninstall/main.lua index 67bb36a83..3132a3456 100644 --- a/xmake/actions/uninstall/main.lua +++ b/xmake/actions/uninstall/main.lua @@ -75,8 +75,11 @@ function main() cprint("${color.success}uninstall ok!") ok = true end - if not ok and os.syserror() == os.SYSERR_NOT_PERM then - wprint("please pass the --admin parameter to `xmake uninstall` to request administrator permissions!") + if not ok then + local syserror = os.syserror() + if syserror == os.SYSERR_NOT_PERM or syserror == os.SYSERR_NOT_ACCESS then + wprint("please pass the --admin parameter to `xmake uninstall` to request administrator permissions!") + end end assert(ok, "uninstall failed, %s", errors or "unknown reason") end diff --git a/xmake/core/base/os.lua b/xmake/core/base/os.lua index b28381ccd..dcd7cca8b 100644 --- a/xmake/core/base/os.lua +++ b/xmake/core/base/os.lua @@ -50,6 +50,7 @@ os.SYSERR_UNKNOWN = -1 os.SYSERR_NONE = 0 os.SYSERR_NOT_PERM = 1 os.SYSERR_NOT_FILEDIR = 2 +os.SYSERR_NOT_ACCESS = 3 -- copy single file or directory function os._cp(src, dst, rootdir, opt) diff --git a/xmake/core/sandbox/modules/os.lua b/xmake/core/sandbox/modules/os.lua index 28eba4471..ac860eac8 100644 --- a/xmake/core/sandbox/modules/os.lua +++ b/xmake/core/sandbox/modules/os.lua @@ -83,6 +83,7 @@ sandbox_os.SYSERR_UNKNOWN = os.SYSERR_UNKNOWN sandbox_os.SYSERR_NONE = os.SYSERR_NONE sandbox_os.SYSERR_NOT_PERM = os.SYSERR_NOT_PERM sandbox_os.SYSERR_NOT_FILEDIR = os.SYSERR_NOT_FILEDIR +sandbox_os.SYSERR_NOT_ACCESS = os.SYSERR_NOT_ACCESS -- copy file or directory function sandbox_os.cp(srcpath, dstpath, opt) -- cgit v1.3.1 From 4b83826396c3bef99e138e2c6b13e2a6f818f017 Mon Sep 17 00:00:00 2001 From: Arthur LAURENT Date: Mon, 26 Dec 2022 18:19:28 +0100 Subject: generate module meta data file on install this should allow a support of importing modules from a XMake library with other buildsys like CMake or Meson --- xmake/rules/c++/modules/modules_support/common.lua | 52 ++++++++++++++++++++++ xmake/rules/c++/modules/xmake.lua | 15 +------ 2 files changed, 53 insertions(+), 14 deletions(-) diff --git a/xmake/rules/c++/modules/modules_support/common.lua b/xmake/rules/c++/modules/modules_support/common.lua index 1c3b2f0b1..f3500a658 100644 --- a/xmake/rules/c++/modules/modules_support/common.lua +++ b/xmake/rules/c++/modules/modules_support/common.lua @@ -572,3 +572,55 @@ function append_dependency_objectfiles(target) end end end + +-- generate meta module informations for package / other buildsystems import +-- based on https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2473r1.pdf +-- +-- e.g +-- { +-- "include_paths": {"foo/", "bar/"} +-- "definitions": {"FOO=BAR"} +-- "imports": {"std", "bar"} +-- "_VENDOR_extension": {} +-- } +function generate_meta_module_info(target, sourcefile) + local module_metadata = {} + + -- add include paths + module_metadata.include_paths = target:get("includedirs") or {} + for _, deps in ipairs(target:orderdeps()) do + table.join2(module_metadata.include_paths, deps:get("includedirs") or {}) + end + + -- add definitions + module_metadata.definitions = target:get("defines") or {} + for _, deps in ipairs(target:orderdeps()) do + table.join2(module_metadata.definitions, deps:get("defines") or {}) + end + + module_metadata._VENDOR_extension = {} + + print(module_metadata) + + return module_metadata +end + +function install_module_target(target) + local sourcebatch = target:sourcebatches()["c++.build.modules.install"] + if sourcebatch and sourcebatch.sourcefiles then + for _, sourcefile in ipairs(sourcebatch.sourcefiles) do + local prefixdir = path.join("modules", target:name()) + local fileconfig = target:fileconfig(sourcefile) + if fileconfig and fileconfig.prefixdir then + prefixdir = fileconfig.prefixdir + end + local install = (fileconfig and not fileconfig.install) and false or true + if install then + target:add("installfiles", sourcefile, {prefixdir = prefixdir}) + local metafile = path.join(target:installdir(), prefixdir, path.basename(sourcefile) .. ".meta-ixx-info") + print(metafile) + io.writefile(metafile, json.encode(generate_meta_module_info(target, sourcefile))) + end + end + end +end \ No newline at end of file diff --git a/xmake/rules/c++/modules/xmake.lua b/xmake/rules/c++/modules/xmake.lua index 3a7c7129d..2ccf27c5d 100644 --- a/xmake/rules/c++/modules/xmake.lua +++ b/xmake/rules/c++/modules/xmake.lua @@ -147,19 +147,6 @@ rule("c++.build.modules.install") -- we cannot use target:data("cxx.has_modules"), -- because on_config will be not called when installing targets if common.contains_modules(target) then - local sourcebatch = target:sourcebatches()["c++.build.modules.install"] - if sourcebatch then - for _, sourcefile in sourcebatch.sourcefiles do - local prefixdir = "modules" - local fileconfig = target:fileconfig(sourcefile) - if fileconfig and fileconfig.prefixdir then - prefixdir = fileconfig.prefixdir - end - local install = (fileconfig and not fileconfig.install) and false or true - if install then - target:add("installfiles", sourcefile, {prefixdir = prefixdir}) - end - end - end + common.install_module_target(target) end end) -- cgit v1.3.1 From e3aa97b577dac58da1588c096140f178e53256cd Mon Sep 17 00:00:00 2001 From: Arthur LAURENT Date: Thu, 29 Dec 2022 18:33:48 +0100 Subject: add support of importing module from packages --- xmake/rules/c++/modules/modules_support/clang.lua | 19 +++-- xmake/rules/c++/modules/modules_support/common.lua | 96 ++++++++++++++++++---- xmake/rules/c++/modules/modules_support/gcc.lua | 15 ++-- xmake/rules/c++/modules/modules_support/msvc.lua | 37 ++++++--- xmake/rules/c++/modules/xmake.lua | 18 ++++ 5 files changed, 148 insertions(+), 37 deletions(-) diff --git a/xmake/rules/c++/modules/modules_support/clang.lua b/xmake/rules/c++/modules/modules_support/clang.lua index 02d08e6b0..074ed331f 100644 --- a/xmake/rules/c++/modules/modules_support/clang.lua +++ b/xmake/rules/c++/modules/modules_support/clang.lua @@ -484,13 +484,18 @@ function build_modules_for_batchjobs(target, batchjobs, objectfiles, modules, op if provide or common.has_module_extension(cppfile) then local bmifile = provide and provide.bmi - _build_modulefile(target, provide and provide.sourcefile or cppfile, { - objectfile = objectfile, - dependfile = target:dependfile(bmifile or objectfile), - provide = provide and {bmifile = bmifile, name = name}, - common_args = common_args, - requiresflags = requiresflags, - progress = (index * 100) / total}) + if not common.memcache():get2(name or cppfile, "compiling") then + if name and module.external then + common.memcache():set2(name or cppfile, "compiling", true) + end + _build_modulefile(target, provide and provide.sourcefile or cppfile, { + objectfile = objectfile, + dependfile = target:dependfile(bmifile or objectfile), + provide = provide and {bmifile = bmifile, name = name}, + common_args = common_args, + requiresflags = requiresflags, + progress = (index * 100) / total}) + end target:add("objectfiles", objectfile) if provide then diff --git a/xmake/rules/c++/modules/modules_support/common.lua b/xmake/rules/c++/modules/modules_support/common.lua index f3500a658..394d9b60e 100644 --- a/xmake/rules/c++/modules/modules_support/common.lua +++ b/xmake/rules/c++/modules/modules_support/common.lua @@ -102,6 +102,64 @@ function patch_sourcebatch(target, sourcebatch) end end +-- extract packages modules dependencies +function get_all_package_modules(target, modules, opt) + local package_modules + + -- parse all meta-info and append their informations to the package store + 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.match(path.join(modules_dir, "**.meta-info"), false) + if meta_files then + 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), + metadata = metadata + } + end + end + end + + return package_modules +end + +-- cull unused modules +function cull_unused_modules(target, modules, package_modules_data) + local needed_modules = {} + -- append all target dependencies + for _, module in pairs(modules) do + if module.requires then + for required, _ in pairs(module.requires) do + table.append(needed_modules, required) + end + end + end + + -- append all package dependencies + local module_names = {} + for name, _ in pairs(package_modules_data) do + table.append(module_names, name) + end + + local culled + for i, name in ipairs(module_names) do + culled = culled or {} + if table.find(needed_modules, name) and package_modules_data[name] and not culled[name] then + culled[name] = package_modules_data[name] + + -- table.remove(module_names, i) + if culled[name].metadata.imports then + table.join2(needed_modules, culled[name].metadata.imports) + table.join2(module_names, culled[name].metadata.imports) + end + end + end + + return culled +end + -- get modules support function modules_support(target) local cachekey = tostring(target) @@ -510,7 +568,7 @@ end function get_module_dependencies(target, sourcebatch, opt) local cachekey = target:name() .. "/" .. sourcebatch.rulename local modules = memcache():get2("modules", cachekey) - if modules == nil then + if modules == nil or opt.regenerate then modules = localcache():get2("modules", cachekey) opt.progress = opt.progress or 0 local changed = modules_support(target).generate_dependencies(target, sourcebatch, opt) @@ -564,11 +622,11 @@ function append_dependency_objectfiles(target) local cache = localcache():get(cachekey) if cache then if target:is_binary() then - target:add("ldflags", cache, {force = true}) + target:add("ldflags", cache, {force = true, expand = false}) elseif target:is_static() then - target:add("arflags", cache, {force = true}) + target:add("arflags", cache, {force = true, expand = false}) elseif target:is_shared() then - target:add("shflags", cache, {force = true}) + target:add("shflags", cache, {force = true, expand = false}) end end end @@ -578,35 +636,42 @@ end -- -- e.g -- { --- "include_paths": {"foo/", "bar/"} --- "definitions": {"FOO=BAR"} --- "imports": {"std", "bar"} +-- "include_paths": ["foo/", "bar/"] +-- "definitions": ["FOO=BAR"] +-- "imports": ["std", "bar"] -- "_VENDOR_extension": {} -- } -function generate_meta_module_info(target, sourcefile) +function generate_meta_module_info(target, name, sourcefile, requires) local module_metadata = {} -- add include paths - module_metadata.include_paths = target:get("includedirs") or {} + module_metadata.include_paths = table.wrap(target:get("includedirs")) or {} for _, deps in ipairs(target:orderdeps()) do table.join2(module_metadata.include_paths, deps:get("includedirs") or {}) end -- add definitions - module_metadata.definitions = target:get("defines") or {} + module_metadata.definitions = table.wrap(target:get("defines")) or {} for _, deps in ipairs(target:orderdeps()) do table.join2(module_metadata.definitions, deps:get("defines") or {}) end - module_metadata._VENDOR_extension = {} + -- add imports + if requires then + for name, _ in pairs(requires) do + module_metadata.imports = module_metadata.imports or {} + table.append(module_metadata.imports, name) + end + end - print(module_metadata) + module_metadata._VENDOR_extension = {name = name, file = path.filename(sourcefile)} return module_metadata end function install_module_target(target) local sourcebatch = target:sourcebatches()["c++.build.modules.install"] + local cachedir = modules_cachedir(target) if sourcebatch and sourcebatch.sourcefiles then for _, sourcefile in ipairs(sourcebatch.sourcefiles) do local prefixdir = path.join("modules", target:name()) @@ -617,9 +682,10 @@ function install_module_target(target) local install = (fileconfig and not fileconfig.install) and false or true if install then target:add("installfiles", sourcefile, {prefixdir = prefixdir}) - local metafile = path.join(target:installdir(), prefixdir, path.basename(sourcefile) .. ".meta-ixx-info") - print(metafile) - io.writefile(metafile, json.encode(generate_meta_module_info(target, sourcefile))) + local metafile = path.join(cachedir, path.filename(sourcefile) .. ".meta-info") + if os.exists(metafile) then + target:add("installfiles", metafile, {prefixdir = prefixdir}) + end end end end diff --git a/xmake/rules/c++/modules/modules_support/gcc.lua b/xmake/rules/c++/modules/modules_support/gcc.lua index f178e550a..acc06039f 100644 --- a/xmake/rules/c++/modules/modules_support/gcc.lua +++ b/xmake/rules/c++/modules/modules_support/gcc.lua @@ -445,11 +445,16 @@ function build_modules_for_batchjobs(target, batchjobs, objectfiles, modules, op end if provide or common.has_module_extension(cppfile) then - _build_modulefile(target, cppfile, { - objectfile = objectfile, - dependfile = dependfile, - name = name or cppfile, - progress = (index * 100) / total}) + if not common.memcache():get2(name or cppfile, "compiling") then + if name and module.external then + common.memcache():set2(name or cppfile, "compiling", true) + end + _build_modulefile(target, cppfile, { + objectfile = objectfile, + dependfile = dependfile, + name = name or cppfile, + progress = (index * 100) / total}) + end target:add("objectfiles", objectfile) end end)}) diff --git a/xmake/rules/c++/modules/modules_support/msvc.lua b/xmake/rules/c++/modules/modules_support/msvc.lua index a902721c0..8799103b0 100644 --- a/xmake/rules/c++/modules/modules_support/msvc.lua +++ b/xmake/rules/c++/modules/modules_support/msvc.lua @@ -26,6 +26,7 @@ import("core.project.depend") import("core.project.config") import("core.base.hashset") import("core.base.semver") +import("core.base.json") import("utils.progress") import("private.action.build.object", {alias = "objectbuilder"}) import("common") @@ -450,6 +451,7 @@ function build_modules_for_batchjobs(target, batchjobs, objectfiles, modules, op for objectfile, module in pairs(get_stdmodules(target)) do table.insert(objectfiles, objectfile) modules[objectfile] = module + modules[objectfile].external = true end end @@ -480,6 +482,21 @@ function build_modules_for_batchjobs(target, batchjobs, objectfiles, modules, op if provide then table.join2(flags, {ifcoutputflag, path(provide.bmi), provide.interface and interfaceflag or internalpartitionflag}) dependfile = target:dependfile(provide.bmi) + + local fileconfig = target:fileconfig(cppfile) + if fileconfig and fileconfig.install then + batchjobs:addjob(name .. "_metafile", function(index, total) + local cachedir = common.modules_cachedir(target) + local metafilepath = path.join(cachedir, path.filename(cppfile) .. ".meta-info") + depend.on_changed(function() + progress.show(opt.progress, "${color.build.object}generating.module.metadata %s", name) + local metadata = common.generate_meta_module_info(target, name, cppfile, module.requires) + json.savefile(metafilepath, metadata) + + end, {dependfile = target:dependfile(metafilepath), files = {cppfile}}) + + end, {rootjob = flushjob}) + end end table.join2(moduleinfo, { @@ -497,17 +514,17 @@ function build_modules_for_batchjobs(target, batchjobs, objectfiles, modules, op if provide or common.has_module_extension(cppfile) then if not common.memcache():get2(name or cppfile, "compiling") then - if name and name:match("std") then - common.memcache():set2(name or cppfile, "compiling", true) + if name and module.external then + common.memcache():set2(name or cppfile, "compiling", true) end - _build_modulefile(target, cppfile, { - objectfile = objectfile, - dependfile = dependfile, - name = name or module.cppfile, - flags = _flags, - progress = (index * 100) / total}) - _add_objectfile_to_link_arguments(target, path(objectfile)) + _build_modulefile(target, cppfile, { + objectfile = objectfile, + dependfile = dependfile, + name = name or module.cppfile, + flags = _flags, + progress = (index * 100) / total}) end + _add_objectfile_to_link_arguments(target, objectfile) elseif requiresflags then requiresflags = get_requiresflags(target, module.requires) target:fileconfig_add(cppfile, {force = {cxxflags = table.join(flags, requiresflags)}}) @@ -577,7 +594,7 @@ function build_modules_for_batchcmds(target, batchcmds, objectfiles, modules, op batchcmds:mkdir(path.directory(objectfile)) _batchcmds_compile(batchcmds, target, table.join(flags, requiresflags or {})) batchcmds:add_depfiles(cppfile) - _add_objectfile_to_link_arguments(target, path(objectfile)) + _add_objectfile_to_link_arguments(target, path.translate(objectfile)) if provide then _add_module_to_mapper(target, referenceflag, name, name, objectfile, provide.bmi, requiresflags) end diff --git a/xmake/rules/c++/modules/xmake.lua b/xmake/rules/c++/modules/xmake.lua index 2ccf27c5d..1d2852644 100644 --- a/xmake/rules/c++/modules/xmake.lua +++ b/xmake/rules/c++/modules/xmake.lua @@ -67,6 +67,24 @@ rule("c++.build.modules.builder") common.patch_sourcebatch(target, sourcebatch, opt) local modules = common.get_module_dependencies(target, sourcebatch, opt) + -- extract packages modules dependencies + local package_modules_data = common.get_all_package_modules(target, modules, opt) + if package_modules_data then + -- cull unused modules + package_modules_data = common.cull_unused_modules(target, modules, package_modules_data) + if package_modules_data then + -- append to sourcebatch + for name, package_module_data in pairs(package_modules_data) do + table.append(sourcebatch.sourcefiles, package_module_data.file) + end + + -- we need to repatch and regenerate dependencies at this point + common.patch_sourcebatch(target, sourcebatch, opt) + opt.regenerate = true + modules = common.get_module_dependencies(target, sourcebatch, opt) + end + end + -- build modules common.build_modules_for_batchjobs(target, batchjobs, sourcebatch, modules, opt) -- cgit v1.3.1 From 35cae5edfac1118b66a521363e1a07c90bc7d900 Mon Sep 17 00:00:00 2001 From: Arthur LAURENT Date: Thu, 29 Dec 2022 19:04:22 +0100 Subject: fix meta info generation on gcc and clang --- xmake/rules/c++/modules/modules_support/clang.lua | 18 ++++++++++++++++++ xmake/rules/c++/modules/modules_support/gcc.lua | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/xmake/rules/c++/modules/modules_support/clang.lua b/xmake/rules/c++/modules/modules_support/clang.lua index 074ed331f..467eb9120 100644 --- a/xmake/rules/c++/modules/modules_support/clang.lua +++ b/xmake/rules/c++/modules/modules_support/clang.lua @@ -471,6 +471,24 @@ function build_modules_for_batchjobs(target, batchjobs, objectfiles, modules, op end end local moduleinfo = table.copy(provide) or {} + + if provide then + local fileconfig = target:fileconfig(cppfile) + if fileconfig and fileconfig.install then + batchjobs:addjob(name .. "_metafile", function(index, total) + local cachedir = common.modules_cachedir(target) + local metafilepath = path.join(cachedir, path.filename(cppfile) .. ".meta-info") + depend.on_changed(function() + progress.show(opt.progress, "${color.build.object}generating.module.metadata %s", name) + local metadata = common.generate_meta_module_info(target, name, cppfile, module.requires) + json.savefile(metafilepath, metadata) + + end, {dependfile = target:dependfile(metafilepath), files = {cppfile}}) + + end, {rootjob = flushjob}) + end + end + table.join2(moduleinfo, { name = name or cppfile, deps = table.keys(module.requires or {}), diff --git a/xmake/rules/c++/modules/modules_support/gcc.lua b/xmake/rules/c++/modules/modules_support/gcc.lua index acc06039f..7659c9f8d 100644 --- a/xmake/rules/c++/modules/modules_support/gcc.lua +++ b/xmake/rules/c++/modules/modules_support/gcc.lua @@ -424,6 +424,24 @@ function build_modules_for_batchjobs(target, batchjobs, objectfiles, modules, op end local moduleinfo = table.copy(provide) or {} local dependfile = (provide and provide.bmi) and target:dependfile(provide.bmi) or target:dependfile(objectfile) + + if provide then + local fileconfig = target:fileconfig(cppfile) + if fileconfig and fileconfig.install then + batchjobs:addjob(name .. "_metafile", function(index, total) + local cachedir = common.modules_cachedir(target) + local metafilepath = path.join(cachedir, path.filename(cppfile) .. ".meta-info") + depend.on_changed(function() + progress.show(opt.progress, "${color.build.object}generating.module.metadata %s", name) + local metadata = common.generate_meta_module_info(target, name, cppfile, module.requires) + json.savefile(metafilepath, metadata) + + end, {dependfile = target:dependfile(metafilepath), files = {cppfile}}) + + end, {rootjob = opt.rootjob}) + end + end + table.join2(moduleinfo, { name = name or cppfile, deps = table.keys(module.requires or {}), -- cgit v1.3.1 From 99a33ea8be3beab1c05f39dd8f2ce8cf59c284cd Mon Sep 17 00:00:00 2001 From: Arthur LAURENT Date: Thu, 29 Dec 2022 19:06:30 +0100 Subject: fix missings json imports --- xmake/rules/c++/modules/modules_support/clang.lua | 1 + xmake/rules/c++/modules/modules_support/gcc.lua | 1 + xmake/rules/c++/modules/modules_support/msvc.lua | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/xmake/rules/c++/modules/modules_support/clang.lua b/xmake/rules/c++/modules/modules_support/clang.lua index 467eb9120..41bfdbd37 100644 --- a/xmake/rules/c++/modules/modules_support/clang.lua +++ b/xmake/rules/c++/modules/modules_support/clang.lua @@ -20,6 +20,7 @@ -- imports import("core.base.option") +import("core.base.json") import("core.tool.compiler") import("core.project.project") import("core.project.depend") diff --git a/xmake/rules/c++/modules/modules_support/gcc.lua b/xmake/rules/c++/modules/modules_support/gcc.lua index 7659c9f8d..5d0f9182f 100644 --- a/xmake/rules/c++/modules/modules_support/gcc.lua +++ b/xmake/rules/c++/modules/modules_support/gcc.lua @@ -20,6 +20,7 @@ -- imports import("core.base.option") +import("core.base.json") import("core.tool.compiler") import("core.project.project") import("core.project.depend") diff --git a/xmake/rules/c++/modules/modules_support/msvc.lua b/xmake/rules/c++/modules/modules_support/msvc.lua index 8799103b0..d68940df1 100644 --- a/xmake/rules/c++/modules/modules_support/msvc.lua +++ b/xmake/rules/c++/modules/modules_support/msvc.lua @@ -20,13 +20,13 @@ -- imports import("core.base.option") +import("core.base.json") import("core.tool.compiler") import("core.project.project") import("core.project.depend") import("core.project.config") import("core.base.hashset") import("core.base.semver") -import("core.base.json") import("utils.progress") import("private.action.build.object", {alias = "objectbuilder"}) import("common") -- cgit v1.3.1 From 64b476a2b13975e484117bc76ea04773fb9e5974 Mon Sep 17 00:00:00 2001 From: Arthur LAURENT Date: Thu, 5 Jan 2023 14:01:18 +0100 Subject: use os.files instead of os.match --- xmake/rules/c++/modules/modules_support/common.lua | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/xmake/rules/c++/modules/modules_support/common.lua b/xmake/rules/c++/modules/modules_support/common.lua index 394d9b60e..25fcc89f3 100644 --- a/xmake/rules/c++/modules/modules_support/common.lua +++ b/xmake/rules/c++/modules/modules_support/common.lua @@ -110,15 +110,13 @@ 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.match(path.join(modules_dir, "**.meta-info"), false) - if meta_files then - 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), - metadata = metadata - } - end + 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), + metadata = metadata + } end end -- cgit v1.3.1 From 65ce8a683bd7b4e929c116dcba0913eb2d839ad0 Mon Sep 17 00:00:00 2001 From: Arthur LAURENT Date: Thu, 5 Jan 2023 16:17:46 +0100 Subject: add tests --- .../c++/modules/packages/my-repo/packages/b/bar/src/bar.cpp | 5 +++++ .../c++/modules/packages/my-repo/packages/b/bar/src/bar.mpp | 3 +++ .../c++/modules/packages/my-repo/packages/b/bar/src/xmake.lua | 6 ++++++ .../c++/modules/packages/my-repo/packages/b/bar/xmake.lua | 6 ++++++ .../c++/modules/packages/my-repo/packages/f/foo/src/foo.cpp | 9 +++++++++ .../c++/modules/packages/my-repo/packages/f/foo/src/foo.mpp | 5 +++++ .../c++/modules/packages/my-repo/packages/f/foo/src/xmake.lua | 6 ++++++ .../c++/modules/packages/my-repo/packages/f/foo/xmake.lua | 6 ++++++ tests/projects/c++/modules/packages/src/main.cpp | 7 +++++++ tests/projects/c++/modules/packages/test.lua | 1 + tests/projects/c++/modules/packages/xmake.lua | 11 +++++++++++ tests/projects/c++/modules/test_headerunits.lua | 6 +++--- 12 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 tests/projects/c++/modules/packages/my-repo/packages/b/bar/src/bar.cpp create mode 100644 tests/projects/c++/modules/packages/my-repo/packages/b/bar/src/bar.mpp create mode 100644 tests/projects/c++/modules/packages/my-repo/packages/b/bar/src/xmake.lua create mode 100644 tests/projects/c++/modules/packages/my-repo/packages/b/bar/xmake.lua create mode 100644 tests/projects/c++/modules/packages/my-repo/packages/f/foo/src/foo.cpp create mode 100644 tests/projects/c++/modules/packages/my-repo/packages/f/foo/src/foo.mpp create mode 100644 tests/projects/c++/modules/packages/my-repo/packages/f/foo/src/xmake.lua create mode 100644 tests/projects/c++/modules/packages/my-repo/packages/f/foo/xmake.lua create mode 100644 tests/projects/c++/modules/packages/src/main.cpp create mode 100644 tests/projects/c++/modules/packages/test.lua create mode 100644 tests/projects/c++/modules/packages/xmake.lua diff --git a/tests/projects/c++/modules/packages/my-repo/packages/b/bar/src/bar.cpp b/tests/projects/c++/modules/packages/my-repo/packages/b/bar/src/bar.cpp new file mode 100644 index 000000000..5bbb5e5c1 --- /dev/null +++ b/tests/projects/c++/modules/packages/my-repo/packages/b/bar/src/bar.cpp @@ -0,0 +1,5 @@ +module bar; + +const char *bar() { + return "Hello world"; +} \ No newline at end of file diff --git a/tests/projects/c++/modules/packages/my-repo/packages/b/bar/src/bar.mpp b/tests/projects/c++/modules/packages/my-repo/packages/b/bar/src/bar.mpp new file mode 100644 index 000000000..a13487fea --- /dev/null +++ b/tests/projects/c++/modules/packages/my-repo/packages/b/bar/src/bar.mpp @@ -0,0 +1,3 @@ +export module bar; + +export const char *bar(); \ No newline at end of file diff --git a/tests/projects/c++/modules/packages/my-repo/packages/b/bar/src/xmake.lua b/tests/projects/c++/modules/packages/my-repo/packages/b/bar/src/xmake.lua new file mode 100644 index 000000000..43ba4921b --- /dev/null +++ b/tests/projects/c++/modules/packages/my-repo/packages/b/bar/src/xmake.lua @@ -0,0 +1,6 @@ +add_rules("mode.release", "mode.debug") +set_languages("c++20") + +target("bar") + set_kind("static") + add_files("*.cpp", "*.mpp") diff --git a/tests/projects/c++/modules/packages/my-repo/packages/b/bar/xmake.lua b/tests/projects/c++/modules/packages/my-repo/packages/b/bar/xmake.lua new file mode 100644 index 000000000..301166807 --- /dev/null +++ b/tests/projects/c++/modules/packages/my-repo/packages/b/bar/xmake.lua @@ -0,0 +1,6 @@ +package("bar") + set_sourcedir(path.join(os.scriptdir(), "src")) + + on_install(function(package) + import("package.tools.xmake").install(package, {}) + end) \ No newline at end of file diff --git a/tests/projects/c++/modules/packages/my-repo/packages/f/foo/src/foo.cpp b/tests/projects/c++/modules/packages/my-repo/packages/f/foo/src/foo.cpp new file mode 100644 index 000000000..f46c7119a --- /dev/null +++ b/tests/projects/c++/modules/packages/my-repo/packages/f/foo/src/foo.cpp @@ -0,0 +1,9 @@ +module foo; + +import ; + +namespace foo { + void say(const char *msg) { + std::printf("%s", msg); + } +} \ No newline at end of file diff --git a/tests/projects/c++/modules/packages/my-repo/packages/f/foo/src/foo.mpp b/tests/projects/c++/modules/packages/my-repo/packages/f/foo/src/foo.mpp new file mode 100644 index 000000000..4cab3d977 --- /dev/null +++ b/tests/projects/c++/modules/packages/my-repo/packages/f/foo/src/foo.mpp @@ -0,0 +1,5 @@ +export module foo; + +export namespace foo { + void say(const char *); +} \ No newline at end of file diff --git a/tests/projects/c++/modules/packages/my-repo/packages/f/foo/src/xmake.lua b/tests/projects/c++/modules/packages/my-repo/packages/f/foo/src/xmake.lua new file mode 100644 index 000000000..6c7cb3444 --- /dev/null +++ b/tests/projects/c++/modules/packages/my-repo/packages/f/foo/src/xmake.lua @@ -0,0 +1,6 @@ +add_rules("mode.release", "mode.debug") +set_languages("c++20") + +target("foo") + set_kind("static") + add_files("*.cpp", "*.mpp") diff --git a/tests/projects/c++/modules/packages/my-repo/packages/f/foo/xmake.lua b/tests/projects/c++/modules/packages/my-repo/packages/f/foo/xmake.lua new file mode 100644 index 000000000..19c87d866 --- /dev/null +++ b/tests/projects/c++/modules/packages/my-repo/packages/f/foo/xmake.lua @@ -0,0 +1,6 @@ +package("foo") + set_sourcedir(path.join(os.scriptdir(), "src")) + + on_install(function(package) + import("package.tools.xmake").install(package, {}) + end) \ No newline at end of file diff --git a/tests/projects/c++/modules/packages/src/main.cpp b/tests/projects/c++/modules/packages/src/main.cpp new file mode 100644 index 000000000..10c501c4a --- /dev/null +++ b/tests/projects/c++/modules/packages/src/main.cpp @@ -0,0 +1,7 @@ +import foo; +import bar; + +int main() { + foo::say(bar()); + return 0; +} diff --git a/tests/projects/c++/modules/packages/test.lua b/tests/projects/c++/modules/packages/test.lua new file mode 100644 index 000000000..c18e5a1d0 --- /dev/null +++ b/tests/projects/c++/modules/packages/test.lua @@ -0,0 +1 @@ +inherit(".test_headerunits") diff --git a/tests/projects/c++/modules/packages/xmake.lua b/tests/projects/c++/modules/packages/xmake.lua new file mode 100644 index 000000000..fe3cc7dc5 --- /dev/null +++ b/tests/projects/c++/modules/packages/xmake.lua @@ -0,0 +1,11 @@ +add_rules("mode.release", "mode.debug") +set_languages("c++20") + +add_repositories("my-repo my-repo") +add_requires("foo", "bar") + +target("packages") + set_kind("binary") + add_files("src/*.cpp") + add_packages("foo", "bar") + set_policy("build.c++.modules", true) diff --git a/tests/projects/c++/modules/test_headerunits.lua b/tests/projects/c++/modules/test_headerunits.lua index 905812c14..78c999497 100644 --- a/tests/projects/c++/modules/test_headerunits.lua +++ b/tests/projects/c++/modules/test_headerunits.lua @@ -15,19 +15,19 @@ function main(t) if is_subhost("windows") then local vs = find_vstudio() if vs and vs["2022"] then - os.exec("xmake f -c") + os.exec("xmake f -c --yes") _build() end elseif is_host("linux") then local gcc = find_tool("gcc", {version = true}) if gcc and gcc.version and semver.compare(gcc.version, "11.0") >= 0 then - os.exec("xmake f -c") + os.exec("xmake f -c --yes") _build() end local clang = find_tool("clang", {version = true}) if clang and clang.version and semver.compare(clang.version, "16.0") >= 0 then os.exec("xmake clean -a") - os.exec("xmake f --toolchain=clang -c") + os.exec("xmake f --toolchain=clang -c --yes") _build() end end -- cgit v1.3.1 From 325d67461b1376a0073674e7dc694be5df804083 Mon Sep 17 00:00:00 2001 From: Arthur LAURENT Date: Fri, 6 Jan 2023 10:35:23 +0100 Subject: fix test --- .../projects/c++/modules/packages/my-repo/packages/b/bar/src/xmake.lua | 3 ++- .../projects/c++/modules/packages/my-repo/packages/f/foo/src/xmake.lua | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/projects/c++/modules/packages/my-repo/packages/b/bar/src/xmake.lua b/tests/projects/c++/modules/packages/my-repo/packages/b/bar/src/xmake.lua index 43ba4921b..345dd2db4 100644 --- a/tests/projects/c++/modules/packages/my-repo/packages/b/bar/src/xmake.lua +++ b/tests/projects/c++/modules/packages/my-repo/packages/b/bar/src/xmake.lua @@ -3,4 +3,5 @@ set_languages("c++20") target("bar") set_kind("static") - add_files("*.cpp", "*.mpp") + add_files("*.cpp") + add_files("*.mpp", { install = true }) diff --git a/tests/projects/c++/modules/packages/my-repo/packages/f/foo/src/xmake.lua b/tests/projects/c++/modules/packages/my-repo/packages/f/foo/src/xmake.lua index 6c7cb3444..d79b2ac54 100644 --- a/tests/projects/c++/modules/packages/my-repo/packages/f/foo/src/xmake.lua +++ b/tests/projects/c++/modules/packages/my-repo/packages/f/foo/src/xmake.lua @@ -3,4 +3,5 @@ set_languages("c++20") target("foo") set_kind("static") - add_files("*.cpp", "*.mpp") + add_files("*.cpp") + add_files("*.mpp", { install = true }) -- cgit v1.3.1 From 02307bd1ca30bc4bfcd6617966a68327157af007 Mon Sep 17 00:00:00 2001 From: Arthur LAURENT Date: Fri, 6 Jan 2023 13:11:51 +0100 Subject: improve metainfo handling --- xmake/rules/c++/modules/modules_support/common.lua | 41 ++++++++++++++++++---- 1 file 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 -- cgit v1.3.1 From 61384ee686c1a008aeae0b47cf59ad96d42f0948 Mon Sep 17 00:00:00 2001 From: ruki Date: Fri, 6 Jan 2023 22:39:08 +0800 Subject: Update msvc.lua --- xmake/rules/c++/modules/modules_support/msvc.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xmake/rules/c++/modules/modules_support/msvc.lua b/xmake/rules/c++/modules/modules_support/msvc.lua index d68940df1..a7b11ded3 100644 --- a/xmake/rules/c++/modules/modules_support/msvc.lua +++ b/xmake/rules/c++/modules/modules_support/msvc.lua @@ -659,7 +659,7 @@ function get_ifcoutputflag(target) local ifcoutputflag = _g.ifcoutputflag if ifcoutputflag == nil then local compinst = target:compiler("cxx") - if compinst:has_flags("-ifcOutput", "cxxflags", {flagskey = "cl_ifc_output"}) then + if compinst:has_flags({"-ifcOutput", os.tmpfile()}, "cxxflags", {flagskey = "cl_ifc_output"}) then ifcoutputflag = "-ifcOutput" end assert(ifcoutputflag, "compiler(msvc): does not support c++ module!") @@ -672,7 +672,7 @@ function get_ifcsearchdirflag(target) local ifcsearchdirflag = _g.ifcsearchdirflag if ifcsearchdirflag == nil then local compinst = target:compiler("cxx") - if compinst:has_flags("-ifcSearchDir", "cxxflags", {flagskey = "cl_ifc_search_dir"}) then + if compinst:has_flags({"-ifcSearchDir", os.tmpdir()}, "cxxflags", {flagskey = "cl_ifc_search_dir"}) then ifcsearchdirflag = "-ifcSearchDir" end assert(ifcsearchdirflag, "compiler(msvc): does not support c++ module!") -- cgit v1.3.1 From 5ca7b8f9b09f67e74f3b487af2ad4968abb448d7 Mon Sep 17 00:00:00 2001 From: ruki Date: Fri, 6 Jan 2023 23:46:40 +0800 Subject: Update msvc.lua --- xmake/rules/c++/modules/modules_support/msvc.lua | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/xmake/rules/c++/modules/modules_support/msvc.lua b/xmake/rules/c++/modules/modules_support/msvc.lua index a7b11ded3..75ce59b84 100644 --- a/xmake/rules/c++/modules/modules_support/msvc.lua +++ b/xmake/rules/c++/modules/modules_support/msvc.lua @@ -137,6 +137,14 @@ function load(target) local modulesflag = get_modulesflag(target) target:add("cxxflags", modulesflag) + -- we detect flags in advance to avoid having to detect them in parallel in parallel tasks. + get_ifcoutputflag(target) + get_ifcsearchdirflag(target) + get_interfaceflag(target) + get_referenceflag(target) + get_headernameflag(target) + get_headerunitflag(target) + -- enable std modules if c++23 by defaults if target:data("c++.msvc.enable_std_import") == nil then local languages = target:get("languages") @@ -659,7 +667,7 @@ function get_ifcoutputflag(target) local ifcoutputflag = _g.ifcoutputflag if ifcoutputflag == nil then local compinst = target:compiler("cxx") - if compinst:has_flags({"-ifcOutput", os.tmpfile()}, "cxxflags", {flagskey = "cl_ifc_output"}) then + if compinst:has_flags("-ifcOutput", "cxxflags", {flagskey = "cl_ifc_output"}) then ifcoutputflag = "-ifcOutput" end assert(ifcoutputflag, "compiler(msvc): does not support c++ module!") @@ -672,7 +680,7 @@ function get_ifcsearchdirflag(target) local ifcsearchdirflag = _g.ifcsearchdirflag if ifcsearchdirflag == nil then local compinst = target:compiler("cxx") - if compinst:has_flags({"-ifcSearchDir", os.tmpdir()}, "cxxflags", {flagskey = "cl_ifc_search_dir"}) then + if compinst:has_flags("-ifcSearchDir", "cxxflags", {flagskey = "cl_ifc_search_dir"}) then ifcsearchdirflag = "-ifcSearchDir" end assert(ifcsearchdirflag, "compiler(msvc): does not support c++ module!") -- cgit v1.3.1 From 79685060276a531eb230d05bbeb7b56966620c09 Mon Sep 17 00:00:00 2001 From: ruki Date: Sat, 7 Jan 2023 09:49:44 +0800 Subject: fix target for zig --- xmake/toolchains/zig/xmake.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xmake/toolchains/zig/xmake.lua b/xmake/toolchains/zig/xmake.lua index 2f97b0340..d6d3e1de2 100644 --- a/xmake/toolchains/zig/xmake.lua +++ b/xmake/toolchains/zig/xmake.lua @@ -96,8 +96,8 @@ toolchain("zig") -- xmake f -p cross --toolchain=zig --cross=mips64el-linux-gnuabi64 target = toolchain:cross() elseif toolchain:is_plat("macosx") then - -- zig 0.10 will raise `unable to find or provide libc for target 'x86_64-macos.11.7.1...13-gnu'` - --target = arch .. "-macos-gnu" + --@see https://github.com/ziglang/zig/issues/14226 + target = arch .. "-macos-none" elseif toolchain:is_plat("linux") then if arch == "arm" then target = "arm-linux-gnueabi" -- cgit v1.3.1 From 3ea7041a0a776ab90791365432b65c37616350df Mon Sep 17 00:00:00 2001 From: ruki Date: Sat, 7 Jan 2023 10:30:29 +0800 Subject: Update msvc.lua --- xmake/rules/c++/modules/modules_support/msvc.lua | 35 +++++++++--------------- 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/xmake/rules/c++/modules/modules_support/msvc.lua b/xmake/rules/c++/modules/modules_support/msvc.lua index 75ce59b84..d0895490a 100644 --- a/xmake/rules/c++/modules/modules_support/msvc.lua +++ b/xmake/rules/c++/modules/modules_support/msvc.lua @@ -137,14 +137,6 @@ function load(target) local modulesflag = get_modulesflag(target) target:add("cxxflags", modulesflag) - -- we detect flags in advance to avoid having to detect them in parallel in parallel tasks. - get_ifcoutputflag(target) - get_ifcsearchdirflag(target) - get_interfaceflag(target) - get_referenceflag(target) - get_headernameflag(target) - get_headerunitflag(target) - -- enable std modules if c++23 by defaults if target:data("c++.msvc.enable_std_import") == nil then local languages = target:get("languages") @@ -667,10 +659,10 @@ function get_ifcoutputflag(target) local ifcoutputflag = _g.ifcoutputflag if ifcoutputflag == nil then local compinst = target:compiler("cxx") - if compinst:has_flags("-ifcOutput", "cxxflags", {flagskey = "cl_ifc_output"}) then + if compinst:has_flags({"-ifcOutput", os.tmpfile()}, "cxxflags", {flagskey = "cl_ifc_output"}) then ifcoutputflag = "-ifcOutput" end - assert(ifcoutputflag, "compiler(msvc): does not support c++ module!") + assert(ifcoutputflag, "compiler(msvc): does not support c++ module flag(/ifcOutput)!") _g.ifcoutputflag = ifcoutputflag or false end return ifcoutputflag or nil @@ -680,10 +672,10 @@ function get_ifcsearchdirflag(target) local ifcsearchdirflag = _g.ifcsearchdirflag if ifcsearchdirflag == nil then local compinst = target:compiler("cxx") - if compinst:has_flags("-ifcSearchDir", "cxxflags", {flagskey = "cl_ifc_search_dir"}) then + if compinst:has_flags({"-ifcSearchDir", os.tmpdir()}, "cxxflags", {flagskey = "cl_ifc_search_dir"}) then ifcsearchdirflag = "-ifcSearchDir" end - assert(ifcsearchdirflag, "compiler(msvc): does not support c++ module!") + assert(ifcsearchdirflag, "compiler(msvc): does not support c++ module flag(/ifcSearchDir)!") _g.ifcsearchdirflag = ifcsearchdirflag or false end return ifcsearchdirflag or nil @@ -696,7 +688,7 @@ function get_interfaceflag(target) if compinst:has_flags("-interface", "cxxflags", {flagskey = "cl_interface"}) then interfaceflag = "-interface" end - assert(interfaceflag, "compiler(msvc): does not support c++ module!") + assert(interfaceflag, "compiler(msvc): does not support c++ module flag(/interface)!") _g.interfaceflag = interfaceflag or false end return interfaceflag @@ -706,10 +698,10 @@ function get_referenceflag(target) local referenceflag = _g.referenceflag if referenceflag == nil then local compinst = target:compiler("cxx") - if compinst:has_flags("-reference", "cxxflags", {flagskey = "cl_reference"}) then + if compinst:has_flags({"-reference", "Foo=" .. os.tmpfile()}, "cxxflags", {flagskey = "cl_reference"}) then referenceflag = "-reference" end - assert(referenceflag, "compiler(msvc): does not support c++ module!") + assert(referenceflag, "compiler(msvc): does not support c++ module flag(/reference)!") _g.referenceflag = referenceflag or false end return referenceflag or nil @@ -719,8 +711,8 @@ function get_headernameflag(target) local headernameflag = _g.headernameflag if headernameflag == nil then local compinst = target:compiler("cxx") - if compinst:has_flags("-headerName:quote", "cxxflags", {flagskey = "cl_header_name_quote"}) and - compinst:has_flags("-headerName:angle", "cxxflags", {flagskey = "cl_header_name_angle"}) then + if compinst:has_flags({"-std:c++latest", "-exportHeader", "-headerName:quote"}, "cxxflags", {flagskey = "cl_header_name_quote"}) and + compinst:has_flags({"-std:c++latest", "-exportHeader", "-headerName:angle"}, "cxxflags", {flagskey = "cl_header_name_angle"}) then headernameflag = "-headerName" end _g.headernameflag = headernameflag or false @@ -732,8 +724,9 @@ function get_headerunitflag(target) local headerunitflag = _g.headerunitflag if headerunitflag == nil then local compinst = target:compiler("cxx") - if compinst:has_flags("-headerUnit:quote", "cxxflags", {flagskey = "cl_header_unit_quote"}) and - compinst:has_flags("-headerUnit:angle", "cxxflags", {flagskey = "cl_header_unit_angle"}) then + local ifcfile = os.tmpfile() + if compinst:has_flags({"-std:c++latest", "-headerUnit:quote", "foo.h=" .. ifcfile}, "cxxflags", {flagskey = "cl_header_unit_quote"}) and + compinst:has_flags({"-std:c++latest", "-headerUnit:angle", "foo.h=" .. ifcfile}, "cxxflags", {flagskey = "cl_header_unit_angle"}) then headerunitflag = "-headerUnit" end _g.headerunitflag = headerunitflag or false @@ -742,11 +735,9 @@ function get_headerunitflag(target) end function get_exportheaderflag(target) - local modulesflag = get_modulesflag(target) local exportheaderflag = _g.exportheaderflag if exportheaderflag == nil then - local compinst = target:compiler("cxx") - if compinst:has_flags(modulesflag .. " -exportHeader", "cxxflags", {flagskey = "cl_export_header"}) then + if get_headernameflag(target) then exportheaderflag = "-exportHeader" end _g.exportheaderflag = exportheaderflag or false -- cgit v1.3.1 From 2c2c67e67ba3076ff7d418af4b27e7381aa7269a Mon Sep 17 00:00:00 2001 From: ruki Date: Sat, 7 Jan 2023 20:34:27 +0800 Subject: Update common.lua --- xmake/rules/c++/modules/modules_support/common.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/xmake/rules/c++/modules/modules_support/common.lua b/xmake/rules/c++/modules/modules_support/common.lua index e1ae05393..5d3907dfb 100644 --- a/xmake/rules/c++/modules/modules_support/common.lua +++ b/xmake/rules/c++/modules/modules_support/common.lua @@ -109,8 +109,8 @@ function parse_meta_info(target, metafile) 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 + for _, ext in ipairs({".mpp", ".mxx", ".cppm", ".ixx"}) do + if os.isfile(path.join(path.directory(metafile), file .. ext)) then file = file .. ext break end @@ -716,4 +716,4 @@ function install_module_target(target) end end end -end \ No newline at end of file +end -- cgit v1.3.1 From d07547fb49474e9822c7ac14031b90c5b6d78bd2 Mon Sep 17 00:00:00 2001 From: ruki Date: Sat, 7 Jan 2023 20:37:01 +0800 Subject: Update common.lua --- xmake/rules/c++/modules/modules_support/common.lua | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/xmake/rules/c++/modules/modules_support/common.lua b/xmake/rules/c++/modules/modules_support/common.lua index 5d3907dfb..5f1f72599 100644 --- a/xmake/rules/c++/modules/modules_support/common.lua +++ b/xmake/rules/c++/modules/modules_support/common.lua @@ -108,15 +108,16 @@ function parse_meta_info(target, metafile) return metadata._VENDOR_extension.xmake.file, metadata._VENDOR_extension.xmake.name, metadata end - local file = path.basename(metafile) + local filename = path.basename(metafile) + local metadir = path.directory(metafile) for _, ext in ipairs({".mpp", ".mxx", ".cppm", ".ixx"}) do - if os.isfile(path.join(path.directory(metafile), file .. ext)) then - file = file .. ext + if os.isfile(path.join(metadir, filename .. ext)) then + filename = filename .. ext break end end - local sourcecode = io.readfile(path.join(path.directory(metafile), file)) + local sourcecode = io.readfile(path.join(path.directory(metafile), filename)) sourcecode = sourcecode:gsub("//.-\n", "\n") sourcecode = sourcecode:gsub("/%*.-%*/", "") @@ -128,7 +129,7 @@ function parse_meta_info(target, metafile) end end - return file, name, metadata + return filename, name, metadata end -- extract packages modules dependencies -- cgit v1.3.1 From 7781a45723b7c359d5cfb2df309daf66f00342ab Mon Sep 17 00:00:00 2001 From: ruki Date: Sat, 7 Jan 2023 21:35:55 +0800 Subject: support build module with space for clang --- xmake/rules/c++/modules/modules_support/clang.lua | 34 +++++++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/xmake/rules/c++/modules/modules_support/clang.lua b/xmake/rules/c++/modules/modules_support/clang.lua index 02d08e6b0..3dbb7b01d 100644 --- a/xmake/rules/c++/modules/modules_support/clang.lua +++ b/xmake/rules/c++/modules/modules_support/clang.lua @@ -497,7 +497,16 @@ function build_modules_for_batchjobs(target, batchjobs, objectfiles, modules, op _add_module_to_mapper(target, name, bmifile, requiresflags) end elseif requiresflags then - target:fileconfig_add(cppfile, {force = {cxxflags = requiresflags}}) + local cxxflags = {} + for _, flag in ipairs(requiresflags) do + -- we need wrap flag to support flag with space + if type(flag) == "string" and flag:find(" ", 1, true) then + table.insert(cxxflags, {flag}) + else + table.insert(cxxflags, flag) + end + end + target:fileconfig_add(cppfile, {force = {cxxflags = cxxflags}}) end end)}) modulesjobs[name or cppfile] = moduleinfo @@ -553,7 +562,16 @@ function build_modules_for_batchcmds(target, batchcmds, objectfiles, modules, op not provide and {"-x", "c++"} or {}, {"-c", file, "-o", path(objectfile)})) target:add("objectfiles", objectfile) elseif requiresflags then - target:fileconfig_add(cppfile, {force = {cxxflags = requiresflags}}) + local cxxflags = {} + for _, flag in ipairs(requiresflags) do + -- we need wrap flag to support flag with space + if type(flag) == "string" and flag:find(" ", 1, true) then + table.insert(cxxflags, {flag}) + else + table.insert(cxxflags, flag) + end + end + target:fileconfig_add(cppfile, {force = {cxxflags = cxxflags}}) end batchcmds:add_depfiles(cppfile) @@ -701,8 +719,10 @@ function get_requiresflags(target, requires) local modulemap_ = _get_modulemap_from_mapper(dep, name) if modulemap_ then already_mapped_modules[name] = true - table.join2(flags, modulemap_.flag) - table.join2(flags, modulemap_.deps or {}) + table.insert(flags, modulemap_.flag) + if modulemap_.deps then + table.shallow_join2(flags, modulemap_.deps) + end goto continue end end @@ -711,8 +731,10 @@ function get_requiresflags(target, requires) local modulemap = _get_modulemap_from_mapper(target, name) if modulemap then already_mapped_modules[name] = true - table.join2(flags, modulemap.flag) - table.join2(flags, modulemap.deps or {}) + table.insert(flags, modulemap.flag) + if modulemap.deps then + table.shallow_join2(flags, modulemap.deps) + end goto continue end -- cgit v1.3.1 From 5b527d486b2a08c0cc4c721fbf673f8bd1c8551f Mon Sep 17 00:00:00 2001 From: ruki Date: Sat, 7 Jan 2023 22:16:39 +0800 Subject: update version --- CHANGELOG.md | 4 ++++ core/xmake.lua | 2 +- core/xmake.sh | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 849816da3..a1980c366 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## master (unreleased) +## v2.7.5 + ### New features * [#3201](https://github.com/xmake-io/xmake/pull/3201): Add completer and xrepo complete @@ -1485,6 +1487,8 @@ ## master (开发中) +## v2.7.5 + ### 新特性 * [#3201](https://github.com/xmake-io/xmake/pull/3201): 为 xrepo 添加命令自动补全 diff --git a/core/xmake.lua b/core/xmake.lua index a9f8a1066..d1eeb20b4 100644 --- a/core/xmake.lua +++ b/core/xmake.lua @@ -2,7 +2,7 @@ set_project("xmake") -- version -set_version("2.7.4", {build = "%Y%m%d%H%M"}) +set_version("2.7.5", {build = "%Y%m%d%H%M"}) -- set xmake min version set_xmakever("2.2.3") diff --git a/core/xmake.sh b/core/xmake.sh index 39a279b25..5de724427 100755 --- a/core/xmake.sh +++ b/core/xmake.sh @@ -1,7 +1,7 @@ #!/bin/sh set_project "xmake" -set_version "2.7.4" "%Y%m%d%H%M" +set_version "2.7.5" "%Y%m%d%H%M" # set warning all set_warnings "all" -- cgit v1.3.1 From d523fc8245c74527a6012187a110f6b86e12c9d5 Mon Sep 17 00:00:00 2001 From: ruki Date: Sat, 7 Jan 2023 22:17:42 +0800 Subject: update spec --- scripts/rpmbuild/SPECS/xmake.spec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/rpmbuild/SPECS/xmake.spec b/scripts/rpmbuild/SPECS/xmake.spec index 528f84d67..c530598f8 100644 --- a/scripts/rpmbuild/SPECS/xmake.spec +++ b/scripts/rpmbuild/SPECS/xmake.spec @@ -1,5 +1,5 @@ -%define xmake_revision 69f7fc412e8a270d9019446fe20e150e0ed806cb -%define tbox_revision 1c6fcb6b7732b6c632f501dbd1ac4ea622220e7d +%define xmake_revision 5b527d486b2a08c0cc4c721fbf673f8bd1c8551f +%define tbox_revision 513f0f36384c540002787c7362ede4efaf104d8a %define sv_revision 035262773da0500367cb88e6f30197908159a348 %define lua_cjson_revision ddcecf3b24b71421e7b4a2962f1fbcc0297e0c1e %define luajit_revision e9af1abec542e6f9851ff2368e7f196b6382a44c -- cgit v1.3.1 From b5e29bdae4f381e343632cf5ea51224aea8f720a Mon Sep 17 00:00:00 2001 From: Arthur LAURENT Date: Sat, 7 Jan 2023 15:49:45 +0100 Subject: implement suggestions --- xmake/rules/c++/modules/modules_support/common.lua | 11 +++-------- xmake/rules/c++/modules/xmake.lua | 2 +- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/xmake/rules/c++/modules/modules_support/common.lua b/xmake/rules/c++/modules/modules_support/common.lua index 5f1f72599..ace8f2c56 100644 --- a/xmake/rules/c++/modules/modules_support/common.lua +++ b/xmake/rules/c++/modules/modules_support/common.lua @@ -160,24 +160,19 @@ function cull_unused_modules(target, modules, package_modules_data) for _, module in pairs(modules) do if module.requires then for required, _ in pairs(module.requires) do - table.append(needed_modules, required) + table.insert(needed_modules, required) end end end -- append all package dependencies - local module_names = {} - for name, _ in pairs(package_modules_data) do - table.append(module_names, name) - end - + local module_names = table.keys(package_modules_data) or {} local culled - for i, name in ipairs(module_names) do + for _, name in ipairs(module_names) do culled = culled or {} if table.find(needed_modules, name) and package_modules_data[name] and not culled[name] then culled[name] = package_modules_data[name] - -- table.remove(module_names, i) if culled[name].metadata.imports then table.join2(needed_modules, culled[name].metadata.imports) table.join2(module_names, culled[name].metadata.imports) diff --git a/xmake/rules/c++/modules/xmake.lua b/xmake/rules/c++/modules/xmake.lua index 1d2852644..b62ec0f36 100644 --- a/xmake/rules/c++/modules/xmake.lua +++ b/xmake/rules/c++/modules/xmake.lua @@ -75,7 +75,7 @@ rule("c++.build.modules.builder") if package_modules_data then -- append to sourcebatch for name, package_module_data in pairs(package_modules_data) do - table.append(sourcebatch.sourcefiles, package_module_data.file) + table.insert(sourcebatch.sourcefiles, package_module_data.file) end -- we need to repatch and regenerate dependencies at this point -- cgit v1.3.1 From df00bf97e8856194898af2e020b7d94dd6ab5e1c Mon Sep 17 00:00:00 2001 From: ruki Date: Sat, 7 Jan 2023 23:25:32 +0800 Subject: update ps1 --- scripts/get.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/get.ps1 b/scripts/get.ps1 index 4cfa51416..3efb6b6a5 100755 --- a/scripts/get.ps1 +++ b/scripts/get.ps1 @@ -11,7 +11,7 @@ param ( ) & { - $LastRelease = "v2.7.3" + $LastRelease = "v2.7.5" $ErrorActionPreference = 'Stop' function writeErrorTip($msg) { -- cgit v1.3.1 From 06829c1ac295a74a62e4c2b9a1732017d1d7a80d Mon Sep 17 00:00:00 2001 From: ruki Date: Sat, 7 Jan 2023 23:35:45 +0800 Subject: update pkgbuild --- scripts/archlinux/PKGBUILD | 8 ++++---- scripts/msys/PKGBUILD | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/scripts/archlinux/PKGBUILD b/scripts/archlinux/PKGBUILD index 5ff7eed6a..d7a555c3f 100755 --- a/scripts/archlinux/PKGBUILD +++ b/scripts/archlinux/PKGBUILD @@ -2,7 +2,7 @@ # PKGBuild Create By: lumpyzhu pkgname=xmake -pkgver=2.7.3 +pkgver=2.7.5 pkgrel=1 pkgdesc="A cross-platform build utility based on Lua" depends=('bash') @@ -14,12 +14,12 @@ source=("https://github.com/xmake-io/xmake/releases/download/v${pkgver}/xmake-v$ sha256sums=('3e71437ad2a59d1fbbc9fba75ab4ca8d428c49beefcce86c11f6c4710dd4b6f2') build() { - cd "$srcdir" + cd "${_realname}-${pkgver}" ./configure make } package() { - cd "$srcdir" - make install PREFIX="${pkgdir}/usr" + cd "${_realname}-${pkgver}" + make install DESTDIR="${pkgdir}" PREFIX="usr" } diff --git a/scripts/msys/PKGBUILD b/scripts/msys/PKGBUILD index 847b2f268..0dcb90b81 100644 --- a/scripts/msys/PKGBUILD +++ b/scripts/msys/PKGBUILD @@ -16,12 +16,12 @@ source=("${_realname}-${pkgver}.tar.gz"::"https://github.com/xmake-io/${_realnam sha256sums=('c927efad5412c3bdb8bad1be5b1b2ea40a998dff2a252edb443782865b7472b9') build() { - cd "$srcdir" + cd "${_realname}-${pkgver}" ./configure make } package() { - cd "$srcdir" + cd "${_realname}-${pkgver}" make install PREFIX="${pkgdir}/usr" } -- cgit v1.3.1 From 6cfdc39bc02cc7fcccb82dcb5abd4d30c624db00 Mon Sep 17 00:00:00 2001 From: ruki Date: Sun, 8 Jan 2023 10:51:33 +0800 Subject: update changelog --- CHANGELOG.md | 8 ++++++++ xmake/rules/c++/modules/modules_support/common.lua | 3 +-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a1980c366..e9908cac2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## master (unreleased) +### New features + +* [#3228](https://github.com/xmake-io/xmake/pull/3228): Add support of importing modules from packages + ## v2.7.5 ### New features @@ -1487,6 +1491,10 @@ ## master (开发中) +### 新特性 + +* [#3228](https://github.com/xmake-io/xmake/pull/3228): C++ modules 的安装发布,以及从包中导入 C++ modules 支持 + ## v2.7.5 ### 新特性 diff --git a/xmake/rules/c++/modules/modules_support/common.lua b/xmake/rules/c++/modules/modules_support/common.lua index ace8f2c56..32c1b7be8 100644 --- a/xmake/rules/c++/modules/modules_support/common.lua +++ b/xmake/rules/c++/modules/modules_support/common.lua @@ -166,8 +166,8 @@ function cull_unused_modules(target, modules, package_modules_data) end -- append all package dependencies - local module_names = table.keys(package_modules_data) or {} local culled + local module_names = table.keys(package_modules_data) for _, name in ipairs(module_names) do culled = culled or {} if table.find(needed_modules, name) and package_modules_data[name] and not culled[name] then @@ -179,7 +179,6 @@ function cull_unused_modules(target, modules, package_modules_data) end end end - return culled end -- cgit v1.3.1 From 7894e62157c0a1e431f347fb5a45947855bee8cd Mon Sep 17 00:00:00 2001 From: ruki Date: Sun, 8 Jan 2023 19:27:43 +0800 Subject: fix find_rc --- xmake/core/tool/toolchain.lua | 6 +++++- xmake/modules/detect/tools/find_rc.lua | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/xmake/core/tool/toolchain.lua b/xmake/core/tool/toolchain.lua index 66321dfa4..87a28cb69 100644 --- a/xmake/core/tool/toolchain.lua +++ b/xmake/core/tool/toolchain.lua @@ -449,7 +449,11 @@ function _instance:_checktool(toolkind, toolpath) end -- find tool program - local tool = find_tool(toolpath, {toolchain = self, cachekey = cachekey, program = program or toolpath, paths = self:bindir(), envs = self:get("runenvs")}) + local tool = find_tool(toolpath, {toolchain = self, + cachekey = cachekey, + program = program or toolpath, + paths = self:bindir(), + envs = self:get("runenvs")}) if tool then program = tool.program toolname = toolname or tool.name diff --git a/xmake/modules/detect/tools/find_rc.lua b/xmake/modules/detect/tools/find_rc.lua index 6e04ac950..08db8fb87 100644 --- a/xmake/modules/detect/tools/find_rc.lua +++ b/xmake/modules/detect/tools/find_rc.lua @@ -59,6 +59,8 @@ function main(opt) -- local envs = opt.envs if envs and envs.WindowsSdkDir and envs.WindowsSDKVersion then + local toolchain = opt.toolchain + local arch = toolchain and toolchain:arch() or config.arch() local bindir = path.join(envs.WindowsSdkDir, "bin", envs.WindowsSDKVersion, arch) if os.isdir(bindir) then opt.paths = opt.paths or {} -- cgit v1.3.1 From fa875a5699cb5292a60fcd308c5e50c294da9ad0 Mon Sep 17 00:00:00 2001 From: ruki Date: Sun, 8 Jan 2023 19:30:58 +0800 Subject: update changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e9908cac2..5f0fc2148 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ * [#3228](https://github.com/xmake-io/xmake/pull/3228): Add support of importing modules from packages +### Bugs fixed + +* [#3229](https://github.com/xmake-io/xmake/issues/3229): Fix find rc.exe for vs2015 + ## v2.7.5 ### New features @@ -1495,6 +1499,10 @@ * [#3228](https://github.com/xmake-io/xmake/pull/3228): C++ modules 的安装发布,以及从包中导入 C++ modules 支持 +### Bugs 修复 + +* [#3229](https://github.com/xmake-io/xmake/issues/3229): 修复 vs2015 下找不到 rc.exe 问题 + ## v2.7.5 ### 新特性 -- cgit v1.3.1 From 476f1c3592aa55cd10a6986c045f1be834cf2a83 Mon Sep 17 00:00:00 2001 From: ruki Date: Sun, 8 Jan 2023 21:46:41 +0800 Subject: improve configure --- configure | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/configure b/configure index 2b692d54e..1fa23c80e 100755 --- a/configure +++ b/configure @@ -3290,12 +3290,21 @@ _check_cxxsnippets() { # check option _check_option() { local name="${1}" - _get_option_item "${name}" "before_check"; local before_check="${_ret}" - if test_nz "${before_check}"; then - eval ${before_check} - fi - if _check_csnippets "${name}" && _check_cxxsnippets "${name}"; then - return 0 + _get_option_value "${name}"; local value="${_ret}" + if test_nz "${value}"; then + if _is_enabled "${value}"; then + return 0 + else + return 1 + fi + else + _get_option_item "${name}" "before_check"; local before_check="${_ret}" + if test_nz "${before_check}"; then + eval ${before_check} + fi + if _check_csnippets "${name}" && _check_cxxsnippets "${name}"; then + return 0 + fi fi return 1 } -- cgit v1.3.1