Reputation: 99
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
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