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

include(ExternalProject)

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

28

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


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


46
set(LINPHONE_BUILDER_EP_VARS)
47
set(LINPHONE_BUILDER_INCLUDED_BUILDERS)
48
set(LINPHONE_BUILDER_INCLUDED_BUILDERS_TO_EXCLUDE)
49
set(LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH_BUILDERS)
50
set(LINPHONE_BUILDER_SYSTEM_DEPENDENCIES_BUILDERS)
51 52

macro(linphone_builder_expand_external_project_vars)
Ghislain MARY's avatar
Ghislain MARY committed
53 54 55 56 57 58 59 60 61 62
	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()
63
endmacro()
64 65 66 67

list(APPEND LINPHONE_BUILDER_EP_VARS
	CMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH
	CMAKE_BUILD_TYPE:STRING
68
	CMAKE_BUILD_WITH_INSTALL_RPATH:BOOL
69
	CMAKE_BUNDLE_OUTPUT_DIRECTORY:PATH
70
	CMAKE_C_COMPILER_LAUNCHER:PATH
71 72 73 74 75
	CMAKE_C_FLAGS_DEBUG:STRING
	CMAKE_C_FLAGS_MINSIZEREL:STRING
	CMAKE_C_FLAGS_RELEASE:STRING
	CMAKE_C_FLAGS_RELWITHDEBINFO:STRING
	CMAKE_C_FLAGS:STRING
76
	CMAKE_CXX_COMPILER_LAUNCHER:PATH
77 78 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_CXX_FLAGS:STRING
	CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING
	CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING
	CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING
	CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING
	CMAKE_EXE_LINKER_FLAGS:STRING
	CMAKE_EXTRA_GENERATOR:STRING
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 99
	CMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH
	CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING
	CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING
	CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING
	CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING
	CMAKE_MODULE_LINKER_FLAGS:STRING
	CMAKE_MODULE_PATH:PATH
100
	CMAKE_NO_BUILD_TYPE:BOOL
101
	CMAKE_NO_SYSTEM_FROM_IMPORTED:BOOL
102
	CMAKE_PREFIX_PATH:STRING
103
	CMAKE_PROGRAM_PATH:STRING
104 105 106 107 108 109
	CMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH
	CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING
	CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING
	CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING
	CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING
	CMAKE_SHARED_LINKER_FLAGS:STRING
110
	CMAKE_SKIP_INSTALL_RPATH:BOOL
111
	CMAKE_SKIP_RPATH:BOOL
112
	CMAKE_SKIP_BUILD_RPATH:BOOL
113
	CMAKE_VERBOSE_MAKEFILE:BOOL
114 115 116
	MSVC_C_ARCHITECTURE_ID:STRING
	MSVC_CXX_ARCHITECTURE_ID:STRING
	MSVC_VERSION:STRING
117
)
118
if(CMAKE_CROSSCOMPILING)
Ghislain MARY's avatar
Ghislain MARY committed
119
	list(APPEND LINPHONE_BUILDER_EP_VARS
120 121 122 123
		CMAKE_SYSTEM_NAME:STRING
		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 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
# This macro can be used to add an option. Give it option name and description,
# default value and optionally dependent predicate and value
macro(linphone_builder_add_dependent_option NAME DESCRIPTION DEFAULT_VALUE CONDITION CONDITION_VALUE)
	string(TOUPPER ${NAME} UPPERCASE_NAME)
	string(REGEX REPLACE  " " "_" UPPERCASE_NAME ${UPPERCASE_NAME})
	string(REGEX REPLACE  "\\+" "P" UPPERCASE_NAME ${UPPERCASE_NAME})
	cmake_dependent_option(ENABLE_${UPPERCASE_NAME} "${DESCRIPTION}" "${DEFAULT_VALUE}" "${CONDITION}" "${CONDITION_VALUE}")
	add_feature_info("${NAME}" "ENABLE_${UPPERCASE_NAME}" "${DESCRIPTION}")
endmacro()

macro(linphone_builder_add_strict_dependent_option NAME DESCRIPTION DEFAULT_VALUE CONDITION CONDITION_VALUE STRICT_CONDITION ERROR_MSG)
	linphone_builder_add_dependent_option("${NAME}" "${DESCRIPTION}" "${DEFAULT_VALUE}" "${CONDITION}" "${CONDITION_VALUE}")
	string(TOUPPER ${NAME} UPPERCASE_NAME)
	string(REGEX REPLACE  " " "_" UPPERCASE_NAME ${UPPERCASE_NAME})
	string(REGEX REPLACE  "\\+" "P" UPPERCASE_NAME ${UPPERCASE_NAME})
	if(${ENABLE_${UPPERCASE_NAME}} AND NOT ${STRICT_CONDITION})
		message(FATAL_ERROR "Trying to enable ${NAME} but ${ERROR_MSG}")
	endif()
endmacro()

macro(linphone_builder_add_option NAME DESCRIPTION DEFAULT_VALUE)
	string(TOUPPER ${NAME} UPPERCASE_NAME)
	string(REGEX REPLACE  " " "_" UPPERCASE_NAME ${UPPERCASE_NAME})
	string(REGEX REPLACE  "\\+" "P" UPPERCASE_NAME ${UPPERCASE_NAME})
	option(ENABLE_${UPPERCASE_NAME} "Enable ${NAME}: ${DESCRIPTION}" "${DEFAULT_VALUE}")
	add_feature_info("${NAME}" "ENABLE_${UPPERCASE_NAME}" "${DESCRIPTION}")
endmacro()

171
macro(linphone_builder_get_autotools_configuration)
172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
	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)
205
endmacro()
206 207


208 209
macro(linphone_builder_create_targets_list)
	set(LINPHONE_BUILDER_TARGETS )
Ghislain MARY's avatar
Ghislain MARY committed
210
	if(LINPHONE_BUILDER_TARGET STREQUAL "belle-sip")
211
		list(APPEND LINPHONE_BUILDER_TARGETS "bctoolbox" "belle-sip")
Ghislain MARY's avatar
Ghislain MARY committed
212
	elseif(LINPHONE_BUILDER_TARGET STREQUAL "ortp")
213
		list(APPEND LINPHONE_BUILDER_TARGETS "bctoolbox" "ortp")
