CMakeLists.txt 55.9 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 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304
				message("    Using ${BUILDER} from the system")
				list(APPEND LINPHONE_BUILDER_INCLUDED_BUILDERS_TO_EXCLUDE ${BUILDER})
				list(APPEND LINPHONE_BUILDER_SYSTEM_DEPENDENCIES_BUILDERS ${BUILDER})
			endif()
		elseif(LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH AND LINPHONE_BUILDER_GROUP_EXTERNAL_SOURCE_PATH_BUILDERS)
			foreach(SUBDIR ${EP_${BUILDER}_EXTERNAL_SOURCE_PATHS})
				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}")
					#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})
305
			endif()
306
			unset(_build_from_external_source_path)
307
		else()
308
			#message("    ${TARGETNAME} depends on external project EP_${BUILDER}")
309
			add_dependencies(${TARGETNAME} EP_${BUILDER})
310
		endif()
311 312 313 314
		foreach(_dependency IN LISTS EP_${BUILDER}_DEPENDENCIES)
			string(REGEX REPLACE "^EP_" "" _dep ${_dependency})
			linphone_builder_add_builder_to_target(${TARGETNAME} "${_dep}" FALSE ${DEPENDENCIES})
		endforeach()
315
	endif()
Ghislain MARY's avatar
Ghislain MARY committed
316
endmacro()
317 318


319
macro(linphone_builder_apply_flags)
320
	string(TOUPPER "${CMAKE_BUILD_TYPE}" BUILD_TYPE)
Ghislain MARY's avatar
Ghislain MARY committed
321 322 323 324 325 326 327 328 329 330
	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)
331 332
		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}")
333 334
		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
335 336
	endif()
	if(LINPHONE_BUILDER_CFLAGS)
337
		set(CMAKE_C_FLAGS_${BUILD_TYPE} "${CMAKE_C_FLAGS_${BUILD_TYPE}} ${LINPHONE_BUILDER_CFLAGS}")
338
		set(AUTOTOOLS_C_FLAGS "${AUTOTOOLS_C_FLAGS} ${LINPHONE_BUILDER_CFLAGS} ")
Ghislain MARY's avatar
Ghislain MARY committed
339 340
	endif()
	if(LINPHONE_BUILDER_CXXFLAGS)
341
		set(CMAKE_CXX_FLAGS_${BUILD_TYPE} "${CMAKE_CXX_FLAGS_${BUILD_TYPE}} ${LINPHONE_BUILDER_CXXFLAGS}")
342
		set(AUTOTOOLS_CXX_FLAGS "${AUTOTOOLS_CXX_FLAGS} ${LINPHONE_BUILDER_CXX_FLAGS} ")
Ghislain MARY's avatar
Ghislain MARY committed
343 344
	endif()
	if(LINPHONE_BUILDER_OBJCFLAGS)
345
		set(CMAKE_C_FLAGS_${BUILD_TYPE} "${CMAKE_C_FLAGS_${BUILD_TYPE}} ${LINPHONE_BUILDER_OBJCFLAGS}")
346
		set(AUTOTOOLS_OBJC_FLAGS "${AUTOTOOLS_OBJC_FLAGS} ${LINPHONE_BUILDER_OBJCFLAGS} ")
Ghislain MARY's avatar
Ghislain MARY committed
347 348
	endif()
	if(LINPHONE_BUILDER_LDFLAGS)
349 350 351
		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}")
352
		set(AUTOTOOLS_LINKER_FLAGS "${AUTOTOOLS_LINKER_FLAGS} ${LINPHONE_BUILDER_LDFLAGS} ")
Ghislain MARY's avatar
Ghislain MARY committed
353
	endif()
354
	unset(BUILD_TYPE)
355 356 357 358 359 360
	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
361
endmacro()
362 363


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


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


428
macro(linphone_builder_restore_flags)
429 430 431 432 433 434 435
	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)
436 437 438
endmacro()


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

450 451 452 453 454 455 456 457
		# 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()

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

496

497 498 499 500 501 502 503 504 505
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()


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


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


537 538 539 540 541
macro(linphone_builder_create_build_command PROJNAME)
	set(ep_make_options "${EP_${PROJNAME}_MAKE_OPTIONS}")
endmacro()


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

