# How to test for CXX module availability

**URL:** https://discourse.cmake.org/t/how-to-test-for-cxx-module-availability/14266
**Category:** Usage
**Created:** [June 19, 2025, 10:14pm UTC](https://discourse.cmake.org/t/how-to-test-for-cxx-module-availability/14266 "2025-06-19T22:14:54Z")
**Posts on this page:** 1
**Showing post:** 2

<div class="post-metadata">

### Author: ![ClausKlein](https://discourse.cmake.org/user_avatar/discourse.cmake.org/clausklein/32/352_2.png) [@ClausKlein](https://discourse.cmake.org/u/ClausKlein)
#### Post date: [June 19, 2025, 10:49pm UTC](https://discourse.cmake.org/t/how-to-test-for-cxx-module-availability/14266/2 "2025-06-19T22:49:16Z")

</div>

I have a just running example here [GitHub - ClausKlein/cmake-init-modules: C++20 Modules, CMake, And Shared Libraries](https://github.com/ClausKlein/cmake-init-modules?tab=readme-ov-file#cmake-init-modules)

The main restrictions are: you must use the most resent tools and the Ninja generator!

```cmake
# This property setting also needs to be consistent between the
# installed shared library and its consumer, otherwise most
# toolchains will once again reject the consumer's generated BMI.
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_EXTENSIONS ON)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

if(CMAKE_GENERATOR STREQUAL "Ninja")
  if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 20.0
  )
    set(ALGO_USE_MODULES TRUE)
    string(APPEND CMAKE_CXX_MODULE_MAP_FLAG " -fmodules-reduced-bmi")

    # see https://releases.llvm.org/20.0.0/projects/libcxx/docs/ReleaseNotes.html
    # Always use libc++
    if(APPLE)
      execute_process(OUTPUT_VARIABLE LLVM_PREFIX COMMAND brew --prefix llvm@20 COMMAND_ECHO STDOUT)
      string(STRIP ${LLVM_PREFIX} LLVM_PREFIX)
      file(REAL_PATH ${LLVM_PREFIX} LLVM_ROOT)
      set(LLVM_ROOT ${LLVM_ROOT} CACHE PATH "")

      message(STATUS "LLVM_ROOT=${LLVM_ROOT}")
      add_link_options(-L${LLVM_ROOT}/lib/c++)
      include_directories(SYSTEM ${LLVM_ROOT}/include)
    endif()

    add_compile_options(-stdlib=libc++)
    add_link_options(-stdlib=libc++)
  elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 15.0
  )
    set(ALGO_USE_MODULES TRUE)
  elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
    set(ALGO_USE_MODULES TRUE)
  endif()
endif()

# Tell CMake that we explicitly want `import std`.
# This will initialize the property on all targets declared after this to 1
message(STATUS "CMAKE_CXX_COMPILER_IMPORT_STD=${CMAKE_CXX_COMPILER_IMPORT_STD}")
if(23 IN_LIST CMAKE_CXX_COMPILER_IMPORT_STD)
  set(CMAKE_CXX_MODULE_STD ON)
  message(STATUS "CMAKE_CXX_MODULE_STD=${CMAKE_CXX_MODULE_STD}")
endif()

message(STATUS "ALGO_USE_MODULES=${ALGO_USE_MODULES}")
message(STATUS "CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES=${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES}")

```

---

_[View the full topic](https://discourse.cmake.org/t/how-to-test-for-cxx-module-availability/14266)._
