CMakeLists.txt 34.7 KB
Newer Older
1
############################################################################
2
# CMakeLists.txt
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
# Copyright (C) 2014  Belledonne Communications, Grenoble France
#
############################################################################
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
#
############################################################################

include(ExternalProject)

25
set(ep_base "${LINPHONE_BUILDER_WORK_DIR}/${CONFIG_NAME}")
26 27
set_property(DIRECTORY PROPERTY EP_BASE ${ep_base})

28

29 30 31
# Define the architecture. It will be used to generate the URL to get prebuilt dependencies.
if(WIN32)
	set(LINPHONE_BUILDER_ARCHITECTURE "Win32")
32 33 34 35
elseif(UNIX)
	if(APPLE)
		set(LINPHONE_BUILDER_ARCHITECTURE "OsX64")
	endif()
36 37 38
endif()


39
if(CMAKE_VERBOSE_MAKEFILE)
40
	set(AUTOTOOLS_VERBOSE_MAKEFILE 1)
41
else()
42
	set(AUTOTOOLS_VERBOSE_MAKEFILE 0)
43
endif()
44 45


46 47
# Check for build tools and show an error if one of them is not present
include(cmake/CheckBuildTools.cmake)
48

49

50
set(LINPHONE_BUILDER_EP_VARS)
51
set(LINPHONE_BUILDER_INCLUDED_BUILDERS)
52
set(LINPHONE_BUILDER_INCLUDED_BUILDERS_TO_EXCLUDE)
53
set(LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH_BUILDERS)
54 55

macro(linphone_builder_expand_external_project_vars)
Ghislain MARY's avatar
Ghislain MARY committed
56 57 58 59 60 61 62 63 64 65
	set(LINPHONE_BUILDER_EP_ARGS "")
	set(LINPHONE_BUILDER_EP_VARNAMES "")
	foreach(arg ${LINPHONE_BUILDER_EP_VARS})
		string(REPLACE ":" ";" varname_and_vartype ${arg})
		set(target_info_list ${target_info_list})
		list(GET varname_and_vartype 0 _varname)
		list(GET varname_and_vartype 1 _vartype)
		list(APPEND LINPHONE_BUILDER_EP_ARGS -D${_varname}:${_vartype}=${${_varname}})
		list(APPEND LINPHONE_BUILDER_EP_VARNAMES ${_varname})
	endforeach()
66
endmacro()
67 68 69 70

list(APPEND LINPHONE_BUILDER_EP_VARS
	CMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH
	CMAKE_BUILD_TYPE:STRING
71
	CMAKE_BUILD_WITH_INSTALL_RPATH:BOOL
72
	CMAKE_BUNDLE_OUTPUT_DIRECTORY:PATH
73
	CMAKE_C_COMPILER_LAUNCHER:PATH
74 75 76 77 78
	CMAKE_C_FLAGS_DEBUG:STRING
	CMAKE_C_FLAGS_MINSIZEREL:STRING
	CMAKE_C_FLAGS_RELEASE:STRING
	CMAKE_C_FLAGS_RELWITHDEBINFO:STRING
	CMAKE_C_FLAGS:STRING
79
	CMAKE_CXX_COMPILER_LAUNCHER:PATH
80 81 82 83 84 85 86 87 88 89 90
	CMAKE_CXX_FLAGS_DEBUG:STRING
	CMAKE_CXX_FLAGS_MINSIZEREL:STRING
	CMAKE_CXX_FLAGS_RELEASE:STRING
	CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING
	CMAKE_CXX_FLAGS:STRING
	CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING
	CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING
	CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING
	CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING
	CMAKE_EXE_LINKER_FLAGS:STRING
	CMAKE_EXTRA_GENERATOR:STRING
91
	CMAKE_GENERATOR_PLATFORM:STRING
92
	CMAKE_INSTALL_MESSAGE:STRING
93
	CMAKE_INSTALL_PREFIX:PATH
94 95
	CMAKE_INSTALL_RPATH:PATH
	CMAKE_INSTALL_RPATH_USE_LINK_PATH:BOOL
96 97 98 99 100 101 102
	CMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH
	CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING
	CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING
	CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING
	CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING
	CMAKE_MODULE_LINKER_FLAGS:STRING
	CMAKE_MODULE_PATH:PATH
103
	CMAKE_NO_BUILD_TYPE:BOOL
104
	CMAKE_PREFIX_PATH:STRING
105
	CMAKE_PROGRAM_PATH:STRING
106 107 108 109 110 111 112
	CMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH
	CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING
	CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING
	CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING
	CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING
	CMAKE_SHARED_LINKER_FLAGS:STRING
	CMAKE_SKIP_RPATH:BOOL
113
	CMAKE_SKIP_BUILD_RPATH:BOOL
114
	CMAKE_VERBOSE_MAKEFILE:BOOL
115 116 117
	MSVC_C_ARCHITECTURE_ID:STRING
	MSVC_CXX_ARCHITECTURE_ID:STRING
	MSVC_VERSION:STRING
118
)
119
if(CMAKE_CROSSCOMPILING)
Ghislain MARY's avatar
Ghislain MARY committed
120
	list(APPEND LINPHONE_BUILDER_EP_VARS
121 122 123 124
		CMAKE_SYSTEM_NAME:STRING
		CMAKE_SYSTEM_VERSION:STRING
	)
endif()
125 126
if(APPLE)
	list(APPEND LINPHONE_BUILDER_EP_VARS
127
		CMAKE_MACOSX_RPATH:BOOL
128 129 130
		CMAKE_OSX_ARCHITECTURES:STRING
		CMAKE_OSX_DEPLOYMENT_TARGET:STRING
	)
131
endif()
132 133 134 135 136 137 138
if(MSVC)
	if(CMAKE_VERSION VERSION_GREATER "3.3")
		list(APPEND LINPHONE_BUILDER_EP_VARS
			CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD:BOOL
		)
	endif()
endif()
139 140 141
if(CMAKE_TOOLCHAIN_FILE)
	list(APPEND LINPHONE_BUILDER_EP_VARS CMAKE_TOOLCHAIN_FILE:PATH)
endif()
142 143


