1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
cmake_minimum_required(VERSION 3.18.2)
project(MyMath VERSION 1.0)
# C++ standard
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_C_EXTENSIONS OFF)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Common installation directories
include(GNUInstallDirs)
# Use -fPIC even if statically compiled
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# ============
# math library
# ============
# Create the mymath library
add_library(mymath
src/mymath.h
src/mymath.cpp)
add_library(MyMath::mymath ALIAS mymath)
set_target_properties(mymath PROPERTIES
PUBLIC_HEADER src/mymath.h)
target_include_directories(mymath PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
# =======================
# print_answer executable
# =======================
# Create the print_answer executable
add_executable(print_answer src/print_answer.cpp)
# =======
# Install
# =======
# See official documentation on exporting targets:
# https://cmake.org/cmake/help/latest/guide/importing-exporting/index.html#exporting-targets
# Install the target with C++ code
install(
TARGETS mymath print_answer
EXPORT MyMathTargets
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
# Install the exported targets
install(
EXPORT MyMathTargets
FILE MyMathTargets.cmake
NAMESPACE MyMath::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MyMath)
# Create a CMake package
include(CMakePackageConfigHelpers)
# Prepare the Config.cmake.in content
set(PACKAGE_INIT_MACRO "@PACKAGE_INIT@")
set(CONFIG_CMAKE_IN "\
@PACKAGE_INIT_MACRO@\n\
include(\"\${CMAKE_CURRENT_LIST_DIR}/MyMathTargets.cmake\")\n\
check_required_components(MyMath)\n"
)
# Create Config.cmake.in
file(CONFIGURE
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Config.cmake.in
CONTENT ${CONFIG_CMAKE_IN}
@ONLY)
# Create MyMathConfig.cmake
configure_package_config_file(
${CMAKE_CURRENT_BINARY_DIR}/Config.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/MyMathConfig.cmake
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MyMath)
# Create MyMathConfigVersion.cmake
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/MyMathConfigVersion.cmake"
VERSION "${version}"
COMPATIBILITY AnyNewerVersion
)
# Install CMake package files
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/MyMathConfig.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/MyMathConfigVersion.cmake"
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MyMath
)
# ===============
# Python bindings
# ===============
# Find Python3 and NumPy
find_package(Python3 COMPONENTS Interpreter Development.Module NumPy REQUIRED)
# Handle where to install the resulting Python package
if(CALL_FROM_SETUP_PY)
# The CMakeExtension will set CMAKE_INSTALL_PREFIX to the root
# of the resulting wheel archive
set(MYMATH_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX})
else()
# The Python package is installed directly in the folder of the
# detected interpreter (system, user, or virtualenv)
set(MYMATH_INSTALL_PREFIX ${Python3_SITELIB})
endif()
# =============
# SWIG bindings
# =============
if(EXAMPLE_WITH_SWIG)
# Rename the executable
set_target_properties(print_answer PROPERTIES OUTPUT_NAME print_answer_swig)
# Add the bindings
add_subdirectory(bindings_swig)
endif()
# =================
# Pybind11 bindings
# =================
if(EXAMPLE_WITH_PYBIND11)
# Rename the executable
set_target_properties(print_answer PROPERTIES OUTPUT_NAME print_answer_pybind11)
# Add the bindings
add_subdirectory(bindings_pybind11)
endif()
|