Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor modules support #4321

Merged
merged 47 commits into from
Feb 2, 2024
Merged

Conversation

Arthapz
Copy link
Member

@Arthapz Arthapz commented Oct 25, 2023

This PR is a little refactoring of C++20 module support
i'll divide the refactoring in multiple PR (there is little to no modification to the code, only splitting in multiple interfaces,
simplification / modification will come in an other PR)

this one is to setup an easier dev environment because the current C++20 module implementation begin to be big, it's easier to work on something a little more structured (draft because i didn't refactor msvc yet)

@Arthapz Arthapz force-pushed the improve-modules-support branch 2 times, most recently from 274c4d2 to 19055f4 Compare October 25, 2023 15:41
@Arthapz Arthapz changed the title Refactor modules support 1/2 Refactor modules support Oct 26, 2023
@Arthapz
Copy link
Member Author

Arthapz commented Oct 26, 2023

Now that the code is splitted, i will simplify things, i plan to handle external modules differently, currently external project and std module are built a lot of times when different target use them

i will change the package support as the paper which the current implementation has not been accepted, no need to bother with "standard" mecanism, we can design our module metadata format

@Arthapz
Copy link
Member Author

Arthapz commented Oct 27, 2023

@waruqi Should i maintain compatibility with older toolchains for modules ? or can i remove support of old msvc / gcc / clang ?

i personnally think we should remove experimental / old stuff and only support first compiler version where modules are not experimental because users that want to use modules, use updated compiler anyway

@waruqi
Copy link
Member

waruqi commented Oct 27, 2023

@waruqi Should i maintain compatibility with older toolchains for modules ? or can i remove support of old msvc / gcc / clang ?

i personnally think we should remove experimental / old stuff and only support first compiler version where modules are not experimental because users that want to use modules, use updated compiler anyway

We can remove them, but for low version compilers, I need to provide a detailed hint to tell the user to upgrade the compiler to the specified version.

And we can only remove very old experimental stuff.

@Arthapz Arthapz changed the title Refactor modules support Refactor modules support 1/2 Oct 27, 2023
@Arthapz Arthapz changed the title Refactor modules support 1/2 Refactor modules support Oct 27, 2023
@Arthapz
Copy link
Member Author

Arthapz commented Nov 14, 2023

(i took 2 weeks away from code, i'll continue next monday)

@Arthapz Arthapz marked this pull request as ready for review December 1, 2023 10:49
@Arthapz
Copy link
Member Author

Arthapz commented Dec 1, 2023

i think i'm done with the refactoring

@waruqi
Copy link
Member

waruqi commented Dec 1, 2023

i think i'm done with the refactoring

Please wait a few days, I've been very busy lately and haven't had much time to review it carefully. I will take a look at it in the next few days.

@Arthapz
Copy link
Member Author

Arthapz commented Dec 1, 2023

no problem :)

@waruqi
Copy link
Member

waruqi commented Dec 2, 2023

There seems to be some issues with incremental compilation

gcc

ruki@d40dc62cc957:/mnt/xmake/tests/projects/c++/modules/user_headerunit$ xmake
[  9%]: populating.headerunit.map user_headerunit
[ 27%]: flushing.headerunit.map user_headerunit
[ 36%]: populating.module.map user_headerunit
[ 63%]: flushing.module.map user_headerunit
[100%]: build ok, spent 0.489s
ruki@d40dc62cc957:/mnt/xmake/tests/projects/c++/modules/user_headerunit$ xmake
[  9%]: populating.headerunit.map user_headerunit
[ 27%]: flushing.headerunit.map user_headerunit
[ 36%]: populating.module.map user_headerunit
[ 63%]: flushing.module.map user_headerunit
[100%]: build ok, spent 0.417s
ruki@d40dc62cc957:/mnt/xmake/tests/projects/c++/modules/user_headerunit$ cd ../dependence
ruki@d40dc62cc957:/mnt/xmake/tests/projects/c++/modules/dependence$ xmake
[  7%]: populating.module.map dependence
[ 53%]: flushing.module.map dependence
[100%]: build ok, spent 0.551s
ruki@d40dc62cc957:/mnt/xmake/tests/projects/c++/modules/dependence$ xmake
[  7%]: populating.module.map dependence
[ 53%]: flushing.module.map dependence
[100%]: build ok, spent 0.437s

clang

ruki@d40dc62cc957:/mnt/xmake/tests/projects/c++/modules/dependence$ xmake -r
[  0%]: generating.module.deps src/hello_impl.cpp
[  0%]: generating.module.deps src/main.cpp
[  0%]: generating.module.deps src/mod_impl.cpp
[  0%]: generating.module.deps src/hello.mpp
[  0%]: generating.module.deps src/mod.mpp
[  8%]: compiling.module.release hello
[  8%]: compiling.module.release mod
[ 50%]: flushing.module.map dependence
[ 58%]: compiling.release src/hello_impl.cpp
[ 58%]: compiling.release src/main.cpp
[ 58%]: compiling.release src/mod_impl.cpp
xm[ 83%]: linking.release dependence
ake[100%]: build ok, spent 2.11s
ruki@d40dc62cc957:/mnt/xmake/tests/projects/c++/modules/dependence$ xmake
[ 50%]: flushing.module.map dependence
[100%]: build ok, spent 0.379s

