summaryrefslogtreecommitdiff
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
parent999c1b3f68ab44b3c5c3ce107f12ea41f035ef39 (diff)
parent97a18a69740f5b464d2bb8649c65d5ac7cf3a815 (diff)
Merge pull request #3936 from xmake-io/module
fix headerunit errors for msvc and gcc #3927
-rw-r--r--tests/projects/c++/modules/user_headerunit2/a/a.mpp3
-rw-r--r--tests/projects/c++/modules/user_headerunit2/a/c.hpp1
-rw-r--r--tests/projects/c++/modules/user_headerunit2/a/d.hpp1
-rw-r--r--tests/projects/c++/modules/user_headerunit2/a/xmake.lua4
-rw-r--r--tests/projects/c++/modules/user_headerunit2/b/b.mpp3
-rw-r--r--tests/projects/c++/modules/user_headerunit2/b/xmake.lua5
-rw-r--r--tests/projects/c++/modules/user_headerunit2/test.lua1
-rw-r--r--tests/projects/c++/modules/user_headerunit2/xmake.lua4
-rw-r--r--xmake/rules/c++/modules/modules_support/gcc.lua31
-rw-r--r--xmake/rules/c++/modules/modules_support/msvc.lua16
10 files changed, 63 insertions, 6 deletions
diff --git a/tests/projects/c++/modules/user_headerunit2/a/a.mpp b/tests/projects/c++/modules/user_headerunit2/a/a.mpp
new file mode 100644
index 000000000..d940a0635
--- /dev/null
+++ b/tests/projects/c++/modules/user_headerunit2/a/a.mpp
@@ -0,0 +1,3 @@
+export module A;
+import "c.hpp";
+import "d.hpp";
diff --git a/tests/projects/c++/modules/user_headerunit2/a/c.hpp b/tests/projects/c++/modules/user_headerunit2/a/c.hpp
new file mode 100644
index 000000000..7c6c88c00
--- /dev/null
+++ b/tests/projects/c++/modules/user_headerunit2/a/c.hpp
@@ -0,0 +1 @@
+#pragma once \ No newline at end of file
diff --git a/tests/projects/c++/modules/user_headerunit2/a/d.hpp b/tests/projects/c++/modules/user_headerunit2/a/d.hpp
new file mode 100644
index 000000000..7c6c88c00
--- /dev/null
+++ b/tests/projects/c++/modules/user_headerunit2/a/d.hpp
@@ -0,0 +1 @@
+#pragma once \ No newline at end of file
diff --git a/tests/projects/c++/modules/user_headerunit2/a/xmake.lua b/tests/projects/c++/modules/user_headerunit2/a/xmake.lua
new file mode 100644
index 000000000..cffe161b2
--- /dev/null
+++ b/tests/projects/c++/modules/user_headerunit2/a/xmake.lua
@@ -0,0 +1,4 @@
+target("a")
+ set_languages("cxxlatest")
+ set_kind("object")
+ add_files("a.mpp")
diff --git a/tests/projects/c++/modules/user_headerunit2/b/b.mpp b/tests/projects/c++/modules/user_headerunit2/b/b.mpp
new file mode 100644
index 000000000..486174a4b
--- /dev/null
+++ b/tests/projects/c++/modules/user_headerunit2/b/b.mpp
@@ -0,0 +1,3 @@
+export module B;
+import A;
+import "../a/c.hpp"; \ No newline at end of file
diff --git a/tests/projects/c++/modules/user_headerunit2/b/xmake.lua b/tests/projects/c++/modules/user_headerunit2/b/xmake.lua
new file mode 100644
index 000000000..98cff4124
--- /dev/null
+++ b/tests/projects/c++/modules/user_headerunit2/b/xmake.lua
@@ -0,0 +1,5 @@
+target("b")
+ add_deps("a")
+ set_languages("cxxlatest")
+ set_kind("object")
+ add_files("b.mpp")
diff --git a/tests/projects/c++/modules/user_headerunit2/test.lua b/tests/projects/c++/modules/user_headerunit2/test.lua
new file mode 100644
index 000000000..c18e5a1d0
--- /dev/null
+++ b/tests/projects/c++/modules/user_headerunit2/test.lua
@@ -0,0 +1 @@
+inherit(".test_headerunits")
diff --git a/tests/projects/c++/modules/user_headerunit2/xmake.lua b/tests/projects/c++/modules/user_headerunit2/xmake.lua
new file mode 100644
index 000000000..09517502b
--- /dev/null
+++ b/tests/projects/c++/modules/user_headerunit2/xmake.lua
@@ -0,0 +1,4 @@
+includes("a", "b")
+target("test")
+ add_deps("a", "b")
+ set_kind("phony")
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