CMakeLists.txt 10.9 KB
Newer Older
1
2
3
4
###
### CMake settings
###
# see http://www.cmake.org/Wiki/CMake_Policies
5
cmake_minimum_required(VERSION 3.1)
6
7
8
9
10
11

include(CheckCXXCompilerFlag)

###
### Project settings
###
12
project(YAML_CPP VERSION 0.6.2)
13
14
15
16
17

###
### Project options
###
## Project stuff
Matthew Woehlke's avatar
Matthew Woehlke committed
18
19
option(YAML_CPP_BUILD_TESTS "Enable testing" ON)
option(YAML_CPP_BUILD_TOOLS "Enable parse tools" ON)
20
option(YAML_CPP_BUILD_CONTRIB "Enable contrib stuff in library" ON)
21
option(YAML_CPP_INSTALL "Enable generation of install target" ON)
22
23
24
25
26

## Build options
# --> General
# see http://www.cmake.org/cmake/help/cmake2.6docs.html#variable:BUILD_SHARED_LIBS
#     http://www.cmake.org/cmake/help/cmake2.6docs.html#command:add_library
27
option(YAML_BUILD_SHARED_LIBS "Build Shared Libraries" OFF)
28
29

# --> Apple
30
31
32
if(APPLE)
    option(YAML_APPLE_UNIVERSAL_BIN "Apple: Build universal binary" OFF)
endif()
33
34
35
36

# --> Microsoft Visual C++
# see http://msdn.microsoft.com/en-us/library/aa278396(v=VS.60).aspx
#     http://msdn.microsoft.com/en-us/library/2kzt1wy3(v=VS.71).aspx
37
38
39
40
if(MSVC)
    option(YAML_MSVC_SHARED_RT "MSVC: Build with shared runtime libs (/MD)" ON)
    option(YAML_MSVC_STHREADED_RT "MSVC: Build with single-threaded static runtime libs (/ML until VS .NET 2003)" OFF)
endif()
41
42
43
44

###
### Sources, headers, directories and libs
###
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

# From http://www.cmake.org/pipermail/cmake/2010-March/035992.html:
# function to collect all the sources from sub-directories
# into a single list
function(add_sources)
  get_property(is_defined GLOBAL PROPERTY SRCS_LIST DEFINED)
  if(NOT is_defined)
    define_property(GLOBAL PROPERTY SRCS_LIST
      BRIEF_DOCS "List of source files"
      FULL_DOCS "List of all source files in the entire project")
  endif()
  # make absolute paths
  set(SRCS)
  foreach(s IN LISTS ARGN)
    if(NOT IS_ABSOLUTE "${s}")
      get_filename_component(s "${s}" ABSOLUTE)
    endif()
    list(APPEND SRCS "${s}")
  endforeach()
  # append to global list
  set_property(GLOBAL APPEND PROPERTY SRCS_LIST "${SRCS}")
endfunction(add_sources)

68
69
set(header_directory "include/yaml-cpp/")

70
file(GLOB sources "src/[a-zA-Z]*.cpp")
Jesse Beder's avatar
Jesse Beder committed
71
file(GLOB_RECURSE public_headers "include/yaml-cpp/[a-zA-Z]*.h")
72
file(GLOB private_headers "src/[a-zA-Z]*.h")
73

74
75
76
77
78
79
80
81
if(YAML_CPP_BUILD_CONTRIB)
	file(GLOB contrib_sources "src/contrib/[a-zA-Z]*.cpp")
	file(GLOB contrib_public_headers "include/yaml-cpp/contrib/[a-zA-Z]*.h")
	file(GLOB contrib_private_headers "src/contrib/[a-zA-Z]*.h")
else()
	add_definitions(-DYAML_CPP_NO_CONTRIB)
endif()

82
set(library_sources
83
84
85
86
87
88
89
  ${sources}
  ${public_headers}
  ${private_headers}
  ${contrib_sources}
  ${contrib_public_headers}
  ${contrib_private_headers}
)
90
add_sources(${library_sources})
91

92
93
94
95
96
97
98
99
100
if(VERBOSE)
	message(STATUS "sources: ${sources}")
	message(STATUS "public_headers: ${public_headers}")
	message(STATUS "private_headers: ${private_headers}")
	message(STATUS "contrib_sources: ${contrib_sources}")
	message(STATUS "contrib_public_headers: ${contrib_public_headers}")
	message(STATUS "contrib_private_headers: ${contrib_private_headers}")