554 555 556 557
macro(linphone_builder_filter_out_inexistent_dependencies PROJNAME)
	if(EP_${PROJNAME}_DEPENDENCIES)
		set(_new_deps )
		foreach(_dep ${EP_${PROJNAME}_DEPENDENCIES})
558 559
			string(REGEX REPLACE "^EP_" "" _dep2 ${_dep})
			list(FIND LINPHONE_BUILDER_INCLUDED_BUILDERS ${_dep2} _found)
560
			list(FIND LINPHONE_BUILDER_INCLUDED_BUILDERS_TO_EXCLUDE ${_dep2} _excluded_found)
561
			list(FIND LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH_BUILDERS ${_dep2} _external_source_path_found)
562
			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)))
563 564 565 566 567 568 569 570 571 572 573
				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()

574
macro(linphone_builder_add_external_project PROJNAME)
575
	if(LINPHONE_BUILDER_ENABLE_RPM_PACKAGING AND NOT EP_${PROJNAME}_BUILD_METHOD STREQUAL "dummy")
576 577 578
		set(EP_${PROJNAME}_BUILD_METHOD "rpm")
	endif()

579 580 581
	if(LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH)
		foreach(SUBDIR ${EP_${PROJNAME}_EXTERNAL_SOURCE_PATHS})
			if(NOT EP_${PROJNAME}_SOURCE_DIR)
582 583 584 585 586 587 588
				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}")
589 590 591 592
				endif()
			endif()
		endforeach()
	endif()
593 594 595
	if(EP_${PROJNAME}_PACKAGE_SOURCE)
		list(APPEND LINPHONE_BUILDER_SOURCE_PACKAGE_BUILDERS ${PROJNAME})
	endif()
596

597
	linphone_builder_set_ep_directories(${PROJNAME})
598
	linphone_builder_set_ep_generator()
Ghislain MARY's avatar
Ghislain MARY committed
599 600 601
	if(NOT EP_${PROJNAME}_DO_NOT_USE_CMAKE_FLAGS)
		linphone_builder_apply_cmake_flags_to_autotools_project(${PROJNAME})
	endif()
602 603 604 605 606
	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()
607
	linphone_builder_apply_extra_flags(${PROJNAME})
608 609
	linphone_builder_expand_external_project_vars()

610 611 612 613 614 615 616 617
	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")
618 619 620 621 622 623
		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
624
	elseif(EP_${PROJNAME}_BUILD_METHOD STREQUAL "custom")
625 626 627
		if(WIN32)
			set(ep_redirect_to_file "2>&1 >> \"${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}.log\"")
		endif()
628 629 630 631 632 633 634 635 636 637 638 639
		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()
640
		set(BUILD_COMMANDS
641 642 643
			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}
644
		)
645 646
	elseif(EP_${PROJNAME}_BUILD_METHOD STREQUAL "autotools")
		linphone_builder_create_autogen_command(${PROJNAME})
647
		linphone_builder_create_configure_command(${PROJNAME})
648
		linphone_builder_create_build_command(${PROJNAME})
Ghislain MARY's avatar
Ghislain MARY committed
649
		if(EP_${PROJNAME}_CONFIG_H_FILE)
650
			set(ep_config_h_file ${EP_${PROJNAME}_CONFIG_H_FILE})
Ghislain MARY's avatar
Ghislain MARY committed
651
		else()
Ghislain MARY's avatar
Ghislain MARY committed
652 653 654
			set(ep_config_h_file config.h)
		endif()
		if(EP_${PROJNAME}_INSTALL_TARGET)
655
			set(ep_install_target "${EP_${PROJNAME}_INSTALL_TARGET}")
Ghislain MARY's avatar
Ghislain MARY committed
656 657
		else()
			set(ep_install_target "install")
Ghislain MARY's avatar
Ghislain MARY committed
658
		endif()
659

660
		if(WIN32)
661
			set(ep_redirect_to_file "2>&1 >> \"${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}.log\"")
662 663 664 665 666
			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
667
			if(ep_autogen_command)
668 669
				set(ep_autogen_redirect_to_file ${ep_redirect_to_file})
			endif()
Ghislain MARY's avatar
Ghislain MARY committed
670
			if(ep_configure_command)
671 672
				set(ep_configure_redirect_to_file ${ep_redirect_to_file})
			endif()
673
		else()
674
			set(SCRIPT_EXTENSION sh)
675
		endif()
676

Ghislain MARY's avatar
Ghislain MARY committed
677
		if(EP_${PROJNAME}_PKG_CONFIG)