Ghislain MARY's avatar
Ghislain MARY committed
214
	elseif(LINPHONE_BUILDER_TARGET STREQUAL "ms2")
215
		list(APPEND LINPHONE_BUILDER_TARGETS "bctoolbox" "ortp" "ms2")
Ghislain MARY's avatar
Ghislain MARY committed
216
	elseif(LINPHONE_BUILDER_TARGET STREQUAL "ms2-plugins")
217
		list(APPEND LINPHONE_BUILDER_TARGETS "bctoolbox" "ortp" "ms2" "ms2-plugins")
Ghislain MARY's avatar
Ghislain MARY committed
218
	elseif(LINPHONE_BUILDER_TARGET STREQUAL "linphone")
219
		list(APPEND LINPHONE_BUILDER_TARGETS "bctoolbox" "belle-sip" "ortp" "ms2" "ms2-plugins" "linphone")
Ghislain MARY's avatar
Ghislain MARY committed
220
	elseif(LINPHONE_BUILDER_TARGET STREQUAL "flexisip")
jehan's avatar
jehan committed
221
		list(APPEND LINPHONE_BUILDER_TARGETS "bctoolbox" "ortp" "flexisip")
222
		if(ENABLE_TRANSCODER)
jehan's avatar
jehan committed
223
			list(APPEND LINPHONE_BUILDER_TARGETS "ms2")
224
		endif()
225
		if(ENABLE_PRESENCE)
jehan's avatar
jehan committed
226
			list(APPEND LINPHONE_BUILDER_TARGETS "belle-sip")
227
		endif()
Ghislain MARY's avatar
Ghislain MARY committed
228
	elseif(LINPHONE_BUILDER_TARGET STREQUAL "odb")
229
		list(APPEND LINPHONE_BUILDER_TARGETS "odb" )
jehan's avatar
jehan committed
230 231 232 233
	elseif(LINPHONE_BUILDER_TARGET STREQUAL "bctoolbox")
		list(APPEND LINPHONE_BUILDER_TARGETS "bctoolbox" )
	else()
		message(FATAL_ERROR "Invalid LINPHONE_BUILDER_TARGET '${LINPHONE_BUILDER_TARGET}'")
234
	endif()
Ghislain MARY's avatar
Ghislain MARY committed
235
endmacro()
236 237 238 239 240 241


macro(linphone_builder_include_builder BUILDER)
	list(FIND LINPHONE_BUILDER_INCLUDED_BUILDERS ${BUILDER} _already_included)
	if(_already_included EQUAL -1)
		message(STATUS "Including builder ${BUILDER}")
242
		set(LINPHONE_BUILDER_CURRENT_BUILDER "${BUILDER}")
243 244 245 246 247 248 249
		if(LINPHONE_BUILDER_INCLUDING_BUILDERS_FROM_EXTERNAL_BUILDERS_PATH)
			include(${LINPHONE_BUILDER_EXTERNAL_BUILDERS_PATH}/${BUILDER}.cmake)
			list(INSERT LINPHONE_BUILDER_INCLUDED_BUILDERS 0 ${BUILDER})
		else()
			include(${CMAKE_CURRENT_SOURCE_DIR}/builders/${BUILDER}.cmake)
			list(APPEND LINPHONE_BUILDER_INCLUDED_BUILDERS ${BUILDER})
		endif()
250 251
	endif()
	unset(_already_included)
Ghislain MARY's avatar
Ghislain MARY committed
252
endmacro()
253 254 255 256


macro(linphone_builder_add_builder_to_target TARGETNAME BUILDER)
	linphone_builder_include_builder(${BUILDER})
257 258 259 260 261 262 263 264
	if(LINPHONE_BUILDER_USE_SYSTEM_DEPENDENCIES AND EP_${BUILDER}_MAY_BE_FOUND_ON_SYSTEM)
		list(FIND LINPHONE_BUILDER_SYSTEM_DEPENDENCIES_BUILDERS ${BUILDER} _already_included)
		if(_already_included EQUAL -1)
			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)
265
		foreach(SUBDIR ${EP_${BUILDER}_EXTERNAL_SOURCE_PATHS})
266 267 268 269 270
			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()
271
			if(EXISTS "${_source_dir}")
272
				#message("    ${TARGETNAME} depends on external source path ${_source_dir}")
273
				set(_build_from_external_source_path 1)
274
				break()
275 276 277 278 279
			endif()
		endforeach()
		if(_build_from_external_source_path)
			list(FIND LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH_BUILDERS ${BUILDER} _already_included)
			if(_already_included EQUAL -1)
280
				# message("    external source path builder ${BUILDER}: ${_source_dir}")
281 282
				set(EP_${BUILDER}_SOURCE_DIR "${_source_dir}")
				list(APPEND LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH_BUILDERS ${BUILDER})
283 284
			endif()
			unset(_already_included)
285
		else()
Ghislain MARY's avatar
Ghislain MARY committed
286
			#message("     ${TARGETNAME} depends on external project EP_${BUILDER}")
287
			add_dependencies(${TARGETNAME} EP_${BUILDER})
288 289 290
		endif()
		unset(_build_from_external_source_path)
	else()
Ghislain MARY's avatar
Ghislain MARY committed
291
		#message("    ${TARGETNAME} depends on external project EP_${BUILDER}")
292 293
		add_dependencies(${TARGETNAME} EP_${BUILDER})
	endif()
Ghislain MARY's avatar
Ghislain MARY committed
294
endmacro()
295 296


297
macro(linphone_builder_apply_flags)
Ghislain MARY's avatar
Ghislain MARY committed
298 299 300 301 302 303 304 305 306 307
	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)
308 309
		set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LINPHONE_BUILDER_CPPFLAGS}")
		set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LINPHONE_BUILDER_CPPFLAGS}")
Ghislain MARY's avatar
Ghislain MARY committed
310 311 312 313
		set(AUTOTOOLS_C_FLAGS "${AUTOTOOLS_C_FLAGS} ${LINPHONE_BUILDER_CPPFLAGS}")
		set(AUTOTOOLS_CXX_FLAGS "${AUTOTOOLS_CXX_FLAGS} ${LINPHONE_BUILDER_CPPFLAGS}")
	endif()
	if(LINPHONE_BUILDER_CFLAGS)
314
		set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LINPHONE_BUILDER_CFLAGS}")
