Skip to content

Add build jobgraph support#6209

Merged
waruqi merged 127 commits intodevfrom
prepare
Apr 9, 2025
Merged

Add build jobgraph support#6209
waruqi merged 127 commits intodevfrom
prepare

Conversation

@waruqi
Copy link
Member

@waruqi waruqi commented Mar 11, 2025

@waruqi waruqi added this to the v2.9.9 milestone Mar 11, 2025
@waruqi waruqi force-pushed the prepare branch 3 times, most recently from d77bb37 to 5fa6d4a Compare March 23, 2025 13:47
@waruqi waruqi changed the title add on_prepare stages Add build jobgraph support Mar 27, 2025
@waruqi waruqi force-pushed the prepare branch 2 times, most recently from 2de8920 to 6dd8d89 Compare April 3, 2025 01:00
@waruqi waruqi marked this pull request as ready for review April 6, 2025 05:16
@waruqi
Copy link
Member Author

waruqi commented Apr 6, 2025

gcc does not seem to support c++modules with pch very well

ruki@0738bc1c5a27:/mnt/xmake/tests/projects/c++/modules/hello_with_pch$ xmake -rv
[  1%]: compiling.release src/test.h
/usr/bin/gcc -c -m64 -fvisibility=hidden -fvisibility-inlines-hidden -O3 -std=c++20 -I build/.objs/hello/linux/x86_64/release/src/cxx -fmodules-ts -D_GLIBCXX_USE_CXX11_ABI=0 -DNDEBUG -x c++-header -o build/.objs/hello/linux/x86_64/release/src/cxx/test.h.gch src/test.h
[  2%]: <hello> generating.module.deps src/main.cpp
/usr/bin/gcc -E -x c++ -m64 -fvisibility=hidden -fvisibility-inlines-hidden -O3 -std=c++20 -I build/.objs/hello/linux/x86_64/release/src/cxx -include test.h -D_GLIBCXX_USE_CXX11_ABI=0 -DNDEBUG src/main.cpp -o build/.gens/hello/linux/x86_64/release/rules/bmi/cache/modules/2d9b7c0b/main.cpp.i
[  3%]: <hello> generating.module.deps src/hello.mpp
/usr/bin/gcc -E -x c++ -m64 -fvisibility=hidden -fvisibility-inlines-hidden -O3 -std=c++20 -I build/.objs/hello/linux/x86_64/release/src/cxx -include test.h -D_GLIBCXX_USE_CXX11_ABI=0 -DNDEBUG src/hello.mpp -o build/.gens/hello/linux/x86_64/release/rules/bmi/cache/modules/2d9b7c0b/hello.mpp.i
[ 25%]: <hello> compiling.module.release hello
/usr/bin/gcc -c -m64 -fvisibility=hidden -fvisibility-inlines-hidden -O3 -std=c++20 -I build/.objs/hello/linux/x86_64/release/src/cxx -include test.h -fmodules-ts -D_GLIBCXX_USE_CXX11_ABI=0 -DNDEBUG -fmodule-mapper=/tmp/.xmake999/250406/hello/src/hello.mpp -x c++ -o build/.objs/hello/linux/x86_64/release/src/hello.mpp.o src/hello.mpp
error: src/hello.mpp:1:1: error: module-declaration only permitted as first declaration, or ending a global module fragment
    1 | module;
      | ^~~~~~
src/hello.mpp:4:8: error: module-declaration only permitted as first declaration, or ending a global module fragment
    4 | export module hello;
      |        ^~~~~~
