Skip to content

Support for C++20/23 modules#395

Draft
DockedFerret800 wants to merge 12 commits intoThalhammer:masterfrom
DockedFerret800:modules
Draft

Support for C++20/23 modules#395
DockedFerret800 wants to merge 12 commits intoThalhammer:masterfrom
DockedFerret800:modules

Conversation

@DockedFerret800
Copy link
Copy Markdown

@DockedFerret800 DockedFerret800 commented Sep 25, 2025

This adds support for C++20/23 modules. Please let me know if you want anything done in a different way. There is still some work left to do: update all examples, tests, docs and CI/CD. I tested the code on Windows, with MSVC latest (v18) on a print-claims example.

JWT_ENABLE_MODULES - to enable modules
JWT_USE_IMPORT_STD - to use import std

UPD: The latest implementation was tested with MSVC (14.51) and Clang-22

Comment thread CMakeLists.txt
@DockedFerret800
Copy link
Copy Markdown
Author

I didn't manage to get import std working properly yet. I'll continue over the weekend.

@DockedFerret800
Copy link
Copy Markdown
Author

DockedFerret800 commented Jan 3, 2026

I'm having trouble pairing modules and tests with GTest, primarily related to this issue: google/googletest#4851. I'll see what I can do tomorrow.

All examples appear to work

@ChuanqiXu9
Copy link
Copy Markdown

Hi I am looking forward to using this. What's the problem you are seeing? if it is the import-#include ordering thing, can we just have #include before import in the tests? And it is not so strict, see: https://github.com/alibaba/async_simple/blob/CXX20Modules/async_simple_module/test/coro/SleepTest.cpp

@DockedFerret800
Copy link
Copy Markdown
Author

DockedFerret800 commented Mar 14, 2026 via email

@DockedFerret800
Copy link
Copy Markdown
Author

@ChuanqiXu9 Hi. Sorry for the delay. I’ve just pushed a commit that now uses ABI-breaking wrapper style. Could you have a look at the current implementation and tell whether you're satisfied with it? Thank you.

Copy link
Copy Markdown

@ChuanqiXu9 ChuanqiXu9 left a comment

Choose a reason for hiding this comment

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

The patch LGTM with some nits. Feel free to ignore them.

Comment thread include/jwt-cpp/jwt.h Outdated
Comment thread modules/jwt.cppm
Comment thread modules/jwt.cppm Outdated
// Build the public headers in module purview so imported declarations are
// attached to jwt_cpp instead of the global module.
#define JWT_CPP_MODULE_INTERFACE_BUILD 1
export {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

nit: export all seems slightly not good but it is your choices.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

I tried to use ABI-Breaking style, as it was recommended by people in other libraries. For example, a Vulkan-hpp contributor said switching to an ABI-Breaking approach allowed them to resolve multiple issues and make many tests that were previously failing to pass. I think the last time there were some issues using the "export using style", however I can try again.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

That document says it is better to add 'export' to different entities instead of exporting all things

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Hi @ChuanqiXu9. Would this be correct? 46b4ea6. Thanks.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Yeah, it seems better

@DockedFerret800
Copy link
Copy Markdown
Author

@prince-chrismc Thank you for resolving conflicts. I'll add a workflow for modules tomorrow and do some minor cleanups, so I think this will be ready soon. Sorry for the delay.

Copy link
Copy Markdown
Collaborator

@prince-chrismc prince-chrismc left a comment

Choose a reason for hiding this comment

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

Few small questions

#ifndef picojson_h
#define picojson_h

#if defined(JWT_CPP_MODULE_INTERFACE_BUILD) && defined(JWT_USE_IMPORT_STD)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Picojson is a vendored dep, we shouldn't be making changes to it.

Comment thread CMakeLists.txt
target_compile_features(jwt-cpp ${JWT_LIBRARY_TYPE} cxx_std_20)
else()
target_compile_features(jwt-cpp ${JWT_LIBRARY_TYPE} cxx_std_23)
target_compile_definitions(jwt-cpp PRIVATE JWT_USE_IMPORT_STD)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

If this was public, could we remove the extra defines in the examples and test apps?

#include <iostream>
#include <sstream>

#include "jwt-cpp/traits/boost-json/traits.h"
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Is there a technical reason to change the header includes? Not familiar enough with modules to know.

Comment thread CMakeLists.txt
option(JWT_ENABLE_COVERAGE "Enable code coverage testing" OFF)
option(JWT_ENABLE_FUZZING "Enable fuzz testing" OFF)
option(JWT_ENABLE_MODULES "Build C++ modules" OFF)
option(JWT_USE_IMPORT_STD "Use import std" OFF)
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Not a requirement, but asking for "import std" to be available will reduce the complexity.

Comment thread CMakeLists.txt
cmake_policy(SET CMP0135 NEW)
endif()

set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD "451f2fe2-a8a2-47c3-bc32-94786d8fc91b")
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

It is better to make this an default value then users can override the value by cmake's -D option during configuraton.

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.

4 participants