CMakeLists.txt 56.5 KB
Newer Older
1
############################################################################
2
# CMakeLists.txt
3
# Copyright (C) 2014-2018  Belledonne Communications, Grenoble France
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#
############################################################################
#
# 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
19
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
20 21 22 23
#
############################################################################

include(ExternalProject)
24
include(${CMAKE_CURRENT_LIST_DIR}/LinphoneOptions.cmake)
25

26
set(ep_base "${LINPHONE_BUILDER_WORK_DIR}/${CONFIG_NAME}")
27
set_property(DIRECTORY PROPERTY EP_BASE ${ep_base})
28
set(LINPHONE_BUILDER_OPTIONS_DIR "${CMAKE_CURRENT_LIST_DIR}/../options")
29

30

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


41
if(CMAKE_VERBOSE_MAKEFILE)
42
	set(AUTOTOOLS_VERBOSE_MAKEFILE 1)
43
else()
44
	set(AUTOTOOLS_VERBOSE_MAKEFILE 0)
45
endif()
46 47


48
set(LINPHONE_BUILDER_EP_VARS)
49
set(LINPHONE_BUILDER_INCLUDED_BUILDERS)
50
set(LINPHONE_BUILDER_INCLUDED_BUILDERS_TO_EXCLUDE)
51
set(LINPHONE_BUILDER_SOURCE_PACKAGE_BUILDERS)
52
set(LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH_BUILDERS)
53
set(LINPHONE_BUILDER_SYSTEM_DEPENDENCIES_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
	CMAKE_C_FLAGS_DEBUG:STRING
	CMAKE_C_FLAGS_MINSIZEREL:STRING
	CMAKE_C_FLAGS_RELEASE:STRING
	CMAKE_C_FLAGS_RELWITHDEBINFO:STRING
78
	CMAKE_CXX_COMPILER_LAUNCHER:PATH
79 80 81 82 83 84 85 86 87
	CMAKE_CXX_FLAGS_DEBUG:STRING
	CMAKE_CXX_FLAGS_MINSIZEREL:STRING
	CMAKE_CXX_FLAGS_RELEASE:STRING
	CMAKE_CXX_FLAGS_RELWITHDEBINFO: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_EXTRA_GENERATOR:STRING
88
	CMAKE_GENERATOR_PLATFORM:STRING
89
	CMAKE_INSTALL_MESSAGE:STRING
90
	CMAKE_INSTALL_PREFIX:PATH
91 92
	CMAKE_INSTALL_RPATH:PATH
	CMAKE_INSTALL_RPATH_USE_LINK_PATH:BOOL
93 94 95 96 97 98
	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_PATH:PATH
99
	CMAKE_NO_BUILD_TYPE:BOOL
100
	CMAKE_NO_SYSTEM_FROM_IMPORTED:BOOL
101
	CMAKE_PREFIX_PATH:STRING
102
	CMAKE_PROGRAM_PATH:STRING
103 104 105 106 107
	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
108
	CMAKE_SKIP_INSTALL_RPATH:BOOL
109
	CMAKE_SKIP_RPATH:BOOL
110
	CMAKE_SKIP_BUILD_RPATH:BOOL
111
	CMAKE_VERBOSE_MAKEFILE:BOOL
112
	LINPHONE_IOS_DEPLOYMENT_TARGET:STRING
113 114 115
	MSVC_C_ARCHITECTURE_ID:STRING
	MSVC_CXX_ARCHITECTURE_ID:STRING
	MSVC_VERSION:STRING
116
)
117
if(CMAKE_CROSSCOMPILING)
Ghislain MARY's avatar
Ghislain MARY committed
118
	list(APPEND LINPHONE_BUILDER_EP_VARS
119
		CMAKE_SYSTEM_NAME:STRING
120
		CMAKE_SYSTEM_PROCESSOR:STRING
121 122 123
		CMAKE_SYSTEM_VERSION:STRING
	)
endif()
124 125
if(APPLE)
	list(APPEND LINPHONE_BUILDER_EP_VARS
126
		CMAKE_MACOSX_RPATH:BOOL
127 128 129
		CMAKE_OSX_ARCHITECTURES:STRING
		CMAKE_OSX_DEPLOYMENT_TARGET:STRING
	)
130
endif()
131 132 133 134 135 136 137
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()
138 139 140
if(CMAKE_TOOLCHAIN_FILE)
	list(APPEND LINPHONE_BUILDER_EP_VARS CMAKE_TOOLCHAIN_FILE:PATH)
endif()
141 142


143
macro(linphone_builder_get_autotools_configuration)
144 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
	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)
177
endmacro()
178 179


180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
macro(lcb_add_target_dependencies TARGET_NAME)
	set(_args2 "${ARGN}")
	foreach(_arg IN LISTS _args2)
		set(_list ${TARGET_${_arg}_DEPENDENCIES})
		if(_list)
			list(REMOVE_ITEM _list "${_arg}")
		endif()
		if(_list)
			lcb_add_target_dependencies("${TARGET_NAME}" ${_list})
		endif()
		list(FIND TARGET_${TARGET_NAME}_DEPENDENCIES "${_arg}" _target_found)
		if(_target_found LESS 0)
			list(APPEND TARGET_${TARGET_NAME}_DEPENDENCIES "${_arg}")
		endif()
	endforeach()
endmacro()

197
# DEPRECATED: Use lcb_define_targets() instead
198 199 200 201 202 203
macro(lcb_define_target TARGET_NAME)
	set(_args "${ARGN}")
	list(APPEND LINPHONE_BUILDER_TARGETS "${TARGET_NAME}")
	set_property(CACHE LINPHONE_BUILDER_TARGET PROPERTY STRINGS ${LINPHONE_BUILDER_TARGETS})
endmacro()

204 205 206 207 208 209 210
macro(lcb_define_targets)
	set(_args "${ARGN}")
	foreach(_arg IN LISTS _args)
		lcb_define_target("${_arg}")
	endforeach()
endmacro()

211 212 213 214 215 216 217
macro(lcb_add_builder_to_target TARGET_NAME BUILDER_NAME)
	list(APPEND TARGET_${TARGET_NAME}_BUILDERS "${BUILDER_NAME}")
endmacro()

macro(lcb_check_target)
	list(FIND LINPHONE_BUILDER_TARGETS "${LINPHONE_BUILDER_TARGET}" _target_found)
	if(_target_found EQUAL -1)
jehan's avatar
jehan committed
218
		message(FATAL_ERROR "Invalid LINPHONE_BUILDER_TARGET '${LINPHONE_BUILDER_TARGET}'")
219
	endif()
Ghislain MARY's avatar
Ghislain MARY committed
220
endmacro()
221

222 223 224 225 226 227 228 229 230 231
macro(lcb_declare_target TARGET_NAME)
	add_custom_target(TARGET_${TARGET_NAME} ALL)
	add_dependencies(TARGET_linphone_builder TARGET_${TARGET_NAME})
	unset(_dependencies)
	linphone_builder_add_builder_to_target(TARGET_${TARGET_NAME} "${TARGET_NAME}" TRUE _dependencies)
	list(APPEND LINPHONE_BUILDER_INCLUDED_BUILDERS ${_dependencies})
endmacro()

macro(lcb_declare_targets)
	add_custom_target(TARGET_linphone_builder ALL)
232
	lcb_declare_target("${LINPHONE_BUILDER_TARGET}")
233 234
endmacro()

235

236 237
macro(linphone_builder_include_builder BUILDER INCLUDE_AFTER DEPENDENCIES _included)
	set(${_included} -1)
238
	list(FIND LINPHONE_BUILDER_INCLUDED_BUILDERS ${BUILDER} _already_included)