Ghislain MARY's avatar
Ghislain MARY committed
315 316 317
		set(AUTOTOOLS_C_FLAGS "${AUTOTOOLS_C_FLAGS} ${LINPHONE_BUILDER_CFLAGS}")
	endif()
	if(LINPHONE_BUILDER_CXXFLAGS)
318
		set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LINPHONE_BUILDER_CXXFLAGS}")
Ghislain MARY's avatar
Ghislain MARY committed
319 320 321
		set(AUTOTOOLS_CXX_FLAGS "{AUTOTOOLS_CXX_FLAGS} ${LINPHONE_BUILDER_CXX_FLAGS}")
	endif()
	if(LINPHONE_BUILDER_OBJCFLAGS)
322
		set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LINPHONE_BUILDER_OBJCFLAGS}")
Ghislain MARY's avatar
Ghislain MARY committed
323 324 325
		set(AUTOTOOLS_OBJC_FLAGS "${AUTOTOOLS_OBJC_FLAGS} ${LINPHONE_BUILDER_OBJCFLAGS}")
	endif()
	if(LINPHONE_BUILDER_LDFLAGS)
326 327 328
		set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LINPHONE_BUILDER_LDFLAGS}")
		set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${LINPHONE_BUILDER_LDFLAGS}")
		set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${LINPHONE_BUILDER_LDFLAGS}")
Ghislain MARY's avatar
Ghislain MARY committed
329 330
		set(AUTOTOOLS_LINKER_FLAGS "${AUTOTOOLS_LINKER_FLAGS} ${LINPHONE_BUILDER_LDFLAGS}")
	endif()
Ghislain MARY's avatar
Ghislain MARY committed
331
endmacro()
332 333


334
macro(linphone_builder_apply_cmake_flags_to_autotools_project PROJNAME)
Ghislain MARY's avatar
Ghislain MARY committed
335
	if(EP_${PROJNAME}_BUILD_METHOD STREQUAL "autotools")
Ghislain MARY's avatar
Ghislain MARY committed
336 337 338 339 340 341
		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}")
342
	endif()
Ghislain MARY's avatar
Ghislain MARY committed
343
endmacro()
344 345


346
macro(linphone_builder_apply_extra_flags PROJNAME)
347 348 349 350 351 352
	if(MSVC)
		set(_no_warnings_flag "/W0")
	else()
		set(_no_warnings_flag "-w")
	endif()

Ghislain MARY's avatar
Ghislain MARY committed
353
	if(EP_${PROJNAME}_BUILD_METHOD STREQUAL "autotools")
354 355 356 357 358 359
		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}")
360 361 362
		if(EP_${PROJNAME}_IGNORE_WARNINGS)
			set(ep_cppflags "${ep_cppflags} ${_no_warnings_flag}")
		endif()
363
	else()
364 365 366 367 368
		set(SAVED_CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
		set(SAVED_CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
		set(SAVED_CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
		set(SAVED_CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}")
		set(SAVED_CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
369
		if(EP_${PROJNAME}_EXTRA_CFLAGS)
370
			set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EP_${PROJNAME}_EXTRA_CFLAGS}")
371 372
		endif()
		if(EP_${PROJNAME}_EXTRA_CXXFLAGS)
373
			set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EP_${PROJNAME}_EXTRA_CXXFLAGS}")
374 375
		endif()
		if(EP_${PROJNAME}_EXTRA_LDFLAGS)
376 377 378
			set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${EP_${PROJNAME}_EXTRA_LDFLAGS}")
			set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${EP_${PROJNAME}_EXTRA_LDFLAGS}")
			set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${EP_${PROJNAME}_EXTRA_LDFLAGS}")
379
		endif()
380 381 382 383
		if(EP_${PROJNAME}_IGNORE_WARNINGS)
			set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_no_warnings_flag}")
			set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_no_warnings_flag}")
		endif()
384
	endif()
Ghislain MARY's avatar
Ghislain MARY committed
385
endmacro()
386 387


388 389 390 391 392 393 394 395 396
macro(linphone_builder_restore_flags)
	set(CMAKE_C_FLAGS "${SAVED_CMAKE_C_FLAGS}")
	set(CMAKE_CXX_FLAGS "${SAVED_CMAKE_CXX_FLAGS}")
	set(CMAKE_EXE_LINKER_FLAGS "${SAVED_CMAKE_EXE_LINKER_FLAGS}")
	set(CMAKE_MODULE_LINKER_FLAGS "${SAVED_CMAKE_MODULE_LINKER_FLAGS}")
	set(CMAKE_SHARED_LINKER_FLAGS "${SAVED_CMAKE_SHARED_LINKER_FLAGS}")
endmacro()


397
macro(linphone_builder_set_ep_directories PROJNAME)
398 399 400 401 402
	if(EP_${PROJNAME}_SOURCE_DIR)
		set(ep_source "${EP_${PROJNAME}_SOURCE_DIR}")
	else()
		set(ep_source "${ep_base}/Source/EP_${PROJNAME}")
	endif()
403
	if(EP_${PROJNAME}_BUILD_IN_SOURCE_TREE)
404
		set(ep_build "${ep_source}")
Ghislain MARY's avatar
Ghislain MARY committed
405
	else()
406
		set(ep_build "${ep_base}/Build/${PROJNAME}")
407

408 409 410 411 412 413 414 415
		# 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()

416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442
		# 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")
443
			math(EXPR relative_build_length "${relative_build_length}-${idx}")
444 445 446 447 448 449 450
			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
451 452
	endif()
endmacro()
453

454

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


464
macro(linphone_builder_create_autogen_command PROJNAME)
465 466
	if(EP_${PROJNAME}_USE_AUTOGEN)
		if(EP_${PROJNAME}_CONFIGURE_OPTIONS_PASSED_TO_AUTOGEN)
467 468 469
			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
470
			endforeach()
471
		endif()
472
		set(ep_autogen_command "\"${ep_source}/autogen.sh\" ${ep_autogen_options}")
473 474
	elseif(EP_${PROJNAME}_USE_AUTORECONF)
		set(ep_autogen_command "autoreconf -vfi ${ep_source}")
475
	else()
476
		set(ep_autogen_command "")
477
	endif()
Ghislain MARY's avatar
Ghislain MARY committed
478
endmacro()
479 480 481


macro(linphone_builder_create_configure_command PROJNAME)
482
	if(EP_${PROJNAME}_CONFIGURE_OPTIONS_PASSED_TO_AUTOGEN)
