CMakeLists.txt 7.01 KB
Newer Older
1
2
3
# 3.5 is actually available almost everywhere, but this a good minimum.
# 3.14 as the upper policy limit avoids CMake deprecation warnings.
cmake_minimum_required(VERSION 3.4...3.14)
4
5
6
7
8
9
10

# enable MSVC_RUNTIME_LIBRARY target property
# see https://cmake.org/cmake/help/latest/policy/CMP0091.html
if(POLICY CMP0091)
  cmake_policy(SET CMP0091 NEW)
endif()

Jesse Beder's avatar
Jesse Beder committed
11
project(YAML_CPP VERSION 0.8.0 LANGUAGES CXX)
12

13
14
15
16
17
set(YAML_CPP_MAIN_PROJECT OFF)
if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
  set(YAML_CPP_MAIN_PROJECT ON)
endif()

18
19
include(CMakePackageConfigHelpers)
include(CMakeDependentOption)
20
include(CheckCXXCompilerFlag)
21
include(GNUInstallDirs)
22
include(CTest)
23

24
option(YAML_CPP_BUILD_CONTRIB "Enable yaml-cpp contrib in library" ON)
Matthew Woehlke's avatar
Matthew Woehlke committed
25
option(YAML_CPP_BUILD_TOOLS "Enable parse tools" ON)
26
option(YAML_BUILD_SHARED_LIBS "Build yaml-cpp shared library" ${BUILD_SHARED_LIBS})
27
option(YAML_CPP_INSTALL "Enable generation of yaml-cpp install targets" ${YAML_CPP_MAIN_PROJECT})
28
option(YAML_CPP_FORMAT_SOURCE "Format source" ${YAML_CPP_MAIN_PROJECT})
29
option(YAML_CPP_DISABLE_UNINSTALL  "Disable uninstallation of yaml-cpp" OFF)
30
option(YAML_USE_SYSTEM_GTEST "Use system googletest if found" OFF)
Humberto Dias's avatar
Humberto Dias committed
31
option(YAML_ENABLE_PIC "Use Position-Independent Code " ON)
32

33
cmake_dependent_option(YAML_CPP_BUILD_TESTS
34
35
  "Enable yaml-cpp tests" OFF
  "BUILD_TESTING;YAML_CPP_MAIN_PROJECT" OFF)
36
37
cmake_dependent_option(YAML_MSVC_SHARED_RT
  "MSVC: Build yaml-cpp with shared runtime libs (/MD)" ON
38
  "CMAKE_SYSTEM_NAME MATCHES Windows" OFF)
39
40
41
set(YAML_CPP_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/yaml-cpp"
  CACHE STRING "Path to install the CMake package to")
 
42
43
44
if (YAML_CPP_FORMAT_SOURCE)
    find_program(YAML_CPP_CLANG_FORMAT_EXE NAMES clang-format)
endif()
45

46
47
if (YAML_BUILD_SHARED_LIBS)
  set(yaml-cpp-type SHARED)
48
  set(yaml-cpp-label-postfix "shared")
49
50
51
else()
  set(yaml-cpp-type STATIC)
  set(yaml-cpp-label-postfix "static")
52
endif()
53

54
55
56
set(build-shared $<BOOL:${YAML_BUILD_SHARED_LIBS}>)
set(build-windows-dll $<AND:$<BOOL:${CMAKE_HOST_WIN32}>,${build-shared}>)
set(not-msvc $<NOT:$<CXX_COMPILER_ID:MSVC>>)
57
set(msvc-shared_rt $<BOOL:${YAML_MSVC_SHARED_RT}>)
58

59
60
if (NOT DEFINED CMAKE_MSVC_RUNTIME_LIBRARY)
  set(CMAKE_MSVC_RUNTIME_LIBRARY
61
    MultiThreaded$<$<CONFIG:Debug>:Debug>$<${msvc-shared_rt}:DLL>)
62
63
endif()