239 240
	list(FIND ${DEPENDENCIES} ${BUILDER} _already_included2)
	if(_already_included EQUAL -1 AND _already_included2 EQUAL -1)
241 242
		unset(_builder_filepath)
		if(LINPHONE_BUILDER_EXTERNAL_BUILDERS_PATH)
243
			set(_builder_filepath "${LINPHONE_BUILDER_EXTERNAL_BUILDERS_PATH}/${BUILDER}.cmake")
244 245 246 247 248
			if(NOT EXISTS "${_builder_filepath}")
				unset(_builder_filepath)
			endif()
		endif()
		if(NOT _builder_filepath)
249 250 251 252
			set(_builder_filepath "${CMAKE_CURRENT_SOURCE_DIR}/builders/${BUILDER}.cmake")
		endif()
		if(EXISTS "${_builder_filepath}")
			message(STATUS "Including builder ${BUILDER}")
253 254 255
			if(EXISTS ${LINPHONE_BUILDER_OPTIONS_DIR}/${BUILDER}.cmake)
				include(${LINPHONE_BUILDER_OPTIONS_DIR}/${BUILDER}.cmake)
			endif()
256 257 258 259 260 261 262 263
			set(LINPHONE_BUILDER_CURRENT_BUILDER "${BUILDER}")
			include(${_builder_filepath})
			if(INCLUDE_AFTER)
				list(APPEND ${DEPENDENCIES} ${BUILDER})
			else()
				list(INSERT ${DEPENDENCIES} 0 ${BUILDER})
			endif()
			set(${_included} 1)
264
			unset(LINPHONE_BUILDER_CURRENT_BUILDER)
265
		endif()
266 267
	endif()
	unset(_already_included)
Ghislain MARY's avatar
Ghislain MARY committed
268
endmacro()
269 270


271 272 273 274 275
macro(linphone_builder_add_builder_to_target TARGETNAME BUILDER INCLUDE_AFTER DEPENDENCIES)
	linphone_builder_include_builder(${BUILDER} ${INCLUDE_AFTER} ${DEPENDENCIES} _included)
	if(_included GREATER -1)
		if(LINPHONE_BUILDER_USE_SYSTEM_DEPENDENCIES AND EP_${BUILDER}_MAY_BE_FOUND_ON_SYSTEM)
			list(FIND LINPHONE_BUILDER_SYSTEM_DEPENDENCIES_BUILDERS ${BUILDER} _already_included)
276
			if(_already_included EQUAL -1)
277 278 279 280
				message("    Using ${BUILDER} from the system")
				list(APPEND LINPHONE_BUILDER_INCLUDED_BUILDERS_TO_EXCLUDE ${BUILDER})
				list(APPEND LINPHONE_BUILDER_SYSTEM_DEPENDENCIES_BUILDERS ${BUILDER})
			endif()
281
		elseif((LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH OR LINPHONE_BUILDER_ALTERNATE_EXTERNAL_SOURCE_PATH) AND LINPHONE_BUILDER_GROUP_EXTERNAL_SOURCE_PATH_BUILDERS)
282 283 284 285
			foreach(SUBDIR ${EP_${BUILDER}_EXTERNAL_SOURCE_PATHS})
				if(SUBDIR STREQUAL "<LINPHONE_BUILDER_TOP_DIR>")
					set(_source_dir "${LINPHONE_BUILDER_TOP_DIR}")
				else()
286 287 288 289 290
					if(LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH AND EXISTS "${LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH}/${SUBDIR}")
						set(_source_dir "${LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH}/${SUBDIR}")
					else()
						set(_source_dir "${LINPHONE_BUILDER_ALTERNATE_EXTERNAL_SOURCE_PATH}/${SUBDIR}")
					endif()
291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
				endif()
				if(EXISTS "${_source_dir}")
					#message("    ${TARGETNAME} depends on external source path ${_source_dir}")
					set(_build_from_external_source_path 1)
					break()
				endif()
			endforeach()
			if(_build_from_external_source_path)
				list(FIND LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH_BUILDERS ${BUILDER} _already_included)
				if(_already_included EQUAL -1)
					# message("    external source path builder ${BUILDER}: ${_source_dir}")
					set(EP_${BUILDER}_SOURCE_DIR "${_source_dir}")
					list(APPEND LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH_BUILDERS ${BUILDER})
				endif()
				unset(_already_included)
			else()
				#message("     ${TARGETNAME} depends on external project EP_${BUILDER}")
				add_dependencies(${TARGETNAME} EP_${BUILDER})
309
			endif()
310
			unset(_build_from_external_source_path)
311
		else()
312
			#message("    ${TARGETNAME} depends on external project EP_${BUILDER}")
313
			add_dependencies(${TARGETNAME} EP_${BUILDER})
314
		endif()
315 316 317 318
		foreach(_dependency IN LISTS EP_${BUILDER}_DEPENDENCIES)
			string(REGEX REPLACE "^EP_" "" _dep ${_dependency})
			linphone_builder_add_builder_to_target(${TARGETNAME} "${_dep}" FALSE ${DEPENDENCIES})
		endforeach()
319
	endif()
Ghislain MARY's avatar
Ghislain MARY committed
320
endmacro()
321 322


323
macro(linphone_builder_apply_flags)
324
	string(TOUPPER "${CMAKE_BUILD_TYPE}" BUILD_TYPE)
Ghislain MARY's avatar
Ghislain MARY committed
325 326 327 328 329 330 331 332 333 334
	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)
335 336
		set(CMAKE_C_FLAGS_${BUILD_TYPE} "${CMAKE_C_FLAGS_${BUILD_TYPE}} ${LINPHONE_BUILDER_CPPFLAGS}")
		set(CMAKE_CXX_FLAGS_${BUILD_TYPE} "${CMAKE_CXX_FLAGS_${BUILD_TYPE}} ${LINPHONE_BUILDER_CPPFLAGS}")
337 338
		set(AUTOTOOLS_C_FLAGS "${AUTOTOOLS_C_FLAGS} ${LINPHONE_BUILDER_CPPFLAGS} ")
		set(AUTOTOOLS_CXX_FLAGS "${AUTOTOOLS_CXX_FLAGS} ${LINPHONE_BUILDER_CPPFLAGS} ")
Ghislain MARY's avatar
Ghislain MARY committed
339 340
	endif()
	if(LINPHONE_BUILDER_CFLAGS)
341
		set(CMAKE_C_FLAGS_${BUILD_TYPE} "${CMAKE_C_FLAGS_${BUILD_TYPE}} ${LINPHONE_BUILDER_CFLAGS}")
342
		set(AUTOTOOLS_C_FLAGS "${AUTOTOOLS_C_FLAGS} ${LINPHONE_BUILDER_CFLAGS} ")
Ghislain MARY's avatar
Ghislain MARY committed
343 344
	endif()
	if(LINPHONE_BUILDER_CXXFLAGS)
345
		set(CMAKE_CXX_FLAGS_${BUILD_TYPE} "${CMAKE_CXX_FLAGS_${BUILD_TYPE}} ${LINPHONE_BUILDER_CXXFLAGS}")
346
		set(AUTOTOOLS_CXX_FLAGS "${AUTOTOOLS_CXX_FLAGS} ${LINPHONE_BUILDER_CXX_FLAGS} ")
Ghislain MARY's avatar
Ghislain MARY committed
347 348
	endif()
	if(LINPHONE_BUILDER_OBJCFLAGS)
349
		set(CMAKE_C_FLAGS_${BUILD_TYPE} "${CMAKE_C_FLAGS_${BUILD_TYPE}} ${LINPHONE_BUILDER_OBJCFLAGS}")
