visual studio – CMake support of C++20 modules partitions with Ninja generator


I’m trying to build CMake project with Ninja generator. Same project builds without errors when generated with Visual Studio 2022 generator. Does Ninja generator support partitions?

The error is:

C:\cmake\bin\ninja\cl : Command line warning D9025: overriding ‘/std:c++20’ with ‘/std:c++latest’
[3/8] Generating CXX dyndep file Common\Collector\CMakeFiles\Collector.dir\CXX.dd
FAILED: Common/Collector/CMakeFiles/Collector.dir/CXX.dd C:/cmake/bin/ninja/Common/Collector/CMakeFiles/Collector.dir/CXXModules.json Common/Collector/CMakeFiles/Collector.dir/MetricAgent.cpp.obj.modmap Common/Collector/CMakeFiles/Collector.dir/MetricCollector.cpp.obj.modmap Common/Collector/CMakeFiles/Collector.dir/MetricAgent.ixx.obj.modmap Common/Collector/CMakeFiles/Collector.dir/MetricCollector.ixx.obj.modmap
“C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe” -E cmake_ninja_dyndep –tdi=Common\Collector\CMakeFiles\Collector.dir\CXXDependInfo.json –lang=CXX –modmapfmt=msvc –dd=Common\Collector\CMakeFiles\Collector.dir\CXX.dd @Common\Collector\CMakeFiles\Collector.dir\CXX.dd.rsp
C:\cmake\bin\ninja\EXEC : CMake error : Output Common\Collector\CMakeFiles\Collector.dir\MetricAgent.cpp.obj provides the MetricCollector:Agent module but it is not found in a FILE_SET of type CXX_MODULES
ninja: build stopped: subcommand failed.

Build failed.

My CMakeLists.txt file is the following:
Top level CMakeLists.txt:

cmake_minimum_required(VERSION 3.29)
project(TaegisAgent LANGUAGES CXX)
# Set the C++ standard to C++20
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_EXPERIMENTAL_CXX_MODULE_DYNDEP 1)
set(CXX_SCAN_FOR_MODULES ON)
set(CMAKE_CXX_SCAN_FOR_MODULES ON)

Project Level CMakeLists.txt:

project(Collector CXX)
set(CODE_SOURCES MetricAgent.cpp MetricCollector.cpp )
set(INTERF_SOURCES MetricAgent.ixx MetricCollector.ixx )
add_library(${PROJECT_NAME} STATIC ${CODE_SOURCES} ${INTERF_SOURCES})
target_sources(${PROJECT_NAME}
    PRIVATE 
        ${CODE_SOURCES}
    PUBLIC
        FILE_SET CXX_MODULES
    BASE_DIRS
        ${CMAKE_SOURCE_DIR}/Common/Collector
    FILES
        ${INTERF_SOURCES}
    )

The interface files are:
MatricCollector.ixx:

module;
export module MetricCollector;
export import : Agent;

MatricCollector.cpp:

module;
module MetricCollector;

MetricAgent.ixx:

module;
export module MetricCollector : Agent;

MetricAgent.cpp:

module;
module MetricCollector : Agent;

Any help would be appreciated.

Leave a Reply

Your email address will not be published. Required fields are marked *