483
		set(ep_configure_command "")
484
	else()
485 486 487
		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
488
		endforeach()
489
		set(ep_configure_env "${EP_${PROJNAME}_CONFIGURE_ENV}")
490
		set(ep_configure_command "\"${ep_source}/configure\" ${ep_configure_options}")
491
	endif()
Ghislain MARY's avatar
Ghislain MARY committed
492
endmacro()
493 494


495 496 497 498 499
macro(linphone_builder_create_build_command PROJNAME)
	set(ep_make_options "${EP_${PROJNAME}_MAKE_OPTIONS}")
endmacro()


500
# this macro invokes configure_file() for the project, using the default file if
501
# the specific file is not defined
502
macro(linphone_builder_configure_file_for_project PROJNAME CMD DEFAULT_CONF_FILE OUTPUT)
Ghislain MARY's avatar
Ghislain MARY committed
503
	if(NOT EP_${PROJNAME}_${CMD}_COMMAND_SOURCE)
504
		message(STATUS "Using default file ${DEFAULT_CONF_FILE} for ${CMD} step of ${PROJNAME}")
505 506
		configure_file(${DEFAULT_CONF_FILE} ${OUTPUT})
	else()
507
		message(STATUS "Using specific file ${EP_${PROJNAME}_${CMD}_COMMAND_SOURCE} for ${CMD} step of ${PROJNAME}")
508
		configure_file(${EP_${PROJNAME}_${CMD}_COMMAND_SOURCE} ${OUTPUT})
509
	endif()
510
endmacro()
511

512 513 514 515
macro(linphone_builder_filter_out_inexistent_dependencies PROJNAME)
	if(EP_${PROJNAME}_DEPENDENCIES)
		set(_new_deps )
		foreach(_dep ${EP_${PROJNAME}_DEPENDENCIES})
516 517
			string(REGEX REPLACE "^EP_" "" _dep2 ${_dep})
			list(FIND LINPHONE_BUILDER_INCLUDED_BUILDERS ${_dep2} _found)
518
			list(FIND LINPHONE_BUILDER_INCLUDED_BUILDERS_TO_EXCLUDE ${_dep2} _excluded_found)
519
			list(FIND LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH_BUILDERS ${_dep2} _external_source_path_found)
520
			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)))
521 522 523 524 525 526 527 528 529 530 531
				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()

532
macro(linphone_builder_add_external_project PROJNAME)
533 534 535
	if(LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH)
		foreach(SUBDIR ${EP_${PROJNAME}_EXTERNAL_SOURCE_PATHS})
			if(NOT EP_${PROJNAME}_SOURCE_DIR)
536 537 538 539 540 541 542
				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}")
543 544 545 546 547
				endif()
			endif()
		endforeach()
	endif()

548
	linphone_builder_set_ep_directories(${PROJNAME})
549
	linphone_builder_set_ep_generator()
Ghislain MARY's avatar
Ghislain MARY committed
550 551 552
	if(NOT EP_${PROJNAME}_DO_NOT_USE_CMAKE_FLAGS)
		linphone_builder_apply_cmake_flags_to_autotools_project(${PROJNAME})
	endif()
553 554 555 556 557
	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()
558
	linphone_builder_apply_extra_flags(${PROJNAME})
559 560
	linphone_builder_expand_external_project_vars()

Ghislain MARY's avatar
Ghislain MARY committed
561
	if(EP_${PROJNAME}_BUILD_METHOD STREQUAL "prebuilt")
562 563 564 565 566 567
		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
568
	elseif(EP_${PROJNAME}_BUILD_METHOD STREQUAL "custom")
569 570 571
		if(WIN32)
			set(ep_redirect_to_file "2>&1 >> \"${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}.log\"")
		endif()
572 573 574 575 576 577 578 579 580 581 582 583
		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()
584
		set(BUILD_COMMANDS
585 586 587
			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}
588
		)
589 590
	elseif(EP_${PROJNAME}_BUILD_METHOD STREQUAL "autotools")
		linphone_builder_create_autogen_command(${PROJNAME})
591
		linphone_builder_create_configure_command(${PROJNAME})
592
		linphone_builder_create_build_command(${PROJNAME})
Ghislain MARY's avatar
Ghislain MARY committed
593
		if(EP_${PROJNAME}_CONFIG_H_FILE)
594
			set(ep_config_h_file ${EP_${PROJNAME}_CONFIG_H_FILE})
Ghislain MARY's avatar
Ghislain MARY committed
595
		else()
Ghislain MARY's avatar
Ghislain MARY committed
596 597 598
			set(ep_config_h_file config.h)
		endif()
		if(EP_${PROJNAME}_INSTALL_TARGET)
599
			set(ep_install_target "${EP_${PROJNAME}_INSTALL_TARGET}")
Ghislain MARY's avatar
Ghislain MARY committed
600 601
		else()
			set(ep_install_target "install")
Ghislain MARY's avatar
Ghislain MARY committed
602
		endif()
603

604
		if(WIN32)
605
			set(ep_redirect_to_file "2>&1 >> \"${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}.log\"")
606 607 608 609 610
			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
611
			if(ep_autogen_command)
612 613
				set(ep_autogen_redirect_to_file ${ep_redirect_to_file})
			endif()
Ghislain MARY's avatar
Ghislain MARY committed
614
			if(ep_configure_command)
615 616
				set(ep_configure_redirect_to_file ${ep_redirect_to_file})
			endif()
617
		else()
618
			set(SCRIPT_EXTENSION sh)
619
		endif()
620

Ghislain MARY's avatar
Ghislain MARY committed
621
		if(EP_${PROJNAME}_PKG_CONFIG)
622
			set(LINPHONE_BUILDER_PKG_CONFIG "${EP_${PROJNAME}_PKG_CONFIG}")
Ghislain MARY's avatar
Ghislain MARY committed
623 624
		else()
			set(LINPHONE_BUILDER_PKG_CONFIG "${PKG_CONFIG_PROGRAM}")
Ghislain MARY's avatar
Ghislain MARY committed
625
		endif()
626

627 628 629
		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
630 631

		set(BUILD_COMMANDS
632 633 634
			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
635
		)
Ghislain MARY's avatar
Ghislain MARY committed
636
	elseif(EP_${PROJNAME}_BUILD_METHOD STREQUAL "rpm")