350
		set(AUTOTOOLS_OBJC_FLAGS "${AUTOTOOLS_OBJC_FLAGS} ${LINPHONE_BUILDER_OBJCFLAGS} ")
Ghislain MARY's avatar
Ghislain MARY committed
351 352
	endif()
	if(LINPHONE_BUILDER_LDFLAGS)
353 354 355
		set(CMAKE_EXE_LINKER_FLAGS_${BUILD_TYPE} "${CMAKE_EXE_LINKER_FLAGS_${BUILD_TYPE}} ${LINPHONE_BUILDER_LDFLAGS}")
		set(CMAKE_MODULE_LINKER_FLAGS_${BUILD_TYPE} "${CMAKE_MODULE_LINKER_FLAGS_${BUILD_TYPE}} ${LINPHONE_BUILDER_LDFLAGS}")
		set(CMAKE_SHARED_LINKER_FLAGS_${BUILD_TYPE} "${CMAKE_SHARED_LINKER_FLAGS_${BUILD_TYPE}} ${LINPHONE_BUILDER_LDFLAGS}")
356
		set(AUTOTOOLS_LINKER_FLAGS "${AUTOTOOLS_LINKER_FLAGS} ${LINPHONE_BUILDER_LDFLAGS} ")
Ghislain MARY's avatar
Ghislain MARY committed
357
	endif()
358
	unset(BUILD_TYPE)
359 360 361 362 363 364
	if(WIN32)
		string(REGEX REPLACE "/[a-zA-Z0-9]+ " "" AUTOTOOLS_C_FLAGS "${AUTOTOOLS_C_FLAGS}")
		string(REGEX REPLACE "/[a-zA-Z0-9]+ " "" AUTOTOOLS_CXX_FLAGS "${AUTOTOOLS_CXX_FLAGS}")
		string(REGEX REPLACE "/[a-zA-Z0-9]+ " "" AUTOTOOLS_OBJC_FLAGS "${AUTOTOOLS_OBJC_FLAGS}")
		string(REGEX REPLACE "/[a-zA-Z0-9]+ " "" AUTOTOOLS_LINKER_FLAGS "${AUTOTOOLS_LINKER_FLAGS}")
	endif()
Ghislain MARY's avatar
Ghislain MARY committed
365
endmacro()
366 367


368
macro(linphone_builder_apply_cmake_flags_to_autotools_project PROJNAME)
Ghislain MARY's avatar
Ghislain MARY committed
369
	if(EP_${PROJNAME}_BUILD_METHOD STREQUAL "autotools")
Ghislain MARY's avatar
Ghislain MARY committed
370 371 372 373 374 375
		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}")
376
	endif()
Ghislain MARY's avatar
Ghislain MARY committed
377
endmacro()
378 379


380
macro(linphone_builder_apply_extra_flags PROJNAME)
381
	string(TOUPPER "${CMAKE_BUILD_TYPE}" BUILD_TYPE)
382 383 384 385 386
	if(MSVC)
		set(_no_warnings_flag "/W0")
	else()
		set(_no_warnings_flag "-w")
	endif()
387 388 389 390 391
	set(SAVED_CMAKE_C_FLAGS "${CMAKE_C_FLAGS_${BUILD_TYPE}}")
	set(SAVED_CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_${BUILD_TYPE}}")
	set(SAVED_CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS_${BUILD_TYPE}}")
	set(SAVED_CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS_${BUILD_TYPE}}")
	set(SAVED_CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS_${BUILD_TYPE}}")
Ghislain MARY's avatar
Ghislain MARY committed
392
	if(EP_${PROJNAME}_BUILD_METHOD STREQUAL "autotools")
393 394 395 396 397 398
		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}")
399 400 401
		if(EP_${PROJNAME}_IGNORE_WARNINGS)
			set(ep_cppflags "${ep_cppflags} ${_no_warnings_flag}")
		endif()
402
	else()
403
		if(EP_${PROJNAME}_EXTRA_CFLAGS)
404
			set(CMAKE_C_FLAGS_${BUILD_TYPE} "${CMAKE_C_FLAGS_${BUILD_TYPE}} ${EP_${PROJNAME}_EXTRA_CFLAGS}")
405 406
		endif()
		if(EP_${PROJNAME}_EXTRA_CXXFLAGS)
407
			set(CMAKE_CXX_FLAGS_${BUILD_TYPE} "${CMAKE_CXX_FLAGS_${BUILD_TYPE}} ${EP_${PROJNAME}_EXTRA_CXXFLAGS}")
408 409
		endif()
		if(EP_${PROJNAME}_EXTRA_LDFLAGS)
410 411 412
			set(CMAKE_EXE_LINKER_FLAGS_${BUILD_TYPE} "${CMAKE_EXE_LINKER_FLAGS_${BUILD_TYPE}} ${EP_${PROJNAME}_EXTRA_LDFLAGS}")
			set(CMAKE_MODULE_LINKER_FLAGS_${BUILD_TYPE} "${CMAKE_MODULE_LINKER_FLAGS_${BUILD_TYPE}} ${EP_${PROJNAME}_EXTRA_LDFLAGS}")
			set(CMAKE_SHARED_LINKER_FLAGS_${BUILD_TYPE} "${CMAKE_SHARED_LINKER_FLAGS_${BUILD_TYPE}} ${EP_${PROJNAME}_EXTRA_LDFLAGS}")
413
		endif()
414
		if(EP_${PROJNAME}_IGNORE_WARNINGS)
415 416
			set(CMAKE_C_FLAGS_${BUILD_TYPE} "${CMAKE_C_FLAGS_${BUILD_TYPE}} ${_no_warnings_flag}")
			set(CMAKE_CXX_FLAGS_${BUILD_TYPE} "${CMAKE_CXX_FLAGS_${BUILD_TYPE}} ${_no_warnings_flag}")
417
		endif()
418
		if(ENABLE_SANITIZER AND EP_${PROJNAME}_SANITIZABLE)
419
			set(sanitize_flags "-fsanitize=address,undefined")
420 421 422 423 424 425 426
			set(CMAKE_C_FLAGS_${BUILD_TYPE} "${CMAKE_C_FLAGS_${BUILD_TYPE}} ${sanitize_flags}")
			set(CMAKE_CXX_FLAGS_${BUILD_TYPE} "${CMAKE_CXX_FLAGS_${BUILD_TYPE}} ${sanitize_flags}")
			set(CMAKE_EXE_LINKER_FLAGS_${BUILD_TYPE} "${CMAKE_EXE_LINKER_FLAGS_${BUILD_TYPE}} ${sanitize_flags}")
			set(CMAKE_MODULE_LINKER_FLAGS_${BUILD_TYPE} "${CMAKE_MODULE_LINKER_FLAGS_${BUILD_TYPE}} ${sanitize_flags}")
			set(CMAKE_SHARED_LINKER_FLAGS_${BUILD_TYPE} "${CMAKE_SHARED_LINKER_FLAGS_${BUILD_TYPE}} ${sanitize_flags}")
			unset(sanitize_flags)
		endif()
427
	endif()
428
	unset(BUILD_TYPE)
Ghislain MARY's avatar
Ghislain MARY committed
429
endmacro()
430 431