@Arthapz
Copy link
Member Author

Arthapz commented Dec 2, 2023

There seems to be some issues with incremental compilation

gcc

ruki@d40dc62cc957:/mnt/xmake/tests/projects/c++/modules/user_headerunit$ xmake
[  9%]: populating.headerunit.map user_headerunit
[ 27%]: flushing.headerunit.map user_headerunit
[ 36%]: populating.module.map user_headerunit
[ 63%]: flushing.module.map user_headerunit
[100%]: build ok, spent 0.489s
ruki@d40dc62cc957:/mnt/xmake/tests/projects/c++/modules/user_headerunit$ xmake
[  9%]: populating.headerunit.map user_headerunit
[ 27%]: flushing.headerunit.map user_headerunit
[ 36%]: populating.module.map user_headerunit
[ 63%]: flushing.module.map user_headerunit
[100%]: build ok, spent 0.417s
ruki@d40dc62cc957:/mnt/xmake/tests/projects/c++/modules/user_headerunit$ cd ../dependence
ruki@d40dc62cc957:/mnt/xmake/tests/projects/c++/modules/dependence$ xmake
[  7%]: populating.module.map dependence
[ 53%]: flushing.module.map dependence
[100%]: build ok, spent 0.551s
ruki@d40dc62cc957:/mnt/xmake/tests/projects/c++/modules/dependence$ xmake
[  7%]: populating.module.map dependence
[ 53%]: flushing.module.map dependence
[100%]: build ok, spent 0.437s

clang

ruki@d40dc62cc957:/mnt/xmake/tests/projects/c++/modules/dependence$ xmake -r
[  0%]: generating.module.deps src/hello_impl.cpp
[  0%]: generating.module.deps src/main.cpp
[  0%]: generating.module.deps src/mod_impl.cpp
[  0%]: generating.module.deps src/hello.mpp
[  0%]: generating.module.deps src/mod.mpp
[  8%]: compiling.module.release hello
[  8%]: compiling.module.release mod
[ 50%]: flushing.module.map dependence
[ 58%]: compiling.release src/hello_impl.cpp
[ 58%]: compiling.release src/main.cpp
[ 58%]: compiling.release src/mod_impl.cpp
xm[ 83%]: linking.release dependence
ake[100%]: build ok, spent 2.11s
ruki@d40dc62cc957:/mnt/xmake/tests/projects/c++/modules/dependence$ xmake
[ 50%]: flushing.module.map dependence
[100%]: build ok, spent 0.379s

with gcc ? it doesn't build modified file ?

@waruqi
Copy link
Member

waruqi commented Dec 3, 2023

Now it always compile all for clang.

ruki@d40dc62cc957:/mnt/xmake/tests/projects/c++/modules/dependence$ xmake -r
[  0%]: generating.module.deps src/hello_impl.cpp
[  0%]: generating.module.deps src/main.cpp
[  0%]: generating.module.deps src/mod_impl.cpp
[  0%]: generating.module.deps src/hello.mpp
[  0%]: generating.module.deps src/mod.mpp
[  8%]: compiling.module.release mod
[  8%]: compiling.module.release hello
[ 50%]: flushing.module.map dependence
[ 58%]: compiling.release src/hello_impl.cpp
[ 58%]: compiling.release src/main.cpp
[ 58%]: compiling.release src/mod_impl.cpp
[ 83%]: linking.release dependence
[100%]: build ok, spent 2.505s
ruki@d40dc62cc957:/mnt/xmake/tests/projects/c++/modules/dependence$ xmake
[ 50%]: flushing.module.map dependence
[ 58%]: compiling.release src/hello_impl.cpp
[ 66%]: compiling.release src/mod_impl.cpp
[ 83%]: linking.release dependence
[100%]: build ok, spent 1.382s
ruki@d40dc62cc957:/mnt/xmake/tests/projects/c++/modules/dependence$ xmake
[ 50%]: flushing.module.map dependence
[ 58%]: compiling.release src/hello_impl.cpp
[ 66%]: compiling.release src/mod_impl.cpp
[ 83%]: linking.release dependence
[100%]: build ok, spent 1.276s

And does not compile files for gcc. but always show compile progress info.

ruki@d40dc62cc957:/mnt/xmake/tests/projects/c++/modules/dependence$ xmake
[  0%]: generating.module.deps src/hello_impl.cpp
[  0%]: generating.module.deps src/main.cpp
[  0%]: generating.module.deps src/mod_impl.cpp
[  0%]: generating.module.deps src/hello.mpp
[  0%]: generating.module.deps src/mod.mpp
[  7%]: populating.module.map dependence
[ 53%]: flushing.module.map dependence
[ 61%]: compiling.release src/hello_impl.cpp
[ 61%]: compiling.release src/main.cpp
[ 61%]: compiling.release src/mod_impl.cpp
[ 84%]: linking.release dependence
[100%]: build ok, spent 2.893s
ruki@d40dc62cc957:/mnt/xmake/tests/projects/c++/modules/dependence$ xmake
[  7%]: populating.module.map dependence
[ 53%]: flushing.module.map dependence
[100%]: build ok, spent 0.486s