src/hello.mpp:6:1: error: 'export' may only occur after a module interface declaration
    6 | export namespace hello {
      | ^~~~~~

@waruqi waruqi requested a review from Arthapz April 6, 2025 14:55
@Arthapz
Copy link
Member

Arthapz commented Apr 6, 2025

gcc does not seem to support c++modules with pch very well

ruki@0738bc1c5a27:/mnt/xmake/tests/projects/c++/modules/hello_with_pch$ xmake -rv
[  1%]: compiling.release src/test.h
/usr/bin/gcc -c -m64 -fvisibility=hidden -fvisibility-inlines-hidden -O3 -std=c++20 -I build/.objs/hello/linux/x86_64/release/src/cxx -fmodules-ts -D_GLIBCXX_USE_CXX11_ABI=0 -DNDEBUG -x c++-header -o build/.objs/hello/linux/x86_64/release/src/cxx/test.h.gch src/test.h
[  2%]: <hello> generating.module.deps src/main.cpp
/usr/bin/gcc -E -x c++ -m64 -fvisibility=hidden -fvisibility-inlines-hidden -O3 -std=c++20 -I build/.objs/hello/linux/x86_64/release/src/cxx -include test.h -D_GLIBCXX_USE_CXX11_ABI=0 -DNDEBUG src/main.cpp -o build/.gens/hello/linux/x86_64/release/rules/bmi/cache/modules/2d9b7c0b/main.cpp.i
[  3%]: <hello> generating.module.deps src/hello.mpp
/usr/bin/gcc -E -x c++ -m64 -fvisibility=hidden -fvisibility-inlines-hidden -O3 -std=c++20 -I build/.objs/hello/linux/x86_64/release/src/cxx -include test.h -D_GLIBCXX_USE_CXX11_ABI=0 -DNDEBUG src/hello.mpp -o build/.gens/hello/linux/x86_64/release/rules/bmi/cache/modules/2d9b7c0b/hello.mpp.i
[ 25%]: <hello> compiling.module.release hello
/usr/bin/gcc -c -m64 -fvisibility=hidden -fvisibility-inlines-hidden -O3 -std=c++20 -I build/.objs/hello/linux/x86_64/release/src/cxx -include test.h -fmodules-ts -D_GLIBCXX_USE_CXX11_ABI=0 -DNDEBUG -fmodule-mapper=/tmp/.xmake999/250406/hello/src/hello.mpp -x c++ -o build/.objs/hello/linux/x86_64/release/src/hello.mpp.o src/hello.mpp
error: src/hello.mpp:1:1: error: module-declaration only permitted as first declaration, or ending a global module fragment
    1 | module;
      | ^~~~~~
src/hello.mpp:4:8: error: module-declaration only permitted as first declaration, or ending a global module fragment
    4 | export module hello;
      |        ^~~~~~
src/hello.mpp:6:1: error: 'export' may only occur after a module interface declaration
    6 | export namespace hello {
      | ^~~~~~

well, modules and headerunits are glorified pch, so i don't think it's a real use case anyway

Copy link
Member

@Arthapz Arthapz left a comment

Choose a reason for hiding this comment

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

lgtm

@Arthapz
Copy link
Member

Arthapz commented Apr 7, 2025

i have a PR that touch a lot module support, should i wait for this to be merge and update this PR or rebase on this PR and wait for this to merge ?

@waruqi
Copy link
Member Author

waruqi commented Apr 7, 2025

i have a PR that touch a lot module support, should i wait for this to be merge and update this PR or rebase on this PR and wait for this to merge ?

you can open a pr to this prepare branch. the current dev branch will be released in these days.

@waruqi waruqi force-pushed the prepare branch 2 times, most recently from b98d617 to b595022 Compare April 8, 2025 02:02
@Arthapz
Copy link
Member

Arthapz commented Apr 8, 2025

why only some of the jobs are actually ran by the jobgraph ?

local scanjob = group .. "/scan_module_dependencies"
jobgraph:add(scanjob, function()
      for _, sourcefile in ipairs(sourcebatch.sourcefiles) do
          local fileconfig = target:fileconfig(sourcefile)
          local external = fileconfig and fileconfig.external

          local jobname = group .. "/scan/" .. sourcefile
          jobgraph:add(jobname, function(_, _, opt)
              local changed = _scanner(target).scan_dependency_for(target, sourcefile, opt)
              if changed then
                  support.memcache():set2(target:fullname(), "modules.changed", true)
              end
          end, {groups = {group .. "/scan"}})
          jobgraph:add_orders(jobname, parsejob)
      end
      print(jobgraph:jobs())
end, {groups = {group}})
jobgraph:add_orders(scanjob, parsejob)
...
 "CppUtils/modules/scan/modules\Language\TreeParser.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\Language\TreeParser.mpp"
  },
  "CppUtils/modules/scan/modules\Network\Server.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\Network\Server.mpp"
  },
  "CppUtils/modules/scan/modules\Math\Float.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\Math\Float.mpp"
  },
  "CppUtils/modules/scan/modules\FileSystem\Directory.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\FileSystem\Directory.mpp"
  },
  "CppUtils/modules/scan/modules\String\Hash.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\String\Hash.mpp"
  },
  "CppUtils/modules/scan/modules\Log\LogRotate.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\Log\LogRotate.mpp"
  },
  "CppUtils/modules/scan/modules\Type\Variant.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\Type\Variant.mpp"
  },
  "CppUtils/modules/scan/modules\Container\Size2d.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\Container\Size2d.mpp"
  },
  "CppUtils/modules/scan/modules\Container\NetworkPtr.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\Container\NetworkPtr.mpp"
  },
  "CppUtils/modules/scan/modules\Container\Vector.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\Container\Vector.mpp"
  },
  "CppUtils/modules/scan/modules\Network\Client.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\Network\Client.mpp"
  },
  "CppUtils/modules/scan/modules\Math\Math.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\Math\Math.mpp"
  },
  "CppUtils/modules/scan/modules\Network\Network.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\Network\Network.mpp"
  },
  "CppUtils/modules/scan/modules\Container\BTree.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\Container\BTree.mpp"
  },
  "CppUtils/end_prepare" = {
    run = function @programdir\modules\private\action\build\target.lua:294,
    name = "CppUtils/end_prepare"
  },
  "CppUtils/modules/scan/modules\String\HashTable.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\String\HashTable.mpp"
  },
  "CppUtils/modules/scan_module_dependencies" = {
    run = function @programdir\rules\c++\modules\scanner.lua:386,
    name = "CppUtils/modules/scan_module_dependencies"
  },
  "CppUtils/modules/scan/modules\Container\Stack.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\Container\Stack.mpp"
  }
}