637

638
		if(WIN32)
639
			message(SEND_ERROR "rpm build not supported on WIN32")
640 641 642 643
		endif()

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

Ghislain MARY's avatar
Ghislain MARY committed
645
		if(EP_${PROJNAME}_CONFIG_H_FILE)
646
			set(ep_config_h_file ${EP_${PROJNAME}_CONFIG_H_FILE})
Ghislain MARY's avatar
Ghislain MARY committed
647 648
		else()
			set(ep_config_h_file config.h)
649
		endif()
650

Ghislain MARY's avatar
Ghislain MARY committed
651
		if(EP_${PROJNAME}_INSTALL_TARGET)
652
			set(ep_install_target "${EP_${PROJNAME}_INSTALL_TARGET}")
Ghislain MARY's avatar
Ghislain MARY committed
653 654
		else()
			set(ep_install_target "install")
655 656
		endif()

Ghislain MARY's avatar
Ghislain MARY committed
657
		if(EP_${PROJNAME}_SPEC_FILE)
658
			set(LINPHONE_BUILDER_SPEC_FILE "${EP_${PROJNAME}_SPEC_FILE}")
Ghislain MARY's avatar
Ghislain MARY committed
659 660
		else()
			message(SEND_ERROR "rpm build requires EP_${PROJNAME}_SPEC_FILE to be defined")
661 662 663 664
		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
665
		if(EP_${PROJNAME}_RPMBUILD_NAME)
666
			set(LINPHONE_BUILDER_RPMBUILD_NAME "${EP_${PROJNAME}_RPMBUILD_NAME}")
Ghislain MARY's avatar
Ghislain MARY committed
667 668
		else()
			set(LINPHONE_BUILDER_RPMBUILD_NAME "${PROJNAME}")
669
		endif()
670

671
		# some specific RPMBUILD options to pass for this particular project
Ghislain MARY's avatar
Ghislain MARY committed
672
		if(EP_${PROJNAME}_RPMBUILD_OPTIONS)
673
			set(LINPHONE_BUILDER_RPMBUILD_OPTIONS "${EP_${PROJNAME}_RPMBUILD_OPTIONS}")
674 675
		else()
			set(LINPHONE_BUILDER_RPMBUILD_OPTIONS "")
676 677 678 679
		endif()

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

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

Ghislain MARY's avatar
Ghislain MARY committed
686
		if(EP_${PROJNAME}_CONFIGURE_EXTRA_CMD)
687
			set(LINPHONE_BUILDER_CONFIGURE_EXTRA_CMD "${EP_${PROJNAME}_CONFIGURE_EXTRA_CMD}")
688 689
		else()
			set(LINPHONE_BUILDER_CONFIGURE_EXTRA_CMD "")
690 691
		endif()

692 693 694 695
		# allow to have special command steps
		linphone_builder_configure_file_for_project(${PROJNAME} CONFIGURE ${CMAKE_CURRENT_SOURCE_DIR}/cmake/configure.rpm.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_configure_rpm.sh)
		linphone_builder_configure_file_for_project(${PROJNAME} BUILD ${CMAKE_CURRENT_SOURCE_DIR}/cmake/build.rpm.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_build_rpm.sh)
		linphone_builder_configure_file_for_project(${PROJNAME} INSTALL ${CMAKE_CURRENT_SOURCE_DIR}/cmake/install.rpm.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/EP_${PROJNAME}_install_rpm.sh)
696 697 698 699 700 701

		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
		)
702 703
	else()
		# Use CMake build method
704 705 706 707 708 709 710
		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()
711 712 713 714
		set(BUILD_COMMANDS
			CMAKE_ARGS ${EP_${PROJNAME}_CMAKE_OPTIONS} ${EP_${PROJNAME}_LINKING_TYPE}
			CMAKE_CACHE_ARGS ${LINPHONE_BUILDER_EP_ARGS}
		)
715
	endif()
716

717
	if(LINPHONE_BUILDER_LATEST AND EP_${PROJNAME}_GIT_TAG_LATEST)
718
		set(DOWNLOAD_SOURCE GIT_REPOSITORY ${EP_${PROJNAME}_GIT_REPOSITORY} GIT_TAG ${EP_${PROJNAME}_GIT_TAG_LATEST})
719
	elseif(EP_${PROJNAME}_SOURCE_DIR)
720
		set(DOWNLOAD_SOURCE SOURCE_DIR "${EP_${PROJNAME}_SOURCE_DIR}")
721 722 723 724 725
	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()
726 727 728
	elseif(EP_${PROJNAME}_SVN_REPOSITORY)
		set(DOWNLOAD_SOURCE SVN_REPOSITORY ${EP_${PROJNAME}_SVN_REPOSITORY})
	else()
729
		set(DOWNLOAD_SOURCE GIT_REPOSITORY ${EP_${PROJNAME}_GIT_REPOSITORY} GIT_TAG ${EP_${PROJNAME}_GIT_TAG})
730
	endif()
731

732 733
	linphone_builder_filter_out_inexistent_dependencies(${PROJNAME})

734 735
	ExternalProject_Add(EP_${PROJNAME}
		DEPENDS ${EP_${PROJNAME}_DEPENDENCIES}
736
		BINARY_DIR "${ep_build}"
737
		${DOWNLOAD_SOURCE}
738
		PATCH_COMMAND ${EP_${PROJNAME}_PATCH_COMMAND}
739
		CMAKE_GENERATOR ${ep_generator}
Ghislain MARY's avatar
Ghislain MARY committed
740
		${BUILD_COMMANDS}
741
	)
742

743 744
	if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/builders/${PROJNAME}/postinstall.cmake)
		ExternalProject_Add_Step(EP_${PROJNAME} postinstall
745
			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
746 747
			COMMENT "Performing post-installation for 'EP_${PROJNAME}'"
			DEPENDEES install
748 749
			WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
		)
750
	endif()
751
	if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/builders/${PROJNAME}/postconfig.cmake)