@waruqi
Copy link
Member

waruqi commented Dec 4, 2023

It works for gcc now, but does not work for clang.

ruki@d40dc62cc957:/mnt/xmake/tests/projects/c++/modules/dependence$ rm -rf build/
ruki@d40dc62cc957:/mnt/xmake/tests/projects/c++/modules/dependence$ xmake 
[  0%]: generating.module.deps src/hello_impl.cpp
[  0%]: generating.module.deps src/main.cpp
[  0%]: generating.module.deps src/mod_impl.cpp
[  0%]: generating.module.deps src/hello.mpp
[  0%]: generating.module.deps src/mod.mpp
[  8%]: compiling.module.release mod
[  8%]: compiling.module.release hello
[ 50%]: flushing.module.map dependence
[ 58%]: compiling.release src/hello_impl.cpp
[ 58%]: compiling.release src/main.cpp
[ 58%]: compiling.release src/mod_impl.cpp
[ 83%]: linking.release dependence
[100%]: build ok, spent 2.427s
ruki@d40dc62cc957:/mnt/xmake/tests/projects/c++/modules/dependence$ xmake 
[ 54%]: compiling.release src/hello_impl.cpp
[ 81%]: linking.release dependence
[100%]: build ok, spent 1.229s

@waruqi
Copy link
Member

waruqi commented Dec 4, 2023

And it does not work for msvc.

D:\projects\personal\xmake\tests\projects\c++\modules\headerunits_person>xmake -r
checking for platform ... windows
checking for architecture ... x64
checking for Microsoft Visual Studio (x64) version ... 2022
[  0%]: generating.module.deps src\test.cpp
[  0%]: generating.module.deps src\Person.mpp
[ 10%]: compiling.headerunit.release string
[ 10%]: compiling.headerunit.release iostream
[ 30%]: flushing.headerunit.map headerunits_person
[ 40%]: compiling.module.release person
[ 60%]: flushing.module.map headerunits_person
[ 70%]: compiling.release src\test.cpp
[ 80%]: linking.release headerunits_person.exe
[100%]: build ok, spent 3.985s

D:\projects\personal\xmake\tests\projects\c++\modules\headerunits_person>xmake
[ 33%]: flushing.headerunit.map headerunits_person
[ 66%]: compiling.release src\test.cpp
[ 77%]: linking.release headerunits_person.exe
[100%]: build ok, spent 0.781s

D:\projects\personal\xmake\tests\projects\c++\modules\headerunits_person>cd ..

D:\projects\personal\xmake\tests\projects\c++\modules>de dependence

D:\projects\personal\xmake\tests\projects\c++\modules>cd dependence

D:\projects\personal\xmake\tests\projects\c++\modules\dependence>xmake -r
checking for platform ... windows
checking for architecture ... x64
checking for Microsoft Visual Studio (x64) version ... 2022
[  0%]: generating.module.deps src\hello_impl.cpp
[  0%]: generating.module.deps src\main.cpp
[  0%]: generating.module.deps src\mod_impl.cpp
[  0%]: generating.module.deps src\hello.mpp
[  0%]: generating.module.deps src\mod.mpp
[  8%]: compiling.module.release hello
[  8%]: compiling.module.release mod
[ 50%]: flushing.module.map dependence
[ 58%]: compiling.release src\hello_impl.cpp
[ 58%]: compiling.release src\main.cpp
[ 58%]: compiling.release src\mod_impl.cpp
[ 83%]: linking.release dependence.exe
[100%]: build ok, spent 3.203s

D:\projects\personal\xmake\tests\projects\c++\modules\dependence>xmake
[ 54%]: compiling.release src\hello_impl.cpp
[ 63%]: compiling.release src\mod_impl.cpp
[ 81%]: linking.release dependence.exe
[100%]: build ok, spent 1.235s

@Arthapz
Copy link
Member Author

Arthapz commented Dec 4, 2023

i found some problem when building my engine, so it's not ready

@Arthapz Arthapz marked this pull request as draft December 4, 2023 15:23
end

return mapper, table.keys(mapper)
end
Copy link
Member

@waruqi waruqi Feb 1, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

-- get or create a target module mapper
function get_target_module_mapper(target)
    local memcache = compiler_support.memcache()
    local mapper = memcache:get2(target:name(), "module_mapper")
    if not mapper then
        mapper = {}
        memcache:set2(target:name(), "module_mapper", mapper)
    end

    local mapper_keys = memcache:get2(target:name(), "module_mapper_keys")
    if not mapper_keys then
        mapper_keys = {}
        for _, item in pairs(mapper) do
            mapper_keys[item.key] = item
        end
        memcache:set2(target:name(), "module_mapper_keys", mapper_keys)
    end

    return mapper, mapper_keys
