How to use c++20 modules with CMake?

后端 未结 4 655
佛祖请我去吃肉
佛祖请我去吃肉 2021-01-03 22:27

Clang and MSVC already supports Modules TS from unfinished C++20 standard. Can I build my modules based project with CMake or other build system and how?

I tried bui

4条回答
  •  青春惊慌失措
    2021-01-03 22:49

    This works on Linux Manjaro (same as Arch), but should work on any Unix OS. Of course, you need to build with new clang (tested with clang-10).

    helloworld.cpp:

    export module helloworld;
    import ;
    export void hello() { puts("Hello world!"); }
    

    main.cpp:

    import helloworld;  // import declaration
    
    int main() {
        hello();
    }
    

    CMakeLists.txt:

    cmake_minimum_required(VERSION 3.16)
    project(main)
    
    set(CMAKE_CXX_STANDARD 20)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    set(CMAKE_CXX_EXTENSIONS OFF)
    set(PREBUILT_MODULE_PATH ${CMAKE_BINARY_DIR}/modules)
    
    function(add_module name)
        file(MAKE_DIRECTORY ${PREBUILT_MODULE_PATH})
        add_custom_target(${name}.pcm
                COMMAND
                    ${CMAKE_CXX_COMPILER}
                    -std=c++20
                    -stdlib=libc++
                    -fmodules
                    -c
                    ${CMAKE_CURRENT_SOURCE_DIR}/${ARGN}
                    -Xclang -emit-module-interface
                    -o ${PREBUILT_MODULE_PATH}/${name}.pcm
    
                )
    endfunction()
    
    
    add_compile_options(-fmodules)
    add_compile_options(-stdlib=libc++)
    add_compile_options(-fbuiltin-module-map)
    add_compile_options(-fimplicit-module-maps)
    add_compile_options(-fprebuilt-module-path=${PREBUILT_MODULE_PATH})
    
    add_module(helloworld helloworld.cpp)
    add_executable(main
            main.cpp
            helloworld.cpp
            )
    add_dependencies(main helloworld.pcm)
    
    

提交回复
热议问题