144
function(linphone_builder_get_autotools_configuration)
145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
	if(MSVC)
		set(_generator "MinGW Makefiles")
	else()
		set(_generator "${CMAKE_GENERATOR}")
	endif()
	set(_autotools_command ${CMAKE_COMMAND} -G "${_generator}")
	if(CMAKE_TOOLCHAIN_FILE)
		list(APPEND _autotools_command "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}")
	endif()
	if(CMAKE_OSX_ARCHITECTURES)
		list(APPEND _autotools_command "-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}")
	endif()
	if(CMAKE_C_COMPILER_LAUNCHER)
		list(APPEND _autotools_command "-DCMAKE_C_COMPILER_LAUNCHER=${CMAKE_C_COMPILER_LAUNCHER}")
	endif()
	if(CMAKE_CXX_COMPILER_LAUNCHER)
		list(APPEND _autotools_command "-DCMAKE_CXX_COMPILER_LAUNCHER=${CMAKE_CXX_COMPILER_LAUNCHER}")
	endif()
	list(APPEND _autotools_command
		"-DAUTOTOOLS_AS_FLAGS=${AUTOTOOLS_AS_FLAGS}"
		"-DAUTOTOOLS_C_FLAGS=${AUTOTOOLS_C_FLAGS}"
		"-DAUTOTOOLS_CPP_FLAGS=${AUTOTOOLS_CPP_FLAGS}"
		"-DAUTOTOOLS_CXX_FLAGS=${AUTOTOOLS_CXX_FLAGS}"
		"-DAUTOTOOLS_OBJC_FLAGS=${AUTOTOOLS_OBJC_FLAGS}"
		"-DAUTOTOOLS_LINKER_FLAGS=${AUTOTOOLS_LINKER_FLAGS}"
	)
	list(APPEND _autotools_command "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Autotools/")
	execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/Autotools)
	execute_process(COMMAND ${_autotools_command} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/Autotools)
	unset(_autotools_command)
	unset(_extra_generator)
	unset(_generator)
	include(${CMAKE_BINARY_DIR}/Autotools/Autotools.cmake)
Ghislain MARY's avatar
Ghislain MARY committed
178
endfunction()
179 180


181 182
macro(linphone_builder_create_targets_list)
	set(LINPHONE_BUILDER_TARGETS )
Ghislain MARY's avatar
Ghislain MARY committed
183
	if(LINPHONE_BUILDER_TARGET STREQUAL "belle-sip")
jehan's avatar
jehan committed
184
		list(APPEND LINPHONE_BUILDER_TARGETS "belle-sip" "bctoolbox")
Ghislain MARY's avatar
Ghislain MARY committed
185
	elseif(LINPHONE_BUILDER_TARGET STREQUAL "ortp")
186
		list(APPEND LINPHONE_BUILDER_TARGETS "ortp")
Ghislain MARY's avatar
Ghislain MARY committed
187
	elseif(LINPHONE_BUILDER_TARGET STREQUAL "ms2")
jehan's avatar
jehan committed
188
		list(APPEND LINPHONE_BUILDER_TARGETS "ortp" "ms2" "bctoolbox")
Ghislain MARY's avatar
Ghislain MARY committed
189
	elseif(LINPHONE_BUILDER_TARGET STREQUAL "ms2-plugins")
190
		list(APPEND LINPHONE_BUILDER_TARGETS "ortp" "ms2" "ms2-plugins")
Ghislain MARY's avatar
Ghislain MARY committed
191
	elseif(LINPHONE_BUILDER_TARGET STREQUAL "linphone")
jehan's avatar
jehan committed
192
		list(APPEND LINPHONE_BUILDER_TARGETS "belle-sip" "ortp" "ms2" "ms2-plugins" "bctoolbox" "linphone")
Ghislain MARY's avatar
Ghislain MARY committed
193
	elseif(LINPHONE_BUILDER_TARGET STREQUAL "flexisip")
194
		list(APPEND LINPHONE_BUILDER_TARGETS "ortp" "flexisip")
Ghislain MARY's avatar
Ghislain MARY committed
195
	elseif(LINPHONE_BUILDER_TARGET STREQUAL "odb")
196
		list(APPEND LINPHONE_BUILDER_TARGETS "odb" )
jehan's avatar
jehan committed
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219
	elseif(LINPHONE_BUILDER_TARGET STREQUAL "bctoolbox")
		list(APPEND LINPHONE_BUILDER_TARGETS "bctoolbox" )
	else()
		message(FATAL_ERROR "Invalid LINPHONE_BUILDER_TARGET '${LINPHONE_BUILDER_TARGET}'")
	endif()
endmacro()


macro(linphone_builder_include_builder BUILDER)
	list(FIND LINPHONE_BUILDER_INCLUDED_BUILDERS ${BUILDER} _already_included)
	if(_already_included EQUAL -1)
		message(STATUS "Including builder ${BUILDER}")
		include(${CMAKE_CURRENT_SOURCE_DIR}/builders/${BUILDER}.cmake)
		list(APPEND LINPHONE_BUILDER_INCLUDED_BUILDERS ${BUILDER})
	endif()
	unset(_already_included)
endmacro()


macro(linphone_builder_add_builder_to_target TARGETNAME BUILDER)
	linphone_builder_include_builder(${BUILDER})
	if(LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH AND (LINPHONE_BUILDER_GROUP_EXTERNAL_SOURCE_PATH_BUILDERS OR LINPHONE_BUILDER_BUILD_ONLY_EXTERNAL_SOURCE_PATH))
		foreach(SUBDIR ${EP_${BUILDER}_EXTERNAL_SOURCE_PATHS})
220 221 222
	else()
		message(FATAL_ERROR "Invalid LINPHONE_BUILDER_TARGET '${LINPHONE_BUILDER_TARGET}'")
	endif()
Ghislain MARY's avatar
Ghislain MARY committed
223
endmacro()
224 225 226 227 228 229 230 231 232 233


macro(linphone_builder_include_builder BUILDER)
	list(FIND LINPHONE_BUILDER_INCLUDED_BUILDERS ${BUILDER} _already_included)
	if(_already_included EQUAL -1)
		message(STATUS "Including builder ${BUILDER}")
		include(${CMAKE_CURRENT_SOURCE_DIR}/builders/${BUILDER}.cmake)
		list(APPEND LINPHONE_BUILDER_INCLUDED_BUILDERS ${BUILDER})
	endif()
	unset(_already_included)
Ghislain MARY's avatar
Ghislain MARY committed
234
endmacro()
235 236 237 238


macro(linphone_builder_add_builder_to_target TARGETNAME BUILDER)
	linphone_builder_include_builder(${BUILDER})
239
	if(LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH AND (LINPHONE_BUILDER_GROUP_EXTERNAL_SOURCE_PATH_BUILDERS OR LINPHONE_BUILDER_BUILD_ONLY_EXTERNAL_SOURCE_PATH))
240
		foreach(SUBDIR ${EP_${BUILDER}_EXTERNAL_SOURCE_PATHS})
241 242 243 244 245
			if(SUBDIR STREQUAL "<LINPHONE_BUILDER_TOP_DIR>")
				set(_source_dir "${LINPHONE_BUILDER_TOP_DIR}")
			else()
				set(_source_dir "${LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH}/${SUBDIR}")
			endif()
246
			if(EXISTS "${_source_dir}")
247
				#message("    ${TARGETNAME} depends on external source path ${_source_dir}")
248
				set(_build_from_external_source_path 1)
249
				break()
250 251 252 253 254
			endif()
		endforeach()
		if(_build_from_external_source_path)
			list(FIND LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH_BUILDERS ${BUILDER} _already_included)
			if(_already_included EQUAL -1)
255
				# message("    external source path builder ${BUILDER}: ${_source_dir}")