432
macro(linphone_builder_restore_flags)
433 434 435 436 437 438 439
	string(TOUPPER "${CMAKE_BUILD_TYPE}" BUILD_TYPE)
	set(CMAKE_C_FLAGS_${BUILD_TYPE} "${SAVED_CMAKE_C_FLAGS}")
	set(CMAKE_CXX_FLAGS_${BUILD_TYPE} "${SAVED_CMAKE_CXX_FLAGS}")
	set(CMAKE_EXE_LINKER_FLAGS_${BUILD_TYPE} "${SAVED_CMAKE_EXE_LINKER_FLAGS}")
	set(CMAKE_MODULE_LINKER_FLAGS_${BUILD_TYPE} "${SAVED_CMAKE_MODULE_LINKER_FLAGS}")
	set(CMAKE_SHARED_LINKER_FLAGS_${BUILD_TYPE} "${SAVED_CMAKE_SHARED_LINKER_FLAGS}")
	unset(BUILD_TYPE)
440 441 442
endmacro()


443
macro(linphone_builder_set_ep_directories PROJNAME)
444 445 446 447 448
	if(EP_${PROJNAME}_SOURCE_DIR)
		set(ep_source "${EP_${PROJNAME}_SOURCE_DIR}")
	else()
		set(ep_source "${ep_base}/Source/EP_${PROJNAME}")
	endif()
449
	if(EP_${PROJNAME}_BUILD_IN_SOURCE_TREE)
450
		set(ep_build "${ep_source}")
Ghislain MARY's avatar
Ghislain MARY committed
451
	else()
452
		set(ep_build "${ep_base}/Build/${PROJNAME}")
453

454 455 456 457 458 459 460 461
		# 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()

462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488
		# 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")
489
			math(EXPR relative_build_length "${relative_build_length}-${idx}")
490 491 492 493 494 495 496
			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
497 498
	endif()
endmacro()
499

500

501 502 503 504 505 506 507 508 509
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()


510
macro(linphone_builder_create_autogen_command PROJNAME)
511 512
	if(EP_${PROJNAME}_USE_AUTOGEN)
		if(EP_${PROJNAME}_CONFIGURE_OPTIONS_PASSED_TO_AUTOGEN)
513 514 515
			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
516
			endforeach()
517
		endif()
518
		set(ep_autogen_command "\"${ep_source}/autogen.sh\" ${ep_autogen_options}")
519 520
	elseif(EP_${PROJNAME}_USE_AUTORECONF)
		set(ep_autogen_command "autoreconf -vfi ${ep_source}")
521
	else()
522
		set(ep_autogen_command "")
523
	endif()
Ghislain MARY's avatar
Ghislain MARY committed
524
endmacro()
525 526 527


macro(linphone_builder_create_configure_command PROJNAME)
528
	if(EP_${PROJNAME}_CONFIGURE_OPTIONS_PASSED_TO_AUTOGEN)
529
		set(ep_configure_command "")
530
	else()
531 532 533
		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
534
		endforeach()
535
		set(ep_configure_env "${EP_${PROJNAME}_CONFIGURE_ENV}")
536
		set(ep_configure_command "\"${ep_source}/configure\" ${ep_configure_options}")
537
	endif()
Ghislain MARY's avatar
Ghislain MARY committed
538
endmacro()
539 540


541 542 543 544 545
macro(linphone_builder_create_build_command PROJNAME)
	set(ep_make_options "${EP_${PROJNAME}_MAKE_OPTIONS}")
endmacro()


546
# this macro invokes configure_file() for the project, using the default file if
547
# the specific file is not defined
548
macro(linphone_builder_configure_file_for_project PROJNAME CMD DEFAULT_CONF_FILE OUTPUT)
Ghislain MARY's avatar
Ghislain MARY committed
549
	if(NOT EP_${PROJNAME}_${CMD}_COMMAND_SOURCE)
550
		message(STATUS "Using default file ${DEFAULT_CONF_FILE} for ${CMD} step of ${PROJNAME}")
551 552
		configure_file(${DEFAULT_CONF_FILE} ${OUTPUT})
	else()
553
		message(STATUS "Using specific file ${EP_${PROJNAME}_${CMD}_COMMAND_SOURCE} for ${CMD} step of ${PROJNAME}")
554
		configure_file(${EP_${PROJNAME}_${CMD}_COMMAND_SOURCE} ${OUTPUT})
555
	endif()
556
endmacro()
557

558 559 560 561
macro(linphone_builder_filter_out_inexistent_dependencies PROJNAME)
	if(EP_${PROJNAME}_DEPENDENCIES)
		set(_new_deps )
		foreach(_dep ${EP_${PROJNAME}_DEPENDENCIES})
562 563
			string(REGEX REPLACE "^EP_" "" _dep2 ${_dep})
			list(FIND LINPHONE_BUILDER_INCLUDED_BUILDERS ${_dep2} _found)
564
			list(FIND LINPHONE_BUILDER_INCLUDED_BUILDERS_TO_EXCLUDE ${_dep2} _excluded_found)
565
			list(FIND LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH_BUILDERS ${_dep2} _external_source_path_found)
566
			if((_found GREATER -1) AND (_excluded_found EQUAL -1) AND ((_external_source_path_found EQUAL -1) OR (NOT EP_${_dep2}_GROUPABLE) OR (NOT LINPHONE_BUILDER_GROUP_EXTERNAL_SOURCE_PATH_BUILDERS)))
567 568 569 570 571 572 573 574 575 576 577
				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()

578
macro(linphone_builder_add_external_project PROJNAME)
579
	if(LINPHONE_BUILDER_ENABLE_RPM_PACKAGING AND NOT EP_${PROJNAME}_BUILD_METHOD STREQUAL "dummy")
580 581 582
		set(EP_${PROJNAME}_BUILD_METHOD "rpm")
	endif()

583
	if(LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH OR LINPHONE_BUILDER_ALTERNATE_EXTERNAL_SOURCE_PATH)
584 585
		foreach(SUBDIR ${EP_${PROJNAME}_EXTERNAL_SOURCE_PATHS})
			if(NOT EP_${PROJNAME}_SOURCE_DIR)
586 587 588
				if(SUBDIR STREQUAL "<LINPHONE_BUILDER_TOP_DIR>")
					set(_source_dir "${LINPHONE_BUILDER_TOP_DIR}")
				else()
589 590 591 592 593
					if(LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH AND EXISTS "${LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH}/${SUBDIR}")
						set(_source_dir "${LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH}/${SUBDIR}")
					else()
						set(_source_dir "${LINPHONE_BUILDER_ALTERNATE_EXTERNAL_SOURCE_PATH}/${SUBDIR}")
					endif()
594 595 596
				endif()
				if(EXISTS "${_source_dir}")
					set(EP_${PROJNAME}_SOURCE_DIR "${_source_dir}")
597 598 599 600
				endif()
			endif()
		endforeach()
	endif()
601 602 603
	if(EP_${PROJNAME}_PACKAGE_SOURCE)
		list(APPEND LINPHONE_BUILDER_SOURCE_PACKAGE_BUILDERS ${PROJNAME})
	endif()
604

605
	linphone_builder_set_ep_directories(${PROJNAME})
606
	linphone_builder_set_ep_generator()
Ghislain MARY's avatar
Ghislain MARY committed
607 608 609
	if(NOT EP_${PROJNAME}_DO_NOT_USE_CMAKE_FLAGS)
		linphone_builder_apply_cmake_flags_to_autotools_project(${PROJNAME})
	endif()
610 611 612 613 614
	if(EP_${PROJNAME}_USE_C_COMPILER_FOR_ASSEMBLER)
		set(ep_use_c_compiler_for_assembler TRUE)
	else()
		unset(ep_use_c_compiler_for_assembler)
	endif()
615
	linphone_builder_apply_extra_flags(${PROJNAME})
616 617
	linphone_builder_expand_external_project_vars()