[  1%]: <CppUtils> generating.module.deps modules\Chrono\Chrono.mpp
[  2%]: <CppUtils> generating.module.deps modules\Chrono\Chronometer.mpp
[  3%]: <CppUtils> generating.module.deps modules\Chrono\Concept.mpp
[  3%]: <CppUtils> generating.module.deps modules\Container\BidirectionalMap.mpp
[  4%]: <CppUtils> generating.module.deps modules\Container\BTree.mpp
[  5%]: <CppUtils> generating.module.deps modules\Container\Container.mpp
[ 38%]: compiling.release tests\main.cpp
error: tests\main.cpp:1:8: fatal error: module 'std' not found
    1 | import std;
      | ~~~~~~~^~~
1 error generated.

@waruqi
Copy link
Member Author

waruqi commented Apr 8, 2025

why only some of the jobs are actually ran by the jobgraph ?

local scanjob = group .. "/scan_module_dependencies"
jobgraph:add(scanjob, function()
      for _, sourcefile in ipairs(sourcebatch.sourcefiles) do
          local fileconfig = target:fileconfig(sourcefile)
          local external = fileconfig and fileconfig.external

          local jobname = group .. "/scan/" .. sourcefile
          jobgraph:add(jobname, function(_, _, opt)
              local changed = _scanner(target).scan_dependency_for(target, sourcefile, opt)
              if changed then
                  support.memcache():set2(target:fullname(), "modules.changed", true)
              end
          end, {groups = {group .. "/scan"}})
          jobgraph:add_orders(jobname, parsejob)
      end
      print(jobgraph:jobs())
end, {groups = {group}})
jobgraph:add_orders(scanjob, parsejob)
...
 "CppUtils/modules/scan/modules\Language\TreeParser.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\Language\TreeParser.mpp"
  },
  "CppUtils/modules/scan/modules\Network\Server.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\Network\Server.mpp"
  },
  "CppUtils/modules/scan/modules\Math\Float.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\Math\Float.mpp"
  },
  "CppUtils/modules/scan/modules\FileSystem\Directory.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\FileSystem\Directory.mpp"
  },
  "CppUtils/modules/scan/modules\String\Hash.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\String\Hash.mpp"
  },
  "CppUtils/modules/scan/modules\Log\LogRotate.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\Log\LogRotate.mpp"
  },
  "CppUtils/modules/scan/modules\Type\Variant.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\Type\Variant.mpp"
  },
  "CppUtils/modules/scan/modules\Container\Size2d.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\Container\Size2d.mpp"
  },
  "CppUtils/modules/scan/modules\Container\NetworkPtr.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\Container\NetworkPtr.mpp"
  },
  "CppUtils/modules/scan/modules\Container\Vector.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\Container\Vector.mpp"
  },
  "CppUtils/modules/scan/modules\Network\Client.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\Network\Client.mpp"
  },
  "CppUtils/modules/scan/modules\Math\Math.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\Math\Math.mpp"
  },
  "CppUtils/modules/scan/modules\Network\Network.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\Network\Network.mpp"
  },
  "CppUtils/modules/scan/modules\Container\BTree.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\Container\BTree.mpp"
  },
  "CppUtils/end_prepare" = {
    run = function @programdir\modules\private\action\build\target.lua:294,
    name = "CppUtils/end_prepare"
  },
  "CppUtils/modules/scan/modules\String\HashTable.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\String\HashTable.mpp"
  },
  "CppUtils/modules/scan_module_dependencies" = {
    run = function @programdir\rules\c++\modules\scanner.lua:386,
    name = "CppUtils/modules/scan_module_dependencies"
  },
  "CppUtils/modules/scan/modules\Container\Stack.mpp" = {
    run = function @programdir\rules\c++\modules\scanner.lua:404,
    name = "CppUtils/modules/scan/modules\Container\Stack.mpp"
  }
}