256 257
				set(EP_${BUILDER}_SOURCE_DIR "${_source_dir}")
				list(APPEND LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH_BUILDERS ${BUILDER})
258 259
			endif()
			unset(_already_included)
260
		elseif(LINPHONE_BUILDER_BUILD_ONLY_EXTERNAL_SOURCE_PATH)
261
			list(APPEND LINPHONE_BUILDER_INCLUDED_BUILDERS_TO_EXCLUDE ${BUILDER})
262
		else()
Ghislain MARY's avatar
Ghislain MARY committed
263
			#message("     ${TARGETNAME} depends on external project EP_${BUILDER}")
264
			add_dependencies(${TARGETNAME} EP_${BUILDER})
265 266 267
		endif()
		unset(_build_from_external_source_path)
	else()
Ghislain MARY's avatar
Ghislain MARY committed
268
		#message("    ${TARGETNAME} depends on external project EP_${BUILDER}")
269 270
		add_dependencies(${TARGETNAME} EP_${BUILDER})
	endif()
Ghislain MARY's avatar
Ghislain MARY committed
271
endmacro()
272 273


274
macro(linphone_builder_apply_flags)
Ghislain MARY's avatar
Ghislain MARY committed
275 276 277 278 279 280 281 282 283 284
	if(LINPHONE_BUILDER_OSX_ARCHITECTURES)
		set(CMAKE_OSX_ARCHITECTURES ${LINPHONE_BUILDER_OSX_ARCHITECTURES})
		set(AUTOTOOLS_ARCH "-arch ${CMAKE_OSX_ARCHITECTURES}")
		set(AUTOTOOLS_C_FLAGS "${AUTOTOOLS_C_FLAGS} ${AUTOTOOLS_ARCH}")
		set(AUTOTOOLS_CXX_FLAGS "${AUTOTOOLS_CXX_FLAGS} ${AUTOTOOLS_ARCH}")
		set(AUTOTOOLS_OBJC_FLAGS "${AUTOTOOLS_OBJC_FLAGS} ${AUTOTOOLS_ARCH}")
		set(AUTOTOOLS_LINKER_FLAGS "${AUTOTOOLS_LINKER_FLAGS} ${AUTOTOOLS_ARCH}")
	endif()

	if(LINPHONE_BUILDER_CPPFLAGS)
285 286
		set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LINPHONE_BUILDER_CPPFLAGS}")
		set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LINPHONE_BUILDER_CPPFLAGS}")
Ghislain MARY's avatar
Ghislain MARY committed
287 288 289 290
		set(AUTOTOOLS_C_FLAGS "${AUTOTOOLS_C_FLAGS} ${LINPHONE_BUILDER_CPPFLAGS}")
		set(AUTOTOOLS_CXX_FLAGS "${AUTOTOOLS_CXX_FLAGS} ${LINPHONE_BUILDER_CPPFLAGS}")
	endif()
	if(LINPHONE_BUILDER_CFLAGS)
291
		set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LINPHONE_BUILDER_CFLAGS}")
Ghislain MARY's avatar
Ghislain MARY committed
292 293 294
		set(AUTOTOOLS_C_FLAGS "${AUTOTOOLS_C_FLAGS} ${LINPHONE_BUILDER_CFLAGS}")
	endif()
	if(LINPHONE_BUILDER_CXXFLAGS)
295
		set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LINPHONE_BUILDER_CXXFLAGS}")
Ghislain MARY's avatar
Ghislain MARY committed
296 297 298
		set(AUTOTOOLS_CXX_FLAGS "{AUTOTOOLS_CXX_FLAGS} ${LINPHONE_BUILDER_CXX_FLAGS}")
	endif()
	if(LINPHONE_BUILDER_OBJCFLAGS)
299
		set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LINPHONE_BUILDER_OBJCFLAGS}")
Ghislain MARY's avatar
Ghislain MARY committed
300 301 302
		set(AUTOTOOLS_OBJC_FLAGS "${AUTOTOOLS_OBJC_FLAGS} ${LINPHONE_BUILDER_OBJCFLAGS}")
	endif()
	if(LINPHONE_BUILDER_LDFLAGS)
303 304 305
		set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LINPHONE_BUILDER_LDFLAGS}")
		set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${LINPHONE_BUILDER_LDFLAGS}")
		set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${LINPHONE_BUILDER_LDFLAGS}")
Ghislain MARY's avatar
Ghislain MARY committed
306 307
		set(AUTOTOOLS_LINKER_FLAGS "${AUTOTOOLS_LINKER_FLAGS} ${LINPHONE_BUILDER_LDFLAGS}")
	endif()
Ghislain MARY's avatar
Ghislain MARY committed
308
endmacro()
309 310


311
macro(linphone_builder_apply_cmake_flags_to_autotools_project PROJNAME)
Ghislain MARY's avatar
Ghislain MARY committed
312
	if(EP_${PROJNAME}_BUILD_METHOD STREQUAL "autotools")
Ghislain MARY's avatar
Ghislain MARY committed
313 314 315 316 317 318
		set(ep_asflags "${AUTOTOOLS_AS_FLAGS}")
		set(ep_cppflags "${AUTOTOOLS_CPP_FLAGS}")
		set(ep_cflags "${AUTOTOOLS_C_FLAGS}")
		set(ep_cxxflags "${AUTOTOOLS_CXX_FLAGS}")
		set(ep_objcflags "${AUTOTOOLS_OBJC_FLAGS}")
		set(ep_ldflags "${AUTOTOOLS_LINKER_FLAGS}")
319
	endif()
Ghislain MARY's avatar
Ghislain MARY committed
320
endmacro()
321 322


323
macro(linphone_builder_apply_extra_flags PROJNAME)
Ghislain MARY's avatar
Ghislain MARY committed
324
	if(EP_${PROJNAME}_BUILD_METHOD STREQUAL "autotools")
325 326 327 328 329 330
		set(ep_asflags "${ep_asflags} ${EP_${PROJNAME}_EXTRA_ASFLAGS}")
		set(ep_cppflags "${ep_cppflags} ${EP_${PROJNAME}_EXTRA_CPPFLAGS}")
		set(ep_cflags "${ep_cflags} ${EP_${PROJNAME}_EXTRA_CFLAGS}")
		set(ep_cxxflags "${ep_cxxflags} ${EP_${PROJNAME}_EXTRA_CXXFLAGS}")
		set(ep_objcflags "${ep_objcflags} ${EP_${PROJNAME}_EXTRA_OBJCFLAGS}")
		set(ep_ldflags "${ep_ldflags} ${EP_${PROJNAME}_EXTRA_LDFLAGS}")
331
	else()