678
			set(LINPHONE_BUILDER_PKG_CONFIG "${EP_${PROJNAME}_PKG_CONFIG}")
Ghislain MARY's avatar
Ghislain MARY committed
679 680
		else()
			set(LINPHONE_BUILDER_PKG_CONFIG "${PKG_CONFIG_PROGRAM}")
Ghislain MARY's avatar
Ghislain MARY committed
681
		endif()
682

683 684 685
		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
686 687

		set(BUILD_COMMANDS
688 689 690
			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
691
		)
Ghislain MARY's avatar
Ghislain MARY committed
692
	elseif(EP_${PROJNAME}_BUILD_METHOD STREQUAL "rpm")
693

694
		if(WIN32)
695
			message(SEND_ERROR "rpm build not supported on WIN32")
696 697 698 699
		endif()

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

Ghislain MARY's avatar
Ghislain MARY committed
701
		if(EP_${PROJNAME}_CONFIG_H_FILE)
702
			set(ep_config_h_file ${EP_${PROJNAME}_CONFIG_H_FILE})
Ghislain MARY's avatar
Ghislain MARY committed
703 704
		else()
			set(ep_config_h_file config.h)
705
		endif()
706

Ghislain MARY's avatar
Ghislain MARY committed
707
		if(EP_${PROJNAME}_INSTALL_TARGET)
708
			set(ep_install_target "${EP_${PROJNAME}_INSTALL_TARGET}")
Ghislain MARY's avatar
Ghislain MARY committed
709 710
		else()
			set(ep_install_target "install")
711 712
		endif()

Ghislain MARY's avatar
Ghislain MARY committed
713
		if(EP_${PROJNAME}_SPEC_FILE)
714
			set(LINPHONE_BUILDER_SPEC_FILE "${EP_${PROJNAME}_SPEC_FILE}")
Ghislain MARY's avatar
Ghislain MARY committed
715 716
		else()
			message(SEND_ERROR "rpm build requires EP_${PROJNAME}_SPEC_FILE to be defined")
717 718 719 720
		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
721
		if(EP_${PROJNAME}_RPMBUILD_NAME)
722
			set(LINPHONE_BUILDER_RPMBUILD_NAME "${EP_${PROJNAME}_RPMBUILD_NAME}")
Ghislain MARY's avatar
Ghislain MARY committed
723 724
		else()
			set(LINPHONE_BUILDER_RPMBUILD_NAME "${PROJNAME}")
725
		endif()
726

727
		# some specific RPMBUILD options to pass for this particular project
Ghislain MARY's avatar
Ghislain MARY committed
728
		if(EP_${PROJNAME}_RPMBUILD_OPTIONS)
729
			string(REPLACE ";" " " LINPHONE_BUILDER_RPMBUILD_OPTIONS "${EP_${PROJNAME}_RPMBUILD_OPTIONS}")
730 731
		else()
			set(LINPHONE_BUILDER_RPMBUILD_OPTIONS "")
732 733 734 735
		endif()

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

Ghislain MARY's avatar
Ghislain MARY committed
736
		if(EP_${PROJNAME}_PKG_CONFIG)
737
			set(LINPHONE_BUILDER_PKG_CONFIG "${EP_${PROJNAME}_PKG_CONFIG}")
Ghislain MARY's avatar
Ghislain MARY committed
738 739
		else()
			set(LINPHONE_BUILDER_PKG_CONFIG "${PKG_CONFIG_PROGRAM}")
740 741
		endif()

Ghislain MARY's avatar
Ghislain MARY committed
742
		if(EP_${PROJNAME}_CONFIGURE_EXTRA_CMD)
743
			set(LINPHONE_BUILDER_CONFIGURE_EXTRA_CMD "${EP_${PROJNAME}_CONFIGURE_EXTRA_CMD}")
744 745
		else()
			set(LINPHONE_BUILDER_CONFIGURE_EXTRA_CMD "")
746 747
		endif()

748 749 750 751 752 753 754 755
		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()

756
		# allow to have special command steps
757 758 759 760
		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()
761 762
			set(CURRENT_PROJ_CMAKE_OPTIONS ${EP_${PROJNAME}_CMAKE_OPTIONS} ${EP_${PROJNAME}_LINKING_TYPE})
			string(REPLACE ";" " " CURRENT_PROJ_CMAKE_OPTIONS  "${CURRENT_PROJ_CMAKE_OPTIONS}")
