summaryrefslogtreecommitdiff
path: root/xmake/rules
diff options
context:
space:
mode:
authorruki <[email protected]>2023-07-08 13:51:22 +0800
committerGitHub <[email protected]>2023-07-08 13:51:22 +0800
commit710f14b26f29c5d6eaccdf9af197eeca4789ae35 (patch)
treec0424a3ebf3e87f1cda46b92a77d1c5ad4d558f0 /xmake/rules
parent999c1b3f68ab44b3c5c3ce107f12ea41f035ef39 (diff)
parent97a18a69740f5b464d2bb8649c65d5ac7cf3a815 (diff)
Merge pull request #3936 from xmake-io/module
fix headerunit errors for msvc and gcc #3927
Diffstat (limited to 'xmake/rules')
-rw-r--r--xmake/rules/c++/modules/modules_support/gcc.lua31
-rw-r--r--xmake/rules/c++/modules/modules_support/msvc.lua16
2 files changed, 41 insertions, 6 deletions
diff --git a/xmake/rules/c++/modules/modules_support/gcc.lua b/xmake/rules/c++/modules/modules_support/gcc.lua
index 3c509edf5..00a63bb03 100644
--- a/xmake/rules/c++/modules/modules_support/gcc.lua
+++ b/xmake/rules/c++/modules/modules_support/gcc.lua
@@ -44,14 +44,14 @@ end
-- /usr/include/c++/11/iostream build/.gens/stl_headerunit/linux/x86_64/release/stlmodules/cache/iostream.gcm
-- hello build/.gens/stl_headerunit/linux/x86_64/release/rules/modules/cache/hello.gcm
--
-function _add_module_to_mapper(file, module, bmi)
+function _add_module_to_mapper(file, modulepath, bmi)
for line in io.lines(file) do
- if line:startswith(module .. " ") then
+ if line:startswith(modulepath .. " ") then
return false
end
end
local f = io.open(file, "a")
- f:print("%s %s", module, bmi)
+ f:print("%s %s", modulepath, bmi)
f:close()
return true
end
@@ -293,6 +293,7 @@ function generate_user_headerunits_for_batchjobs(target, batchjobs, headerunits,
-- build headerunits
local projectdir = os.projectdir()
for _, headerunit in ipairs(headerunits) do
+ print(headerunit)
local headerunit_path
if headerunit.type == ":quote" then
headerunit_path = path.join(".", path.relative(headerunit.path, projectdir))
@@ -315,7 +316,17 @@ function generate_user_headerunits_for_batchjobs(target, batchjobs, headerunits,
-- generate headerunit
local args = { "-c" }
if headerunit.type == ":quote" then
- table.join2(args, { "-I", path.directory(path.relative(headerunit.path, projectdir)), "-x", "c++-user-header", headerunit.name })
+ local includedir
+ local p = headerunit.path
+ if p:endswith(headerunit.name) then
+ includedir = p:sub(1, #p - #headerunit.name - 1)
+ else
+ includedir = path.directory(p)
+ end
+ if path.is_absolute(includedir) then
+ includedir = path.relative(includedir, projectdir)
+ end
+ table.join2(args, { "-I", includedir, "-x", "c++-user-header", headerunit.name })
elseif headerunit.type == ":angle" then
table.join2(args, { "-x", "c++-system-header", headerunit.name })
end
@@ -338,7 +349,17 @@ function generate_user_headerunits_for_batchcmds(target, batchcmds, headerunits,
local flags = {"-c"}
local headerunit_path
if headerunit.type == ":quote" then
- table.join2(flags, {"-I", path(path.relative(headerunit.path, projectdir)):directory(), "-x", "c++-user-header", headerunit.name})
+ local includedir
+ local p = headerunit.path
+ if p:endswith(headerunit.name) then
+ includedir = p:sub(1, #p - #headerunit.name - 1)
+ else
+ includedir = path.directory(p)
+ end
+ if path.is_absolute(includedir) then
+ includedir = path.relative(includedir, projectdir)
+ end
+ table.join2(flags, {"-I", path(includedir), "-x", "c++-user-header", headerunit.name})
headerunit_path = path.join(".", path.relative(headerunit.path, projectdir))
elseif headerunit.type == ":angle" then
table.join2(flags, {"-x", "c++-system-header", headerunit.name})
diff --git a/xmake/rules/c++/modules/modules_support/msvc.lua b/xmake/rules/c++/modules/modules_support/msvc.lua
index 3ee88715c..411b32b20 100644
--- a/xmake/rules/c++/modules/modules_support/msvc.lua
+++ b/xmake/rules/c++/modules/modules_support/msvc.lua
@@ -226,6 +226,7 @@ function generate_headerunit_for_batchjob(target, name, flags, objectfile, index
progress.show((index * 100) / total, "${color.build.object}compiling.headerunit.$(mode) %s", name)
_compile(target, table.join(common_flags, flags))
_add_objectfile_to_link_arguments(target, objectfile)
+ common.memcache():set2(name, "generating", false)
end
end
@@ -740,7 +741,20 @@ function get_requiresflags(target, requires, opt)
local modulemap_ = _get_modulemap_from_mapper(dep)
if modulemap_[name] then
table.join2(flags, modulemap_[name].flag)
- table.join2(flags, modulemap_[name].deps or {})
+ -- we need ignore headerunits from deps
+ -- @see https://github.com/xmake-io/xmake/issues/3925
+ local skip = 0
+ for _, flag in ipairs(modulemap_[name].deps) do
+ if flag:find("headerUnit:quote", 1, true) then
+ skip = 2
+ end
+ if skip == 0 then
+ table.insert(flags, flag)
+ end
+ if skip > 0 then
+ skip = skip - 1
+ end
+ end
already_mapped_modules[name] = true
goto continue
end