end

-- flush target module mapper keys
function flush_target_module_mapper_keys(target)
    local memcache = compiler_support.memcache()
    memcache:set2(target:name(), "module_mapper_keys", nil)
end


function _is_duplicated_headerunit(target, key)
local mapper, mapper_keys = get_target_module_mapper(target)
for _, mapped_key in ipairs(mapper_keys) do
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no, we should remove the whole for-loop.

function _is_duplicated_headerunit(target, key)
    local _, mapper_keys = get_target_module_mapper(target)
    return mapper_keys[key]
end

-- add a module to target mapper
function add_module_to_target_mapper(target, name, sourcefile, bmifile, opt)
local mapper = get_target_module_mapper(target)
mapper[name] = {name = name, key = name, bmi = bmifile, sourcefile = sourcefile, opt = opt}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

flush_target_module_mapper_keys(target)

mapper[headerunit.name] = {name = headerunit.name, key = key, aliasof = deduplicated.name, headerunit = headerunit}
else
mapper[headerunit.name] = {name = headerunit.name, key = key, headerunit = headerunit, bmi = bmifile}
end
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

flush_target_module_mapper_keys(target)

@waruqi
Copy link
Member

waruqi commented Feb 1, 2024

stdmodules/gcc on ubuntu

ruki@c9677f0d8590:/mnt/xmake/tests/projects/c++/modules/stdmodules$ xmake -rvD
[  0%]: <stdmodules> generating.module.deps test/test.cpp
[  0%]: <stdmodules> generating.module.deps src/my_module.mpp
[  0%]: <mod> generating.module.deps src/my_module.cpp
[  0%]: <mod> generating.module.deps src/my_module.mpp
[  7%]: <mod> generating.module.metadata my_module
error: @programdir/core/main.lua:306: @programdir/actions/build/main.lua:148: @programdir/modules/async/runjobs.lua:320: ...ramdir/rules/c++/modules/modules_support/gcc/builder.lua:152: module dependency std required for nil not found
stack traceback:
    [C]: in function 'error'
    [@programdir/core/base/os.lua:957]: in function 'raiselevel'
    [@programdir/core/sandbox/modules/utils.lua:149]: in function 'assert'
    [...ramdir/rules/c++/modules/modules_support/gcc/builder.lua:152]: in function '_get_maplines'
    [...ramdir/rules/c++/modules/modules_support/gcc/builder.lua:175]: in function '_generate_modulemapper_file'
    [...ramdir/rules/c++/modules/modules_support/gcc/builder.lua:251]: in function 'jobfunc'
    [@programdir/modules/async/runjobs.lua:237]:

stack traceback:
	[C]: in function 'error'
	@programdir/core/base/os.lua:957: in function 'os.raiselevel'
	(...tail calls...)
	@programdir/core/main.lua:306: in upvalue 'cotask'
	@programdir/core/base/scheduler.lua:404: in function <@programdir/core/base/scheduler.lua:397>

clang on ubuntu/macos

ruki@c9677f0d8590:/mnt/xmake/tests/projects/c++/modules/stdmodules$ xmake -rvD
[  0%]: <stdmodules> generating.module.deps test/test.cpp
checkinfo: cannot runv(/usr/bin/clang-scan-deps --version), No such file or directory
checking for /usr/bin/clang-scan-deps ... no
checking for flags (clang_keep_system_includes) ... no
> clang "-fkeep-system-includes" "-Qunused-arguments" "-m64"
checkinfo: @programdir/core/sandbox/modules/os.lua:273: clang: error: unknown argument: '-fkeep-system-includes'

stack traceback:
    [C]: in function 'error'
    [@programdir/core/base/os.lua:957]:
    [@programdir/core/sandbox/modules/os.lua:273]: in function 'runv'
    [@programdir/modules/detect/tools/gcc/has_flags.lua:42]:
checking for flags (-fvisibility-inlines-hidden) ... ok
> clang "-fvisibility-inlines-hidden" "-Qunused-arguments" "-m64"
checking for flags (-O3) ... ok
> clang "-O3" "-Qunused-arguments" "-m64"
checking for flags (-std=c++23) ... no
> clang "-std=c++23" "-Qunused-arguments" "-m64"
checkinfo: @programdir/core/sandbox/modules/os.lua:273: error: invalid value 'c++23' in '-std=c++23'
note: use 'c++98' or 'c++03' for 'ISO C++ 1998 with amendments' standard
note: use 'gnu++98' or 'gnu++03' for 'ISO C++ 1998 with amendments and GNU extensions' standard
note: use 'c++11' for 'ISO C++ 2011 with amendments' standard
note: use 'gnu++11' for 'ISO C++ 2011 with amendments and GNU extensions' standard
note: use 'c++14' for 'ISO C++ 2014 with amendments' standard
note: use 'gnu++14' for 'ISO C++ 2014 with amendments and GNU extensions' standard
note: use 'c++17' for 'ISO C++ 2017 with amendments' standard
note: use 'gnu++17' for 'ISO C++ 2017 with amendments and GNU extensions' standard
note: use 'c++20' for 'ISO C++ 2020 DIS' standard
note: use 'gnu++20' for 'ISO C++ 2020 DIS with GNU extensions' standard
note: use 'c++2b' for 'Working draft for ISO C++ 2023 DIS' standard
note: use 'gnu++2b' for 'Working draft for ISO C++ 2023 DIS with GNU extensions' standard