763 764
			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)
765
			unset(CURRENT_PROJ_CMAKE_OPTIONS)
766
		endif()
767
		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)
768 769 770 771 772 773

		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
		)
774 775
	else()
		# Use CMake build method
776 777 778 779 780 781 782
		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()
783 784 785 786
		set(BUILD_COMMANDS
			CMAKE_ARGS ${EP_${PROJNAME}_CMAKE_OPTIONS} ${EP_${PROJNAME}_LINKING_TYPE}
			CMAKE_CACHE_ARGS ${LINPHONE_BUILDER_EP_ARGS}
		)
787
	endif()
788

789
	if(LINPHONE_BUILDER_LATEST AND EP_${PROJNAME}_GIT_TAG_LATEST)
790
		set(DOWNLOAD_SOURCE GIT_REPOSITORY ${EP_${PROJNAME}_GIT_REPOSITORY} GIT_TAG ${EP_${PROJNAME}_GIT_TAG_LATEST})
791
	elseif(EP_${PROJNAME}_SOURCE_DIR)
792
		set(DOWNLOAD_SOURCE SOURCE_DIR "${EP_${PROJNAME}_SOURCE_DIR}")
793 794 795 796 797
	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()
798 799 800
	elseif(EP_${PROJNAME}_SVN_REPOSITORY)
		set(DOWNLOAD_SOURCE SVN_REPOSITORY ${EP_${PROJNAME}_SVN_REPOSITORY})
	else()
801
		set(DOWNLOAD_SOURCE GIT_REPOSITORY ${EP_${PROJNAME}_GIT_REPOSITORY} GIT_TAG ${EP_${PROJNAME}_GIT_TAG})
802
	endif()
803

804 805
	linphone_builder_filter_out_inexistent_dependencies(${PROJNAME})

806 807
	ExternalProject_Add(EP_${PROJNAME}
		DEPENDS ${EP_${PROJNAME}_DEPENDENCIES}
808
		BINARY_DIR "${ep_build}"
809
		${DOWNLOAD_SOURCE}
810
		PATCH_COMMAND ${EP_${PROJNAME}_PATCH_COMMAND}
811
		CMAKE_GENERATOR ${ep_generator}
Ghislain MARY's avatar
Ghislain MARY committed
812
		${BUILD_COMMANDS}
813
	)
814

815 816
	if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/builders/${PROJNAME}/postinstall.cmake)
		ExternalProject_Add_Step(EP_${PROJNAME} postinstall
817
			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
818 819
			COMMENT "Performing post-installation for 'EP_${PROJNAME}'"
			DEPENDEES install
820 821
			WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
		)
822
	endif()
823
	if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/builders/${PROJNAME}/postconfig.cmake)
824
		ExternalProject_Add_Step(EP_${PROJNAME} postconfig
825
			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
826 827 828 829 830
			COMMENT "Performing post-configuration for 'EP_${PROJNAME}'"
			DEPENDEES install
			WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
		)
	endif()
831 832 833 834 835 836 837 838
	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()
839 840 841 842 843 844 845

	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()
846 847 848 849
		ExternalProject_Add_Step(EP_${PROJNAME} force_build
			COMMENT "Forcing build for 'EP_${PROJNAME}'"
			DEPENDEES configure
			DEPENDERS build
850 851 852
			ALWAYS 1
		)
		unset(_source_dirs)
853 854
	endif()

855 856
	linphone_builder_restore_flags()

857
endmacro()
Ghislain MARY's avatar
Ghislain MARY committed
858

859
macro(linphone_builder_add_grouped_external_source_path_project PROJNAME FILENAME)
860
	linphone_builder_filter_out_inexistent_dependencies(${PROJNAME})
861
	file(APPEND "${FILENAME}" "add_subdirectory(\"${EP_${PROJNAME}_SOURCE_DIR}\" \"${LINPHONE_BUILDER_WORK_DIR}/Build/${PROJNAME}\")\n")
862
	list(APPEND EP_linphone_builder_LINKING_TYPE "${EP_${PROJNAME}_LINKING_TYPE}")
863
	list(APPEND EP_linphone_builder_CMAKE_OPTIONS "${EP_${PROJNAME}_CMAKE_OPTIONS}")
864 865 866
	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}")