332 333 334 335 336
		set(SAVED_CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
		set(SAVED_CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
		set(SAVED_CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
		set(SAVED_CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}")
		set(SAVED_CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
337
		if(EP_${PROJNAME}_EXTRA_CFLAGS)
338
			set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EP_${PROJNAME}_EXTRA_CFLAGS}")
339 340
		endif()
		if(EP_${PROJNAME}_EXTRA_CXXFLAGS)
341
			set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EP_${PROJNAME}_EXTRA_CXXFLAGS}")
342 343
		endif()
		if(EP_${PROJNAME}_EXTRA_LDFLAGS)
344 345 346
			set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${EP_${PROJNAME}_EXTRA_LDFLAGS}")
			set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${EP_${PROJNAME}_EXTRA_LDFLAGS}")
			set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${EP_${PROJNAME}_EXTRA_LDFLAGS}")
347
		endif()
348
	endif()
Ghislain MARY's avatar
Ghislain MARY committed
349
endmacro()
350 351


352 353 354 355 356 357 358 359 360
macro(linphone_builder_restore_flags)
	set(CMAKE_C_FLAGS "${SAVED_CMAKE_C_FLAGS}")
	set(CMAKE_CXX_FLAGS "${SAVED_CMAKE_CXX_FLAGS}")
	set(CMAKE_EXE_LINKER_FLAGS "${SAVED_CMAKE_EXE_LINKER_FLAGS}")
	set(CMAKE_MODULE_LINKER_FLAGS "${SAVED_CMAKE_MODULE_LINKER_FLAGS}")
	set(CMAKE_SHARED_LINKER_FLAGS "${SAVED_CMAKE_SHARED_LINKER_FLAGS}")
endmacro()


361
macro(linphone_builder_set_ep_directories PROJNAME)
362 363 364 365 366
	if(EP_${PROJNAME}_SOURCE_DIR)
		set(ep_source "${EP_${PROJNAME}_SOURCE_DIR}")
	else()
		set(ep_source "${ep_base}/Source/EP_${PROJNAME}")
	endif()
367
	if(EP_${PROJNAME}_BUILD_IN_SOURCE)
368
		set(ep_build "${ep_source}")
Ghislain MARY's avatar
Ghislain MARY committed
369
	else()
370
		set(ep_build "${ep_base}/Build/${PROJNAME}")
371

372 373 374 375 376 377 378 379
		# replace "//" with "/" in paths
		string(FIND "${ep_build}" "//" must_trim)
		while (must_trim GREATER -1)
			string(REPLACE "//" "/" ep_build_trim ${ep_build})
			set(ep_build ${ep_build_trim})
			string(FIND "${ep_build}" "//" must_trim)
		endwhile()

380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406
		# Compute the relative path to the source directory from the build directory
		set(common TRUE)
		set(not_finished TRUE)
		set(idx 1)
		string(LENGTH "${ep_source}" ep_source_length)
		string(LENGTH "${ep_build}" ep_build_length)
		while(common AND not_finished)
			string(SUBSTRING "${ep_source}" 0 ${idx} common_ep_source)
			string(SUBSTRING "${ep_build}" 0 ${idx} common_ep_build)
			math(EXPR idx "${idx}+1")
			if(NOT common_ep_source STREQUAL common_ep_build)
				set(common FALSE)
			endif()
			if((idx EQUAL ep_source_length) OR (idx EQUAL ep_build_length))
				set(not_finished FALSE)
			endif()
		endwhile()
		math(EXPR idx "${idx}-2")
		math(EXPR relative_source_length "${ep_source_length}-${idx}")
		math(EXPR relative_build_length "${ep_build_length}-${idx}")
		string(SUBSTRING "${ep_source}" ${idx} ${relative_source_length} ep_relative_source)
		string(SUBSTRING "${ep_build}" ${idx} ${relative_build_length} ep_relative_build)
		set(updirs "")
		string(FIND "${ep_relative_build}" "/" idx)
		while(idx GREATER -1)
			string(CONCAT updirs "${updirs}" "../")
			math(EXPR idx "${idx}+1")
407
			math(EXPR relative_build_length "${relative_build_length}-${idx}")
408 409 410 411 412 413 414
			string(SUBSTRING "${ep_relative_build}" ${idx} ${relative_build_length} ep_relative_build)
			string(FIND "${ep_relative_build}" "/" idx)
		endwhile()
		if(ep_relative_build)
			string(CONCAT updirs "${updirs}" "../")
		endif()
		set(ep_source_relative_to_build "${updirs}/${ep_relative_source}")
Ghislain MARY's avatar
Ghislain MARY committed
415 416
	endif()
endmacro()
417

418

419 420 421 422 423 424 425 426 427
macro(linphone_builder_set_ep_generator)
	if(CMAKE_EXTRA_GENERATOR)
		set(ep_generator "${CMAKE_EXTRA_GENERATOR} - ${CMAKE_GENERATOR}")
	else()
		set(ep_generator "${CMAKE_GENERATOR}")
	endif()
endmacro()


428
macro(linphone_builder_create_autogen_command PROJNAME)
429 430
	if(EP_${PROJNAME}_USE_AUTOGEN)
		if(EP_${PROJNAME}_CONFIGURE_OPTIONS_PASSED_TO_AUTOGEN)
431 432 433
			set(ep_autogen_options "")
			foreach(OPTION ${EP_${PROJNAME}_CROSS_COMPILATION_OPTIONS} ${EP_${PROJNAME}_LINKING_TYPE} ${EP_${PROJNAME}_CONFIGURE_OPTIONS})
				set(ep_autogen_options "${ep_autogen_options} \"${OPTION}\"")
Ghislain MARY's avatar
Ghislain MARY committed
434
			endforeach()
435
		endif()
436
		set(ep_autogen_command "\"${ep_source}/autogen.sh\" ${ep_autogen_options}")
437
	else()
438
		set(ep_autogen_command "")
439
	endif()
Ghislain MARY's avatar
Ghislain MARY committed
440
endmacro()
441 442 443


macro(linphone_builder_create_configure_command PROJNAME)
444
	if(EP_${PROJNAME}_CONFIGURE_OPTIONS_PASSED_TO_AUTOGEN)
445
		set(ep_configure_command "")
446
	else()
447 448 449
		set(ep_configure_options "")
		foreach(OPTION ${EP_${PROJNAME}_CROSS_COMPILATION_OPTIONS} ${EP_${PROJNAME}_LINKING_TYPE} ${EP_${PROJNAME}_CONFIGURE_OPTIONS})
			set(ep_configure_options "${ep_configure_options} \"${OPTION}\"")
Ghislain MARY's avatar
Ghislain MARY committed
450
		endforeach()
451
		set(ep_configure_env "${EP_${PROJNAME}_CONFIGURE_ENV}")
452
		set(ep_configure_command "\"${ep_source}/configure\" ${ep_configure_options}")
453
	endif()
Ghislain MARY's avatar
Ghislain MARY committed
454
endmacro()
455 456


457 458 459 460 461
macro(linphone_builder_create_build_command PROJNAME)
	set(ep_make_options "${EP_${PROJNAME}_MAKE_OPTIONS}")
endmacro()


462
# this function invokes configure_file() for the project, using the default file if
463 464
# the specific file is not defined
function(linphone_builder_configure_file_for_project PROJNAME CMD DEFAULT_CONF_FILE OUTPUT)
Ghislain MARY's avatar
Ghislain MARY committed
465
	if(NOT EP_${PROJNAME}_${CMD}_COMMAND_SOURCE)
466
		message(STATUS "Using default file ${DEFAULT_CONF_FILE} for ${CMD} step of ${PROJNAME}")
467 468
		configure_file(${DEFAULT_CONF_FILE} ${OUTPUT})
	else()
469
		message(STATUS "Using specific file ${EP_${PROJNAME}_${CMD}_COMMAND_SOURCE} for ${CMD} step of ${PROJNAME}")
470
		configure_file(${EP_${PROJNAME}_${CMD}_COMMAND_SOURCE} ${OUTPUT})
471 472 473
	endif()
endfunction()

474 475 476 477
macro(linphone_builder_filter_out_inexistent_dependencies PROJNAME)
	if(EP_${PROJNAME}_DEPENDENCIES)
		set(_new_deps )
		foreach(_dep ${EP_${PROJNAME}_DEPENDENCIES})
478 479
			string(REGEX REPLACE "^EP_" "" _dep2 ${_dep})
			list(FIND LINPHONE_BUILDER_INCLUDED_BUILDERS ${_dep2} _found)
480
			list(FIND LINPHONE_BUILDER_INCLUDED_BUILDERS_TO_EXCLUDE ${_dep2} _excluded_found)
481
			list(FIND LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH_BUILDERS ${_dep2} _external_source_path_found)
482
			if((_found GREATER -1) AND (_excluded_found EQUAL -1) AND ((_external_source_path_found EQUAL -1) OR (NOT EP_${_dep2}_GROUPABLE)))
483 484 485 486 487 488 489 490 491 492 493
				list(APPEND _new_deps ${_dep})
			endif()
		endforeach()
		unset(_dep)
		unset(_found)
		unset(_external_source_path_found)
		set(EP_${PROJNAME}_DEPENDENCIES ${_new_deps})
		unset(_new_deps)
	endif()
endmacro()

494
function(linphone_builder_add_external_project PROJNAME)
495 496 497
	if(LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH)
		foreach(SUBDIR ${EP_${PROJNAME}_EXTERNAL_SOURCE_PATHS})
			if(NOT EP_${PROJNAME}_SOURCE_DIR)
498 499 500 501 502 503 504
				if(SUBDIR STREQUAL "<LINPHONE_BUILDER_TOP_DIR>")
					set(_source_dir "${LINPHONE_BUILDER_TOP_DIR}")
				else()
					set(_source_dir "${LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH}/${SUBDIR}")
				endif()
				if(EXISTS "${_source_dir}")
					set(EP_${PROJNAME}_SOURCE_DIR "${_source_dir}")
505 506 507 508 509
				endif()
			endif()
		endforeach()
	endif()

510
	linphone_builder_set_ep_directories(${PROJNAME})
511
	linphone_builder_set_ep_generator()
Ghislain MARY's avatar
Ghislain MARY committed
512 513 514
	if(NOT EP_${PROJNAME}_DO_NOT_USE_CMAKE_FLAGS)
		linphone_builder_apply_cmake_flags_to_autotools_project(${PROJNAME})
	endif()
515
	linphone_builder_apply_extra_flags(${PROJNAME})
516 517
	linphone_builder_expand_external_project_vars()

Ghislain MARY's avatar
Ghislain MARY committed
518
	if(EP_${PROJNAME}_BUILD_METHOD STREQUAL "prebuilt")
519 520 521 522 523 524
		message("Using prebuilt ${PROJNAME}")
		set(BUILD_COMMANDS
			CONFIGURE_COMMAND ${CMAKE_COMMAND} -E echo ""
			BUILD_COMMAND ${CMAKE_COMMAND} -E echo ""
			INSTALL_COMMAND ${CMAKE_COMMAND} -DSOURCE_DIR=<SOURCE_DIR> -DINSTALL_DIR=${CMAKE_INSTALL_PREFIX} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/install_prebuilt.cmake
		)
Ghislain MARY's avatar
Ghislain MARY committed
525
	elseif(EP_${PROJNAME}_BUILD_METHOD STREQUAL "custom")
526 527 528
		if(WIN32)
			set(ep_redirect_to_file "2>&1 >> \"${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}.log\"")
		endif()
529 530 531 532 533 534 535 536 537 538 539 540
		configure_file(${EP_${PROJNAME}_CONFIGURE_COMMAND_SOURCE} ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_configure.sh)
		configure_file(${EP_${PROJNAME}_BUILD_COMMAND_SOURCE} ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_build.sh)
		configure_file(${EP_${PROJNAME}_INSTALL_COMMAND_SOURCE} ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_install.sh)
		if(WIN32)
			set(SCRIPT_EXTENSION bat)
			set(MSVC_PROJNAME ${PROJNAME})
			configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/mingw_configure.bat.cmake ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_configure.bat)
			configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/mingw_build.bat.cmake ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_build.bat)
			configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/mingw_install.bat.cmake ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_install.bat)
		else()
			set(SCRIPT_EXTENSION sh)
		endif()