752
		ExternalProject_Add_Step(EP_${PROJNAME} postconfig
753
			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
754 755 756 757 758 759 760 761 762 763 764 765
			COMMENT "Performing post-configuration for 'EP_${PROJNAME}'"
			DEPENDEES install
			WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
		)
	endif()

	if(EP_${PROJNAME}_GROUPED_SOURCE_DIRS OR EP_${PROJNAME}_SOURCE_DIR)
		if(EP_${PROJNAME}_GROUPED_SOURCE_DIRS)
			set(_source_dirs ${EP_${PROJNAME}_GROUPED_SOURCE_DIRS})
		else()
			set(_source_dirs ${EP_${PROJNAME}_SOURCE_DIR})
		endif()
766 767 768 769
		ExternalProject_Add_Step(EP_${PROJNAME} force_build
			COMMENT "Forcing build for 'EP_${PROJNAME}'"
			DEPENDEES configure
			DEPENDERS build
770 771 772
			ALWAYS 1
		)
		unset(_source_dirs)
773 774
	endif()

775 776
	linphone_builder_restore_flags()

777
endmacro()
Ghislain MARY's avatar
Ghislain MARY committed
778

779
macro(linphone_builder_add_grouped_external_source_path_project PROJNAME FILENAME)
780
	linphone_builder_filter_out_inexistent_dependencies(${PROJNAME})
781
	file(APPEND "${FILENAME}" "add_subdirectory(\"${EP_${PROJNAME}_SOURCE_DIR}\" \"${LINPHONE_BUILDER_WORK_DIR}/Build/${PROJNAME}\")\n")
782
	list(APPEND EP_linphone_builder_LINKING_TYPE "${EP_${PROJNAME}_LINKING_TYPE}")
783
	list(APPEND EP_linphone_builder_CMAKE_OPTIONS "${EP_${PROJNAME}_CMAKE_OPTIONS}")
784 785 786
	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}")
787
	list(APPEND EP_linphone_builder_EXTRA_LDFLAGS "${EP_${PROJNAME}_EXTRA_LDFLAGS}")
788
	list(APPEND EP_linphone_builder_EXTRA_OBJCFLAGS "${EP_${PROJNAME}_EXTRA_OBJCFLAGS}")
789 790
	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}")
791
	if(EP_${PROJNAME}_DEPENDENCIES)
792
		list(APPEND EP_linphone_builder_DEPENDENCIES ${EP_${PROJNAME}_DEPENDENCIES})
793
	endif()
794
endmacro()
795

796
macro(linphone_builder_add_external_projects)
797
	foreach(BUILDER ${LINPHONE_BUILDER_INCLUDED_BUILDERS})
798 799
		list(FIND LINPHONE_BUILDER_INCLUDED_BUILDERS_TO_EXCLUDE ${BUILDER} _excluded_found)
		list(FIND LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH_BUILDERS ${BUILDER} _external_source_path_found)
800
		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)))
801 802 803
			linphone_builder_add_external_project(${BUILDER})
		endif()
	endforeach()
804
endmacro()
805

806 807 808
macro(detect_variable_conflict VARIABLE_NAME ERROR_MESSAGE)
	if(EP_linphone_builder_${VARIABLE_NAME})
		list(REMOVE_DUPLICATES EP_linphone_builder_${VARIABLE_NAME})
809
		set(_new_options )
810
		foreach(_option ${EP_linphone_builder_${VARIABLE_NAME}})
811 812 813
			string(REGEX MATCH "^-D(.+)=(.*)$" _match "${_option}")
			if(_match)
				set(_new_option "-D${CMAKE_MATCH_1}=")
814
				set(_varname ${CMAKE_MATCH_1})
815
				set(_value ${CMAKE_MATCH_2})
816
				if(_varname MATCHES "^ENABLE_.*$")
817 818
					if(_value)
						set(_conflicting_option "${_new_option}OFF")
819
						set(_new_option "${_new_option}ON")
820 821
					else()
						set(_conflicting_option "${_new_option}ON")
822
						set(_new_option "${_new_option}OFF")
823
					endif()
824
				else()
825
					set(_new_option "${_new_option}${_value}")
826 827 828 829 830 831 832
				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)
833
					message(FATAL_ERROR ${ERROR_MESSAGE})
834
				endif()
835
			endif()
836 837
		endforeach()
		if(_new_options)
838
			set(EP_linphone_builder_${VARIABLE_NAME} ${_new_options})
839 840 841 842
		endif()
	endif()
endmacro()

843 844 845 846 847 848 849 850 851
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)
852 853 854 855 856 857 858 859 860
	set(_grouped_builders)
	if(LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH_BUILDERS)
		foreach (_builder ${LINPHONE_BUILDER_EXTERNAL_SOURCE_PATH_BUILDERS})
			if(EP_${_builder}_GROUPABLE)
				list(APPEND _grouped_builders ${_builder})
			endif()
		endforeach()
	endif()
	if(LINPHONE_BUILDER_GROUP_EXTERNAL_SOURCE_PATH_BUILDERS AND _grouped_builders)
861 862 863 864
		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")
865
		file(APPEND "${_linphone_builder_file}" "option(LINPHONE_BUILDER_GROUP_EXTERNAL_SOURCE_PATH_BUILDERS \"Group external source path builders.\" ON)\n")
866
		set(EP_linphone_builder_CMAKE_OPTIONS )
867
		set(EP_linphone_builder_LINKING_TYPE )
868 869 870
		set(EP_linphone_builder_EXTRA_CFLAGS )
		set(EP_linphone_builder_EXTRA_CPPFLAGS )
		set(EP_linphone_builder_EXTRA_CXXFLAGS )
871
		set(EP_linphone_builder_EXTRA_LDFLAGS )
872
		set(EP_linphone_builder_EXTRA_OBJCFLAGS )
873
		set(EP_linphone_builder_DEPENDENCIES )
874
		set(EP_linphone_builder_GROUPED_SOURCE_DIRS )
875
		foreach(BUILDER ${_grouped_builders})
876
			list(APPEND EP_linphone_builder_GROUPED_SOURCE_DIRS ${EP_${BUILDER}_SOURCE_DIR})
877
			linphone_builder_add_grouped_external_source_path_project(${BUILDER} "${_linphone_builder_file}")
878
		endforeach()
879
		detect_conflicting_linking_types()
880
		detect_conflicting_cmake_options()
881 882 883 884 885 886 887 888 889
		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()
890 891 892
		if(EP_linphone_builder_EXTRA_LDFLAGS)
			list(REMOVE_DUPLICATES EP_linphone_builder_EXTRA_LDFLAGS)
		endif()