618 619 620 621 622 623 624 625
	if(EP_${PROJNAME}_BUILD_METHOD STREQUAL "dummy")
		set(BUILD_COMMANDS
			CONFIGURE_COMMAND ${CMAKE_COMMAND} -E echo ""
			BUILD_COMMAND ${CMAKE_COMMAND} -E echo ""
			INSTALL_COMMAND ${CMAKE_COMMAND} -E echo ""
		)
		set(EP_${PROJNAME}_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}")
	elseif(EP_${PROJNAME}_BUILD_METHOD STREQUAL "prebuilt")
626 627 628 629 630 631
		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
632
	elseif(EP_${PROJNAME}_BUILD_METHOD STREQUAL "custom")
633 634 635
		if(WIN32)
			set(ep_redirect_to_file "2>&1 >> \"${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}.log\"")
		endif()
636 637 638 639 640 641 642 643 644 645 646 647
		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()
648
		set(BUILD_COMMANDS
649 650 651
			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}
652
		)
653 654
	elseif(EP_${PROJNAME}_BUILD_METHOD STREQUAL "autotools")
		linphone_builder_create_autogen_command(${PROJNAME})
655
		linphone_builder_create_configure_command(${PROJNAME})
656
		linphone_builder_create_build_command(${PROJNAME})
Ghislain MARY's avatar
Ghislain MARY committed
657
		if(EP_${PROJNAME}_CONFIG_H_FILE)
658
			set(ep_config_h_file ${EP_${PROJNAME}_CONFIG_H_FILE})
Ghislain MARY's avatar
Ghislain MARY committed
659
		else()
Ghislain MARY's avatar
Ghislain MARY committed
660 661 662
			set(ep_config_h_file config.h)
		endif()
		if(EP_${PROJNAME}_INSTALL_TARGET)
663
			set(ep_install_target "${EP_${PROJNAME}_INSTALL_TARGET}")
Ghislain MARY's avatar
Ghislain MARY committed
664 665
		else()
			set(ep_install_target "install")
Ghislain MARY's avatar
Ghislain MARY committed
666
		endif()
667

668
		if(WIN32)
669
			set(ep_redirect_to_file "2>&1 >> \"${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}.log\"")
670 671 672 673 674
			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)
Ghislain MARY's avatar
Ghislain MARY committed
675
			if(ep_autogen_command)
676 677
				set(ep_autogen_redirect_to_file ${ep_redirect_to_file})
			endif()
Ghislain MARY's avatar
Ghislain MARY committed
678
			if(ep_configure_command)
679 680
				set(ep_configure_redirect_to_file ${ep_redirect_to_file})
			endif()
681
		else()
682
			set(SCRIPT_EXTENSION sh)
683
		endif()
684

Ghislain MARY's avatar
Ghislain MARY committed
685
		if(EP_${PROJNAME}_PKG_CONFIG)
686
			set(LINPHONE_BUILDER_PKG_CONFIG "${EP_${PROJNAME}_PKG_CONFIG}")
Ghislain MARY's avatar
Ghislain MARY committed
687 688
		else()
			set(LINPHONE_BUILDER_PKG_CONFIG "${PKG_CONFIG_PROGRAM}")
Ghislain MARY's avatar
Ghislain MARY committed
689
		endif()
690

691 692 693
		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
694 695

		set(BUILD_COMMANDS
696 697 698
			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
699
		)
Ghislain MARY's avatar
Ghislain MARY committed
700
	elseif(EP_${PROJNAME}_BUILD_METHOD STREQUAL "rpm")
701

702
		if(WIN32)
703
			message(SEND_ERROR "rpm build not supported on WIN32")
704 705 706 707
		endif()

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

Ghislain MARY's avatar
Ghislain MARY committed
709
		if(EP_${PROJNAME}_CONFIG_H_FILE)
710
			set(ep_config_h_file ${EP_${PROJNAME}_CONFIG_H_FILE})
Ghislain MARY's avatar
Ghislain MARY committed
711 712
		else()
			set(ep_config_h_file config.h)
713
		endif()
714

Ghislain MARY's avatar
Ghislain MARY committed
715
		if(EP_${PROJNAME}_INSTALL_TARGET)
716
			set(ep_install_target "${EP_${PROJNAME}_INSTALL_TARGET}")
Ghislain MARY's avatar
Ghislain MARY committed
717 718
		else()
			set(ep_install_target "install")
719 720
		endif()

Ghislain MARY's avatar
Ghislain MARY committed
721
		if(EP_${PROJNAME}_SPEC_FILE)
722
			set(LINPHONE_BUILDER_SPEC_FILE "${EP_${PROJNAME}_SPEC_FILE}")
Ghislain MARY's avatar
Ghislain MARY committed
723 724
		else()
			message(SEND_ERROR "rpm build requires EP_${PROJNAME}_SPEC_FILE to be defined")
725 726 727 728
		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
729
		if(EP_${PROJNAME}_RPMBUILD_NAME)
730
			set(LINPHONE_BUILDER_RPMBUILD_NAME "${EP_${PROJNAME}_RPMBUILD_NAME}")
Ghislain MARY's avatar
Ghislain MARY committed
731 732
		else()
			set(LINPHONE_BUILDER_RPMBUILD_NAME "${PROJNAME}")
733
		endif()
734

735
		# some specific RPMBUILD options to pass for this particular project
Ghislain MARY's avatar
Ghislain MARY committed
736
		if(EP_${PROJNAME}_RPMBUILD_OPTIONS)
737
			string(REPLACE ";" " " LINPHONE_BUILDER_RPMBUILD_OPTIONS "${EP_${PROJNAME}_RPMBUILD_OPTIONS}")
738 739
		else()
			set(LINPHONE_BUILDER_RPMBUILD_OPTIONS "")
740 741 742 743
		endif()

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

Ghislain MARY's avatar
Ghislain MARY committed
744
		if(EP_${PROJNAME}_PKG_CONFIG)
745
			set(LINPHONE_BUILDER_PKG_CONFIG "${EP_${PROJNAME}_PKG_CONFIG}")
Ghislain MARY's avatar
Ghislain MARY committed
746 747
		else()
			set(LINPHONE_BUILDER_PKG_CONFIG "${PKG_CONFIG_PROGRAM}")
748 749
		endif()

Ghislain MARY's avatar
Ghislain MARY committed
750
		if(EP_${PROJNAME}_CONFIGURE_EXTRA_CMD)
751
			set(LINPHONE_BUILDER_CONFIGURE_EXTRA_CMD "${EP_${PROJNAME}_CONFIGURE_EXTRA_CMD}")
752 753
		else()
			set(LINPHONE_BUILDER_CONFIGURE_EXTRA_CMD "")
754 755
		endif()

756 757 758 759 760 761 762 763
		if(NOT EP_${PROJNAME}_LINKING_TYPE) # Apply default CMake linking type if not set explicitely
			if(EP_${PROJNAME}_PLUGIN)
				set(EP_${PROJNAME}_LINKING_TYPE ${DEFAULT_VALUE_CMAKE_PLUGIN_LINKING_TYPE})
			else()
				set(EP_${PROJNAME}_LINKING_TYPE ${DEFAULT_VALUE_CMAKE_LINKING_TYPE})
			endif()
		endif()

764
		# allow to have special command steps
765 766 767 768
		if(EP_${PROJNAME}_USE_AUTOTOOLS_FOR_RPM)
			linphone_builder_configure_file_for_project(${PROJNAME} CONFIGURE ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Autotools/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/Autotools/build.rpm.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_build_rpm.sh)
		else()