64
65
66
67
68
set(contrib-pattern "src/contrib/*.cpp")
set(src-pattern "src/*.cpp")
if (CMAKE_VERSION VERSION_GREATER 3.12)
  list(INSERT contrib-pattern 0 CONFIGURE_DEPENDS)
  list(INSERT src-pattern 0 CONFIGURE_DEPENDS)
69
70
endif()

71
72
file(GLOB yaml-cpp-contrib-sources ${contrib-pattern})
file(GLOB yaml-cpp-sources ${src-pattern})
73

74
set(msvc-rt $<TARGET_PROPERTY:MSVC_RUNTIME_LIBRARY>)
75

76
77
set(msvc-rt-mtd-static $<STREQUAL:${msvc-rt},MultiThreadedDebug>)
set(msvc-rt-mt-static $<STREQUAL:${msvc-rt},MultiThreaded>)
78

79
80
set(msvc-rt-mtd-dll $<STREQUAL:${msvc-rt},MultiThreadedDebugDLL>)
set(msvc-rt-mt-dll $<STREQUAL:${msvc-rt},MultiThreadedDLL>)
81

82
set(backport-msvc-runtime $<VERSION_LESS:${CMAKE_VERSION},3.15>)
83

84
add_library(yaml-cpp ${yaml-cpp-type} "")
85
add_library(yaml-cpp::yaml-cpp ALIAS yaml-cpp)
86

87
88
89
90
91
92
set_property(TARGET yaml-cpp
  PROPERTY
    MSVC_RUNTIME_LIBRARY ${CMAKE_MSVC_RUNTIME_LIBRARY})
set_property(TARGET yaml-cpp
  PROPERTY
    CXX_STANDARD_REQUIRED ON)
93

94
if (NOT YAML_BUILD_SHARED_LIBS)
Humberto Dias's avatar
Humberto Dias committed
95
      set_property(TARGET yaml-cpp PROPERTY POSITION_INDEPENDENT_CODE ${YAML_ENABLE_PIC})
96
97
endif()

98
99
100
101
102
103
target_include_directories(yaml-cpp
  PUBLIC
    $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  PRIVATE
    $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>)
104

105
106
107
108
if (NOT DEFINED CMAKE_CXX_STANDARD)
  set_target_properties(yaml-cpp
    PROPERTIES
      CXX_STANDARD 11)
109
110
endif()

111
112
113
114
115
116
117
if(YAML_CPP_MAIN_PROJECT)
  target_compile_options(yaml-cpp
    PRIVATE
      $<${not-msvc}:-Wall -Wextra -Wshadow -Weffc++ -Wno-long-long>
      $<${not-msvc}:-pedantic -pedantic-errors>)
endif()

118
119
120
121
122
123
target_compile_options(yaml-cpp
  PRIVATE
    $<$<AND:${backport-msvc-runtime},${msvc-rt-mtd-static}>:-MTd>
    $<$<AND:${backport-msvc-runtime},${msvc-rt-mt-static}>:-MT>
    $<$<AND:${backport-msvc-runtime},${msvc-rt-mtd-dll}>:-MDd>
    $<$<AND:${backport-msvc-runtime},${msvc-rt-mt-dll}>:-MD>
124

125
126
127
128
129
    # /wd4127 = disable warning C4127 "conditional expression is constant"
    # http://msdn.microsoft.com/en-us/library/6t66728h.aspx
    # /wd4355 = disable warning C4355 "'this' : used in base member initializer list
    # http://msdn.microsoft.com/en-us/library/3c594ae3.aspx
    $<$<CXX_COMPILER_ID:MSVC>:/W3 /wd4127 /wd4355>)
130

131
target_compile_definitions(yaml-cpp
132
133
  PUBLIC
    $<$<NOT:$<BOOL:${YAML_BUILD_SHARED_LIBS}>>:YAML_CPP_STATIC_DEFINE>
134
135
136
  PRIVATE
    $<${build-windows-dll}:${PROJECT_NAME}_DLL>
    $<$<NOT:$<BOOL:${YAML_CPP_BUILD_CONTRIB}>>:YAML_CPP_NO_CONTRIB>)