stack traceback:
    [C]: in function 'error'
    [@programdir/core/base/os.lua:957]:
    [@programdir/core/sandbox/modules/os.lua:273]: in function 'runv'
    [@programdir/modules/detect/tools/gcc/has_flags.lua:42]:
checking for flags (-std=c++2b) ... ok
> clang "-std=c++2b" "-Qunused-arguments" "-m64"
checking for flags (-fmodules-ts) ... ok
> clang "-fmodules-ts" "-Qunused-arguments" "-m64"
checking for flags (-fno-delayed-template-parsing) ... ok
> clang "-fno-delayed-template-parsing" "-Qunused-arguments" "-m64"
checking for flags (-DNDEBUG) ... ok
> clang "-DNDEBUG" "-Qunused-arguments" "-m64"
[  0%]: <stdmodules> generating.module.deps src/my_module.mpp
[  0%]: <mod> generating.module.deps src/my_module.cpp
[  0%]: <mod> generating.module.deps src/my_module.mpp
[  7%]: <mod> generating.module.metadata my_module
checking for flags (clang_module_file) ... ok
> clang "-fmodule-file=/tmp/.xmake999/240131/_6E7A437B8F57440087AD07512E630E30.pcm" "-Qunused-arguments" "-m64"
error: @programdir/core/main.lua:306: @programdir/actions/build/main.lua:148: @programdir/modules/async/runjobs.lua:320: ...mdir/rules/c++/modules/modules_support/clang/builder.lua:135: module dependency std required for my_module not found
stack traceback:
    [C]: in function 'error'
    [@programdir/core/base/os.lua:957]: in function 'raiselevel'
    [@programdir/core/sandbox/modules/utils.lua:149]: in function 'assert'
    [...mdir/rules/c++/modules/modules_support/clang/builder.lua:135]: in function '_get_requiresflags'
    [...mdir/rules/c++/modules/modules_support/clang/builder.lua:157]: in function '_append_requires_flags'
    [...mdir/rules/c++/modules/modules_support/clang/builder.lua:218]: in function 'jobfunc'
    [@programdir/modules/async/runjobs.lua:237]:

stack traceback:
	[C]: in function 'error'
	@programdir/core/base/os.lua:957: in function 'os.raiselevel'
	(...tail calls...)
	@programdir/core/main.lua:306: in upvalue 'cotask'
	@programdir/core/base/scheduler.lua:404: in function <@programdir/core/base/scheduler.lua:397>

hello/clang on macOS

ruki-2:hello ruki$ xmake -rv
[  0%]: <hello> generating.module.deps src/main.cpp
checking for /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/
bin/clang-scan-deps ... no
checking for /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/
bin/clang-scan-deps ... no
checking for /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/
bin/clang-scan-deps ... no
checking for flags (clang_keep_system_includes) ... no
checking for flags (-fvisibility-inlines-hidden) ... ok
checking for flags (-O3) ... ok
checking for flags (-std=c++20) ... ok
checking for flags (-fmodules-ts) ... ok
checking for flags (-fno-delayed-template-parsing) ... ok
checking for flags (-DNDEBUG) ... ok
[  0%]: <hello> generating.module.deps src/hello.mpp
[ 16%]: <hello> compiling.module.release hello
checking for flags (clang_module_output) ... no
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -Qu
nused-arguments -target x86_64-apple-macos14.0 -isysroot /Applications/Xcode.app/Contents/Develo
per/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.0.sdk -fvisibility=hidden -fvisibility-inl
ines-hidden -O3 -std=c++20 -fmodules-ts -fno-delayed-template-parsing -DNDEBUG -x c++-module --p
recompile -o build/.gens/hello/macosx/x86_64/release/rules/bmi/cache/modules/2d9b7c0b/hello.pcm
-c src/hello.mpp
error: src/hello.mpp:1:7: error: expected a module name after 'module'
module;
      ^
1 error generated.

These problems still exist.

#4321 (comment)

@waruqi waruqi changed the base branch from dev to modules February 1, 2024 01:18
@Arthapz
Copy link
Member Author

Arthapz commented Feb 1, 2024

stdmodules/gcc on ubuntu