867
	list(APPEND EP_linphone_builder_EXTRA_LDFLAGS "${EP_${PROJNAME}_EXTRA_LDFLAGS}")
868
	list(APPEND EP_linphone_builder_EXTRA_OBJCFLAGS "${EP_${PROJNAME}_EXTRA_OBJCFLAGS}")
869 870
	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}")
871
	if(EP_${PROJNAME}_DEPENDENCIES)
872
		list(APPEND EP_linphone_builder_DEPENDENCIES ${EP_${PROJNAME}_DEPENDENCIES})
873
	endif()
874
endmacro()
875

876
macro(linphone_builder_add_external_projects)
877
	foreach(BUILDER ${LINPHONE_BUILDER_INCLUDED_BUILDERS})
878 879
		list(FIND LINPHONE_BUILDER_INCLUDED_BUILDERS_TO_EXCLUDE ${BUILDER} _excluded_found)
		list(FIND LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH_BUILDERS ${BUILDER} _external_source_path_found)
880
		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)))
881 882 883
			linphone_builder_add_external_project(${BUILDER})
		endif()
	endforeach()
884
endmacro()
885

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

923 924 925 926 927 928 929 930 931
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)
932 933
	set(_grouped_builders)
	if(LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH_BUILDERS)
934 935 936 937 938 939
		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()
940 941 942
			endif()
		endforeach()
	endif()
943
	
944
	if(LINPHONE_BUILDER_GROUP_EXTERNAL_SOURCE_PATH_BUILDERS AND _grouped_builders)
945 946 947 948
		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")
949
		file(APPEND "${_linphone_builder_file}" "option(LINPHONE_BUILDER_GROUP_EXTERNAL_SOURCE_PATH_BUILDERS \"Group external source path builders.\" ON)\n")
950
		set(EP_linphone_builder_CMAKE_OPTIONS )
951
		set(EP_linphone_builder_LINKING_TYPE )
952 953 954
		set(EP_linphone_builder_EXTRA_CFLAGS )
		set(EP_linphone_builder_EXTRA_CPPFLAGS )
		set(EP_linphone_builder_EXTRA_CXXFLAGS )
955
		set(EP_linphone_builder_EXTRA_LDFLAGS )
956
		set(EP_linphone_builder_EXTRA_OBJCFLAGS )
957
		set(EP_linphone_builder_DEPENDENCIES )
958
		set(EP_linphone_builder_GROUPED_SOURCE_DIRS )
959
		foreach(BUILDER ${_grouped_builders})
960
			list(APPEND EP_linphone_builder_GROUPED_SOURCE_DIRS ${EP_${BUILDER}_SOURCE_DIR})
961
			linphone_builder_add_grouped_external_source_path_project(${BUILDER} "${_linphone_builder_file}")
962
		endforeach()
963
		detect_conflicting_linking_types()
964
		detect_conflicting_cmake_options()
965 966 967 968 969 970 971 972 973
		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()
974 975 976
		if(EP_linphone_builder_EXTRA_LDFLAGS)
			list(REMOVE_DUPLICATES EP_linphone_builder_EXTRA_LDFLAGS)
		endif()
977 978 979
		if(EP_linphone_builder_EXTRA_OBJCFLAGS)
			list(REMOVE_DUPLICATES EP_linphone_builder_EXTRA_OBJCFLAGS)
		endif()
980 981 982
		if(EP_linphone_builder_DEPENDENCIES)
			list(REMOVE_DUPLICATES EP_linphone_builder_DEPENDENCIES)
		endif()
983 984 985 986 987
		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)
988
		unset(_grouped_builders)
989
	endif()
990
endmacro()
991

992 993 994 995 996 997 998 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
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()

1025
macro(linphone_builder_add_projects)
1026
	linphone_builder_sort_builders()
1027
	linphone_builder_add_external_projects()
1028
	linphone_builder_add_grouped_external_source_path_projects()
1029
endmacro()
1030 1031 1032 1033

macro(linphone_builder_add_dummy_libraries_generation)
	if(LINPHONE_BUILDER_DUMMY_LIBRARIES)
		linphone_builder_set_ep_directories(dummy_libraries)
1034
		linphone_builder_set_ep_generator()
1035
		linphone_builder_expand_external_project_vars()
