yaml-cpp

FORK: A YAML parser and emitter in C++
git clone https://git.neptards.moe/neptards/yaml-cpp.git
Log | Files | Refs | README | LICENSE

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()