⚠ This page is served via a proxy. Original site: https://github.com
This service does not collect credentials or authentication data.
Skip to content

Conversation

@mikomikotaishi
Copy link
Contributor

This pull request adds support for C++20 modules through CMake. It is enabled by the HTTPLIB_BUILD_MODULES option (which requires HTTPLIB_COMPILE to be enabled, though it probably doesn't have to - I only forced this requirement because it seems to make the most sense to force the library to compile if modules are to be compiled).

@Spixmaster
Copy link

Spixmaster commented Dec 8, 2025

Great work. I also thought about this.

The approach is very similiar to what was done to https://github.com/nlohmann/json with nlohmann/json#4799. Then, I noticed ...

Is this temporary approach with a file with using ... for the meantime while modules and no modules are supported?

This approach is not using modules natively but rather as an interface to the original way.

Does this method work without disadvantages?

@mikomikotaishi
Copy link
Contributor Author

mikomikotaishi commented Dec 8, 2025

This is the best way to my knowledge to support modules on top of a header-only or header/source library, allowing continued support for older versions while providing newer features as an option.

I'm not aware of any disadvantages to it besides a being additional translation unit to compile, but if I am wrong please correct me. The only glaring difference in API is that detail symbols are hidden as they are not exported, but in my opinion that's probably better not to expose detail symbols and flood IDE suggestions with implementation details.

@Spixmaster
Copy link

Spixmaster commented Dec 8, 2025

What about compiled libraries? Is it possible to have the traditional method and modules installed in parallel?

I am thinking of repositories that ship compiled .so or .a.

This is relevant here, https://aur.archlinux.org/packages/cpp-httplib-compiled .

@mikomikotaishi
Copy link
Contributor Author

mikomikotaishi commented Dec 8, 2025

Yes I believe it's possible to use shared/static libraries with modules, all of my modular projects compiled to shared libraries that an executable consumes

@yhirose
Copy link
Owner

yhirose commented Dec 8, 2025

@mikomikotaishi, thanks for the fine pull request! It's fantastic, but my concern is that someone needs to update modules/httplib.cppm whenever new external symbols are added or existing symbols are removed/renamed, and it could happen quite often. I am not planning to maintain this file. So if you cannot keep maintaining the file, I am probably not merge it since the file can be easily out-of-date. Is there a way to generate modules/httplib.cppm from httplib.h automatically?

@sum01 @jimmy-park @Tachi107 do you have any thought about this pull request?

@mikomikotaishi
Copy link
Contributor Author

mikomikotaishi commented Dec 8, 2025

I could create a Python script, or some other kinds of automated means of updating, which you could run every time it is updated. Until then I would be OK with maintaining this file, as it is a simple process. Such a script would probably comb through the file and add any symbols not part of a detail or internal namespace, or prefixed with an underscore, etc.

However, I am curious why it is not feasible to update the file manually. In case it isn't clear how, one can update the file by adding a using httplib::NEW_SYMBOL_HERE; into the export namespace httlib { } block, for each new symbol that is added. Do let me know if any more information is needed.

@mikomikotaishi
Copy link
Contributor Author

I have also seen some repositories use bots to push some commits too. Potentially one such bot could be set up to automatically populate the module with new changes each time there is a mismatch. I don't know anything about how to set this up, but I have seen this before and it could potentially be a solution (but I think the simplest one is just to run a Python script each time any update to the library happens).

@mikomikotaishi
Copy link
Contributor Author

Anyway, I think this could be one such way of automatically updating the module.

@yhirose
Copy link
Owner

yhirose commented Dec 9, 2025

@mikomikotaishi thanks for the additional explanation. I am ok with the following your suggestion.

I have also seen some repositories use bots to push some commits too. Potentially one such bot could be set up to automatically populate the module with new changes each time there is a mismatch. I don't know anything about how to set this up, but I have seen this before and it could potentially be a solution.

We could automatically generate modules/httplib.cppm in a GitHub Actions script when httplib.h is pushed. (I can't accept the way to run a script to update the file manually, since I don't maintain any build systems in this repository. Please see #955 (comment).)

@mikomikotaishi
Copy link
Contributor Author

OK, that makes sense to me. (I don't know anything about how to run GitHub Actions or write scripts for it however, so I'm afraid the most I can do is create a script for this.)

@mikomikotaishi
Copy link
Contributor Author

I'm not sure why there were failing workflows as I didn't change anything in the core library

@mikomikotaishi
Copy link
Contributor Author

Never mind, it seems the failing CI is happening upstream too.

@Tachi107
Copy link
Contributor

Tachi107 commented Dec 9, 2025 via email

@mikomikotaishi
Copy link
Contributor Author

mikomikotaishi commented Dec 9, 2025

@Tachi107 CMake needs to know what the output directory is ahead of time to compile the module. How do you propose to solve this?

@mikomikotaishi
Copy link
Contributor Author

@yhirose I think there is one possible solution to allow both the directory to be user-specified while still supporting CMake module building, which is probably just to have the Python script generate the CMake file too. I don't know if this is too convoluted or awkward of a design though, so please do tell me your thoughts.

@Tachi107
Copy link
Contributor

Tachi107 commented Dec 11, 2025 via email

Copy link
Contributor

@Tachi107 Tachi107 left a comment

Choose a reason for hiding this comment

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

Some feedback now that I have been able to look at the whole code :)

@Spixmaster
Copy link

Spixmaster commented Jan 11, 2026

Might I ask a question? Is the currennt approach good for programme packages? Think of https://aur.archlinux.org/packages?O=0&K=cpp-httplib .

Can users who have installed a package use modules and not with one package installed? This is very important because if one software depending on cpp-httplib uses modules and the other not one will need to have two different packages whose files would likely collide.

Alternatively formulated, can no modules and modules exist in parallel?

@mikomikotaishi
Copy link
Contributor Author

Alternatively formulated, can no modules and modules exist in parallel?

I'm not sure if I entirely understand what you mean. Are you asking if it's possible to #include <httplib/httplib.h> and import httplib; in the same project? I believe the answer is yes.

@mikomikotaishi
Copy link
Contributor Author

@yhirose Hi, could you please review it again and tell me your thoughts on the current solution? I think this is very simple and should be to your liking.

@yhirose yhirose requested review from Tachi107 and yhirose and removed request for Tachi107 and yhirose January 12, 2026 04:54
@yhirose
Copy link
Owner

yhirose commented Jan 14, 2026

@mikomikotaishi could you test it on three platforms (macos, ubuntu, Windows)?

@mikomikotaishi
Copy link
Contributor Author

@mikomikotaishi could you test it on three platforms (macos, ubuntu, Windows)?

Things are building correctly for me and I'm able to use the module on MSVC, GCC and Clang, so I think things are good

@yhirose
Copy link
Owner

yhirose commented Jan 14, 2026

Could you show me how you compile it with clang++, g++, and vc++? I'll try on my machines when I have time.

@mikomikotaishi
Copy link
Contributor Author

mikomikotaishi commented Jan 14, 2026

I'm relying on CMake to build it, because compiling libraries by manually calling the compiler rather than including it by header or using a build system is difficult and something I have little experience with. If you are interested in what I did:

cmake -B build -S . -G Ninja -DHTTPLIB_COMPILE=ON -DHTTPLIB_BUILD_MODULES=ON

This runs the split.py script and creates the files httplib.h, httplib.cc, and httplib.cppm. (Could we replace .cc with .cpp so that it aligns with .cppm? I'll leave this decision up to you, I personally prefer .cpp for the aforementioned reason but it's nothing dealbreaking, I don't particularly mind either way.) It configures to use Ninja as the build system, and indicates to the build system we wish to use modules. Of course, the compiler must support modules; see arewemodulesyet/tools for versions.

cmake --build build

This performs the actual build. All of the compiler configuration is handled by the generated build system files.

Copy link
Contributor

@Tachi107 Tachi107 left a comment

Choose a reason for hiding this comment

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

Some more comments :)

@Tachi107
Copy link
Contributor

(Could we replace .cc with .cpp so that it aligns with .cppm? I'll leave this decision up to you, I personally prefer .cpp for the aforementioned reason but it's nothing dealbreaking, I don't particularly mind either way.)

This would create issues for people who have hardcoded .cc in their build scripts, without any really advantage apart from a cosmetic difference :/

@Tachi107
Copy link
Contributor

Tachi107 commented Jan 15, 2026 via email

@Tachi107
Copy link
Contributor

Tachi107 commented Jan 15, 2026 via email

Co-authored-by: Andrea Pappacoda <[email protected]>
@mikomikotaishi
Copy link
Contributor Author

OK, I'll instead put it behind an include call

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.

6 participants