cmake_minimum_required(VERSION 3.15)#setthe project name and versionproject(Tutorial VERSION 1.0)set(CMAKE_DEBUG_POSTFIX d)add_library(tutorial_compiler_flags INTERFACE)target_compile_features(tutorial_compiler_flags INTERFACE cxx_std_11)#addcompiler warning flags just when building this project via#theBUILD_INTERFACE genexset(gcc_like_cxx "$<COMPILE_LANG_AND_ID:CXX,ARMClang,AppleClang,Clang,GNU,LCC>")set(msvc_cxx "$<COMPILE_LANG_AND_ID:CXX,MSVC>")target_compile_options(tutorial_compiler_flags INTERFACE
"$<${gcc_like_cxx}:$<BUILD_INTERFACE:-Wall;-Wextra;-Wshadow;-Wformat=2;-Wunused>>""$<${msvc_cxx}:$<BUILD_INTERFACE:-W3>>")#controlwhere the static and shared libraries are built so that on windows#wedon't need to tinker with the path to run the executableset(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")option(BUILD_SHARED_LIBS "Build using shared libraries" ON)if(APPLE)set(CMAKE_INSTALL_RPATH "@executable_path/../lib")elseif(UNIX)set(CMAKE_INSTALL_RPATH "$ORIGIN/../lib")endif()#configurea header file to pass the version number onlyconfigure_file(TutorialConfig.h.in TutorialConfig.h)#addthe MathFunctions libraryadd_subdirectory(MathFunctions)#addthe executableadd_executable(Tutorial tutorial.cxx)set_target_properties(Tutorial PROPERTIES DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX})set_property(TARGET MathFunctions PROPERTY VERSION "1.0.0")set_property(TARGET MathFunctions PROPERTY SOVERSION "1")target_link_libraries(Tutorial PUBLIC MathFunctions tutorial_compiler_flags)#addthe binary tree to the search path for include files#sothat we will find TutorialConfig.htarget_include_directories(Tutorial PUBLIC
"${PROJECT_BINARY_DIR}")#addthe install targetsinstall(TARGETS Tutorial DESTINATION bin)install(FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h"
DESTINATION include
)#enabletestingenable_testing()#doesthe application runadd_test(NAME Runs COMMAND Tutorial 25)#doesthe usage message work?add_test(NAME Usage COMMAND Tutorial)set_tests_properties(Usage
PROPERTIES PASS_REGULAR_EXPRESSION "Usage:.*number")#defineafunction to simplify adding testsfunction(do_test target arg result)add_test(NAME Comp${arg} COMMAND ${target} ${arg})set_tests_properties(Comp${arg}
PROPERTIES PASS_REGULAR_EXPRESSION ${result})endfunction()#doa bunch of result based testsdo_test(Tutorial 4"4 is 2")do_test(Tutorial 9"9 is 3")do_test(Tutorial 5"5 is 2.236")do_test(Tutorial 7"7 is 2.645")do_test(Tutorial 25"25 is 5")do_test(Tutorial -25"-25 is (-nan|nan|0)")do_test(Tutorial 0.0001"0.0001 is 0.01")#setupinstallerinclude(InstallRequiredSystemLibraries)set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/License.txt")set(CPACK_PACKAGE_VERSION_MAJOR "${Tutorial_VERSION_MAJOR}")set(CPACK_PACKAGE_VERSION_MINOR "${Tutorial_VERSION_MINOR}")include(CPack)install(EXPORT MathFunctionsTargets
FILE MathFunctionsTargets.cmake
DESTINATION lib/cmake/MathFunctions
)include(CMakePackageConfigHelpers)#generatethe config file that includes the exportsconfigure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in
"${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfig.cmake"
INSTALL_DESTINATION "lib/cmake/MathFunctions"
NO_SET_AND_CHECK_MACRO
NO_CHECK_REQUIRED_COMPONENTS_MACRO
)#generatethe version file for the config filewrite_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfigVersion.cmake"
VERSION "${Tutorial_VERSION_MAJOR}.${Tutorial_VERSION_MINOR}"
COMPATIBILITY AnyNewerVersion
)#installthe generated configuration filesinstall(FILES
${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfig.cmake
${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfigVersion.cmake
DESTINATION lib/cmake/MathFunctions
)#generatethe export targets for the build tree#needsto be after the install(TARGETS) commandexport(EXPORT MathFunctionsTargets
FILE "${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsTargets.cmake")