endif()

101
102
103
104
if (CMAKE_VERSION VERSION_LESS 2.8.12)
    include_directories(${YAML_CPP_SOURCE_DIR}/src)
    include_directories(${YAML_CPP_SOURCE_DIR}/include)
endif()
105
106
107
108
109


###
### General compilation settings
###
110
111
112
set(yaml_c_flags ${CMAKE_C_FLAGS})
set(yaml_cxx_flags ${CMAKE_CXX_FLAGS})

113
if(YAML_BUILD_SHARED_LIBS)
114
115
116
117
118
119
	set(LABEL_SUFFIX "shared")
else()
	set(LABEL_SUFFIX "static")
endif()

if(APPLE)
120
	if(YAML_APPLE_UNIVERSAL_BIN)
121
122
123
124
125
126
127
128
129
130
		set(CMAKE_OSX_ARCHITECTURES ppc;i386)
	endif()
endif()

if(IPHONE)
	set(CMAKE_OSX_SYSROOT "iphoneos4.2")
	set(CMAKE_OSX_ARCHITECTURES "armv6;armv7")
endif()

if(WIN32)
131
	if(YAML_BUILD_SHARED_LIBS)
132
133
134
135
136
137
138
		add_definitions(-D${PROJECT_NAME}_DLL)	# use or build Windows DLL
	endif()
	if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
		set(CMAKE_INSTALL_PREFIX "C:/")
	endif()
endif()

139
# GCC or Clang or Intel Compiler specialities
140
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR
141
   (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND NOT "x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC") OR
142
143
   CMAKE_CXX_COMPILER_ID MATCHES "Intel")