541
		set(BUILD_COMMANDS
542 543 544
			CONFIGURE_COMMAND ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_configure.${SCRIPT_EXTENSION}
			BUILD_COMMAND ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_build.${SCRIPT_EXTENSION}
			INSTALL_COMMAND ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_install.${SCRIPT_EXTENSION}
545
		)
Ghislain MARY's avatar
Ghislain MARY committed
546
	elseif(EP_${PROJNAME}_BUILD_METHOD STREQUAL "autotools")
547 548
		linphone_builder_create_autogen_command(${PROJNAME})
		linphone_builder_create_configure_command(${PROJNAME})
549
		linphone_builder_create_build_command(${PROJNAME})
Ghislain MARY's avatar
Ghislain MARY committed
550
		if(EP_${PROJNAME}_CONFIG_H_FILE)
551
			set(ep_config_h_file ${EP_${PROJNAME}_CONFIG_H_FILE})
Ghislain MARY's avatar
Ghislain MARY committed
552
		else()
Ghislain MARY's avatar
Ghislain MARY committed
553 554 555
			set(ep_config_h_file config.h)
		endif()
		if(EP_${PROJNAME}_INSTALL_TARGET)
556
			set(ep_install_target "${EP_${PROJNAME}_INSTALL_TARGET}")
Ghislain MARY's avatar
Ghislain MARY committed
557 558
		else()
			set(ep_install_target "install")
Ghislain MARY's avatar
Ghislain MARY committed
559
		endif()
560

561
		if(WIN32)
562
			set(ep_redirect_to_file "2>&1 >> \"${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}.log\"")
563 564 565 566 567 568
			set(SCRIPT_EXTENSION bat)
			set(MSVC_PROJNAME ${PROJNAME})
			configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/mingw_configure.bat.cmake ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_configure.bat)
			configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/mingw_build.bat.cmake ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_build.bat)
			configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/mingw_install.bat.cmake ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_install.bat)
			# Build in source with MinGW as build out-of-source does not work
