1 cmake_minimum_required(VERSION 3.11)
2 project(function2 VERSION 4.2.0 LANGUAGES CXX)
4 if (NOT FU2_IS_FIND_INCLUDED)
5 string(COMPARE EQUAL ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR}
6 FU2_IS_TOP_LEVEL_PROJECT)
9 if (FU2_IS_TOP_LEVEL_PROJECT)
10 add_library(function2 INTERFACE)
12 add_library(function2 INTERFACE IMPORTED GLOBAL)
15 add_library(function2::function2 ALIAS function2)
17 target_include_directories(function2
19 $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
20 $<INSTALL_INTERFACE:include>)
22 target_compile_features(function2
31 cxx_lambda_init_captures
33 cxx_variadic_templates
34 cxx_defaulted_functions
36 cxx_trailing_return_types
37 cxx_return_type_deduction)
39 if (FU2_IS_TOP_LEVEL_PROJECT)
40 include(ExternalProject)
41 include(GNUInstallDirs)
42 include(CMakePackageConfigHelpers)
44 # Create an install target:
45 # Headers and license files
46 install(DIRECTORY "${PROJECT_SOURCE_DIR}/include/function2"
47 DESTINATION "include")
48 install(FILES "LICENSE.txt" DESTINATION .)
49 install(FILES "Readme.md" DESTINATION .)
52 write_basic_package_version_file(
53 "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
54 VERSION ${PROJECT_VERSION}
55 COMPATIBILITY SameMajorVersion)
56 install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
57 DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
60 configure_package_config_file("cmake/config.cmake.in"
61 "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
62 INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
63 # PATH_VARS INCLUDE_INSTALL_DIR SYSCONFIG_INSTALL_DIR
65 install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
66 DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
69 export(TARGETS ${PROJECT_NAME}
70 NAMESPACE ${PROJECT_NAME}::
71 FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Targets.cmake")
72 install(TARGETS ${PROJECT_NAME}
73 EXPORT "${PROJECT_NAME}Targets"
74 INCLUDES DESTINATION "include")
75 install(EXPORT "${PROJECT_NAME}Targets"
76 NAMESPACE ${PROJECT_NAME}::
77 DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
79 # Setup CPack for bundling
80 set(CPACK_GENERATOR "ZIP")
81 set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
82 set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR})
83 set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH})
85 # Since the header only library is platform independent
86 # we name the packages after the native line feed
88 set(CPACK_SYSTEM_NAME "crlf")
90 set(CPACK_SYSTEM_NAME "lf")
96 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
97 string(REGEX REPLACE "/W[0-4]" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
98 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
99 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
100 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /permissive-")
103 include(cmake/CMakeLists.txt)
107 option(FU2_WITH_NO_EXCEPTIONS
108 "Test without exceptions"
110 option(FU2_WITH_NO_DEATH_TESTS
111 "Test without death tests"
113 option(FU2_WITH_CPP_LATEST
114 "Enable the highest C++ standard available for testing polyfills"
116 option(FU2_WITH_LIMITED_EMPTY_PROPAGATION
117 "Test limiting empty propagation to only function pointers, member pointers, std::function, and specializations of fu2::function_base"
121 if (FU2_WITH_NO_EXCEPTIONS)
122 message(STATUS "Testing with exceptions disabled")
123 add_definitions(-DTESTS_NO_EXCEPTIONS)
126 if (FU2_WITH_NO_DEATH_TESTS)
127 message(STATUS "Testing without death tests")
128 add_definitions(-DTESTS_NO_DEATH_TESTS)
131 if (FU2_WITH_LIMITED_EMPTY_PROPAGATION)
132 message(STATUS "Testing with limited empty propagation")
133 add_definitions(-DFU2_WITH_LIMITED_EMPTY_PROPAGATION)
136 add_subdirectory(test)