144
145
146
147
148
149
150
151
152
153
154
155
156
157
	### General stuff
	if(WIN32)
		set(CMAKE_SHARED_LIBRARY_PREFIX "")	# DLLs do not have a "lib" prefix
		set(CMAKE_IMPORT_LIBRARY_PREFIX "")	# same for DLL import libs
		set(CMAKE_LINK_DEF_FILE_FLAG "")	# CMake workaround (2.8.3)
	endif()

	### Project stuff
	if(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
		set(CMAKE_BUILD_TYPE Release)
	endif()
	#
	set(GCC_EXTRA_OPTIONS "")
	#
158
	if(YAML_BUILD_SHARED_LIBS)
159
160
161
		set(GCC_EXTRA_OPTIONS "${GCC_EXTRA_OPTIONS} -fPIC")
	endif()
	#
162
	set(FLAG_TESTED "-Wextra -Wshadow -Weffc++ -pedantic -pedantic-errors")
163
164
165
166
167
	check_cxx_compiler_flag(${FLAG_TESTED} FLAG_WEXTRA)
	if(FLAG_WEXTRA)
		set(GCC_EXTRA_OPTIONS "${GCC_EXTRA_OPTIONS} ${FLAG_TESTED}")
	endif()
	#
168
	set(yaml_cxx_flags "-Wall ${GCC_EXTRA_OPTIONS} -pedantic -Wno-long-long ${yaml_cxx_flags}")
169
170

	### Make specific
171
	if(${CMAKE_BUILD_TOOL} MATCHES make OR ${CMAKE_BUILD_TOOL} MATCHES gmake)
Olli Wang's avatar
Olli Wang committed
172
		add_custom_target(debuggable ${CMAKE_MAKE_PROGRAM} clean
173
174
175
			COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug ${CMAKE_SOURCE_DIR}
			COMMENT "Adjusting settings for debug compilation"
			VERBATIM)
Olli Wang's avatar
Olli Wang committed
176
		add_custom_target(releasable ${CMAKE_MAKE_PROGRAM} clean
177
178
179
180
			COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Release ${CMAKE_SOURCE_DIR}
			COMMENT "Adjusting settings for release compilation"
			VERBATIM)
	endif()
181
182
183
184
185
186
187
188
189
190
191
192
endif()

# Microsoft VisualC++ specialities
if(MSVC)
	### General stuff
	# a) Change MSVC runtime library settings (/MD[d], /MT[d], /ML[d] (single-threaded until VS 2003))
	#    plus set lib suffix for later use and project label accordingly
	# see http://msdn.microsoft.com/en-us/library/aa278396(v=VS.60).aspx
	#     http://msdn.microsoft.com/en-us/library/2kzt1wy3(v=VS.71).aspx
	set(LIB_RT_SUFFIX "md")	# CMake defaults to /MD for MSVC
	set(LIB_RT_OPTION "/MD")
	#
193
194
	if(NOT YAML_MSVC_SHARED_RT)	# User wants to have static runtime libraries (/MT, /ML)
		if(YAML_MSVC_STHREADED_RT)	# User wants to have old single-threaded static runtime libraries
195
196
197
198
199
200
201
202
203
204
205
			set(LIB_RT_SUFFIX "ml")
			set(LIB_RT_OPTION "/ML")
			if(NOT ${MSVC_VERSION} LESS 1400)
				message(FATAL_ERROR "Single-threaded static runtime libraries (/ML) only available until VS .NET 2003 (7.1).")
			endif()
		else()
			set(LIB_RT_SUFFIX "mt")
			set(LIB_RT_OPTION "/MT")
		endif()

		# correct linker options
206
		foreach(flag_var  CMAKE_C_FLAGS  CMAKE_CXX_FLAGS)
207
208
209
210
211
212
			foreach(config_name  ""  DEBUG  RELEASE  MINSIZEREL  RELWITHDEBINFO)
				set(var_name "${flag_var}")
				if(NOT "${config_name}" STREQUAL "")
					set(var_name "${var_name}_${config_name}")
				endif()
				string(REPLACE "/MD" "${LIB_RT_OPTION}" ${var_name} "${${var_name}}")
213
				set(${var_name} "${${var_name}}" CACHE STRING "" FORCE)
214
215
216
217
			endforeach()
		endforeach()
	endif()
	#
218
	set(LABEL_SUFFIX "${LABEL_SUFFIX} ${LIB_RT_SUFFIX}")
219
220
221
222
223

	# b) Change prefix for static libraries
	set(CMAKE_STATIC_LIBRARY_PREFIX "lib")	# to distinguish static libraries from DLL import libs

	# c) Correct suffixes for static libraries
224
	if(NOT YAML_BUILD_SHARED_LIBS)
225
226
227
228
229
230
231
232
		### General stuff
		set(LIB_TARGET_SUFFIX "${LIB_SUFFIX}${LIB_RT_SUFFIX}")
	endif()

	### Project stuff
	# /W3 = set warning level; see http://msdn.microsoft.com/en-us/library/thxezb7y.aspx
	# /wd4127 = disable warning C4127 "conditional expression is constant"; see 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
233
	set(yaml_cxx_flags "/W3 /wd4127 /wd4355 ${yaml_cxx_flags}")
234
235
236
237
238
239
endif()


###
### General install settings
###
240
set(INCLUDE_INSTALL_ROOT_DIR include)
241
242

set(INCLUDE_INSTALL_DIR ${INCLUDE_INSTALL_ROOT_DIR}/yaml-cpp)
243
set(LIB_INSTALL_DIR "lib${LIB_SUFFIX}")
244
245

set(_INSTALL_DESTINATIONS
246
	RUNTIME DESTINATION bin
247
	LIBRARY DESTINATION ${LIB_INSTALL_DIR}
248
	ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
249
250
251
252
253
254
)


###
### Library
###
255
256
257
258
259
if(YAML_BUILD_SHARED_LIBS)
    add_library(yaml-cpp SHARED ${library_sources})
else()
    add_library(yaml-cpp STATIC ${library_sources})
endif()
260
261
262
263
264
265
266
267

if (NOT CMAKE_VERSION VERSION_LESS 2.8.12)
    target_include_directories(yaml-cpp
        PUBLIC $<BUILD_INTERFACE:${YAML_CPP_SOURCE_DIR}/include>
               $<INSTALL_INTERFACE:${INCLUDE_INSTALL_ROOT_DIR}>
        PRIVATE $<BUILD_INTERFACE:${YAML_CPP_SOURCE_DIR}/src>)
endif()

268
269
270
271
272
set_target_properties(yaml-cpp PROPERTIES
    CXX_STANDARD 11
    CXX_STANDARD_REQUIRED ON
)

273
274
set_target_properties(yaml-cpp PROPERTIES
  COMPILE_FLAGS "${yaml_c_flags} ${yaml_cxx_flags}"
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
)

set_target_properties(yaml-cpp PROPERTIES
	VERSION "${YAML_CPP_VERSION}"
	SOVERSION "${YAML_CPP_VERSION_MAJOR}.${YAML_CPP_VERSION_MINOR}"
	PROJECT_LABEL "yaml-cpp ${LABEL_SUFFIX}"
)

if(IPHONE)
	set_target_properties(yaml-cpp PROPERTIES
		XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET "3.0"
	)
endif()

if(MSVC)
290
	if(NOT YAML_BUILD_SHARED_LIBS)
291
292
293
294
295
296
297
298
299
300
		# correct library names
		set_target_properties(yaml-cpp PROPERTIES
			DEBUG_POSTFIX "${LIB_TARGET_SUFFIX}d"
			RELEASE_POSTFIX "${LIB_TARGET_SUFFIX}"
			MINSIZEREL_POSTFIX "${LIB_TARGET_SUFFIX}"
			RELWITHDEBINFO_POSTFIX "${LIB_TARGET_SUFFIX}"
		)
	endif()
endif()

301
302
303
304
305
306
307
308
if (YAML_CPP_INSTALL)
	install(TARGETS yaml-cpp EXPORT yaml-cpp-targets ${_INSTALL_DESTINATIONS})
	install(
		DIRECTORY ${header_directory}
		DESTINATION ${INCLUDE_INSTALL_DIR}
		FILES_MATCHING PATTERN "*.h"
	)
endif()
309

310
311
312
313
314
315
316
317
318
export(
    TARGETS yaml-cpp
    FILE "${PROJECT_BINARY_DIR}/yaml-cpp-targets.cmake")
export(PACKAGE yaml-cpp)
set(EXPORT_TARGETS yaml-cpp CACHE INTERNAL "export targets")

set(CONFIG_INCLUDE_DIRS "${YAML_CPP_SOURCE_DIR}/include")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/yaml-cpp-config.cmake.in
	"${PROJECT_BINARY_DIR}/yaml-cpp-config.cmake" @ONLY)