[  1%]: <CppUtils> generating.module.deps modules\Chrono\Chrono.mpp
[  2%]: <CppUtils> generating.module.deps modules\Chrono\Chronometer.mpp
[  3%]: <CppUtils> generating.module.deps modules\Chrono\Concept.mpp
[  3%]: <CppUtils> generating.module.deps modules\Container\BidirectionalMap.mpp
[  4%]: <CppUtils> generating.module.deps modules\Container\BTree.mpp
[  5%]: <CppUtils> generating.module.deps modules\Container\Container.mpp
[ 38%]: compiling.release tests\main.cpp
error: tests\main.cpp:1:8: fatal error: module 'std' not found
    1 | import std;
      | ~~~~~~~^~~
1 error generated.

use group jobgraph:add(scanjob, -> jobgraph:group(scanjob,

@waruqi
Copy link
Member Author

waruqi commented Apr 8, 2025

@Arthapz try

local scangroup = group .. "/scan_module_dependencies"
jobgraph:group(scangroup, function()
      for _, sourcefile in ipairs(sourcebatch.sourcefiles) do
          local fileconfig = target:fileconfig(sourcefile)
          local external = fileconfig and fileconfig.external
          local jobname = group .. "/scan/" .. sourcefile
          jobgraph:add(jobname, function(_, _, opt)
              local changed = _scanner(target).scan_dependency_for(target, sourcefile, opt)
              if changed then
                  support.memcache():set2(target:fullname(), "modules.changed", true)
              end
          end)
      end
end)
jobgraph:add_orders(scangroup, parsejob)

@Arthapz
Copy link
Member

Arthapz commented Apr 9, 2025

@Arthapz try

local scangroup = group .. "/scan_module_dependencies"
jobgraph:group(scangroup, function()
      for _, sourcefile in ipairs(sourcebatch.sourcefiles) do
          local fileconfig = target:fileconfig(sourcefile)
          local external = fileconfig and fileconfig.external
          local jobname = group .. "/scan/" .. sourcefile
          jobgraph:add(jobname, function(_, _, opt)
              local changed = _scanner(target).scan_dependency_for(target, sourcefile, opt)
              if changed then
                  support.memcache():set2(target:fullname(), "modules.changed", true)
              end
          end)
      end
end)
jobgraph:add_orders(scangroup, parsejob)

it work thx

@waruqi waruqi merged commit 48275f8 into dev Apr 9, 2025
44 of 46 checks passed
@waruqi waruqi deleted the prepare branch April 9, 2025 14:09
@waruqi
Copy link
Member Author

waruqi commented Apr 9, 2025

@Arthapz I have merged it, you can open a pr to dev later.

@Arthapz
Copy link
Member

Arthapz commented Apr 10, 2025

@Arthapz I have merged it, you can open a pr to dev later.

Okay

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.

2 participants