ruki@c9677f0d8590:/mnt/xmake/tests/projects/c++/modules/stdmodules$ xmake -rvD
[  0%]: <stdmodules> generating.module.deps test/test.cpp
[  0%]: <stdmodules> generating.module.deps src/my_module.mpp
[  0%]: <mod> generating.module.deps src/my_module.cpp
[  0%]: <mod> generating.module.deps src/my_module.mpp
[  7%]: <mod> generating.module.metadata my_module
error: @programdir/core/main.lua:306: @programdir/actions/build/main.lua:148: @programdir/modules/async/runjobs.lua:320: ...ramdir/rules/c++/modules/modules_support/gcc/builder.lua:152: module dependency std required for nil not found
stack traceback:
    [C]: in function 'error'
    [@programdir/core/base/os.lua:957]: in function 'raiselevel'
    [@programdir/core/sandbox/modules/utils.lua:149]: in function 'assert'
    [...ramdir/rules/c++/modules/modules_support/gcc/builder.lua:152]: in function '_get_maplines'
    [...ramdir/rules/c++/modules/modules_support/gcc/builder.lua:175]: in function '_generate_modulemapper_file'
    [...ramdir/rules/c++/modules/modules_support/gcc/builder.lua:251]: in function 'jobfunc'
    [@programdir/modules/async/runjobs.lua:237]:

stack traceback:
	[C]: in function 'error'
	@programdir/core/base/os.lua:957: in function 'os.raiselevel'
	(...tail calls...)
	@programdir/core/main.lua:306: in upvalue 'cotask'
	@programdir/core/base/scheduler.lua:404: in function <@programdir/core/base/scheduler.lua:397>

clang on ubuntu/macos

ruki@c9677f0d8590:/mnt/xmake/tests/projects/c++/modules/stdmodules$ xmake -rvD
[  0%]: <stdmodules> generating.module.deps test/test.cpp
checkinfo: cannot runv(/usr/bin/clang-scan-deps --version), No such file or directory
checking for /usr/bin/clang-scan-deps ... no
checking for flags (clang_keep_system_includes) ... no
> clang "-fkeep-system-includes" "-Qunused-arguments" "-m64"
checkinfo: @programdir/core/sandbox/modules/os.lua:273: clang: error: unknown argument: '-fkeep-system-includes'

stack traceback:
    [C]: in function 'error'
    [@programdir/core/base/os.lua:957]:
    [@programdir/core/sandbox/modules/os.lua:273]: in function 'runv'
    [@programdir/modules/detect/tools/gcc/has_flags.lua:42]:
checking for flags (-fvisibility-inlines-hidden) ... ok
> clang "-fvisibility-inlines-hidden" "-Qunused-arguments" "-m64"
checking for flags (-O3) ... ok
> clang "-O3" "-Qunused-arguments" "-m64"
checking for flags (-std=c++23) ... no
> clang "-std=c++23" "-Qunused-arguments" "-m64"
checkinfo: @programdir/core/sandbox/modules/os.lua:273: error: invalid value 'c++23' in '-std=c++23'
note: use 'c++98' or 'c++03' for 'ISO C++ 1998 with amendments' standard
note: use 'gnu++98' or 'gnu++03' for 'ISO C++ 1998 with amendments and GNU extensions' standard
note: use 'c++11' for 'ISO C++ 2011 with amendments' standard
note: use 'gnu++11' for 'ISO C++ 2011 with amendments and GNU extensions' standard
note: use 'c++14' for 'ISO C++ 2014 with amendments' standard
note: use 'gnu++14' for 'ISO C++ 2014 with amendments and GNU extensions' standard
note: use 'c++17' for 'ISO C++ 2017 with amendments' standard
note: use 'gnu++17' for 'ISO C++ 2017 with amendments and GNU extensions' standard
note: use 'c++20' for 'ISO C++ 2020 DIS' standard
note: use 'gnu++20' for 'ISO C++ 2020 DIS with GNU extensions' standard
note: use 'c++2b' for 'Working draft for ISO C++ 2023 DIS' standard
note: use 'gnu++2b' for 'Working draft for ISO C++ 2023 DIS with GNU extensions' standard

stack traceback:
    [C]: in function 'error'
    [@programdir/core/base/os.lua:957]:
    [@programdir/core/sandbox/modules/os.lua:273]: in function 'runv'
    [@programdir/modules/detect/tools/gcc/has_flags.lua:42]:
checking for flags (-std=c++2b) ... ok
> clang "-std=c++2b" "-Qunused-arguments" "-m64"
checking for flags (-fmodules-ts) ... ok
> clang "-fmodules-ts" "-Qunused-arguments" "-m64"
checking for flags (-fno-delayed-template-parsing) ... ok
> clang "-fno-delayed-template-parsing" "-Qunused-arguments" "-m64"
checking for flags (-DNDEBUG) ... ok
> clang "-DNDEBUG" "-Qunused-arguments" "-m64"
[  0%]: <stdmodules> generating.module.deps src/my_module.mpp
[  0%]: <mod> generating.module.deps src/my_module.cpp
[  0%]: <mod> generating.module.deps src/my_module.mpp
[  7%]: <mod> generating.module.metadata my_module
checking for flags (clang_module_file) ... ok
> clang "-fmodule-file=/tmp/.xmake999/240131/_6E7A437B8F57440087AD07512E630E30.pcm" "-Qunused-arguments" "-m64"
error: @programdir/core/main.lua:306: @programdir/actions/build/main.lua:148: @programdir/modules/async/runjobs.lua:320: ...mdir/rules/c++/modules/modules_support/clang/builder.lua:135: module dependency std required for my_module not found
stack traceback:
    [C]: in function 'error'
    [@programdir/core/base/os.lua:957]: in function 'raiselevel'
    [@programdir/core/sandbox/modules/utils.lua:149]: in function 'assert'
    [...mdir/rules/c++/modules/modules_support/clang/builder.lua:135]: in function '_get_requiresflags'
    [...mdir/rules/c++/modules/modules_support/clang/builder.lua:157]: in function '_append_requires_flags'
    [...mdir/rules/c++/modules/modules_support/clang/builder.lua:218]: in function 'jobfunc'
    [@programdir/modules/async/runjobs.lua:237]:

stack traceback:
	[C]: in function 'error'
	@programdir/core/base/os.lua:957: in function 'os.raiselevel'
	(...tail calls...)
	@programdir/core/main.lua:306: in upvalue 'cotask'
	@programdir/core/base/scheduler.lua:404: in function <@programdir/core/base/scheduler.lua:397>

hello/clang on macOS

ruki-2:hello ruki$ xmake -rv
[  0%]: <hello> generating.module.deps src/main.cpp
checking for /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/
bin/clang-scan-deps ... no
checking for /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/
bin/clang-scan-deps ... no
checking for /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/
bin/clang-scan-deps ... no
checking for flags (clang_keep_system_includes) ... no
checking for flags (-fvisibility-inlines-hidden) ... ok
checking for flags (-O3) ... ok
checking for flags (-std=c++20) ... ok
checking for flags (-fmodules-ts) ... ok
checking for flags (-fno-delayed-template-parsing) ... ok
checking for flags (-DNDEBUG) ... ok
[  0%]: <hello> generating.module.deps src/hello.mpp
[ 16%]: <hello> compiling.module.release hello
checking for flags (clang_module_output) ... no
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -Qu
nused-arguments -target x86_64-apple-macos14.0 -isysroot /Applications/Xcode.app/Contents/Develo
per/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.0.sdk -fvisibility=hidden -fvisibility-inl
ines-hidden -O3 -std=c++20 -fmodules-ts -fno-delayed-template-parsing -DNDEBUG -x c++-module --p
recompile -o build/.gens/hello/macosx/x86_64/release/rules/bmi/cache/modules/2d9b7c0b/hello.pcm
-c src/hello.mpp
error: src/hello.mpp:1:7: error: expected a module name after 'module'
module;
      ^
1 error generated.

These problems still exist.

#4321 (comment)