569
			set(ep_build "${ep_source}")
Ghislain MARY's avatar
Ghislain MARY committed
570
			if(ep_autogen_command)
571 572
				set(ep_autogen_redirect_to_file ${ep_redirect_to_file})
			endif()
Ghislain MARY's avatar
Ghislain MARY committed
573
			if(ep_configure_command)
574 575
				set(ep_configure_redirect_to_file ${ep_redirect_to_file})
			endif()
576
		else()
577
			set(SCRIPT_EXTENSION sh)
578
		endif()
579

Ghislain MARY's avatar
Ghislain MARY committed
580
		if(EP_${PROJNAME}_PKG_CONFIG)
581
			set(LINPHONE_BUILDER_PKG_CONFIG "${EP_${PROJNAME}_PKG_CONFIG}")
Ghislain MARY's avatar
Ghislain MARY committed
582 583
		else()
			set(LINPHONE_BUILDER_PKG_CONFIG "${PKG_CONFIG_PROGRAM}")
Ghislain MARY's avatar
Ghislain MARY committed
584
		endif()
585

586 587 588
		configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/configure.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_configure.sh)
		configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/build.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_build.sh)
		configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/install.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_install.sh)
Ghislain MARY's avatar
Ghislain MARY committed
589 590

		set(BUILD_COMMANDS
591 592 593
			CONFIGURE_COMMAND ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_configure.${SCRIPT_EXTENSION}
			BUILD_COMMAND ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_build.${SCRIPT_EXTENSION}
			INSTALL_COMMAND ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_install.${SCRIPT_EXTENSION}
Ghislain MARY's avatar
Ghislain MARY committed
594
		)
Ghislain MARY's avatar
Ghislain MARY committed
595
	elseif(EP_${PROJNAME}_BUILD_METHOD STREQUAL "rpm")
596

597
		if(WIN32)
598
			message(SEND_ERROR "rpm build not supported on WIN32")
599 600 601 602
		endif()

		linphone_builder_create_autogen_command(${PROJNAME})
		linphone_builder_create_configure_command(${PROJNAME})
603

Ghislain MARY's avatar
Ghislain MARY committed
604
		if(EP_${PROJNAME}_CONFIG_H_FILE)
605
			set(ep_config_h_file ${EP_${PROJNAME}_CONFIG_H_FILE})
Ghislain MARY's avatar
Ghislain MARY committed
606 607
		else()
			set(ep_config_h_file config.h)
608
		endif()
609

Ghislain MARY's avatar
Ghislain MARY committed
610
		if(EP_${PROJNAME}_INSTALL_TARGET)
611
			set(ep_install_target "${EP_${PROJNAME}_INSTALL_TARGET}")
Ghislain MARY's avatar
Ghislain MARY committed
612 613
		else()
			set(ep_install_target "install")
614 615
		endif()

Ghislain MARY's avatar
Ghislain MARY committed
616
		if(EP_${PROJNAME}_SPEC_FILE)
617
			set(LINPHONE_BUILDER_SPEC_FILE "${EP_${PROJNAME}_SPEC_FILE}")
Ghislain MARY's avatar
Ghislain MARY committed
618 619
		else()
			message(SEND_ERROR "rpm build requires EP_${PROJNAME}_SPEC_FILE to be defined")
620 621 622 623
		endif()

		# a distinctive name of the generated RPM. It is used to find the rpms to install
		# in the install step. Defaults to $PROJNAME but could be something else
Ghislain MARY's avatar
Ghislain MARY committed
624
		if(EP_${PROJNAME}_RPMBUILD_NAME)
625
			set(LINPHONE_BUILDER_RPMBUILD_NAME "${EP_${PROJNAME}_RPMBUILD_NAME}")
Ghislain MARY's avatar
Ghislain MARY committed
626 627
		else()
			set(LINPHONE_BUILDER_RPMBUILD_NAME "${PROJNAME}")
628
		endif()
629

630 631
		# a distinctive name of the generated RPM. It is used to find the rpms to install
		# in the install step. Defaults to $PROJNAME but could be something else
Ghislain MARY's avatar
Ghislain MARY committed
632
		if(EP_${PROJNAME}_RPMBUILD_OPTIONS)
633 634 635 636 637
			set(LINPHONE_BUILDER_RPMBUILD_OPTIONS "${EP_${PROJNAME}_RPMBUILD_OPTIONS}")
		endif()

		set(LINPHONE_BUILDER_SPEC_PREFIX "${EP_${PROJNAME}_SPEC_PREXIX}")

Ghislain MARY's avatar
Ghislain MARY committed
638
		if(EP_${PROJNAME}_PKG_CONFIG)
639
			set(LINPHONE_BUILDER_PKG_CONFIG "${EP_${PROJNAME}_PKG_CONFIG}")
Ghislain MARY's avatar
Ghislain MARY committed
640 641
		else()
			set(LINPHONE_BUILDER_PKG_CONFIG "${PKG_CONFIG_PROGRAM}")
642 643
		endif()

Ghislain MARY's avatar
Ghislain MARY committed
644
		if(EP_${PROJNAME}_CONFIGURE_EXTRA_CMD)
645 646 647
			set(LINPHONE_BUILDER_CONFIGURE_EXTRA_CMD "${EP_${PROJNAME}_CONFIGURE_EXTRA_CMD}")
		endif()

648 649 650 651
		# allow to have special command steps
		linphone_builder_configure_file_for_project(${PROJNAME} CONFIGURE ${CMAKE_CURRENT_SOURCE_DIR}/cmake/configure.rpm.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_configure_rpm.sh)
		linphone_builder_configure_file_for_project(${PROJNAME} BUILD ${CMAKE_CURRENT_SOURCE_DIR}/cmake/build.rpm.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_build_rpm.sh)
		linphone_builder_configure_file_for_project(${PROJNAME} INSTALL ${CMAKE_CURRENT_SOURCE_DIR}/cmake/install.rpm.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_install_rpm.sh)
652 653 654 655 656 657

		set(BUILD_COMMANDS
			CONFIGURE_COMMAND ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_configure_rpm.sh
			BUILD_COMMAND ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_build_rpm.sh
			INSTALL_COMMAND ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_install_rpm.sh
		)
658 659
	else()
		# Use CMake build method
660 661 662 663
		set(BUILD_COMMANDS
			CMAKE_ARGS ${EP_${PROJNAME}_CMAKE_OPTIONS} ${EP_${PROJNAME}_LINKING_TYPE}
			CMAKE_CACHE_ARGS ${LINPHONE_BUILDER_EP_ARGS}
		)
664
	endif()
665

666
	if(LINPHONE_BUILDER_LATEST AND EP_${PROJNAME}_GIT_TAG_LATEST)
667
		set(DOWNLOAD_SOURCE GIT_REPOSITORY ${EP_${PROJNAME}_GIT_REPOSITORY} GIT_TAG ${EP_${PROJNAME}_GIT_TAG_LATEST})