Paul Novotny's avatar
Paul Novotny committed
319
320

if(WIN32 AND NOT CYGWIN)
321
	set(INSTALL_CMAKE_DIR CMake)
Paul Novotny's avatar
Paul Novotny committed
322
323
324
325
else()
	set(INSTALL_CMAKE_DIR ${LIB_INSTALL_DIR}/cmake/yaml-cpp)
endif()

326

327
file(RELATIVE_PATH REL_INCLUDE_DIR "${CMAKE_INSTALL_PREFIX}/${INSTALL_CMAKE_DIR}" "${CMAKE_INSTALL_PREFIX}/${INCLUDE_INSTALL_ROOT_DIR}")
Paul Novotny's avatar
Paul Novotny committed
328
329
330
331
set(CONFIG_INCLUDE_DIRS "\${YAML_CPP_CMAKE_DIR}/${REL_INCLUDE_DIR}")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/yaml-cpp-config.cmake.in
	"${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/yaml-cpp-config.cmake" @ONLY)

332
333
334
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/yaml-cpp-config-version.cmake.in
	"${PROJECT_BINARY_DIR}/yaml-cpp-config-version.cmake" @ONLY)

335
336
337
338
339
340
341
342
343
344
345
346
if (YAML_CPP_INSTALL)
	install(FILES
		"${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/yaml-cpp-config.cmake"
		"${PROJECT_BINARY_DIR}/yaml-cpp-config-version.cmake"
		DESTINATION "${INSTALL_CMAKE_DIR}" COMPONENT dev)
	install(EXPORT yaml-cpp-targets DESTINATION ${INSTALL_CMAKE_DIR})

	if(UNIX)
		set(PC_FILE ${CMAKE_BINARY_DIR}/yaml-cpp.pc)
		configure_file("yaml-cpp.pc.cmake" ${PC_FILE} @ONLY)
		install(FILES ${PC_FILE} DESTINATION ${LIB_INSTALL_DIR}/pkgconfig)
	endif()
Paul Novotny's avatar
Paul Novotny committed
347

348
349
350
351
352
353
endif()


###
### Extras
###
Matthew Woehlke's avatar
Matthew Woehlke committed
354
if(YAML_CPP_BUILD_TESTS)
355
	enable_testing()
356
	add_subdirectory(test)
Matthew Woehlke's avatar
Matthew Woehlke committed
357
358
endif()
if(YAML_CPP_BUILD_TOOLS)
359
360
	add_subdirectory(util)
endif()
361
362

### Formatting
363
364
365
366
367
get_property(all_sources GLOBAL PROPERTY SRCS_LIST)
add_custom_target(format
	COMMAND clang-format --style=file -i ${all_sources}
	COMMENT "Running clang-format"
	VERBATIM)