893 894 895
		if(EP_linphone_builder_EXTRA_OBJCFLAGS)
			list(REMOVE_DUPLICATES EP_linphone_builder_EXTRA_OBJCFLAGS)
		endif()
896 897 898
		if(EP_linphone_builder_DEPENDENCIES)
			list(REMOVE_DUPLICATES EP_linphone_builder_DEPENDENCIES)
		endif()
899 900 901 902 903
		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)
904
		unset(_grouped_builders)
905
	endif()
906
endmacro()
907

908
macro(linphone_builder_add_projects)
909
	linphone_builder_add_external_projects()
910
	linphone_builder_add_grouped_external_source_path_projects()
911
endmacro()
912 913 914 915

macro(linphone_builder_add_dummy_libraries_generation)
	if(LINPHONE_BUILDER_DUMMY_LIBRARIES)
		linphone_builder_set_ep_directories(dummy_libraries)
916
		linphone_builder_set_ep_generator()
917
		linphone_builder_expand_external_project_vars()
918
		ExternalProject_Add(EP_dummy_libraries
919
			DEPENDS TARGET_linphone_builder
920 921
			TMP_DIR "${ep_tmp}"
			BINARY_DIR "${ep_build}"
922
			SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/cmake/dummy_libraries"
923
			DOWNLOAD_COMMAND ""
924
			CMAKE_GENERATOR ${ep_generator}
925 926 927 928
			CMAKE_ARGS ${LINPHONE_BUILDER_EP_ARGS} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DLINPHONE_BUILDER_DUMMY_LIBRARIES=${LINPHONE_BUILDER_DUMMY_LIBRARIES}
		)
	endif()
endmacro()
929

930 931 932 933 934 935 936 937 938 939 940 941 942 943 944
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()
945
endmacro()
946

947 948
macro(lcb_cmake_options)
	lcb_builder_cmake_options("${LINPHONE_BUILDER_CURRENT_BUILDER}" ${ARGN})
949 950
endmacro()

951 952 953 954 955
macro(lcb_builder_configure_options BUILDER)
	set(_args "${ARGN}")
	foreach(_option IN LISTS _args)
		list(APPEND EP_${BUILDER}_CONFIGURE_OPTIONS ${_option})
	endforeach()
956
endmacro()
957

958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 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 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253
macro(lcb_configure_options)
	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)
	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)
	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)
	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)
	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)
	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)
	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)
	lcb_builder_extra_asflags("${LINPHONE_BUILDER_CURRENT_BUILDER}" "${ASFLAGS}")
endmacro()

macro(lcb_builder_dependencies BUILDER)
	set(_args "${ARGN}")
	foreach(_dependency IN LISTS _args)
		list(APPEND EP_${BUILDER}_DEPENDENCIES "EP_${_dependency}")
	endforeach()
endmacro()

macro(lcb_dependencies)
	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)
	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)
	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)
	lcb_builder_git_tag("${LINPHONE_BUILDER_CURRENT_BUILDER}" "${GIT_TAG}")
endmacro()

macro(lcb_builder_external_source_paths BUILDER)
	set(EP_${BUILDER}_EXTERNAL_SOURCE_PATHS ${ARGN})
endmacro()

macro(lcb_external_source_paths)
	lcb_builder_external_source_paths("${LINPHONE_BUILDER_CURRENT_BUILDER}" ${ARGN})
endmacro()

macro(lcb_builder_groupable BUILDER BOOL_VALUE)
	set(EP_${BUILDER}_GROUPABLE ${BOOL_VALUE})
endmacro()

macro(lcb_groupable BOOL_VALUE)
	lcb_builder_groupable("${LINPHONE_BUILDER_CURRENT_BUILDER}" ${BOOL_VALUE})
endmacro()

macro(lcb_builder_spec_file BUILDER SPEC_FILE)
	set(EP_${BUILDER}_SPEC_FILE "${SPEC_FILE}")
endmacro()

macro(lcb_spec_file SPEC_FILE)
	lcb_builder_spec_file("${LINPHONE_BUILDER_CURRENT_BUILDER}" "${SPEC_FILE}")
endmacro()

macro(lcb_builder_use_autogen BUILDER BOOL_VALUE)
	set(EP_${BUILDER}_USE_AUTOGEN ${BOOL_VALUE})
endmacro()

macro(lcb_use_autogen BOOL_VALUE)
	lcb_builder_use_autogen(${BOOL_VALUE})
endmacro()

macro(lcb_builder_use_autoreconf BUILDER BOOL_VALUE)
	set(EP_${BUILDER}_USE_AUTORECONF ${BOOL_VALUE})
endmacro()

macro(lcb_use_autoreconf BOOL_VALUE)
	lcb_builder_use_autoreconf("${LINPHONE_BUILDER_CURRENT_BUILDER}" ${BOOL_VALUE})
endmacro()

macro(lcb_builder_linking_type BUILDER)
	unset(EP_${BUILDER}_LINKING_TYPE) # Clear previously set linking type
	set(_args "${ARGN}")
	foreach(_type IN LISTS _args)
		list(APPEND EP_${BUILDER}_LINKING_TYPE ${_type})
	endforeach()
endmacro()

macro(lcb_linking_type)
	lcb_builder_linking_type("${LINPHONE_BUILDER_CURRENT_BUILDER}" ${ARGN})
endmacro()

macro(lcb_builder_ignore_warnings BUILDER BOOL_VALUE)
	set(EP_${BUILDER}_IGNORE_WARNINGS ${BOOL_VALUE})
endmacro()

macro(lcb_ignore_warnings BOOL_VALUE)
	lcb_builder_ignore_warnings("${LINPHONE_BUILDER_CURRENT_BUILDER}" ${BOOL_VALUE})
endmacro()

macro(lcb_builder_may_be_found_on_system BUILDER BOOL_VALUE)
	set(EP_${BUILDER}_MAY_BE_FOUND_ON_SYSTEM ${BOOL_VALUE})
endmacro()

macro(lcb_may_be_found_on_system BOOL_VALUE)
	lcb_builder_may_be_found_on_system("${LINPHONE_BUILDER_CURRENT_BUILDER}" ${BOOL_VALUE})
endmacro()

macro(lcb_builder_rpmbuild_name BUILDER RPMBUILD_NAME)
	set(EP_${BUILDER}_RPMBUILD_NAME "${RPMBUILD_NAME}")
