CMakeLists.txt (5730B)
1 # 3.5 is actually available almost everywhere, but this a good minimum 2 cmake_minimum_required(VERSION 3.4) 3 4 # enable MSVC_RUNTIME_LIBRARY target property 5 # see https://cmake.org/cmake/help/latest/policy/CMP0091.html 6 if(POLICY CMP0091) 7 cmake_policy(SET CMP0091 NEW) 8 endif() 9 10 project(YAML_CPP VERSION 0.7.0 LANGUAGES CXX) 11 12 include(CMakePackageConfigHelpers) 13 include(CMakeDependentOption) 14 include(CheckCXXCompilerFlag) 15 include(GNUInstallDirs) 16 include(CTest) 17 18 find_program(YAML_CPP_CLANG_FORMAT_EXE NAMES clang-format) 19 20 option(YAML_CPP_BUILD_CONTRIB "Enable yaml-cpp contrib in library" ON) 21 option(YAML_CPP_BUILD_TOOLS "Enable parse tools" ON) 22 option(YAML_BUILD_SHARED_LIBS "Build yaml-cpp shared library" ${BUILD_SHARED_LIBS}) 23 24 cmake_dependent_option(YAML_CPP_BUILD_TESTS 25 "Enable yaml-cpp tests" ON 26 "BUILD_TESTING;CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR" OFF) 27 cmake_dependent_option(YAML_CPP_INSTALL 28 "Enable generation of yaml-cpp install targets" ON 29 "CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR" OFF) 30 cmake_dependent_option(YAML_MSVC_SHARED_RT 31 "MSVC: Build yaml-cpp with shared runtime libs (/MD)" ON 32 "MSVC" OFF) 33 34 set(yaml-cpp-type STATIC) 35 set(yaml-cpp-label-postfix "static") 36 if (YAML_BUILD_SHARED_LIBS) 37 set(yaml-cpp-type SHARED) 38 set(yaml-cpp-label-postfix "shared") 39 endif() 40 41 set(build-shared $<BOOL:${YAML_BUILD_SHARED_LIBS}>) 42 set(build-windows-dll $<AND:$<BOOL:${CMAKE_HOST_WIN32}>,${build-shared}>) 43 set(not-msvc $<NOT:$<CXX_COMPILER_ID:MSVC>>) 44 set(msvc-shared_rt $<BOOL:${YAML_MSVC_SHARED_RT}>) 45 46 if (NOT DEFINED CMAKE_MSVC_RUNTIME_LIBRARY) 47 set(CMAKE_MSVC_RUNTIME_LIBRARY 48 MultiThreaded$<$<CONFIG:Debug>:Debug>$<${msvc-shared_rt}:DLL>) 49 endif() 50 51 set(contrib-pattern "src/contrib/*.cpp") 52 set(src-pattern "src/*.cpp") 53 if (CMAKE_VERSION VERSION_GREATER 3.12) 54 list(INSERT contrib-pattern 0 CONFIGURE_DEPENDS) 55 list(INSERT src-pattern 0 CONFIGURE_DEPENDS) 56 endif() 57 58 file(GLOB yaml-cpp-contrib-sources ${contrib-pattern}) 59 file(GLOB yaml-cpp-sources ${src-pattern}) 60 61 set(msvc-rt $<TARGET_PROPERTY:MSVC_RUNTIME_LIBRARY>) 62 63 set(msvc-rt-mtd-static $<STREQUAL:${msvc-rt},MultiThreadedDebug>) 64 set(msvc-rt-mt-static $<STREQUAL:${msvc-rt},MultiThreaded>) 65 66 set(msvc-rt-mtd-dll $<STREQUAL:${msvc-rt},MultiThreadedDebugDLL>) 67 set(msvc-rt-mt-dll $<STREQUAL:${msvc-rt},MultiThreadedDLL>) 68 69 set(backport-msvc-runtime $<VERSION_LESS:${CMAKE_VERSION},3.15>) 70 71 add_library(yaml-cpp ${yaml-cpp-type} "") 72 add_library(yaml-cpp::yaml-cpp ALIAS yaml-cpp) 73 74 set_property(TARGET yaml-cpp 75 PROPERTY 76 MSVC_RUNTIME_LIBRARY ${CMAKE_MSVC_RUNTIME_LIBRARY}) 77 set_property(TARGET yaml-cpp 78 PROPERTY 79 CXX_STANDARD_REQUIRED ON) 80 81 target_include_directories(yaml-cpp 82 PUBLIC 83 $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include> 84 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> 85 PRIVATE 86 $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>) 87 88 if (NOT DEFINED CMAKE_CXX_STANDARD) 89 set_target_properties(yaml-cpp 90 PROPERTIES 91 CXX_STANDARD 11) 92 endif() 93 94 target_compile_options(yaml-cpp 95 PRIVATE 96 $<${not-msvc}:-Wall -Wextra -Wshadow -Weffc++ -Wno-long-long> 97 $<${not-msvc}:-pedantic -pedantic-errors> 98 99 $<$<AND:${backport-msvc-runtime},${msvc-rt-mtd-static}>:-MTd> 100 $<$<AND:${backport-msvc-runtime},${msvc-rt-mt-static}>:-MT> 101 $<$<AND:${backport-msvc-runtime},${msvc-rt-mtd-dll}>:-MDd> 102 $<$<AND:${backport-msvc-runtime},${msvc-rt-mt-dll}>:-MD> 103 104 # /wd4127 = disable warning C4127 "conditional expression is constant" 105 # http://msdn.microsoft.com/en-us/library/6t66728h.aspx 106 # /wd4355 = disable warning C4355 "'this' : used in base member initializer list 107 # http://msdn.microsoft.com/en-us/library/3c594ae3.aspx 108 $<$<CXX_COMPILER_ID:MSVC>:/W3 /wd4127 /wd4355>) 109 110 target_compile_definitions(yaml-cpp 111 PRIVATE 112 $<${build-windows-dll}:${PROJECT_NAME}_DLL> 113 $<$<NOT:$<BOOL:${YAML_CPP_BUILD_CONTRIB}>>:YAML_CPP_NO_CONTRIB>) 114 115 target_sources(yaml-cpp 116 PRIVATE 117 $<$<BOOL:${YAML_CPP_BUILD_CONTRIB}>:${yaml-cpp-contrib-sources}> 118 ${yaml-cpp-sources}) 119 120 if (NOT DEFINED CMAKE_DEBUG_POSTFIX) 121 set(CMAKE_DEBUG_POSTFIX "d") 122 endif() 123 124 set_target_properties(yaml-cpp PROPERTIES 125 VERSION "${PROJECT_VERSION}" 126 SOVERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}" 127 PROJECT_LABEL "yaml-cpp ${yaml-cpp-label-postfix}" 128 DEBUG_POSTFIX "${CMAKE_DEBUG_POSTFIX}") 129 130 configure_package_config_file( 131 "${PROJECT_SOURCE_DIR}/yaml-cpp-config.cmake.in" 132 "${PROJECT_BINARY_DIR}/yaml-cpp-config.cmake" 133 INSTALL_DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/yaml-cpp") 134 135 write_basic_package_version_file( 136 "${PROJECT_BINARY_DIR}/yaml-cpp-config-version.cmake" 137 COMPATIBILITY AnyNewerVersion) 138 139 configure_file(yaml-cpp.pc.in yaml-cpp.pc @ONLY) 140 141 if (YAML_CPP_INSTALL) 142 install(TARGETS yaml-cpp 143 EXPORT yaml-cpp-targets 144 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} 145 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 146 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) 147 install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/ 148 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} 149 FILES_MATCHING PATTERN "*.h") 150 install(EXPORT yaml-cpp-targets 151 DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/yaml-cpp") 152 install(FILES 153 "${PROJECT_BINARY_DIR}/yaml-cpp-config.cmake" 154 "${PROJECT_BINARY_DIR}/yaml-cpp-config-version.cmake" 155 DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/yaml-cpp") 156 install(FILES "${PROJECT_BINARY_DIR}/yaml-cpp.pc" 157 DESTINATION ${CMAKE_INSTALL_DATADIR}/pkgconfig) 158 endif() 159 160 if(YAML_CPP_BUILD_TESTS) 161 add_subdirectory(test) 162 endif() 163 164 if(YAML_CPP_BUILD_TOOLS) 165 add_subdirectory(util) 166 endif() 167 168 if (YAML_CPP_CLANG_FORMAT_EXE) 169 add_custom_target(format 170 COMMAND clang-format --style=file -i $<TARGET_PROPERTY:yaml-cpp,SOURCES> 171 COMMAND_EXPAND_LISTS 172 COMMENT "Running clang-format" 173 VERBATIM) 174 endif()