668
	elseif(EP_${PROJNAME}_SOURCE_DIR)
669
		set(DOWNLOAD_SOURCE SOURCE_DIR "${EP_${PROJNAME}_SOURCE_DIR}")
670 671 672 673 674
	elseif(EP_${PROJNAME}_URL)
		set(DOWNLOAD_SOURCE URL ${EP_${PROJNAME}_URL})
		if(EP_${PROJNAME}_URL_HASH)
			list(APPEND DOWNLOAD_SOURCE URL_HASH ${EP_${PROJNAME}_URL_HASH})
		endif()
675
	else()
676
		set(DOWNLOAD_SOURCE GIT_REPOSITORY ${EP_${PROJNAME}_GIT_REPOSITORY} GIT_TAG ${EP_${PROJNAME}_GIT_TAG})
677
	endif()
678

679 680
	linphone_builder_filter_out_inexistent_dependencies(${PROJNAME})

681 682
	ExternalProject_Add(EP_${PROJNAME}
		DEPENDS ${EP_${PROJNAME}_DEPENDENCIES}
683
		BINARY_DIR "${ep_build}"
684
		${DOWNLOAD_SOURCE}
685
		PATCH_COMMAND ${EP_${PROJNAME}_PATCH_COMMAND}
686
		CMAKE_GENERATOR ${ep_generator}
Ghislain MARY's avatar
Ghislain MARY committed
687
		${BUILD_COMMANDS}
688
	)
689

690 691 692
	if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/builders/${PROJNAME}/postinstall.cmake)
		ExternalProject_Add_Step(EP_${PROJNAME} postinstall
			COMMAND ${CMAKE_COMMAND} -DPYTHON_EXECUTABLE=${PYTHON_EXECUTABLE} -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -DINSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -P ${CMAKE_CURRENT_SOURCE_DIR}/builders/${PROJNAME}/postinstall.cmake
693 694
			COMMENT "Performing post-installation for 'EP_${PROJNAME}'"
			DEPENDEES install
695 696
			WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
		)
697
	endif()
698
	if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/builders/${PROJNAME}/postconfig.cmake)
699
		ExternalProject_Add_Step(EP_${PROJNAME} postconfig
700
			COMMAND ${CMAKE_COMMAND} -DPYTHON_EXECUTABLE=${PYTHON_EXECUTABLE} -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -DINSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -P ${CMAKE_CURRENT_SOURCE_DIR}/builders/${PROJNAME}/postinstall.cmake
701 702 703 704 705 706 707 708 709 710 711 712
			COMMENT "Performing post-configuration for 'EP_${PROJNAME}'"
			DEPENDEES install
			WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
		)
	endif()

	if(EP_${PROJNAME}_GROUPED_SOURCE_DIRS OR EP_${PROJNAME}_SOURCE_DIR)
		if(EP_${PROJNAME}_GROUPED_SOURCE_DIRS)
			set(_source_dirs ${EP_${PROJNAME}_GROUPED_SOURCE_DIRS})
		else()
			set(_source_dirs ${EP_${PROJNAME}_SOURCE_DIR})
		endif()
713 714 715 716
		ExternalProject_Add_Step(EP_${PROJNAME} force_build
			COMMENT "Forcing build for 'EP_${PROJNAME}'"
			DEPENDEES configure
			DEPENDERS build
717 718 719
			ALWAYS 1
		)
		unset(_source_dirs)
720 721
	endif()

722 723
	linphone_builder_restore_flags()

Ghislain MARY's avatar
Ghislain MARY committed
724
endfunction()
Ghislain MARY's avatar
Ghislain MARY committed
725

726
macro(linphone_builder_add_grouped_external_source_path_project PROJNAME FILENAME)
727
	linphone_builder_filter_out_inexistent_dependencies(${PROJNAME})
728 729 730
	file(APPEND "${FILENAME}" "add_subdirectory(\"${EP_${PROJNAME}_SOURCE_DIR}\" \"${LINPHONE_BUILDER_WORK_DIR}/Build/${PROJNAME}\")\n")
	list(APPEND EP_linphone_builder_LINKING_TYPES "${EP_${PROJNAME}_LINKING_TYPE}")
	list(APPEND EP_linphone_builder_CMAKE_OPTIONS "${EP_${PROJNAME}_CMAKE_OPTIONS}")
731 732 733
	list(APPEND EP_linphone_builder_EXTRA_CFLAGS "${EP_${PROJNAME}_EXTRA_CFLAGS}")
	list(APPEND EP_linphone_builder_EXTRA_CPPFLAGS "${EP_${PROJNAME}_EXTRA_CPPFLAGS}")
	list(APPEND EP_linphone_builder_EXTRA_CXXFLAGS "${EP_${PROJNAME}_EXTRA_CXXFLAGS}")
734
	list(APPEND EP_linphone_builder_EXTRA_LDFLAGS "${EP_${PROJNAME}_EXTRA_LDFLAGS}")
735
	list(APPEND EP_linphone_builder_EXTRA_OBJCFLAGS "${EP_${PROJNAME}_EXTRA_OBJCFLAGS}")
736 737
	list(APPEND EP_linphone_builder_ADDITIONAL_CMAKE_OPTIONS "-DEP_${PROJNAME}_INCLUDE_DIR=${EP_${PROJNAME}_SOURCE_DIR}/include")
	list(APPEND EP_linphone_builder_ADDITIONAL_CMAKE_OPTIONS "-DEP_${PROJNAME}_CONFIG_DIR=${LINPHONE_BUILDER_WORK_DIR}/Build/${PROJNAME}")
738
	if(EP_${PROJNAME}_DEPENDENCIES)
739
		list(APPEND EP_linphone_builder_DEPENDENCIES ${EP_${PROJNAME}_DEPENDENCIES})
740
	endif()
741
endmacro()
742

743
function(linphone_builder_add_external_projects)
744
	foreach(BUILDER ${LINPHONE_BUILDER_INCLUDED_BUILDERS})
745 746
		list(FIND LINPHONE_BUILDER_INCLUDED_BUILDERS_TO_EXCLUDE ${BUILDER} _excluded_found)
		list(FIND LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH_BUILDERS ${BUILDER} _external_source_path_found)
747
		if((_excluded_found EQUAL -1) AND ((_external_source_path_found EQUAL -1) OR (NOT LINPHONE_BUILDER_GROUP_EXTERNAL_SOURCE_PATH_BUILDERS) OR (NOT EP_${BUILDER}_GROUPABLE)))
748 749 750 751 752
			linphone_builder_add_external_project(${BUILDER})
		endif()
	endforeach()
endfunction()

753
macro(detect_conflicting_cmake_options)
754 755 756 757 758 759 760
	if(EP_linphone_builder_CMAKE_OPTIONS)
		list(REMOVE_DUPLICATES EP_linphone_builder_CMAKE_OPTIONS)
		set(_new_options )
		foreach(_option ${EP_linphone_builder_CMAKE_OPTIONS})
			string(REGEX MATCH "^-D(.+)=(.*)$" _match "${_option}")
			if(_match)
				set(_new_option "-D${CMAKE_MATCH_1}=")