137

138
139
140
141
target_sources(yaml-cpp
  PRIVATE
    $<$<BOOL:${YAML_CPP_BUILD_CONTRIB}>:${yaml-cpp-contrib-sources}>
    ${yaml-cpp-sources})
142

deflinhec's avatar
deflinhec committed
143
144
145
if (NOT DEFINED CMAKE_DEBUG_POSTFIX)
  set(CMAKE_DEBUG_POSTFIX "d")
endif()
146

147
set_target_properties(yaml-cpp PROPERTIES
148
149
  VERSION "${PROJECT_VERSION}"
  SOVERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}"
150
  PROJECT_LABEL "yaml-cpp ${yaml-cpp-label-postfix}"
deflinhec's avatar
deflinhec committed
151
  DEBUG_POSTFIX "${CMAKE_DEBUG_POSTFIX}")
152

153
set(EXPORT_TARGETS yaml-cpp::yaml-cpp)
154
155
156
configure_package_config_file(
  "${PROJECT_SOURCE_DIR}/yaml-cpp-config.cmake.in"
  "${PROJECT_BINARY_DIR}/yaml-cpp-config.cmake"
157
158
  INSTALL_DESTINATION "${YAML_CPP_INSTALL_CMAKEDIR}"
  PATH_VARS CMAKE_INSTALL_INCLUDEDIR CMAKE_INSTALL_LIBDIR)
159
unset(EXPORT_TARGETS)
160

161
162
163
write_basic_package_version_file(
  "${PROJECT_BINARY_DIR}/yaml-cpp-config-version.cmake"
  COMPATIBILITY AnyNewerVersion)
164

165
configure_file(yaml-cpp.pc.in yaml-cpp.pc @ONLY)
166

167
if (YAML_CPP_INSTALL)
168
  install(TARGETS yaml-cpp
169
170
171
172
    EXPORT yaml-cpp-targets
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
173
  install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/
174
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
175
                FILES_MATCHING PATTERN "*.h")
176
  install(EXPORT yaml-cpp-targets
177
    NAMESPACE yaml-cpp::
178
    DESTINATION "${YAML_CPP_INSTALL_CMAKEDIR}")
179
180
181
  install(FILES
      "${PROJECT_BINARY_DIR}/yaml-cpp-config.cmake"
      "${PROJECT_BINARY_DIR}/yaml-cpp-config-version.cmake"
182
    DESTINATION "${YAML_CPP_INSTALL_CMAKEDIR}")
183
  install(FILES "${PROJECT_BINARY_DIR}/yaml-cpp.pc"
184
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
185
186
endif()

Matthew Woehlke's avatar
Matthew Woehlke committed
187
if(YAML_CPP_BUILD_TESTS)
188
  add_subdirectory(test)
Matthew Woehlke's avatar
Matthew Woehlke committed
189
endif()
190

Matthew Woehlke's avatar
Matthew Woehlke committed
191
if(YAML_CPP_BUILD_TOOLS)
192
  add_subdirectory(util)
193
endif()
194

195
if (YAML_CPP_FORMAT_SOURCE AND YAML_CPP_CLANG_FORMAT_EXE)
196
197
  add_custom_target(format
    COMMAND clang-format --style=file -i $<TARGET_PROPERTY:yaml-cpp,SOURCES>
Ian Taylor's avatar
Ian Taylor committed
198
    COMMAND_EXPAND_LISTS
199
200
201
    COMMENT "Running clang-format"
    VERBATIM)
endif()
202
203

# uninstall target
204
if(YAML_CPP_INSTALL AND NOT YAML_CPP_DISABLE_UNINSTALL AND NOT TARGET uninstall)
205
206
207
208
209
210
211
212
  configure_file(
    "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
    "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
    IMMEDIATE @ONLY)

  add_custom_target(uninstall
    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
endif()