endmacro()

macro(lcb_rpmbuild_name RPMBUILD_NAME)
	lcb_builder_rpmbuild_name("${LINPHONE_BUILDER_CURRENT_BUILDER}" "${RPMBUILD_NAME}")
endmacro()

macro(lcb_plugin BOOL_VALUE)
	set(EP_${BUILDER}_PLUGIN ${BOOL_VALUE})
endmacro()

macro(lcb_builder_build_method BUILDER BUILD_METHOD)
	set(EP_${BUILDER}_BUILD_METHOD "${BUILD_METHOD}")
endmacro()

macro(lcb_build_method BUILD_METHOD)
	lcb_builder_build_method("${LINPHONE_BUILDER_CURRENT_BUILDER}" "${BUILD_METHOD}")
endmacro()

macro(lcb_builder_url BUILDER URL)
	set(EP_${BUILDER}_URL "${URL}")
endmacro()

macro(lcb_url URL)
	lcb_builder_url("${LINPHONE_BUILDER_CURRENT_BUILDER}" "${URL}")
endmacro()

macro(lcb_builder_url_hash BUILDER URL_HASH)
	set(EP_${BUILDER}_URL_HASH "${URL_HASH}")
endmacro()

macro(lcb_url_hash URL_HASH)
	lcb_builder_url_hash("${LINPHONE_BUILDER_CURRENT_BUILDER}" "${URL_HASH}")
endmacro()

macro(lcb_builder_patch_command BUILDER)
	unset(EP_${BUILDER}_PATCH_COMMAND) # Clear previously set command
	set(_args "${ARGN}")
	foreach(_arg IN LISTS _args)
		list(APPEND EP_${BUILDER}_PATCH_COMMAND "${_arg}")
	endforeach()
endmacro()

macro(lcb_patch_command)
	lcb_builder_patch_command("${LINPHONE_BUILDER_CURRENT_BUILDER}" ${ARGN})
endmacro()

macro(lcb_builder_configure_command_source BUILDER COMMAND_SOURCE)
	set(EP_${BUILDER}_CONFIGURE_COMMAND_SOURCE "${COMMAND_SOURCE}")
endmacro()

macro(lcb_configure_command_source COMMAND_SOURCE)
	lcb_builder_configure_command_source("${LINPHONE_BUILDER_CURRENT_BUILDER}" "${COMMAND_SOURCE}")
endmacro()

macro(lcb_builder_build_command_source BUILDER COMMAND_SOURCE)
	set(EP_${BUILDER}_BUILD_COMMAND_SOURCE "${COMMAND_SOURCE}")
endmacro()

macro(lcb_build_command_source COMMAND_SOURCE)
	lcb_builder_build_command_source("${LINPHONE_BUILDER_CURRENT_BUILDER}" "${COMMAND_SOURCE}")
endmacro()

macro(lcb_builder_install_command_source BUILDER COMMAND_SOURCE)
	set(EP_${BUILDER}_INSTALL_COMMAND_SOURCE "${COMMAND_SOURCE}")
endmacro()

macro(lcb_install_command_source COMMAND_SOURCE)
	lcb_builder_install_command_source("${LINPHONE_BUILDER_CURRENT_BUILDER}" "${COMMAND_SOURCE}")
endmacro()

macro(lcb_builder_additional_options BUILDER ADDITIONAL_OPTIONS)
	set(EP_${BUILDER}_ADDITIONAL_OPTIONS "${ADDITIONAL_OPTIONS}")
endmacro()

macro(lcb_additional_options ADDITIONAL_OPTIONS)
	lcb_builder_additional_options("${LINPHONE_BUILDER_CURRENT_BUILDER}" "${ADDITIONAL_OPTIONS}")
endmacro()

macro(lcb_builder_build_in_source_tree BUILDER BOOL_VALUE)
	set(EP_${BUILDER}_BUILD_IN_SOURCE_TREE ${BOOL_VALUE})
endmacro()

macro(lcb_build_in_source_tree BOOL_VALUE)
	lcb_builder_build_in_source_tree("${LINPHONE_BUILDER_CURRENT_BUILDER}" ${BOOL_VALUE})
endmacro()

macro(lcb_builder_configure_env BUILDER CONFIGURE_ENV)
	set(EP_${BUILDER}_CONFIGURE_ENV "${CONFIGURE_ENV}")
endmacro()

macro(lcb_configure_env CONFIGURE_ENV)
	lcb_builder_configure_env("${LINPHONE_BUILDER_CURRENT_BUILDER}" "${CONFIGURE_ENV}")
endmacro()

macro(lcb_builder_config_h_file BUILDER CONFIG_H_FILE)
	set(EP_${BUILDER}_CONFIG_H_FILE "${CONFIG_H_FILE}")
endmacro()

macro(lcb_config_h_file CONFIG_H_FILE)
	lcb_builder_config_h_file("${LINPHONE_BUILDER_CURRENT_BUILDER}" "${CONFIG_H_FILE}")
endmacro()

macro(lcb_builder_do_not_use_cmake_flags BUILDER BOOL_VALUE)
	set(EP_${BUILDER}_DO_NOT_USE_CMAKE_FLAGS ${BOOL_VALUE})
endmacro()

macro(lcb_do_not_use_cmake_flags BOOL_VALUE)
	lcb_builder_do_not_use_cmake_flags("${LINPHONE_BUILDER_CURRENT_BUILDER}" ${BOOL_VALUE})
endmacro()

macro(lcb_builder_install_target BUILDER INSTALL_TARGET)
	set(EP_${BUILDER}_INSTALL_TARGET "${INSTALL_TARGET}")
endmacro()

macro(lcb_install_target INSTALL_TARGET)
	lcb_builder_install_target("${LINPHONE_BUILDER_CURRENT_BUILDER}" "${INSTALL_TARGET}")
endmacro()

macro(lcb_builder_use_c_compiler_for_assembler BUILDER BOOL_VALUE)
	set(EP_${BUILDER}_USE_C_COMPILER_FOR_ASSEMBLER ${BOOL_VALUE})
endmacro()

macro(lcb_use_c_compiler_for_assembler BOOL_VALUE)
	lcb_builder_use_c_compiler_for_assembler("${LINPHONE_BUILDER_CURRENT_BUILDER}" ${BOOL_VALUE})
1254
endmacro()