1036
		ExternalProject_Add(EP_dummy_libraries
1037
			DEPENDS TARGET_linphone_builder
1038 1039
			TMP_DIR "${ep_tmp}"
			BINARY_DIR "${ep_build}"
1040
			SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/cmake/dummy_libraries"
1041
			DOWNLOAD_COMMAND ""
1042
			CMAKE_GENERATOR ${ep_generator}
1043 1044 1045 1046
			CMAKE_ARGS ${LINPHONE_BUILDER_EP_ARGS} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DLINPHONE_BUILDER_DUMMY_LIBRARIES=${LINPHONE_BUILDER_DUMMY_LIBRARIES}
		)
	endif()
endmacro()
1047

1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065
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()

1066 1067 1068 1069 1070 1071
macro(lcb_check_current_builder)
	if(NOT DEFINED LINPHONE_BUILDER_CURRENT_BUILDER)
		message(FATAL_ERROR "lcb_ macro used outside of builder definition")
	endif()
endmacro()

1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086
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()
1087
endmacro()
1088

1089
macro(lcb_cmake_options)
1090
	lcb_check_current_builder()
1091
	lcb_builder_cmake_options("${LINPHONE_BUILDER_CURRENT_BUILDER}" ${ARGN})
1092 1093
endmacro()

1094 1095 1096 1097 1098
macro(lcb_builder_configure_options BUILDER)
	set(_args "${ARGN}")
	foreach(_option IN LISTS _args)
		list(APPEND EP_${BUILDER}_CONFIGURE_OPTIONS ${_option})
	endforeach()
1099
endmacro()
1100

1101
macro(lcb_configure_options)
1102
	lcb_check_current_builder()
1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114
	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)
1115
	lcb_check_current_builder()
1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126
	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)
1127
	lcb_check_current_builder()
1128 1129 1130 1131 1132 1133 1134 1135
	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)
1136
	lcb_check_current_builder()
1137 1138 1139 1140 1141 1142 1143 1144
	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)
1145
	lcb_check_current_builder()
1146 1147 1148 1149 1150 1151 1152 1153
	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)
1154
	lcb_check_current_builder()
1155 1156 1157 1158 1159 1160 1161 1162
	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)
1163
	lcb_check_current_builder()
1164 1165 1166 1167 1168 1169 1170 1171
	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)
1172
	lcb_check_current_builder()
1173 1174 1175 1176 1177 1178
	lcb_builder_extra_asflags("${LINPHONE_BUILDER_CURRENT_BUILDER}" "${ASFLAGS}")
endmacro()

macro(lcb_builder_dependencies BUILDER)
	set(_args "${ARGN}")
	foreach(_dependency IN LISTS _args)
1179 1180 1181 1182 1183 1184 1185 1186 1187
		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}")
1188 1189 1190
			if(EXISTS ${LINPHONE_BUILDER_OPTIONS_DIR}/${_dependency}.cmake)
				include(${LINPHONE_BUILDER_OPTIONS_DIR}/${_dependency}.cmake)
			endif()
1191
		endif()
1192 1193 1194 1195
	endforeach()
endmacro()

macro(lcb_dependencies)
1196
	lcb_check_current_builder()
1197 1198 1199 1200 1201 1202 1203 1204
	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)
1205
	lcb_check_current_builder()
1206 1207 1208 1209 1210 1211 1212 1213
	lcb_builder_git_repository("${LINPHONE_BUILDER_CURRENT_BUILDER}" "${GIT_REPOSITORY}")
endmacro()

macro(lcb_builder_git_tag_latest BUILDER GIT_TAG_LATEST)
	set(EP_${BUILDER}_GIT_TAG_LATEST "${GIT_TAG_LATEST}" CACHE STRING "${BUILDER} tag to use when compiling latest version")
endmacro()

macro(lcb_git_tag_latest GIT_TAG_LATEST)
1214
	lcb_check_current_builder()
1215 1216 1217 1218 1219 1220 1221 1222
	lcb_builder_git_tag_latest("${LINPHONE_BUILDER_CURRENT_BUILDER}" "${GIT_TAG_LATEST}")
endmacro()

macro(lcb_builder_git_tag BUILDER GIT_TAG)
	set(EP_${BUILDER}_GIT_TAG "${GIT_TAG}" CACHE STRING "${BUILDER} tag to use")
endmacro()

macro(lcb_git_tag GIT_TAG)
1223
	lcb_check_current_builder()
1224 1225 1226 1227