[build2] C++ modules: how to generate the modules-list for own library

Wilhelm Meier wilhelm.meier at hs-kl.de
Tue May 9 11:05:29 UTC 2023

Actually I'm using the following buildfile:
config.cxx = /usr/local/bin/avr-g++

cxx.std = experimental
cxx.features.modules = true

config.cxx.target = avr-none-none

using cxx

assert $cxx.features.modules "no modules support for $cxx.signature"

mxx{*}: extension = mpp
cxx{*}: extension = cc

exe{test00}: cxx{test00}

cxx.modules = std=../../../include/std/std.mpp \
std:array=../../../include/std/array.mpp \

All module interface units are *.mpp file in the
directory ../../../include/std/.

The main TU is in test00.cc:
import std;

int main() {
     std::array<int, 3> arr;

This gives the following errors:

/usr/local/bin/avr-g++ -std=c++23 -fmodules-ts -finput-charset=UTF-8 -E 
-x c++ -fpreprocessed -fdirectives-only 
/usr/local/bin/avr-g++ -std=c++23 -fmodules-ts -fdiagnostics-color 
-finput-charset=UTF-8 -fmodule-mapper=test00.o.d?@ -o test00.o -c -x c++ 
-fpreprocessed -fdirectives-only 
error: unknown Compiled Module Interface: no such module
1 | import std;
| ^~~~~~
In module imported at 
std: error: failed to read compiled module: Unknown CMI mapping
std: note: imports must be built before being imported
std: fatal error: returning to the gate for a mechanical issue
compilation terminated.
error: process /usr/local/bin/avr-g++ exited with code 1
info: while updating 
info: while updating 
info: while updating 
info: failed to update 

On 08.05.23 15:31, Boris Kolpackov wrote:
> Wilhelm Meier <wilhelm.meier at hs-kl.de> writes:
>> I want to convert a own header-only library to a version using modules.
>> Because it is a header-only library (mostly templates) I'm using module
>> interface unit as *.cpp files in some directory structure. Seldom I split a
>> module in module-partitions with more than one *.cpp file.
>> If I want to use this modules, the build-tool needs a mapping between module
>> names an the corresponding *.cpp files of our library.
> Is this header-only library built with build2? If so, you (normally)
> don't need an explicit mapping. For example, if your module interface
> is in foo.cpp, then (normally) all you need is:
> lib{foo}: mxx{foo.cpp}

More information about the users mailing list