769 770
			set(CURRENT_PROJ_CMAKE_OPTIONS ${EP_${PROJNAME}_CMAKE_OPTIONS} ${EP_${PROJNAME}_LINKING_TYPE})
			string(REPLACE ";" " " CURRENT_PROJ_CMAKE_OPTIONS  "${CURRENT_PROJ_CMAKE_OPTIONS}")
771 772
			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)
773
			unset(CURRENT_PROJ_CMAKE_OPTIONS)
774
		endif()
775
		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)
776 777 778 779 780 781

		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
		)
782 783
	else()
		# Use CMake build method
784 785 786 787 788 789 790
		if(NOT EP_${PROJNAME}_LINKING_TYPE) # Apply default CMake linking type if not set explicitely
			if(EP_${PROJNAME}_PLUGIN)
				set(EP_${PROJNAME}_LINKING_TYPE ${DEFAULT_VALUE_CMAKE_PLUGIN_LINKING_TYPE})
			else()
				set(EP_${PROJNAME}_LINKING_TYPE ${DEFAULT_VALUE_CMAKE_LINKING_TYPE})
			endif()
		endif()
791 792 793 794
		set(BUILD_COMMANDS
			CMAKE_ARGS ${EP_${PROJNAME}_CMAKE_OPTIONS} ${EP_${PROJNAME}_LINKING_TYPE}
			CMAKE_CACHE_ARGS ${LINPHONE_BUILDER_EP_ARGS}
		)
795
	endif()
796

797
	if(LINPHONE_BUILDER_LATEST AND EP_${PROJNAME}_GIT_TAG_LATEST)
798
		set(DOWNLOAD_SOURCE GIT_REPOSITORY ${EP_${PROJNAME}_GIT_REPOSITORY} GIT_TAG ${EP_${PROJNAME}_GIT_TAG_LATEST})
799
	elseif(EP_${PROJNAME}_SOURCE_DIR)
800
		set(DOWNLOAD_SOURCE SOURCE_DIR "${EP_${PROJNAME}_SOURCE_DIR}")
801 802 803 804 805
	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()
806 807 808
	elseif(EP_${PROJNAME}_SVN_REPOSITORY)
		set(DOWNLOAD_SOURCE SVN_REPOSITORY ${EP_${PROJNAME}_SVN_REPOSITORY})
	else()
809
		set(DOWNLOAD_SOURCE GIT_REPOSITORY ${EP_${PROJNAME}_GIT_REPOSITORY} GIT_TAG ${EP_${PROJNAME}_GIT_TAG})
810
	endif()
811

812 813
	linphone_builder_filter_out_inexistent_dependencies(${PROJNAME})

814 815
	ExternalProject_Add(EP_${PROJNAME}
		DEPENDS ${EP_${PROJNAME}_DEPENDENCIES}
816
		BINARY_DIR "${ep_build}"
817
		${DOWNLOAD_SOURCE}
818
		PATCH_COMMAND ${EP_${PROJNAME}_PATCH_COMMAND}
819
		CMAKE_GENERATOR ${ep_generator}
Ghislain MARY's avatar
Ghislain MARY committed
820
		${BUILD_COMMANDS}
821
	)
822

823 824
	if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/builders/${PROJNAME}/postinstall.cmake)
		ExternalProject_Add_Step(EP_${PROJNAME} postinstall
825
			COMMAND ${CMAKE_COMMAND} -DTOOLCHAIN_RANLIB=${TOOLCHAIN_RANLIB} -DPYTHON_EXECUTABLE=${PYTHON_EXECUTABLE} -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -DINSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -P ${CMAKE_CURRENT_SOURCE_DIR}/builders/${PROJNAME}/postinstall.cmake
826 827
			COMMENT "Performing post-installation for 'EP_${PROJNAME}'"
			DEPENDEES install
828 829
			WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
		)
830
	endif()
831
	if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/builders/${PROJNAME}/postconfig.cmake)
832
		ExternalProject_Add_Step(EP_${PROJNAME} postconfig
833
			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
834 835 836 837 838
			COMMENT "Performing post-configuration for 'EP_${PROJNAME}'"
			DEPENDEES install
			WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
		)
	endif()
839 840 841 842 843 844 845 846
	if(ENABLE_SOURCE_PACKAGING AND EP_${PROJNAME}_PACKAGE_SOURCE)
		ExternalProject_Add_Step(EP_${PROJNAME} package_source
			COMMAND ${CMAKE_COMMAND} --build ${ep_build} --target package_source
			COMMENT "Creating source package for 'EP_${PROJNAME}'"
			DEPENDEES install
			WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
		)
	endif()
847 848 849 850 851 852 853

	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()
854 855 856 857
		ExternalProject_Add_Step(EP_${PROJNAME} force_build
			COMMENT "Forcing build for 'EP_${PROJNAME}'"
			DEPENDEES configure
			DEPENDERS build
858 859 860
			ALWAYS 1
		)
		unset(_source_dirs)
861 862
	endif()

863 864
	linphone_builder_restore_flags()

865
endmacro()
Ghislain MARY's avatar
Ghislain MARY committed
866

867
macro(linphone_builder_add_grouped_external_source_path_project PROJNAME FILENAME)
868
	linphone_builder_filter_out_inexistent_dependencies(${PROJNAME})
869
	file(APPEND "${FILENAME}" "add_subdirectory(\"${EP_${PROJNAME}_SOURCE_DIR}\" \"${LINPHONE_BUILDER_WORK_DIR}/Build/${PROJNAME}\")\n")
870
	list(APPEND EP_linphone_builder_LINKING_TYPE "${EP_${PROJNAME}_LINKING_TYPE}")
871
	list(APPEND EP_linphone_builder_CMAKE_OPTIONS "${EP_${PROJNAME}_CMAKE_OPTIONS}")
872 873 874
	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}")
875
	list(APPEND EP_linphone_builder_EXTRA_LDFLAGS "${EP_${PROJNAME}_EXTRA_LDFLAGS}")
876
	list(APPEND EP_linphone_builder_EXTRA_OBJCFLAGS "${EP_${PROJNAME}_EXTRA_OBJCFLAGS}")
877 878
	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}")
879
	if(EP_${PROJNAME}_DEPENDENCIES)
880
		list(APPEND EP_linphone_builder_DEPENDENCIES ${EP_${PROJNAME}_DEPENDENCIES})
881
	endif()
882
endmacro()
883

884
macro(linphone_builder_add_external_projects)
885
	foreach(BUILDER ${LINPHONE_BUILDER_INCLUDED_BUILDERS})
886 887
		list(FIND LINPHONE_BUILDER_INCLUDED_BUILDERS_TO_EXCLUDE ${BUILDER} _excluded_found)
		list(FIND LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH_BUILDERS ${BUILDER} _external_source_path_found)
888
		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)))
889 890 891
			linphone_builder_add_external_project(${BUILDER})
		endif()
	endforeach()
892
endmacro()
893

894 895 896
macro(detect_variable_conflict VARIABLE_NAME ERROR_MESSAGE)
	if(EP_linphone_builder_${VARIABLE_NAME})
		list(REMOVE_DUPLICATES EP_linphone_builder_${VARIABLE_NAME})
897
		set(_new_options )
898
		foreach(_option ${EP_linphone_builder_${VARIABLE_NAME}})
899 900 901
			string(REGEX MATCH "^-D(.+)=(.*)$" _match "${_option}")
			if(_match)
				set(_new_option "-D${CMAKE_MATCH_1}=")
902
				set(_varname ${CMAKE_MATCH_1})
903
				set(_value ${CMAKE_MATCH_2})
904
				if(_varname MATCHES "^ENABLE_.*$")
905 906
					if(_value)
						set(_conflicting_option "${_new_option}OFF")
