CMakeLists.txt 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. ###
  2. ### CMake settings
  3. ###
  4. ## Due to Mac OSX we need to keep compatibility with CMake 2.6
  5. # see http://www.cmake.org/Wiki/CMake_Policies
  6. cmake_minimum_required(VERSION 2.6)
  7. # see http://www.cmake.org/cmake/help/cmake-2-8-docs.html#policy:CMP0012
  8. if(POLICY CMP0012)
  9. cmake_policy(SET CMP0012 OLD)
  10. endif()
  11. # see http://www.cmake.org/cmake/help/cmake-2-8-docs.html#policy:CMP0015
  12. if(POLICY CMP0015)
  13. cmake_policy(SET CMP0015 OLD)
  14. endif()
  15. # see https://cmake.org/cmake/help/latest/policy/CMP0042.html
  16. if(POLICY CMP0042)
  17. # Enable MACOSX_RPATH by default.
  18. cmake_policy(SET CMP0042 NEW)
  19. endif()
  20. include(CheckCXXCompilerFlag)
  21. ###
  22. ### Project settings
  23. ###
  24. project(YAML_CPP)
  25. set(YAML_CPP_VERSION_MAJOR "0")
  26. set(YAML_CPP_VERSION_MINOR "6")
  27. set(YAML_CPP_VERSION_PATCH "0")
  28. set(YAML_CPP_VERSION "${YAML_CPP_VERSION_MAJOR}.${YAML_CPP_VERSION_MINOR}.${YAML_CPP_VERSION_PATCH}")
  29. enable_testing()
  30. ###
  31. ### Project options
  32. ###
  33. ## Project stuff
  34. option(YAML_CPP_BUILD_TESTS "Enable testing" OFF)
  35. option(YAML_CPP_BUILD_TOOLS "Enable parse tools" OFF)
  36. option(YAML_CPP_BUILD_CONTRIB "Enable contrib stuff in library" OFF)
  37. ## Build options
  38. # --> General
  39. # see http://www.cmake.org/cmake/help/cmake2.6docs.html#variable:BUILD_SHARED_LIBS
  40. # http://www.cmake.org/cmake/help/cmake2.6docs.html#command:add_library
  41. option(BUILD_SHARED_LIBS "Build Shared Libraries" OFF)
  42. # --> Apple
  43. option(APPLE_UNIVERSAL_BIN "Apple: Build universal binary" OFF)
  44. # --> Microsoft Visual C++
  45. # see http://msdn.microsoft.com/en-us/library/aa278396(v=VS.60).aspx
  46. # http://msdn.microsoft.com/en-us/library/2kzt1wy3(v=VS.71).aspx
  47. option(MSVC_SHARED_RT "MSVC: Build with shared runtime libs (/MD)" ON)
  48. option(MSVC_STHREADED_RT "MSVC: Build with single-threaded static runtime libs (/ML until VS .NET 2003)" OFF)
  49. ###
  50. ### Sources, headers, directories and libs
  51. ###
  52. # From http://www.cmake.org/pipermail/cmake/2010-March/035992.html:
  53. # function to collect all the sources from sub-directories
  54. # into a single list
  55. function(add_sources)
  56. get_property(is_defined GLOBAL PROPERTY SRCS_LIST DEFINED)
  57. if(NOT is_defined)
  58. define_property(GLOBAL PROPERTY SRCS_LIST
  59. BRIEF_DOCS "List of source files"
  60. FULL_DOCS "List of all source files in the entire project")
  61. endif()
  62. # make absolute paths
  63. set(SRCS)
  64. foreach(s IN LISTS ARGN)
  65. if(NOT IS_ABSOLUTE "${s}")
  66. get_filename_component(s "${s}" ABSOLUTE)
  67. endif()
  68. list(APPEND SRCS "${s}")
  69. endforeach()
  70. # append to global list
  71. set_property(GLOBAL APPEND PROPERTY SRCS_LIST "${SRCS}")
  72. endfunction(add_sources)
  73. set(header_directory "include/yaml-cpp/")
  74. file(GLOB sources "src/[a-zA-Z]*.cpp")
  75. file(GLOB_RECURSE public_headers "include/yaml-cpp/[a-zA-Z]*.h")
  76. file(GLOB private_headers "src/[a-zA-Z]*.h")
  77. if(YAML_CPP_BUILD_CONTRIB)
  78. file(GLOB contrib_sources "src/contrib/[a-zA-Z]*.cpp")
  79. file(GLOB contrib_public_headers "include/yaml-cpp/contrib/[a-zA-Z]*.h")
  80. file(GLOB contrib_private_headers "src/contrib/[a-zA-Z]*.h")
  81. else()
  82. add_definitions(-DYAML_CPP_NO_CONTRIB)
  83. endif()
  84. set(library_sources
  85. ${sources}
  86. ${public_headers}
  87. ${private_headers}
  88. ${contrib_sources}
  89. ${contrib_public_headers}
  90. ${contrib_private_headers}
  91. )
  92. add_sources(${library_sources})
  93. if(VERBOSE)
  94. message(STATUS "sources: ${sources}")
  95. message(STATUS "public_headers: ${public_headers}")
  96. message(STATUS "private_headers: ${private_headers}")
  97. message(STATUS "contrib_sources: ${contrib_sources}")
  98. message(STATUS "contrib_public_headers: ${contrib_public_headers}")
  99. message(STATUS "contrib_private_headers: ${contrib_private_headers}")
  100. endif()
  101. include_directories(${YAML_CPP_SOURCE_DIR}/src)
  102. include_directories(${YAML_CPP_SOURCE_DIR}/include)
  103. ###
  104. ### General compilation settings
  105. ###
  106. set(yaml_c_flags ${CMAKE_C_FLAGS})
  107. set(yaml_cxx_flags ${CMAKE_CXX_FLAGS})
  108. if(BUILD_SHARED_LIBS)
  109. set(LABEL_SUFFIX "shared")
  110. else()
  111. set(LABEL_SUFFIX "static")
  112. endif()
  113. if(APPLE)
  114. if(APPLE_UNIVERSAL_BIN)
  115. set(CMAKE_OSX_ARCHITECTURES ppc;i386)
  116. endif()
  117. endif()
  118. if(IPHONE)
  119. set(CMAKE_OSX_SYSROOT "iphoneos4.2")
  120. set(CMAKE_OSX_ARCHITECTURES "armv6;armv7")
  121. endif()
  122. if(WIN32)
  123. if(BUILD_SHARED_LIBS)
  124. add_definitions(-D${PROJECT_NAME}_DLL) # use or build Windows DLL
  125. endif()
  126. if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
  127. set(CMAKE_INSTALL_PREFIX "C:/")
  128. endif()
  129. endif()
  130. # GCC or Clang or Intel Compiler specialities
  131. if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR
  132. CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR
  133. CMAKE_CXX_COMPILER_ID MATCHES "Intel")
  134. ### General stuff
  135. if(WIN32)
  136. set(CMAKE_SHARED_LIBRARY_PREFIX "") # DLLs do not have a "lib" prefix
  137. set(CMAKE_IMPORT_LIBRARY_PREFIX "") # same for DLL import libs
  138. set(CMAKE_LINK_DEF_FILE_FLAG "") # CMake workaround (2.8.3)
  139. endif()
  140. ### Project stuff
  141. if(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
  142. set(CMAKE_BUILD_TYPE Release)
  143. endif()
  144. #
  145. set(CMAKE_CXX_FLAGS_RELEASE "-O2")
  146. set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
  147. set(CMAKE_CXX_FLAGS_DEBUG "-g")
  148. set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os")
  149. #
  150. set(GCC_EXTRA_OPTIONS "")
  151. #
  152. if(BUILD_SHARED_LIBS)
  153. set(GCC_EXTRA_OPTIONS "${GCC_EXTRA_OPTIONS} -fPIC")
  154. endif()
  155. #
  156. set(FLAG_TESTED "-Wextra")
  157. check_cxx_compiler_flag(${FLAG_TESTED} FLAG_WEXTRA)
  158. if(FLAG_WEXTRA)
  159. set(GCC_EXTRA_OPTIONS "${GCC_EXTRA_OPTIONS} ${FLAG_TESTED}")
  160. endif()
  161. #
  162. set(yaml_cxx_flags "-Wall ${GCC_EXTRA_OPTIONS} -pedantic -Wno-long-long -std=c++11 ${yaml_cxx_flags}")
  163. ### Make specific
  164. if(${CMAKE_BUILD_TOOL} MATCHES make OR ${CMAKE_BUILD_TOOL} MATCHES gmake)
  165. add_custom_target(debuggable $(MAKE) clean
  166. COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug ${CMAKE_SOURCE_DIR}
  167. COMMENT "Adjusting settings for debug compilation"
  168. VERBATIM)
  169. add_custom_target(releasable $(MAKE) clean
  170. COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Release ${CMAKE_SOURCE_DIR}
  171. COMMENT "Adjusting settings for release compilation"
  172. VERBATIM)
  173. endif()
  174. endif()
  175. # Microsoft VisualC++ specialities
  176. if(MSVC)
  177. ### General stuff
  178. # a) Change MSVC runtime library settings (/MD[d], /MT[d], /ML[d] (single-threaded until VS 2003))
  179. # plus set lib suffix for later use and project label accordingly
  180. # see http://msdn.microsoft.com/en-us/library/aa278396(v=VS.60).aspx
  181. # http://msdn.microsoft.com/en-us/library/2kzt1wy3(v=VS.71).aspx
  182. set(LIB_RT_SUFFIX "md") # CMake defaults to /MD for MSVC
  183. set(LIB_RT_OPTION "/MD")
  184. #
  185. if(NOT MSVC_SHARED_RT) # User wants to have static runtime libraries (/MT, /ML)
  186. if(MSVC_STHREADED_RT) # User wants to have old single-threaded static runtime libraries
  187. set(LIB_RT_SUFFIX "ml")
  188. set(LIB_RT_OPTION "/ML")
  189. if(NOT ${MSVC_VERSION} LESS 1400)
  190. message(FATAL_ERROR "Single-threaded static runtime libraries (/ML) only available until VS .NET 2003 (7.1).")
  191. endif()
  192. else()
  193. set(LIB_RT_SUFFIX "mt")
  194. set(LIB_RT_OPTION "/MT")
  195. endif()
  196. # correct linker options
  197. foreach(flag_var CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
  198. foreach(config_name "" DEBUG RELEASE MINSIZEREL RELWITHDEBINFO)
  199. set(var_name "${flag_var}")
  200. if(NOT "${config_name}" STREQUAL "")
  201. set(var_name "${var_name}_${config_name}")
  202. endif()
  203. string(REPLACE "/MD" "${LIB_RT_OPTION}" ${var_name} "${${var_name}}")
  204. set(${var_name} "${${var_name}}" CACHE STRING "" FORCE)
  205. endforeach()
  206. endforeach()
  207. endif()
  208. #
  209. set(LABEL_SUFFIX "${LABEL_SUFFIX} ${LIB_RT_SUFFIX}")
  210. # b) Change prefix for static libraries
  211. set(CMAKE_STATIC_LIBRARY_PREFIX "lib") # to distinguish static libraries from DLL import libs
  212. # c) Correct suffixes for static libraries
  213. if(NOT BUILD_SHARED_LIBS)
  214. ### General stuff
  215. set(LIB_TARGET_SUFFIX "${LIB_SUFFIX}${LIB_RT_SUFFIX}")
  216. endif()
  217. ### Project stuff
  218. # /W3 = set warning level; see http://msdn.microsoft.com/en-us/library/thxezb7y.aspx
  219. # /wd4127 = disable warning C4127 "conditional expression is constant"; see http://msdn.microsoft.com/en-us/library/6t66728h.aspx
  220. # /wd4355 = disable warning C4355 "'this' : used in base member initializer list"; http://msdn.microsoft.com/en-us/library/3c594ae3.aspx
  221. set(yaml_cxx_flags "/W3 /wd4127 /wd4355 ${yaml_cxx_flags}")
  222. endif()
  223. ###
  224. ### General install settings
  225. ###
  226. set(INCLUDE_INSTALL_ROOT_DIR include)
  227. set(INCLUDE_INSTALL_DIR ${INCLUDE_INSTALL_ROOT_DIR}/yaml-cpp)
  228. set(LIB_INSTALL_DIR "lib${LIB_SUFFIX}")
  229. set(_INSTALL_DESTINATIONS
  230. RUNTIME DESTINATION bin
  231. LIBRARY DESTINATION ${LIB_INSTALL_DIR}
  232. ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
  233. )
  234. ###
  235. ### Library
  236. ###
  237. add_library(yaml-cpp ${library_sources})
  238. set_target_properties(yaml-cpp PROPERTIES
  239. COMPILE_FLAGS "${yaml_c_flags} ${yaml_cxx_flags}"
  240. )
  241. set_target_properties(yaml-cpp PROPERTIES
  242. VERSION "${YAML_CPP_VERSION}"
  243. SOVERSION "${YAML_CPP_VERSION_MAJOR}.${YAML_CPP_VERSION_MINOR}"
  244. PROJECT_LABEL "yaml-cpp ${LABEL_SUFFIX}"
  245. )
  246. if(IPHONE)
  247. set_target_properties(yaml-cpp PROPERTIES
  248. XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET "3.0"
  249. )
  250. endif()
  251. if(MSVC)
  252. if(NOT BUILD_SHARED_LIBS)
  253. # correct library names
  254. set_target_properties(yaml-cpp PROPERTIES
  255. DEBUG_POSTFIX "${LIB_TARGET_SUFFIX}d"
  256. RELEASE_POSTFIX "${LIB_TARGET_SUFFIX}"
  257. MINSIZEREL_POSTFIX "${LIB_TARGET_SUFFIX}"
  258. RELWITHDEBINFO_POSTFIX "${LIB_TARGET_SUFFIX}"
  259. )
  260. endif()
  261. endif()
  262. install(TARGETS yaml-cpp EXPORT yaml-cpp-targets ${_INSTALL_DESTINATIONS})
  263. install(
  264. DIRECTORY ${header_directory}
  265. DESTINATION ${INCLUDE_INSTALL_DIR}
  266. FILES_MATCHING PATTERN "*.h"
  267. )
  268. export(
  269. TARGETS yaml-cpp
  270. FILE "${PROJECT_BINARY_DIR}/yaml-cpp-targets.cmake")
  271. export(PACKAGE yaml-cpp)
  272. set(EXPORT_TARGETS yaml-cpp CACHE INTERNAL "export targets")
  273. set(CONFIG_INCLUDE_DIRS "${YAML_CPP_SOURCE_DIR}/include")
  274. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/yaml-cpp-config.cmake.in
  275. "${PROJECT_BINARY_DIR}/yaml-cpp-config.cmake" @ONLY)
  276. if(WIN32 AND NOT CYGWIN)
  277. set(INSTALL_CMAKE_DIR CMake)
  278. else()
  279. set(INSTALL_CMAKE_DIR ${LIB_INSTALL_DIR}/cmake/yaml-cpp)
  280. endif()
  281. file(RELATIVE_PATH REL_INCLUDE_DIR "${CMAKE_INSTALL_PREFIX}/${INSTALL_CMAKE_DIR}" "${CMAKE_INSTALL_PREFIX}/${INCLUDE_INSTALL_ROOT_DIR}")
  282. set(CONFIG_INCLUDE_DIRS "\${YAML_CPP_CMAKE_DIR}/${REL_INCLUDE_DIR}")
  283. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/yaml-cpp-config.cmake.in
  284. "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/yaml-cpp-config.cmake" @ONLY)
  285. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/yaml-cpp-config-version.cmake.in
  286. "${PROJECT_BINARY_DIR}/yaml-cpp-config-version.cmake" @ONLY)
  287. install(FILES
  288. "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/yaml-cpp-config.cmake"
  289. "${PROJECT_BINARY_DIR}/yaml-cpp-config-version.cmake"
  290. DESTINATION "${INSTALL_CMAKE_DIR}" COMPONENT dev)
  291. install(EXPORT yaml-cpp-targets DESTINATION ${INSTALL_CMAKE_DIR})
  292. if(UNIX)
  293. set(PC_FILE ${CMAKE_BINARY_DIR}/yaml-cpp.pc)
  294. configure_file("yaml-cpp.pc.cmake" ${PC_FILE} @ONLY)
  295. install(FILES ${PC_FILE} DESTINATION ${LIB_INSTALL_DIR}/pkgconfig)
  296. endif()
  297. ###
  298. ### Extras
  299. ###
  300. if(YAML_CPP_BUILD_TESTS)
  301. add_subdirectory(test)
  302. endif()
  303. if(YAML_CPP_BUILD_TOOLS)
  304. add_subdirectory(util)
  305. endif()
  306. ### Formatting
  307. get_property(all_sources GLOBAL PROPERTY SRCS_LIST)
  308. add_custom_target(format
  309. COMMAND clang-format --style=file -i ${all_sources}
  310. COMMENT "Running clang-format"
  311. VERBATIM)