i fixed the "nil" as modulename for "stdmodules/GCC" but i'm not sure what you want for "clang on ubuntu/macos", clang doesn't support std module currently so it should fail like this (i have a PR ready for support of experimental std module stuff for clang but it'll come after this PR)

for "hello/clang on macOS" i tried with xmake without my PR and it doesn't work too, i think something changed in apple clang
do you use apple clang 15 ?

@waruqi
Copy link
Member

waruqi commented Feb 1, 2024

i fixed the "nil" as modulename for "stdmodules/GCC" but i'm not sure what you want for "clang on ubuntu/macos", clang doesn't support std module currently so it should fail like this (i have a PR ready for support of experimental std module stuff for clang but it'll come after this PR)

nil has been fixed, thanks.

@waruqi
Copy link
Member

waruqi commented Feb 1, 2024

tried with xmake without my PR and it doesn't work too, i think something changed in apple clang
do you use apple clang 15 ?

clang 15 does not support it?

ruki-2:hello ruki$ clang --version
Apple clang version 15.0.0 (clang-1500.0.40.1)
Target: x86_64-apple-darwin23.0.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDe
fault.xctoolchain/usr/bin

@Arthapz
Copy link
Member Author

Arthapz commented Feb 1, 2024

tried with xmake without my PR and it doesn't work too, i think something changed in apple clang
do you use apple clang 15 ?

clang 15 does not support it?

ruki-2:hello ruki$ clang --version
Apple clang version 15.0.0 (clang-1500.0.40.1)
Target: x86_64-apple-darwin23.0.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDe
fault.xctoolchain/usr/bin

i think apple disabled module support or something because i can't get it to work, and on llvm discord they don't know why it doesn't work

simple command line tests like

> clang++ -std=c++20 -fmodules-ts --precompile -o hello.pcm -x c++-module src/hello.mpp
src:/hello.mpp:1:7: error: expected a module name after 'module'
module;
      ^
1 error  generated.

or

> clang++ -std=c++20 --precompile -o hello.pcm -x c++-module src/hello.mpp
error: module interface compilation requires '-std=c++20' or '-fmodules-ts'
1 error generated.

doesn't work anymore, but worked before
this is very weird

@waruqi
Copy link
Member

waruqi commented Feb 1, 2024

I don't know, clang 14 works fine on linix, but clang15/macos does not.

@Issues-translate-bot
Copy link

Bot detected the issue body's language is not English, translate it automatically.


I don't know, clang 14 works fine on linux, but clang 15/macos does not.

@Arthapz
Copy link
Member Author

Arthapz commented Feb 1, 2024

I don't know, clang 14 works fine on linix, but clang15/macos does not.

and macOS CI work too ...

@Arthapz
Copy link
Member Author

Arthapz commented Feb 1, 2024

on llvm discord
image

@Arthapz
Copy link
Member Author

Arthapz commented Feb 1, 2024

i got clang support to use compinst:compile, but now for msvc i need a way to have compinst:compile omit -Fo flag

@Arthapz
Copy link
Member Author

Arthapz commented Feb 1, 2024

i got the confirmation that C++20 modules are disabled on apple clang on llvm discord https://discord.com/channels/636084430946959380/636808521371090956/1202656509834825819

Bigcheese — Aujourd’hui à 17:47
Yes, objective c disables c++20 modules by default because it requires local submodule visibility, which doesn't work for our SDK.

@waruqi
Copy link
Member

waruqi commented Feb 2, 2024

i got clang support to use compinst:compile, but now for msvc i need a way to have compinst:compile omit -Fo flag

Why omit it? Can you show me the whole compile command and flags?

@waruqi
Copy link
Member

waruqi commented Feb 2, 2024

i got the confirmation that C++20 modules are disabled on apple clang on llvm discord https://discord.com/channels/636084430946959380/636808521371090956/1202656509834825819

Bigcheese — Aujourd’hui à 17:47
Yes, objective c disables c++20 modules by default because it requires local submodule visibility, which doesn't work for our SDK.

so we need to add -std=c++20 -fcxx-modules -Xclang -fmodules-local-submodule-visibility? I try to add it, It doesn't seem to be working either.

[  0%]: <hello> generating.module.deps src/main.cpp
checking for /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDef
ault.xctoolchain/usr/bin/clang-scan-deps ... no
checking for /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDef
ault.xctoolchain/usr/bin/clang-scan-deps ... no
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolch
ain/usr/bin/clang -Qunused-arguments -target x86_64-apple-macos14.0 -isysro
ot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Dev
eloper/SDKs/MacOSX14.0.sdk -fvisibility=hidden -fvisibility-inlines-hidden
-O3 -fno-delayed-template-parsing -fcxx-modules -Xclang -DNDEBUG -E -x c++
src/main.cpp -o build/.gens/hello/macosx/x86_64/release/rules/bmi/cache/mod
ules/2d9b7c0b/main.cpp.i
[  0%]: <hello> generating.module.deps src/hello.mpp
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolch
ain/usr/bin/clang -Qunused-arguments -target x86_64-apple-macos14.0 -isysro
ot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Dev
eloper/SDKs/MacOSX14.0.sdk -fvisibility=hidden -fvisibility-inlines-hidden
-O3 -fno-delayed-template-parsing -fcxx-modules -Xclang -DNDEBUG -E -x c++
src/hello.mpp -o build/.gens/hello/macosx/x86_64/release/rules/bmi/cache/mo
dules/2d9b7c0b/hello.mpp.i
[ 16%]: <hello> compiling.module.release hello
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolch
ain/usr/bin/clang -Qunused-arguments -target x86_64-apple-macos14.0 -isysro
ot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Dev
eloper/SDKs/MacOSX14.0.sdk -fvisibility=hidden -fvisibility-inlines-hidden
-O3 -std=c++20 -fmodules-ts -fno-delayed-template-parsing -fcxx-modules -Xc
lang -fmodules-local-submodule-visibility -DNDEBUG -x c++-module --precompi
le -o build/.gens/hello/macosx/x86_64/release/rules/bmi/cache/modules/2d9b7
c0b/hello.pcm -c src/hello.mpp
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolch
ain/usr/bin/clang -Qunused-arguments -target x86_64-apple-macos14.0 -isysro
ot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Dev
eloper/SDKs/MacOSX14.0.sdk -fvisibility=hidden -fvisibility-inlines-hidden
-O3 -std=c++20 -fmodules-ts -fno-delayed-template-parsing -fcxx-modules -Xc
lang -fmodules-local-submodule-visibility -DNDEBUG -x c++-module --precompi
le -o build/.gens/hello/macosx/x86_64/release/rules/bmi/cache/modules/2d9b7
c0b/hello.pcm -c src/hello.mpp
src/hello.mpp:1:7: error: expected a module name after 'module'
module;
      ^
1 error generated.

@waruqi waruqi merged commit b81eed5 into xmake-io:modules Feb 2, 2024
19 checks passed
@waruqi
Copy link
Member

waruqi commented Feb 2, 2024

I'm going to merge this patch into the modules branch so that I can make some improvements. If you have new improvements, you can continue to submit them to the modules branch.

@waruqi waruqi mentioned this pull request Feb 2, 2024
@waruqi waruqi added this to the v2.8.7 milestone Feb 2, 2024
@Arthapz Arthapz deleted the improve-modules-support branch February 3, 2024 15:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants