Skip to content

feat: Add C++ modules support - #1530

Open
mikomikotaishi wants to merge 26 commits into
brainboxdotcc:devfrom
mikomikotaishi:dev
Open

feat: Add C++ modules support#1530
mikomikotaishi wants to merge 26 commits into
brainboxdotcc:devfrom
mikomikotaishi:dev

Conversation

@mikomikotaishi

@mikomikotaishi mikomikotaishi commented Dec 27, 2025

Copy link
Copy Markdown
Contributor

This pull request adds support for C++20 modules.

In order to accomplish this, some constants were changed to using external linkage.

I have also updated nlohmann/json to version 3.12.0, as the older version declares some symbols as internal. Updating nlohmann/json has been moved to #1596.

Code change checklist

  • I have ensured that all methods and functions are fully documented using doxygen style comments.
  • My code follows the coding style guide.
  • I tested that my change works before raising the PR.
  • I have ensured that I did not break any existing API calls.
  • I have not built my pull request using AI, a static analysis tool or similar without any human oversight.

@netlify

netlify Bot commented Dec 27, 2025

Copy link
Copy Markdown

Deploy Preview for dpp-dev ready!

Name Link
🔨 Latest commit ce88aff
🔍 Latest deploy log https://app.netlify.com/projects/dpp-dev/deploys/69b75fdc5f079200085fc488
😎 Deploy Preview https://deploy-preview-1530--dpp-dev.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@github-actions github-actions Bot added documentation Improvements or additions to documentation build Issue or Pull Request related to the build process code Improvements or additions to code. labels Dec 27, 2025
@Jaskowicz1 Jaskowicz1 added the enhancement New feature or request label Dec 27, 2025
@mikomikotaishi
mikomikotaishi force-pushed the dev branch 3 times, most recently from e91eaa8 to 121eb9b Compare December 27, 2025 12:04

@Mishura4 Mishura4 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks for the PR! Good stuff. Just gonna prefer the approach with including dpp.h in the module for maintainability, as discussed in https://discord.com/channels/825407338755653642/825411104208977952/1454456223952011427

@braindigitalis braindigitalis left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

some module related unit tests would be good. not repeating a thousand lines of code in dpp.cppm is an absolute must, as @Mishura4 also said.

@mikomikotaishi

mikomikotaishi commented Dec 27, 2025

Copy link
Copy Markdown
Contributor Author

I've looked at the src/unittest/ files but I'm not particularly familiar with how you've set up the unit testing framework. Are you just looking to run those same tests under import dpp; rather than #include <dpp/dpp.h>?

@braindigitalis

Copy link
Copy Markdown
Contributor

I think that in this case you might want to make a new .cpp under the unittests folder which imports dpp instead of #including it. it can have some test functions that are exported and called via standard approaches from the main unittest file.

@mikomikotaishi
mikomikotaishi force-pushed the dev branch 3 times, most recently from 1909f3f to 7f6fb23 Compare December 28, 2025 06:06
@mikomikotaishi

Copy link
Copy Markdown
Contributor Author

I think this should fix the errors we're encountering. It's with the build system configuration

@braindigitalis

Copy link
Copy Markdown
Contributor

you cant just do -DDPP_MODULES=ON for the entire CI matrix. Some CI's use older g++ (which we support) and some use C++17.

Comment thread docpages/example_code/using_modules.cpp Outdated
Comment thread docpages/example_programs/misc/using_modules.md Outdated
Comment thread docpages/example_code/using_modules.cpp Outdated
@mikomikotaishi

Copy link
Copy Markdown
Contributor Author

Then is it possible to disable the modules unit tests for C++17 CI tests?

@mikomikotaishi

Copy link
Copy Markdown
Contributor Author

@braindigitalis I think the modules CI should just be in a totally separate CI. It requires Ninja, as CMake can't build modules with Makefiles.

@braindigitalis

Copy link
Copy Markdown
Contributor

unit tests only run in one g++, which is g++-12. This is the one which is packaged. we cant and dont run unit tests on them all, as the unit tests connect to discord and we cant do this concurrently.

Comment thread .github/workflows/test-docs-examples.yml Outdated
@Jaskowicz1 Jaskowicz1 changed the title Add C++ modules support and update nlohmann::json feat: Add C++ modules support and update nlohmann::json Dec 29, 2025
@Jaskowicz1

Copy link
Copy Markdown
Contributor

Updated Title to match code standards

Comment thread .github/workflows/test-docs-examples.yml Outdated
Comment thread .github/workflows/test-docs-examples.yml Outdated
Comment thread src/unittest/test.cpp
Comment thread .github/workflows/ci.yml

@Mishura4 Mishura4 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Example doesn't seem to build on Windows. Can we add it to CI somehow?
Also, please fix merge conflicts.

Comment thread docpages/example_code/CMakeLists.txt Outdated

set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -rdynamic")

# Create gcm.cache directory and symlink to the main build's dpp.gcm

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Yes I can see that, but why?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Clang obtains the BMI paths through -fprebuilt-module-path which indicates where to scan, but GCC has no such option, and places its BMIs in gcm.cache/, which is why the lookup location is populated with the symlink to the actual interface.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Why is this necessary? I've not had to do this with any of my other projects

Comment thread docpages/example_code/CMakeLists.txt Outdated
Comment thread library/CMakeLists.txt

@Jaskowicz1 Jaskowicz1 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

A couple comments, nothing to really reject for though

Comment thread docpages/example_code/using_modules.cpp Outdated
Comment thread docpages/example_programs/misc/using_modules.md
Comment thread include/dpp/etf.h Outdated
Comment thread docpages/include/modules_warn.dox Outdated
Comment thread docpages/include/coro_warn.dox Outdated
Comment thread .github/workflows/test-docs-examples.yml Outdated
Comment thread docpages/example_code/CMakeLists.txt
@Jaskowicz1

Copy link
Copy Markdown
Contributor

ngl i'm pretty happy with moving to clang-cl for windows lol

Comment thread docpages/example_code/CMakeLists.txt
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

build Issue or Pull Request related to the build process code Improvements or additions to code. documentation Improvements or additions to documentation enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants