146 lines
4.8 KiB
CMake
146 lines
4.8 KiB
CMake
|
# cmake_minimum_required(VERSION 3.11)
|
||
|
cmake_minimum_required(VERSION 3.11)
|
||
|
|
||
|
## Declare a project named "cmake-exercise"
|
||
|
project(cmake-exercise VERSION 0.90.0)
|
||
|
|
||
|
if(CMAKE_BINARY_DIR STREQUAL CMAKE_SOURCE_DIR)
|
||
|
message(FATAL_ERROR "Don't build in the source directory, pretty please.")
|
||
|
endif()
|
||
|
|
||
|
## Includes
|
||
|
include(GNUInstallDirs)
|
||
|
include(GenerateExportHeader)
|
||
|
include(CMakePackageConfigHelpers)
|
||
|
|
||
|
## Find necessary packages
|
||
|
find_package(OpenMP)
|
||
|
find_package(Threads REQUIRED)
|
||
|
|
||
|
## Artifacts to create
|
||
|
add_library(obj OBJECT)
|
||
|
add_library(static STATIC)
|
||
|
add_library(shared SHARED)
|
||
|
add_library(interface INTERFACE)
|
||
|
add_executable(tests)
|
||
|
|
||
|
## Generate other files
|
||
|
generate_export_header(shared
|
||
|
BASE_NAME DSO
|
||
|
EXPORT_FILE_NAME include/cmake-exercise/config.hh)
|
||
|
|
||
|
## Specify source files
|
||
|
target_sources(obj
|
||
|
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/cmake-exercise/a.hh>
|
||
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/cmake-exercise/a.hh>
|
||
|
PRIVATE src/a.cc)
|
||
|
target_sources(shared
|
||
|
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/cmake-exercise/b.hh>
|
||
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/cmake-exercise/b.hh>
|
||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include/cmake-exercise/config.hh>
|
||
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/cmake-exercise/config.hh>
|
||
|
PRIVATE src/b.cc
|
||
|
$<TARGET_PROPERTY:obj,INTERFACE_SOURCES>
|
||
|
$<TARGET_OBJECTS:obj>)
|
||
|
target_sources(interface
|
||
|
INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/cmake-exercise/c.hh>
|
||
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/cmake-exercise/c.hh>)
|
||
|
target_sources(tests
|
||
|
PRIVATE test/test.cc)
|
||
|
|
||
|
|
||
|
## Add include folders
|
||
|
target_include_directories(interface
|
||
|
INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
||
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
|
||
|
target_include_directories(obj
|
||
|
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
||
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
|
||
|
target_include_directories(shared
|
||
|
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
|
||
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
|
||
|
|
||
|
|
||
|
## Set target properties for visibility and PIC
|
||
|
set_property(TARGET obj PROPERTY POSITION_INDEPENDENT_CODE TRUE)
|
||
|
set_property(TARGET obj shared PROPERTY CXX_VISIBILITY_PRESET hidden)
|
||
|
set_property(TARGET obj shared PROPERTY VISIBILITY_INLINES_HIDDEN TRUE)
|
||
|
|
||
|
|
||
|
## Specify C++ version to use
|
||
|
target_compile_features(interface
|
||
|
INTERFACE cxx_std_11)
|
||
|
target_compile_features(obj
|
||
|
INTERFACE cxx_std_11
|
||
|
PRIVATE cxx_std_14)
|
||
|
|
||
|
|
||
|
## Link to other libraries, and inherit their settings
|
||
|
target_link_libraries(obj
|
||
|
PUBLIC Threads::Threads)
|
||
|
target_link_libraries(static
|
||
|
PRIVATE interface
|
||
|
PUBLIC obj)
|
||
|
target_link_libraries(shared
|
||
|
PRIVATE interface obj)
|
||
|
target_link_libraries(tests
|
||
|
PRIVATE static)
|
||
|
|
||
|
if(TARGET OpenMP::OpenMP_CXX)
|
||
|
target_compile_definitions(tests PRIVATE HAVE_OPENMP)
|
||
|
target_link_libraries(tests PRIVATE OpenMP::OpenMP_CXX)
|
||
|
endif()
|
||
|
|
||
|
|
||
|
## Install all needed files for packaging
|
||
|
install(FILES $<TARGET_PROPERTY:shared,INTERFACE_SOURCES>
|
||
|
$<TARGET_PROPERTY:interface,INTERFACE_SOURCES>
|
||
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||
|
COMPONENT devel)
|
||
|
install(TARGETS shared
|
||
|
EXPORT cmake-exercise
|
||
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||
|
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
|
||
|
install(TARGETS obj interface
|
||
|
EXPORT cmake-exercise
|
||
|
COMPONENT devel
|
||
|
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
|
||
|
install(TARGETS tests
|
||
|
DESTINATION ${CMAKE_INSTALL_DATADIR}/cmake-exercise/test
|
||
|
COMPONENT test)
|
||
|
|
||
|
## Add a test
|
||
|
enable_testing()
|
||
|
add_test(NAME not-really-a-test
|
||
|
COMMAND tests --ignored-param)
|
||
|
|
||
|
|
||
|
## Generate the export sets to be able to import this project
|
||
|
## in other projects via find_package (the config file is not complete though)
|
||
|
set(CMAKE_INSTALL_CMAKEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/cmake-exercise)
|
||
|
export(EXPORT cmake-exercise
|
||
|
NAMESPACE cmake-exercise::
|
||
|
FILE cmake-exercise-targets.cmake)
|
||
|
install(EXPORT cmake-exercise
|
||
|
NAMESPACE cmake-exercise::
|
||
|
DESTINATION ${CMAKE_INSTALL_CMAKEDIR}
|
||
|
FILE cmake-exercise-targets.cmake
|
||
|
COMPONENT devel)
|
||
|
configure_package_config_file(cmake-exercise-config.cmake.in
|
||
|
cmake-exercise-config.cmake
|
||
|
INSTALL_DESTINATION ${CMAKE_INSTALL_CMAKEDIR})
|
||
|
write_basic_package_version_file(cmake-exercise-version.cmake
|
||
|
COMPATIBILITY SameMajorVersion)
|
||
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/cmake-exercise-config.cmake
|
||
|
${CMAKE_CURRENT_BINARY_DIR}/cmake-exercise-version.cmake
|
||
|
DESTINATION ${CMAKE_INSTALL_CMAKEDIR}
|
||
|
COMPONENT devel)
|
||
|
|
||
|
|
||
|
## Trigger packaging
|
||
|
set(CPACK_PACKAGE_FILE_NAME package)
|
||
|
set(CPACK_GENERATOR TXZ)
|
||
|
set(CPACK_ARCHIVE_COMPONENT_INSTALL TRUE)
|
||
|
include(CPack)
|