907
						set(_new_option "${_new_option}ON")
908 909
					else()
						set(_conflicting_option "${_new_option}ON")
910
						set(_new_option "${_new_option}OFF")
911
					endif()
912
				else()
913
					set(_new_option "${_new_option}${_value}")
914 915 916 917 918 919 920
				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)
921
					message(FATAL_ERROR ${ERROR_MESSAGE})
922
				endif()
923
			endif()
924 925
		endforeach()
		if(_new_options)
926
			set(EP_linphone_builder_${VARIABLE_NAME} ${_new_options})
927 928 929 930
		endif()
	endif()
endmacro()

931 932 933 934 935 936 937 938 939
macro(detect_conflicting_cmake_options)
	detect_variable_conflict(CMAKE_OPTIONS "Conflicting options \${_new_option} and \${_conflicting_option}")
endmacro()

macro(detect_conflicting_linking_types)
	detect_variable_conflict(LINKING_TYPE "Conflicing linking types in grouped external source path projects: \${EP_linphone_builder_LINKING_TYPE}")
endmacro()

macro(linphone_builder_add_grouped_external_source_path_projects)
940 941
	set(_grouped_builders)
	if(LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH_BUILDERS)
942 943 944 945 946 947
		foreach (_builder ${LINPHONE_BUILDER_INCLUDED_BUILDERS})
			list(FIND LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH_BUILDERS ${_builder} _found)
			if(NOT _found EQUAL -1)
				if(EP_${_builder}_GROUPABLE)
					list(APPEND _grouped_builders ${_builder})
				endif()
948 949 950
			endif()
		endforeach()
	endif()
951
	
952
	if(LINPHONE_BUILDER_GROUP_EXTERNAL_SOURCE_PATH_BUILDERS AND _grouped_builders)
953 954 955 956
		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")
957
		file(APPEND "${_linphone_builder_file}" "option(LINPHONE_BUILDER_GROUP_EXTERNAL_SOURCE_PATH_BUILDERS \"Group external source path builders.\" ON)\n")
958
		set(EP_linphone_builder_CMAKE_OPTIONS )
959
		set(EP_linphone_builder_LINKING_TYPE )
960 961 962
		set(EP_linphone_builder_EXTRA_CFLAGS )
		set(EP_linphone_builder_EXTRA_CPPFLAGS )
		set(EP_linphone_builder_EXTRA_CXXFLAGS )
963
		set(EP_linphone_builder_EXTRA_LDFLAGS )
964
		set(EP_linphone_builder_EXTRA_OBJCFLAGS )
965
		set(EP_linphone_builder_DEPENDENCIES )
966
		set(EP_linphone_builder_GROUPED_SOURCE_DIRS )
967
		foreach(BUILDER ${_grouped_builders})
968
			list(APPEND EP_linphone_builder_GROUPED_SOURCE_DIRS ${EP_${BUILDER}_SOURCE_DIR})
969
			linphone_builder_add_grouped_external_source_path_project(${BUILDER} "${_linphone_builder_file}")
970
		endforeach()
971
		detect_conflicting_linking_types()
972
		detect_conflicting_cmake_options()
973 974 975 976 977 978 979 980 981
		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()
982 983 984
		if(EP_linphone_builder_EXTRA_LDFLAGS)
			list(REMOVE_DUPLICATES EP_linphone_builder_EXTRA_LDFLAGS)
		endif()
985 986 987
		if(EP_linphone_builder_EXTRA_OBJCFLAGS)
			list(REMOVE_DUPLICATES EP_linphone_builder_EXTRA_OBJCFLAGS)
		endif()
988 989 990
		if(EP_linphone_builder_DEPENDENCIES)
			list(REMOVE_DUPLICATES EP_linphone_builder_DEPENDENCIES)
		endif()
991 992 993 994 995
		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)
996
		unset(_grouped_builders)
997
	endif()
998
endmacro()
999

1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032
macro(linphone_builder_sort_builders)
	set(_ordered_builders)
	set(_to_process_builders ${LINPHONE_BUILDER_INCLUDED_BUILDERS})
	list(LENGTH _to_process_builders _remaining_builders_count)
	while(_remaining_builders_count GREATER 0)
		set(_processed_builders)
		foreach(_builder IN LISTS _to_process_builders)
			if(NOT EP_${_builder}_DEPENDENCIES)
				list(APPEND _ordered_builders ${_builder})
				list(APPEND _processed_builders ${_builder})
			else()
				set(_to_add TRUE)
				foreach(_dep IN LISTS EP_${_builder}_DEPENDENCIES)
					string(SUBSTRING "${_dep}" 3 -1 _dep)
					list(FIND _ordered_builders ${_dep} _found)
					if(_found EQUAL -1)
						set(_to_add FALSE)
					endif()
				endforeach()
				if(_to_add)
					list(APPEND _ordered_builders ${_builder})
					list(APPEND _processed_builders ${_builder})
				endif()
			endif()
		endforeach()
		foreach(_builder IN LISTS _processed_builders)
			list(REMOVE_ITEM _to_process_builders ${_builder})
		endforeach()
		list(LENGTH _to_process_builders _remaining_builders_count)
	endwhile()
	set(LINPHONE_BUILDER_INCLUDED_BUILDERS ${_ordered_builders})
endmacro()

1033
macro(linphone_builder_add_projects)
1034
	linphone_builder_sort_builders()
1035
	linphone_builder_add_external_projects()
1036
	linphone_builder_add_grouped_external_source_path_projects()
1037
endmacro()
1038 1039 1040 1041

macro(linphone_builder_add_dummy_libraries_generation)
	if(LINPHONE_BUILDER_DUMMY_LIBRARIES)
		linphone_builder_set_ep_directories(dummy_libraries)
1042
		linphone_builder_set_ep_generator()
1043
		linphone_builder_expand_external_project_vars()
1044
		ExternalProject_Add(EP_dummy_libraries
1045
			DEPENDS TARGET_linphone_builder
1046 1047
			TMP_DIR "${ep_tmp}"
			BINARY_DIR "${ep_build}"
1048
			SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/cmake/dummy_libraries"
1049
			DOWNLOAD_COMMAND ""
1050
			CMAKE_GENERATOR ${ep_generator}
1051 1052 1053 1054
			CMAKE_ARGS ${LINPHONE_BUILDER_EP_ARGS} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DLINPHONE_BUILDER_DUMMY_LIBRARIES=${LINPHONE_BUILDER_DUMMY_LIBRARIES}
		)
	endif()
endmacro()
1055

1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073
macro(linphone_builder_add_package_source_check_project)
	if(ENABLE_SOURCE_PACKAGING AND LINPHONE_BUILDER_SOURCE_PACKAGE_BUILDERS)
		string(REPLACE ";" " " LINPHONE_BUILDER_SOURCE_PACKAGE_BUILDERS "${LINPHONE_BUILDER_SOURCE_PACKAGE_BUILDERS}")
		linphone_builder_set_ep_directories(package_source_check)
		linphone_builder_set_ep_generator()
		linphone_builder_expand_external_project_vars()
		ExternalProject_Add(EP_package_source_check
			DEPENDS TARGET_linphone_builder
			TMP_DIR "${ep_tmp}"
			BINARY_DIR "${ep_build}"
			SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/cmake/package_source_check"
			DOWNLOAD_COMMAND ""
			CMAKE_GENERATOR ${ep_generator}
			CMAKE_ARGS -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX}/package_source_check -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}/package_source_check -DLINPHONE_BUILDER_WORK_DIR=${LINPHONE_BUILDER_WORK_DIR} -DLINPHONE_BUILDER_SOURCE_PACKAGE_BUILDERS=${LINPHONE_BUILDER_SOURCE_PACKAGE_BUILDERS} -DGENERATOR=${ep_generator}
		)
	endif()
endmacro()

1074 1075 1076 1077 1078 1079
macro(lcb_check_current_builder)
	if(NOT DEFINED LINPHONE_BUILDER_CURRENT_BUILDER)
		message(FATAL_ERROR "lcb_ macro used outside of builder definition")
	endif()
endmacro()

1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094
macro(lcb_builder_cmake_options BUILDER)
	set(_args "${ARGN}")
	foreach(_arg IN LISTS _args)
		string(REGEX MATCH "^-D(.+)=(.*)$" _match "${_arg}")
		if(_match)
			set(_varname ${CMAKE_MATCH_1})
			foreach(_option ${EP_${BUILDER}_CMAKE_OPTIONS})
				string(REGEX MATCH "^-D${_varname}=(.*)$" _match2 "${_option}")
				if(_match2)
					list(REMOVE_ITEM EP_${BUILDER}_CMAKE_OPTIONS ${_option})
				endif()
			endforeach()
		endif()
		list(APPEND EP_${BUILDER}_CMAKE_OPTIONS ${_arg})
	endforeach()
1095
endmacro()
1096

1097
macro(lcb_cmake_options)
1098
	lcb_check_current_builder()
1099
	lcb_builder_cmake_options("${LINPHONE_BUILDER_CURRENT_BUILDER}" ${ARGN})
1100 1101
endmacro()

1102 1103 1104 1105 1106
macro(lcb_builder_configure_options BUILDER)
	set(_args "${ARGN}")
	foreach(_option IN LISTS _args)
		list(APPEND EP_${BUILDER}_CONFIGURE_OPTIONS ${_option})
	endforeach()
1107
endmacro()
1108

1109
macro(lcb_configure_options)
1110
	lcb_check_current_builder()
1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122
	lcb_builder_configure_options("${LINPHONE_BUILDER_CURRENT_BUILDER}" ${ARGN})
endmacro()

macro(lcb_builder_cross_compilation_options BUILDER)
	unset(EP_${BUILDER}_CROSS_COMPILATION_OPTIONS) # Clear previously set options
	set(_args "${ARGN}")
	foreach(_option IN LISTS _args)
		list(APPEND EP_${BUILDER}_CROSS_COMPILATION_OPTIONS ${_args})
	endforeach()
endmacro()

macro(lcb_cross_compilation_options)
1123
	lcb_check_current_builder()
1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134
	lcb_builder_cross_compilation_options("${LINPHONE_BUILDER_CURRENT_BUILDER}" ${ARGN})
endmacro()

macro(lcb_builder_make_options BUILDER)
	set(_args "${ARGN}")
	foreach(_option IN LISTS _args)
		set(EP_${BUILDER}_MAKE_OPTIONS "${EP_${BUILDER}_MAKE_OPTIONS} ${_option}")
	endforeach()
endmacro()

macro(lcb_make_options)
1135
	lcb_check_current_builder()
1136 1137 1138 1139 1140 1141 1142 1143
	lcb_builder_make_options("${LINPHONE_BUILDER_CURRENT_BUILDER}" ${ARGN})
endmacro()

macro(lcb_builder_extra_cflags BUILDER CFLAGS)
	set(EP_${BUILDER}_EXTRA_CFLAGS "${EP_${BUILDER}_EXTRA_CFLAGS} ${CFLAGS}")
endmacro()

macro(lcb_extra_cflags CFLAGS)
1144
	lcb_check_current_builder()
1145 1146 1147 1148 1149 1150 1151 1152
	lcb_builder_extra_cflags("${LINPHONE_BUILDER_CURRENT_BUILDER}" "${CFLAGS}")
endmacro()

macro(lcb_builder_extra_cppflags BUILDER CPPFLAGS)
	set(EP_${BUILDER}_EXTRA_CPPFLAGS "${EP_${BUILDER}_EXTRA_CPPFLAGS} ${CPPFLAGS}")
endmacro()

macro(lcb_extra_cppflags CPPFLAGS)
1153
	lcb_check_current_builder()
1154 1155 1156 1157 1158 1159 1160 1161
	lcb_builder_extra_cppflags("${LINPHONE_BUILDER_CURRENT_BUILDER}" "${CPPFLAGS}")
endmacro()

macro(lcb_builder_extra_cxxflags BUILDER CXXFLAGS)
	set(EP_${BUILDER}_EXTRA_CXXFLAGS "${EP_${BUILDER}_EXTRA_CXXFLAGS} ${CXXFLAGS}")
endmacro()

macro(lcb_extra_cxxflags CPPFLAGS)
1162
	lcb_check_current_builder()
1163 1164 1165 1166 1167 1168 1169 1170
	lcb_builder_extra_cxxflags("${LINPHONE_BUILDER_CURRENT_BUILDER}" "${CXXFLAGS}")
endmacro()

macro(lcb_builder_extra_ldflags BUILDER LDFLAGS)
	set(EP_${BUILDER}_EXTRA_LDFLAGS "${EP_${BUILDER}_EXTRA_LDFLAGS} ${LDFLAGS}")
endmacro()

macro(lcb_extra_ldflags LDFLAGS)
1171
	lcb_check_current_builder()
1172 1173 1174 1175 1176 1177 1178 1179
	lcb_builder_extra_ldflags("${LINPHONE_BUILDER_CURRENT_BUILDER}" "${LDFLAGS}")
endmacro()

macro(lcb_builder_extra_asflags BUILDER ASFLAGS)
	set(EP_${BUILDER}_EXTRA_ASFLAGS "${EP_${BUILDER}_EXTRA_ASFLAGS} ${ASFLAGS}")
endmacro()

macro(lcb_extra_asflags ASFLAGS)
1180
	lcb_check_current_builder()
1181 1182 1183 1184 1185 1186
	lcb_builder_extra_asflags("${LINPHONE_BUILDER_CURRENT_BUILDER}" "${ASFLAGS}")
endmacro()

macro(lcb_builder_dependencies BUILDER)
	set(_args "${ARGN}")
	foreach(_dependency IN LISTS _args)
1187 1188 1189 1190 1191 1192 1193 1194 1195
		set(_add_dependency 1)
		if(LINPHONE_BUILDER_BLACKLISTED_DEPENDENCIES)
			list(FIND LINPHONE_BUILDER_BLACKLISTED_DEPENDENCIES "${_dependency}" _found)
			if(_found GREATER -1)
				set(_add_dependency 0)
			endif()
		endif()
		if(_add_dependency)
			list(APPEND EP_${BUILDER}_DEPENDENCIES "EP_${_dependency}")
1196 1197 1198
			if(EXISTS ${LINPHONE_BUILDER_OPTIONS_DIR}/${_dependency}.cmake)
				include(${LINPHONE_BUILDER_OPTIONS_DIR}/${_dependency}.cmake)
			endif()
1199
		endif()
1200 1201 1202 1203
	endforeach()
endmacro()

macro(lcb_dependencies)
1204
	lcb_check_current_builder()
1205 1206 1207 1208 1209 1210 1211 1212
	lcb_builder_dependencies("${LINPHONE_BUILDER_CURRENT_BUILDER}" ${ARGN})
endmacro()

macro(lcb_builder_git_repository BUILDER GIT_REPOSITORY)
	set(EP_${BUILDER}_GIT_REPOSITORY "${GIT_REPOSITORY}" CACHE STRING "${GIT_REPOSITORY} repository URL")
endmacro()

macro(lcb_git_repository GIT_REPOSITORY)