Ne C
Ne C

Reputation: 99

Provide Config.cmake for libraries using C++20 modules

I have a library written in C++20 modules. I previously used this library in the form of add_subdirectory(../NeLib ${CMAKE_CURRENT_BINARY_DIR}/NeLib) Now I hope that after I provide a NeLibConfig.cmake, other projects can use it directly through find_package

The project structure is:

NeLib File.cppm Image.cppm ... (Some other libraries,All are cppm files) CMakeLists.txt NeLibConfig.cmake.in

The content of the CMakeLists.txt file is:

cmake_minimum_required(VERSION 3.29)
project(NeLib)

set(CMAKE_CXX_COMPILER "/usr/bin/clang++")
set(VERSION "1.0.0")
set(CMAKE_CXX_STANDARD 23)
find_package(OpenCV REQUIRED)

add_library(NeLib STATIC )

file(GLOB module_files "*.cppm")

configure_file(
    "${CMAKE_CURRENT_SOURCE_DIR}/NeLibConfig.cmake.in"
    "${CMAKE_CURRENT_BINARY_DIR}/NeLibConfig.cmake"
    @ONLY
)
target_sources(NeLib
    PUBLIC
    FILE_SET cxx_modules TYPE CXX_MODULES FILES
    ${module_files}
)

install(TARGETS  ${PROJECT_NAME}  DESTINATION /usr/lib EXPORT ${PROJECT_NAME} FILE_SET cxx_modules)
install(EXPORT ${PROJECT_NAME} DESTINATION /usr/lib/cmake/NeLib/)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/NeLibConfig.cmake"
        DESTINATION "${test_INSTALL_DIR}/lib/cmake/NeLib/")

The content of the NeLibConfig.cmake.in file is:

@PACKAGE_INIT@
set(NeLib_VERSION "1.0.0")
set(NeLib_SOVERSION "1.0")

find_library(NeLib_LIBRARIES
    NAMES libNeLib.a
    HINTS ${CMAKE_INSTALL_PREFIX}/lib/${PROJECT_NAME}
)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(NeLib
    REQUIRED_VARS NeLib_LIBRARIES
    VERSION_VAR NeLib_VERSION
)

if(NeLib_FOUND)
    add_library(NeLib::NeLib INTERFACE IMPORTED)
    set_target_properties(NeLib::NeLib PROPERTIES
        INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/include/${PROJECT_NAME}"
        IMPORTED_LOCATION "${NeLib_LIBRARIES}"
        INTERFACE_LINK_LIBRARIES "OpenCV::opencv_core"
    )
endif()

Then we install this library:

sudo cmake --install .command intercepts part of the information as follows:

-- Install configuration: ""
-- Up-to-date: /usr/lib/libNeLib.a
-- Up-to-date: /usr/lib/Image.cppm
-- Up-to-date: /usr/lib/cmake/NeLib/NeLib.cmake
-- Up-to-date: /usr/lib/cmake/NeLib/NeLib-noconfig.cmake
-- Installing: /lib/cmake/NeLib/NeLibConfig.cmake

Use this library in a new project: CMakeLists.txt

cmake_minimum_required(VERSION 3.29)
project(untitled)
set(CMAKE_CXX_STANDARD 23)
find_package(NeLib REQUIRED)
add_executable(untitled
    main.cpp
)
target_link_libraries(untitled
    NeLib
)

main.cpp

import Image;

int main () {
    nl::Image image("../desk.png");
    image.show("show");
    return 0;
}

Compile error:

/opt/clion/bin/cmake/linux/x64/bin/cmake --build /home/yongheng/Projects/untitled/cmake-build-debug --target untitled -j 10
[3/4] Building CXX object CMakeFiles/untitled.dir/main.cpp.o
FAILED: CMakeFiles/untitled.dir/main.cpp.o 
/usr/bin/clang++   -g -std=gnu++23 -fcolor-diagnostics -MD -MT CMakeFiles/untitled.dir/main.cpp.o -MF CMakeFiles/untitled.dir/main.cpp.o.d @CMakeFiles/untitled.dir/main.cpp.o.modmap -o CMakeFiles/untitled.dir/main.cpp.o -c /home/yongheng/Projects/untitled/main.cpp
/home/yongheng/Projects/untitled/main.cpp:1:8: fatal error: module 'Image' not found
    1 | import Image;
      | ~~~~~~~^~~~~
1 error generated.
ninja: build stopped: subcommand failed.

Upvotes: 0

Views: 50

Answers (1)

Ne C
Ne C

Reputation: 99

CMakeLists.txt to :

cmake_minimum_required(VERSION 3.29)
project(NeLib)

# set(CMAKE_CXX_COMPILER "/usr/bin/clang++")
set(VERSION "1.0.0")
set(CMAKE_CXX_STANDARD 23)
find_package(OpenCV REQUIRED)

add_library(NeLib STATIC )

file(GLOB module_files "*.cppm")

configure_file(
    "${CMAKE_CURRENT_SOURCE_DIR}/NeLibConfig.cmake.in"
    "${CMAKE_CURRENT_BINARY_DIR}/NeLibConfig.cmake"
    @ONLY
)
target_sources(NeLib
    PUBLIC
    FILE_SET cxx_modules TYPE CXX_MODULES FILES
    ${module_files}
)

target_compile_features(NeLib PUBLIC cxx_std_23)

install(TARGETS  ${PROJECT_NAME}  DESTINATION /usr/lib EXPORT ${PROJECT_NAME} FILE_SET cxx_modules)
install(EXPORT ${PROJECT_NAME} DESTINATION /usr/lib/cmake/NeLib/)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/NeLibConfig.cmake"
        DESTINATION "${test_INSTALL_DIR}/lib/cmake/NeLib/")

NeLibConfig.cmake.in to:

@PACKAGE_INIT@
include ( "${CMAKE_CURRENT_LIST_DIR}/NeLib.cmake" )

Upvotes: 0

Related Questions