761 762 763 764 765 766 767 768 769
				set(_value ${CMAKE_MATCH_2})
				if(CMAKE_MATCH_1 MATCHES "^ENABLE_.*$")
					if(_value)
						set(_new_option "${_new_option}ON")
						set(_conflicting_option "${_new_option}OFF")
					else()
						set(_new_option "${_new_option}OFF")
						set(_conflicting_option "${_new_option}ON")
					endif()
770
				else()
771
					set(_new_option "${_new_option}${_value}")
772 773 774 775 776 777 778 779 780
				endif()
				list(FIND _new_options "${_new_option}" _found)
				list(FIND _new_options "${_conflicting_option}" _conflict_found)
				if(_found EQUAL -1)
					list(APPEND _new_options "${_new_option}")
				endif()
				if(_conflict_found GREATER -1)
					message(FATAL_ERROR "Conflicting options ${_new_option} and ${_conflicting_option}")
				endif()
781
			endif()
782 783 784
		endforeach()
		if(_new_options)
			set(EP_linphone_builder_CMAKE_OPTIONS ${_new_options})
785 786 787 788
		endif()
	endif()
endmacro()

789
function(linphone_builder_add_grouped_external_source_path_projects)
790 791 792 793 794 795 796 797 798
	set(_grouped_builders)
	if(LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH_BUILDERS)
		foreach (_builder ${LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH_BUILDERS})
			if(EP_${_builder}_GROUPABLE)
				list(APPEND _grouped_builders ${_builder})
			endif()
		endforeach()
	endif()
	if(LINPHONE_BUILDER_GROUP_EXTERNAL_SOURCE_PATH_BUILDERS AND _grouped_builders)
799 800 801 802
		make_directory("${LINPHONE_BUILDER_WORK_DIR}/Source/EP_linphone_builder")
		set(_linphone_builder_file "${LINPHONE_BUILDER_WORK_DIR}/Source/EP_linphone_builder/CMakeLists.txt")
		file(WRITE "${_linphone_builder_file}" "cmake_minimum_required(VERSION 3.0)\n")
		file(APPEND "${_linphone_builder_file}" "project(EP_linphone_builder)\n")
803
		file(APPEND "${_linphone_builder_file}" "option(LINPHONE_BUILDER_GROUP_EXTERNAL_SOURCE_PATH_BUILDERS \"Group external source path builders.\" ON)\n")
804 805
		set(EP_linphone_builder_CMAKE_OPTIONS )
		set(EP_linphone_builder_LINKING_TYPES )
806 807 808
		set(EP_linphone_builder_EXTRA_CFLAGS )
		set(EP_linphone_builder_EXTRA_CPPFLAGS )
		set(EP_linphone_builder_EXTRA_CXXFLAGS )
809
		set(EP_linphone_builder_EXTRA_LDFLAGS )
810
		set(EP_linphone_builder_EXTRA_OBJCFLAGS )
811
		set(EP_linphone_builder_DEPENDENCIES )
812
		set(EP_linphone_builder_GROUPED_SOURCE_DIRS )
813
		foreach(BUILDER ${_grouped_builders})
814
			list(APPEND EP_linphone_builder_GROUPED_SOURCE_DIRS ${EP_${BUILDER}_SOURCE_DIR})
815
			linphone_builder_add_grouped_external_source_path_project(${BUILDER} "${_linphone_builder_file}")
816
		endforeach()
817 818 819 820 821 822 823
		list(REMOVE_DUPLICATES EP_linphone_builder_LINKING_TYPES)
		list(LENGTH EP_linphone_builder_LINKING_TYPES _conflicting_linking_types)
		if(_conflicting_linking_types GREATER 1)
			message(FATAL_ERROR "Conflicing linking types in grouped external source path projects: ${EP_linphone_builder_LINKING_TYPES}")
		else()
			set(EP_linphone_builder_LINKING_TYPE ${EP_linphone_builder_LINKING_TYPES})
		endif()
824
		detect_conflicting_cmake_options()
825 826 827 828 829 830 831 832 833
		if(EP_linphone_builder_EXTRA_CFLAGS)
			list(REMOVE_DUPLICATES EP_linphone_builder_EXTRA_CFLAGS)
		endif()
		if(EP_linphone_builder_EXTRA_CPPFLAGS)
			list(REMOVE_DUPLICATES EP_linphone_builder_EXTRA_CPPFLAGS)
		endif()
		if(EP_linphone_builder_EXTRA_CXXFLAGS)
			list(REMOVE_DUPLICATES EP_linphone_builder_EXTRA_CXXFLAGS)
		endif()
834 835 836
		if(EP_linphone_builder_EXTRA_LDFLAGS)
			list(REMOVE_DUPLICATES EP_linphone_builder_EXTRA_LDFLAGS)
		endif()
837 838 839
		if(EP_linphone_builder_EXTRA_OBJCFLAGS)
			list(REMOVE_DUPLICATES EP_linphone_builder_EXTRA_OBJCFLAGS)
		endif()
840 841 842
		if(EP_linphone_builder_DEPENDENCIES)
			list(REMOVE_DUPLICATES EP_linphone_builder_DEPENDENCIES)
		endif()
843 844 845 846 847
		list(APPEND EP_linphone_builder_CMAKE_OPTIONS ${EP_linphone_builder_ADDITIONAL_CMAKE_OPTIONS})
		linphone_builder_add_external_project("linphone_builder")
		add_dependencies(TARGET_linphone_builder EP_linphone_builder)
		unset(_conflicting_linking_types)
		unset(_linphone_builder_file)
848
		unset(_grouped_builders)
849
	endif()
850 851 852 853
endfunction()

function(linphone_builder_add_projects)
	linphone_builder_add_external_projects()
854
	linphone_builder_add_grouped_external_source_path_projects()
Ghislain MARY's avatar
Ghislain MARY committed
855
endfunction()
856 857 858 859

macro(linphone_builder_add_dummy_libraries_generation)
	if(LINPHONE_BUILDER_DUMMY_LIBRARIES)
		linphone_builder_set_ep_directories(dummy_libraries)
860
		linphone_builder_set_ep_generator()
861
		linphone_builder_expand_external_project_vars()
862
		ExternalProject_Add(EP_dummy_libraries
863
			DEPENDS TARGET_linphone_builder
864 865
			TMP_DIR "${ep_tmp}"
			BINARY_DIR "${ep_build}"
866
			SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/cmake/dummy_libraries"
867
			DOWNLOAD_COMMAND ""
868
			CMAKE_GENERATOR ${ep_generator}
869 870 871 872
			CMAKE_ARGS ${LINPHONE_BUILDER_EP_ARGS} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DLINPHONE_BUILDER_DUMMY_LIBRARIES=${LINPHONE_BUILDER_DUMMY_LIBRARIES}
		)
	endif()
endmacro()