Added -DDEFINE_NO_DEPRECATED CMake option
[platform/upstream/freerdp.git] / CMakeLists.txt
1 # FreeRDP: A Remote Desktop Protocol Implementation
2 # FreeRDP cmake build script
3 #
4 # Copyright 2011 O.S. Systems Software Ltda.
5 # Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
6 # Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
7 # Copyright 2012 HP Development Company, LLC
8 #
9 # Licensed under the Apache License, Version 2.0 (the "License");
10 # you may not use this file except in compliance with the License.
11 # You may obtain a copy of the License at
12 #
13 #     http://www.apache.org/licenses/LICENSE-2.0
14 #
15 # Unless required by applicable law or agreed to in writing, software
16 # distributed under the License is distributed on an "AS IS" BASIS,
17 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 # See the License for the specific language governing permissions and
19 # limitations under the License.
20
21 cmake_minimum_required(VERSION 2.8)
22
23 project(FreeRDP C CXX)
24
25 if(NOT DEFINED VENDOR)
26         set(VENDOR "FreeRDP" CACHE STRING "FreeRDP package vendor")
27 endif()
28
29 if(NOT DEFINED PRODUCT)
30         set(PRODUCT "FreeRDP" CACHE STRING "FreeRDP package name")
31 endif()
32
33 if(NOT DEFINED FREERDP_VENDOR)
34         set(FREERDP_VENDOR 1)
35 endif()
36
37 set(CMAKE_COLOR_MAKEFILE ON)
38
39 set(CMAKE_POSITION_INDEPENDENT_CODE ON)
40
41 # Include our extra modules
42 set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/)
43
44 if((CMAKE_SYSTEM_NAME MATCHES "WindowsStore") AND (CMAKE_SYSTEM_VERSION MATCHES "10.0"))
45         set(UWP 1)
46         add_definitions("-D_UWP")
47         set(CMAKE_WINDOWS_VERSION "WIN10")
48 endif()
49
50 # Check for cmake compatibility (enable/disable features)
51 include(CheckCmakeCompat)
52
53 # Include cmake modules
54 if(WITH_CLANG_FORMAT)
55         include(ClangFormat)
56 endif()
57
58 include(CheckIncludeFiles)
59 include(CheckLibraryExists)
60 include(CheckSymbolExists)
61 include(CheckStructHasMember)
62 include(FindPkgConfig)
63 include(TestBigEndian)
64
65 include(FindFeature)
66 include(ConfigOptions)
67 include(ComplexLibrary)
68 include(FeatureSummary)
69 include(CheckCCompilerFlag)
70 include(CheckCXXCompilerFlag)
71 include(GNUInstallDirsWrapper)
72 include(CMakePackageConfigHelpers)
73 include(InstallFreeRDPMan)
74 include(GetGitRevisionDescription)
75 include(SetFreeRDPCMakeInstallDir)
76
77 if (DEFINE_NO_DEPRECATED)
78     add_definitions(-DDEFINE_NO_DEPRECATED)
79 endif()
80
81 # Soname versioning
82 set(BUILD_NUMBER 0)
83 if ($ENV{BUILD_NUMBER})
84         set(BUILD_NUMBER $ENV{BUILD_NUMBER})
85 endif()
86 set(WITH_LIBRARY_VERSIONING "ON")
87
88 set(RAW_VERSION_STRING "2.3.1")
89 if(EXISTS "${CMAKE_SOURCE_DIR}/.source_tag")
90         file(READ ${CMAKE_SOURCE_DIR}/.source_tag RAW_VERSION_STRING)
91 elseif(USE_VERSION_FROM_GIT_TAG)
92         git_get_exact_tag(_GIT_TAG --tags --always)
93         if (NOT ${_GIT_TAG} STREQUAL "n/a")
94                 set(RAW_VERSION_STRING ${_GIT_TAG})
95         endif()
96 endif()
97 string(STRIP ${RAW_VERSION_STRING} RAW_VERSION_STRING)
98
99 set(VERSION_REGEX "^.?([0-9]+)\\.([0-9]+)\\.([0-9]+)-?(.*)")
100 string(REGEX REPLACE "${VERSION_REGEX}" "\\1" FREERDP_VERSION_MAJOR "${RAW_VERSION_STRING}")
101 string(REGEX REPLACE "${VERSION_REGEX}" "\\2" FREERDP_VERSION_MINOR "${RAW_VERSION_STRING}")
102 string(REGEX REPLACE "${VERSION_REGEX}" "\\3" FREERDP_VERSION_REVISION "${RAW_VERSION_STRING}")
103 string(REGEX REPLACE "${VERSION_REGEX}" "\\4" FREERDP_VERSION_SUFFIX "${RAW_VERSION_STRING}")
104
105 set(FREERDP_API_VERSION "${FREERDP_VERSION_MAJOR}")
106 set(FREERDP_VERSION "${FREERDP_VERSION_MAJOR}.${FREERDP_VERSION_MINOR}.${FREERDP_VERSION_REVISION}")
107 if (FREERDP_VERSION_SUFFIX)
108         set(FREERDP_VERSION_FULL "${FREERDP_VERSION}-${FREERDP_VERSION_SUFFIX}")
109 else()
110         set(FREERDP_VERSION_FULL "${FREERDP_VERSION}")
111 endif()
112 message("FREERDP_VERSION=${FREERDP_VERSION_FULL}")
113
114 set(FREERDP_INCLUDE_DIR "include/freerdp${FREERDP_VERSION_MAJOR}/")
115
116 # Compatibility options
117 if(DEFINED STATIC_CHANNELS)
118         message(WARNING "STATIC_CHANNELS is obsolete, please use BUILTIN_CHANNELS instead")
119         set(BUILTIN_CHANNELS ${STATIC_CHANNELS} CACHE BOOL "" FORCE)
120 endif()
121
122 # Make paths absolute
123 if (CMAKE_INSTALL_PREFIX)
124         get_filename_component(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" ABSOLUTE)
125 endif()
126 if (FREERDP_EXTERNAL_PATH)
127         get_filename_component (FREERDP_EXTERNAL_PATH "${FREERDP_EXTERNAL_PATH}" ABSOLUTE)
128 endif()
129
130 # Allow to search the host machine for git/ccache
131 if(CMAKE_CROSSCOMPILING)
132         SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
133 endif(CMAKE_CROSSCOMPILING)
134
135 find_program(CCACHE ccache)
136 if(CCACHE AND WITH_CCACHE)
137         if(CMAKE_VERSION VERSION_GREATER 3.3.2)
138                 if(NOT DEFINED CMAKE_C_COMPILER_LAUNCHER)
139                         SET(CMAKE_C_COMPILER_LAUNCHER ${CCACHE})
140                 endif(NOT DEFINED CMAKE_C_COMPILER_LAUNCHER)
141                 if(NOT DEFINED CMAKE_CXX_COMPILER_LAUNCHER)
142                         SET(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE})
143                 endif(NOT DEFINED CMAKE_CXX_COMPILER_LAUNCHER)
144         else()
145                 set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE})
146                 set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE})
147         endif()
148 endif(CCACHE AND WITH_CCACHE)
149
150 if(EXISTS "${CMAKE_SOURCE_DIR}/.source_version" )
151         file(READ ${CMAKE_SOURCE_DIR}/.source_version GIT_REVISION)
152
153   string(STRIP ${GIT_REVISION} GIT_REVISION)
154 else()
155         git_get_exact_tag(GIT_REVISION --tags --always)
156
157         if (${GIT_REVISION} STREQUAL "n/a")
158                 git_rev_parse (GIT_REVISION --short)
159         endif()
160 endif()
161
162 if(CMAKE_CROSSCOMPILING)
163         SET (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
164 endif(CMAKE_CROSSCOMPILING)
165 # /Allow to search the host machine for git/ccache
166
167 message(STATUS "Git Revision ${GIT_REVISION}")
168
169 # Turn on solution folders (2.8.4+)
170 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
171
172 # Default to release build type
173 if(NOT CMAKE_BUILD_TYPE)
174         set(CMAKE_BUILD_TYPE "Release")
175 endif()
176
177 if(NOT DEFINED BUILD_SHARED_LIBS)
178         if(IOS)
179                 set(BUILD_SHARED_LIBS OFF)
180         else()
181                 set(BUILD_SHARED_LIBS ON)
182         endif()
183 endif()
184
185 if(BUILD_TESTING)
186         set(EXPORT_ALL_SYMBOLS TRUE)
187 elseif(NOT DEFINED EXPORT_ALL_SYMBOLS)
188         set(EXPORT_ALL_SYMBOLS FALSE)
189 endif()
190
191 if (EXPORT_ALL_SYMBOLS)
192 #       set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
193         add_definitions(-DFREERDP_TEST_EXPORTS -DBUILD_TESTING)
194 endif(EXPORT_ALL_SYMBOLS)
195
196 # BSD
197 if(${CMAKE_SYSTEM_NAME} MATCHES "BSD")
198         set(BSD TRUE)
199         if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
200                 set(FREEBSD TRUE)
201         endif()
202         if(${CMAKE_SYSTEM_NAME} MATCHES "kFreeBSD")
203                 set(KFREEBSD TRUE)
204         endif()
205         if(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
206                 set(OPENBSD TRUE)
207         endif()
208 endif()
209
210 if(${CMAKE_SYSTEM_NAME} MATCHES "DragonFly")
211         set(BSD TRUE)
212         set(FREEBSD TRUE)
213 endif()
214
215 if(FREEBSD)
216         find_path(EPOLLSHIM_INCLUDE_DIR NAMES sys/epoll.h sys/timerfd.h HINTS /usr/local/include/libepoll-shim)
217         find_library(EPOLLSHIM_LIBS NAMES epoll-shim libepoll-shim HINTS /usr/local/lib)
218 endif()
219
220 # Configure MSVC Runtime
221 if(MSVC)
222         include(MSVCRuntime)
223         if(NOT DEFINED MSVC_RUNTIME)
224                 set(MSVC_RUNTIME "dynamic")
225         endif()
226         if(MSVC_RUNTIME STREQUAL "static")
227                 if(BUILD_SHARED_LIBS)
228                         message(FATAL_ERROR "Static CRT is only supported in a fully static build")
229                 endif()
230                 message(STATUS "Use the MSVC static runtime option carefully!")
231                 message(STATUS "OpenSSL uses /MD by default, and is very picky")
232                 message(STATUS "Random freeing errors are a common sign of runtime issues")
233         endif()
234         configure_msvc_runtime()
235
236         if(NOT DEFINED CMAKE_SUPPRESS_REGENERATION)
237                 set(CMAKE_SUPPRESS_REGENERATION ON)
238         endif()
239 endif()
240
241 # Enable 64bit file support on linux and FreeBSD.
242 if("${CMAKE_SYSTEM_NAME}" MATCHES "Linux" OR FREEBSD)
243         add_definitions("-D_FILE_OFFSET_BITS=64")
244 endif()
245
246 # Use Standard conforming getpwnam_r() on Solaris.
247 if("${CMAKE_SYSTEM_NAME}" MATCHES "SunOS")
248         add_definitions("-D_POSIX_PTHREAD_SEMANTICS")
249 endif()
250
251 # Compiler-specific flags
252 if(CMAKE_COMPILER_IS_GNUCC)
253         if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "i686")
254                 CHECK_SYMBOL_EXISTS(__x86_64__ "" IS_X86_64)
255                 if(IS_X86_64)
256                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
257                 else()
258                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686")
259                 endif()
260         else()
261                 if(CMAKE_POSITION_INDEPENDENT_CODE)
262                         if(${CMAKE_VERSION} VERSION_LESS 2.8.9)
263                                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
264                         endif()
265                 endif()
266         endif()
267
268         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
269
270         CHECK_C_COMPILER_FLAG (-Wno-unused-result Wno-unused-result)
271         if(Wno-unused-result)
272                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-result")
273         endif()
274         CHECK_C_COMPILER_FLAG (-Wno-unused-but-set-variable Wno-unused-but-set-variable)
275         if(Wno-unused-but-set-variable)
276                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-but-set-variable")
277         endif()
278         CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
279         if(Wno-deprecated-declarations)
280                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
281         endif()
282         CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
283         if(Wno-deprecated-declarationsCXX)
284                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
285         endif()
286
287         if(NOT EXPORT_ALL_SYMBOLS)
288                 message(STATUS "GCC default symbol visibility: hidden")
289                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
290         endif()
291         if(BUILD_TESTING)
292                 CHECK_C_COMPILER_FLAG(-Wno-format Wno-format)
293                 if(Wno-format)
294                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format")
295                 endif()
296         endif()
297         CHECK_C_COMPILER_FLAG (-Wimplicit-function-declaration Wimplicit-function-declaration)
298         if(Wimplicit-function-declaration)
299                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wimplicit-function-declaration")
300         endif()
301
302         if (NOT OPENBSD)
303                 CHECK_C_COMPILER_FLAG (-Wredundant-decls Wredundant-decls)
304                 if(Wredundant-decls)
305                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
306                 endif()
307         endif()
308         if(CMAKE_BUILD_TYPE STREQUAL "Release")
309                 add_definitions(-DNDEBUG)
310         else()
311                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
312                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
313         endif()
314 endif()
315
316 # When building with Unix Makefiles and doing any release builds
317 # try to set __FILE__ to relative paths via a make specific macro
318 if (CMAKE_GENERATOR MATCHES "Unix Makefile*")
319         if(CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
320                 string(TOUPPER ${CMAKE_BUILD_TYPE} UPPER_BUILD_TYPE)
321                 CHECK_C_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefined)
322                 if(Wno-builtin-macro-redefined)
323                         set(CMAKE_C_FLAGS_${UPPER_BUILD_TYPE} "${CMAKE_C_FLAGS_${UPPER_BUILD_TYPE}} -Wno-builtin-macro-redefined -D__FILE__='\"$(subst ${CMAKE_BINARY_DIR}/,,$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<)))\"'")
324                 endif()
325
326                 CHECK_CXX_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefinedCXX)
327                 if(Wno-builtin-macro-redefinedCXX)
328                         set(CMAKE_CXX_FLAGS_${UPPER_BUILD_TYPE} "${CMAKE_CXX_FLAGS_${UPPER_BUILD_TYPE}} -Wno-builtin-macro-redefined -D__FILE__='\"$(subst ${CMAKE_BINARY_DIR}/,,$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<)))\"'")
329                 endif()
330         endif()
331 endif()
332
333 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
334         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
335         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-macros -Wno-padded")
336         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-c11-extensions -Wno-gnu")
337         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-command-line-argument")
338         CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
339         if(Wno-deprecated-declarations)
340                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
341         endif()
342         CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
343         if(Wno-deprecated-declarationsCXX)
344                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
345         endif()
346 endif()
347
348 set(THREAD_PREFER_PTHREAD_FLAG TRUE)
349
350 if(NOT IOS)
351         find_package(Threads REQUIRED)
352 endif()
353
354 if(NOT WIN32)
355         CHECK_SYMBOL_EXISTS(pthread_mutex_timedlock pthread.h HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
356         if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
357                 CHECK_LIBRARY_EXISTS(pthread pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
358         endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
359         if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
360                 CHECK_LIBRARY_EXISTS(pthreads pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
361         endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
362
363         if (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
364                 set(HAVE_PTHREAD_MUTEX_TIMEDLOCK ON)
365         endif (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
366 endif()
367
368 # Enable address sanitizer, where supported and when required
369 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCC)
370         CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
371
372         if (fno-omit-frame-pointer)
373                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
374         endif()
375
376         set(CMAKE_REQUIRED_LINK_OPTIONS_SAVED ${CMAKE_REQUIRED_LINK_OPTIONS})
377         file(WRITE ${CMAKE_BINARY_DIR}/foo.txt "")
378         if(WITH_SANITIZE_ADDRESS)
379                 list(APPEND CMAKE_REQUIRED_LINK_OPTIONS "-fsanitize=address")
380                 CHECK_C_COMPILER_FLAG ("-fsanitize=address" fsanitize-address)
381                 CHECK_C_COMPILER_FLAG ("-fsanitize-blacklist=${CMAKE_BINARY_DIR}/foo.txt" fsanitize-blacklist)
382                 CHECK_C_COMPILER_FLAG ("-fsanitize-address-use-after-scope" fsanitize-address-use-after-scope)
383
384                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
385                 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=address")
386                 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
387
388                 if(fsanitize-blacklist)
389                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/scripts/blacklist-address-sanitizer.txt")
390                 endif(fsanitize-blacklist)
391
392                 if(fsanitize-address-use-after-scope)
393                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-address-use-after-scope")
394                 endif(fsanitize-address-use-after-scope)
395         elseif(WITH_SANITIZE_MEMORY)
396                 list(APPEND CMAKE_REQUIRED_LINK_OPTIONS "-fsanitize=memory")
397                 CHECK_C_COMPILER_FLAG ("-fsanitize=memory" fsanitize-memory)
398                 CHECK_C_COMPILER_FLAG ("-fsanitize-blacklist=${CMAKE_BINARY_DIR}/foo.txt" fsanitize-blacklist)
399                 CHECK_C_COMPILER_FLAG ("-fsanitize-memory-use-after-dtor" fsanitize-memory-use-after-dtor)
400                 CHECK_C_COMPILER_FLAG ("-fsanitize-memory-track-origins" fsanitize-memory-track-origins)
401
402                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=memory")
403                 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=memory")
404                 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=memory")
405
406                 if(fsanitize-blacklist)
407                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/scripts/blacklist-memory-sanitizer.txt")
408                 endif(fsanitize-blacklist)
409
410                 if (fsanitize-memory-use-after-dtor)
411                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-memory-use-after-dtor")
412                 endif(fsanitize-memory-use-after-dtor)
413
414                 if (fsanitize-memory-track-origins)
415                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-memory-track-origins")
416                 endif(fsanitize-memory-track-origins)
417         elseif(WITH_SANITIZE_THREAD)
418                 list(APPEND CMAKE_REQUIRED_LINK_OPTIONS "-fsanitize=thread")
419                 CHECK_C_COMPILER_FLAG ("-fsanitize=thread" fsanitize-thread)
420                 CHECK_C_COMPILER_FLAG ("-fsanitize-blacklist=${CMAKE_BINARY_DIR}/foo.txt" fsanitize-blacklist)
421
422                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=thread")
423                 if(fsanitize-blacklist)
424                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/scripts/blacklist-thread-sanitizer.txt")
425                 endif(fsanitize-blacklist)
426                 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=thread")
427                 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=thread")
428         endif()
429
430         file(REMOVE ${CMAKE_BINARY_DIR}/foo.txt)
431         set(CMAKE_REQUIRED_LINK_OPTIONS ${CMAKE_REQUIRED_LINK_OPTIONS_SAVED})
432
433         if (WITH_NO_UNDEFINED)
434                 CHECK_C_COMPILER_FLAG (-Wl,--no-undefined no-undefined)
435
436                 if(no-undefined)
437                         SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--no-undefined" )
438                         SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined" )
439                 endif()
440         endif()
441 endif()
442
443 if(MSVC)
444         # Remove previous warning definitions,
445         # NMake is otherwise complaining.
446         foreach (flags_var_to_scrub
447                 CMAKE_C_FLAGS
448                 CMAKE_CXX_FLAGS
449                 CMAKE_CXX_FLAGS_RELEASE
450                 CMAKE_CXX_FLAGS_RELWITHDEBINFO
451                 CMAKE_CXX_FLAGS_MINSIZEREL
452                 CMAKE_C_FLAGS_RELEASE
453                 CMAKE_C_FLAGS_RELWITHDEBINFO
454                 CMAKE_C_FLAGS_MINSIZEREL)
455                 string (REGEX REPLACE "(^| )[/-]W[ ]*[1-9]" " "
456                 "${flags_var_to_scrub}" "${${flags_var_to_scrub}}")
457         endforeach()
458
459         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gd")
460         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
461
462         if(CMAKE_SIZEOF_VOID_P EQUAL 8)
463                 add_definitions(-D_AMD64_)
464         else()
465                 add_definitions(-D_X86_)
466         endif()
467
468         set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
469         set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})
470
471         if(CMAKE_BUILD_TYPE STREQUAL "Release")
472         else()
473                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Zi")
474                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi")
475         endif()
476
477 endif()
478
479 if(WIN32)
480         add_definitions(-DUNICODE -D_UNICODE)
481         add_definitions(-D_CRT_SECURE_NO_WARNINGS)
482         add_definitions(-DWIN32_LEAN_AND_MEAN)
483         add_definitions(-D_WINSOCK_DEPRECATED_NO_WARNINGS)
484
485         set(CMAKE_USE_RELATIVE_PATH ON)
486         if (${CMAKE_GENERATOR} MATCHES "NMake Makefile*" OR ${CMAKE_GENERATOR} MATCHES "Ninja*" OR ${CMAKE_GENERATOR} MATCHES "Unix Makefiles")
487                 set(CMAKE_PDB_BINARY_DIR ${CMAKE_BINARY_DIR})
488         elseif (${CMAKE_GENERATOR} MATCHES "Visual Studio*")
489                 set(CMAKE_PDB_BINARY_DIR "${CMAKE_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
490         else()
491                 message(FATAL_ERROR "Unknown generator ${CMAKE_GENERATOR}")
492         endif()
493
494         string(TIMESTAMP RC_VERSION_YEAR "%Y")
495
496         if(NOT DEFINED CMAKE_WINDOWS_VERSION)
497                 set(CMAKE_WINDOWS_VERSION "WIN7")
498         endif()
499
500         if(CMAKE_WINDOWS_VERSION STREQUAL "WINXP")
501                 add_definitions(-DWINVER=0x0501 -D_WIN32_WINNT=0x0501)
502         elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN7")
503                 add_definitions(-DWINVER=0x0601 -D_WIN32_WINNT=0x0601)
504         elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN8")
505                 add_definitions(-DWINVER=0x0602 -D_WIN32_WINNT=0x0602)
506         elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN10")
507                 add_definitions(-DWINVER=0x0A00 -D_WIN32_WINNT=0x0A00)
508         endif()
509
510         # Set product and vendor for dll and exe version information.
511         set(RC_VERSION_VENDOR ${VENDOR})
512         set(RC_VERSION_PRODUCT ${PRODUCT})
513         set(RC_VERSION_PATCH ${BUILD_NUMBER})
514                 set(RC_VERSION_DESCRIPTION "${FREERDP_VERSION_FULL} ${GIT_REVISION} ${CMAKE_WINDOWS_VERSION} ${CMAKE_SYSTEM_PROCESSOR}")
515
516         if (FREERDP_EXTERNAL_SSL_PATH)
517                 set(OPENSSL_ROOT_DIR ${FREERDP_EXTERNAL_SSL_PATH})
518         endif()
519 endif()
520
521 if(IOS)
522         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_IOS_SDK_ROOT} -g")
523 endif()
524
525 add_definitions(-DWINPR_EXPORTS -DFREERDP_EXPORTS)
526
527 # Include files
528 if(NOT IOS)
529         check_include_files(fcntl.h HAVE_FCNTL_H)
530         check_include_files(unistd.h HAVE_UNISTD_H)
531         check_include_files(execinfo.h HAVE_EXECINFO_H)
532         check_include_files(inttypes.h HAVE_INTTYPES_H)
533         check_include_files(sys/modem.h HAVE_SYS_MODEM_H)
534         check_include_files(sys/filio.h HAVE_SYS_FILIO_H)
535         check_include_files(sys/sockio.h HAVE_SYS_SOCKIO_H)
536         check_include_files(sys/strtio.h HAVE_SYS_STRTIO_H)
537         check_include_files(sys/select.h HAVE_SYS_SELECT_H)
538         check_include_files(syslog.h HAVE_SYSLOG_H)
539 else()
540         set(HAVE_FCNTL_H 1)
541         set(HAVE_UNISTD_H 1)
542         set(HAVE_INTTYPES_H 1)
543         set(HAVE_SYS_FILIO_H 1)
544 endif()
545
546 if(NOT IOS)
547         check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
548 else()
549         set(HAVE_TM_GMTOFF 1)
550 endif()
551
552 # Mac OS X
553 if(APPLE)
554         if(IOS)
555                 if (NOT FREERDP_IOS_EXTERNAL_SSL_PATH)
556                         message(STATUS "FREERDP_IOS_EXTERNAL_SSL_PATH not set! Required if openssl is not found in the iOS SDK (which usually isn't")
557                 endif()
558                 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_IOS_EXTERNAL_SSL_PATH})
559                 set_property(GLOBAL PROPERTY XCODE_ATTRIBUTE_SKIP_INSTALL YES)
560         else(IOS)
561                 if(NOT DEFINED CMAKE_OSX_ARCHITECTURES)
562                         set(CMAKE_OSX_ARCHITECTURES i386 x86_64)
563                 endif()
564         endif(IOS)
565
566 # Temporarily disabled, causes the cmake script to be reexecuted, causing the compilation to fail.
567 # Workaround: specify the parameter in the command-line
568 #       if(WITH_CLANG)
569 #               set(CMAKE_C_COMPILER "clang")
570 #       endif()
571
572         if (WITH_VERBOSE)
573                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -v")
574                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v")
575         endif()
576 endif(APPLE)
577
578 # OpenBSD
579 if(OPENBSD)
580         set(WITH_MANPAGES "ON")
581         set(WITH_ALSA "OFF")
582         set(WITH_PULSE "OFF")
583         set(WITH_OSS "ON")
584         set(WITH_WAYLAND "OFF")
585 endif()
586
587 # Android
588 if(ANDROID)
589         set(WITH_LIBRARY_VERSIONING "OFF")
590
591         set_property( GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ${ANDROID_LIBRARY_USE_LIB64_PATHS} )
592
593         if (${ANDROID_ABI} STREQUAL "armeabi")
594                 set (WITH_NEON OFF)
595         endif()
596
597         if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
598                 add_definitions(-DNDK_DEBUG=1)
599
600                 # NOTE: Manually add -gdwarf-3, as newer toolchains default to -gdwarf-4,
601                 #       which is not supported by the gdbserver binary shipped with
602                 #       the android NDK (tested with r9b)
603                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG} -gdwarf-3")
604         endif()
605         set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -llog")
606
607         if (NOT FREERDP_EXTERNAL_PATH)
608                 if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/")
609                         set (FREERDP_EXTERNAL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/")
610                 else()
611                         message(STATUS "FREERDP_EXTERNAL_PATH not set!")
612                 endif()
613         endif()
614
615         list (APPEND CMAKE_INCLUDE_PATH ${FREERDP_EXTERNAL_PATH}/${ANDROID_ABI}/include)
616         list (APPEND CMAKE_LIBRARY_PATH ${FREERDP_EXTERNAL_PATH}/${ANDROID_ABI}/ )
617         set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH )
618         set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH )
619
620         if (WITH_GPROF)
621                 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/gprof_generate.sh.cmake
622                         ${CMAKE_BINARY_DIR}/scripts/gprof_generate.sh @ONLY)
623         endif(WITH_GPROF)
624 endif()
625
626 if(WITH_VALGRIND_MEMCHECK)
627         check_include_files(valgrind/memcheck.h HAVE_VALGRIND_MEMCHECK_H)
628 else()
629         unset(HAVE_VALGRIND_MEMCHECK_H CACHE)
630 endif()
631
632 if(UNIX OR CYGWIN)
633         check_include_files(aio.h HAVE_AIO_H)
634         check_include_files(sys/eventfd.h HAVE_SYS_EVENTFD_H)
635         if (HAVE_SYS_EVENTFD_H)
636                 check_symbol_exists(eventfd_read sys/eventfd.h WITH_EVENTFD_READ_WRITE)
637         endif()
638         if (FREEBSD)
639                 list(APPEND CMAKE_REQUIRED_INCLUDES ${EPOLLSHIM_INCLUDE_DIR})
640         endif()
641         check_include_files(sys/timerfd.h HAVE_SYS_TIMERFD_H)
642         if (FREEBSD)
643                 list(REMOVE_ITEM CMAKE_REQUIRED_INCLUDES ${EPOLLSHIM_INCLUDE_DIR})
644         endif()
645         check_include_files(poll.h HAVE_POLL_H)
646         list(APPEND CMAKE_REQUIRED_LIBRARIES m)
647         check_symbol_exists(ceill math.h HAVE_MATH_C99_LONG_DOUBLE)
648         list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES m)
649         set(X11_FEATURE_TYPE "RECOMMENDED")
650         set(WAYLAND_FEATURE_TYPE "RECOMMENDED")
651
652         include(CheckFunctionExists)
653
654         check_function_exists(getlogin_r HAVE_GETLOGIN_R)
655 else()
656         set(X11_FEATURE_TYPE "DISABLED")
657         set(WAYLAND_FEATURE_TYPE "DISABLED")
658 endif()
659
660 if(WITH_PCSC_WINPR)
661         find_package(PCSCWinPR)
662 endif()
663
664 set(X11_FEATURE_PURPOSE "X11")
665 set(X11_FEATURE_DESCRIPTION "X11 client and server")
666
667 set(WAYLAND_FEATURE_PURPOSE "Wayland")
668 set(WAYLAND_FEATURE_DESCRIPTION "Wayland client")
669
670 set(ZLIB_FEATURE_TYPE "REQUIRED")
671 set(ZLIB_FEATURE_PURPOSE "compression")
672 set(ZLIB_FEATURE_DESCRIPTION "data compression")
673
674 set(OPENSSL_FEATURE_TYPE "REQUIRED")
675 set(OPENSSL_FEATURE_PURPOSE "cryptography")
676 set(OPENSSL_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
677
678 set(MBEDTLS_FEATURE_TYPE "OPTIONAL")
679 set(MBEDTLS_FEATURE_PURPOSE "cryptography")
680 set(MBEDTLS_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
681
682 set(OPENSLES_FEATURE_TYPE "OPTIONAL")
683 set(OPENSLES_FEATURE_PURPOSE "multimedia")
684 set(OPENSLES_FEATURE_DESCRIPTION "OpenSLES audio / video")
685
686 set(OSS_FEATURE_TYPE "RECOMMENDED")
687 set(OSS_FEATURE_PURPOSE "sound")
688 set(OSS_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
689
690 set(ALSA_FEATURE_TYPE "RECOMMENDED")
691 set(ALSA_FEATURE_PURPOSE "sound")
692 set(ALSA_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
693
694 set(PULSE_FEATURE_TYPE "RECOMMENDED")
695 set(PULSE_FEATURE_PURPOSE "sound")
696 set(PULSE_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
697
698 set(CUPS_FEATURE_TYPE "RECOMMENDED")
699 set(CUPS_FEATURE_PURPOSE "printing")
700 set(CUPS_FEATURE_DESCRIPTION "printer device redirection")
701
702 set(PCSC_FEATURE_TYPE "RECOMMENDED")
703 set(PCSC_FEATURE_PURPOSE "smart card")
704 set(PCSC_FEATURE_DESCRIPTION "smart card device redirection")
705
706 set(FFMPEG_FEATURE_TYPE "RECOMMENDED")
707 set(FFMPEG_FEATURE_PURPOSE "multimedia")
708 set(FFMPEG_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
709
710 set(VAAPI_FEATURE_TYPE "OPTIONAL")
711 set(VAAPI_FEATURE_PURPOSE "multimedia")
712 set(VAAPI_FEATURE_DESCRIPTION "[experimental] VA-API hardware acceleration for video playback")
713
714 set(IPP_FEATURE_TYPE "OPTIONAL")
715 set(IPP_FEATURE_PURPOSE "performance")
716 set(IPP_FEATURE_DESCRIPTION "Intel Integrated Performance Primitives library")
717
718 set(JPEG_FEATURE_TYPE "OPTIONAL")
719 set(JPEG_FEATURE_PURPOSE "codec")
720 set(JPEG_FEATURE_DESCRIPTION "use JPEG library")
721
722 set(X264_FEATURE_TYPE "OPTIONAL")
723 set(X264_FEATURE_PURPOSE "codec")
724 set(X264_FEATURE_DESCRIPTION "use x264 library")
725
726 set(OPENH264_FEATURE_TYPE "OPTIONAL")
727 set(OPENH264_FEATURE_PURPOSE "codec")
728 set(OPENH264_FEATURE_DESCRIPTION "use OpenH264 library")
729
730 set(OPENCL_FEATURE_TYPE "OPTIONAL")
731 set(OPENCL_FEATURE_PURPOSE "codec")
732 set(OPENCL_FEATURE_DESCRIPTION "[experimental] use OpenCL library")
733
734 set(GSM_FEATURE_TYPE "OPTIONAL")
735 set(GSM_FEATURE_PURPOSE "codec")
736 set(GSM_FEATURE_DESCRIPTION "GSM audio codec library")
737
738 set(LAME_FEATURE_TYPE "OPTIONAL")
739 set(LAME_FEATURE_PURPOSE "codec")
740 set(LAME_FEATURE_DESCRIPTION "lame MP3 audio codec library")
741
742 set(FAAD2_FEATURE_TYPE "OPTIONAL")
743 set(FAAD2_FEATURE_PURPOSE "codec")
744 set(FAAD2_FEATURE_DESCRIPTION "FAAD2 AAC audio codec library")
745
746 set(FAAC_FEATURE_TYPE "OPTIONAL")
747 set(FAAC_FEATURE_PURPOSE "codec")
748 set(FAAC_FEATURE_DESCRIPTION "[experimental] FAAC AAC audio codec library")
749
750 set(SOXR_FEATURE_TYPE "OPTIONAL")
751 set(SOXR_FEATURE_PURPOSE "codec")
752 set(SOXR_FEATURE_DESCRIPTION "SOX audio resample library")
753
754 set(GSSAPI_FEATURE_TYPE "OPTIONAL")
755 set(GSSAPI_FEATURE_PURPOSE "auth")
756 set(GSSAPI_FEATURE_DESCRIPTION "[experimental] add kerberos support")
757
758 if(WIN32)
759         set(X11_FEATURE_TYPE "DISABLED")
760         set(WAYLAND_FEATURE_TYPE "DISABLED")
761         set(ZLIB_FEATURE_TYPE "DISABLED")
762         set(OSS_FEATURE_TYPE "DISABLED")
763         set(ALSA_FEATURE_TYPE "DISABLED")
764         set(PULSE_FEATURE_TYPE "DISABLED")
765         set(CUPS_FEATURE_TYPE "DISABLED")
766         set(PCSC_FEATURE_TYPE "DISABLED")
767         set(FFMPEG_FEATURE_TYPE "DISABLED")
768         set(VAAPI_FEATURE_TYPE "DISABLED")
769         set(OPENSLES_FEATURE_TYPE "DISABLED")
770 endif()
771
772 if(APPLE)
773         set(FFMPEG_FEATURE_TYPE "OPTIONAL")
774         set(VAAPI_FEATURE_TYPE "DISABLED")
775         set(X11_FEATURE_TYPE "OPTIONAL")
776         set(WAYLAND_FEATURE_TYPE "DISABLED")
777         set(OSS_FEATURE_TYPE "DISABLED")
778         set(ALSA_FEATURE_TYPE "DISABLED")
779         if(IOS)
780                 set(X11_FEATURE_TYPE "DISABLED")
781                 set(PULSE_FEATURE_TYPE "DISABLED")
782                 set(CUPS_FEATURE_TYPE "DISABLED")
783                 set(PCSC_FEATURE_TYPE "DISABLED")
784         endif()
785         set(OPENSLES_FEATURE_TYPE "DISABLED")
786 endif()
787
788 if(UNIX AND NOT ANDROID)
789         set(WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE "RECOMMENDED")
790         set(WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE "systemd journal appender")
791         set(WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION "allows to export wLog to systemd journal")
792
793         #include(Findlibsystemd)
794         find_feature(libsystemd ${WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION})
795
796         if(LIBSYSTEMD_FOUND)
797                 set(HAVE_JOURNALD_H TRUE)
798         else()
799                 unset(HAVE_JOURNALD_H)
800         endif()
801 endif(UNIX AND NOT ANDROID)
802
803 if(ANDROID)
804         set(X11_FEATURE_TYPE "DISABLED")
805         set(WAYLAND_FEATURE_TYPE "DISABLED")
806         set(OSS_FEATURE_TYPE "DISABLED")
807         set(ALSA_FEATURE_TYPE "DISABLED")
808         set(PULSE_FEATURE_TYPE "DISABLED")
809         set(CUPS_FEATURE_TYPE "DISABLED")
810         set(PCSC_FEATURE_TYPE "DISABLED")
811         set(FFMPEG_FEATURE_TYPE "DISABLED")
812         set(VAAPI_FEATURE_TYPE "DISABLED")
813         set(OPENSLES_FEATURE_TYPE "REQUIRED")
814 endif()
815
816 find_feature(X11 ${X11_FEATURE_TYPE} ${X11_FEATURE_PURPOSE} ${X11_FEATURE_DESCRIPTION})
817 find_feature(Wayland ${WAYLAND_FEATURE_TYPE} ${WAYLAND_FEATURE_PURPOSE} ${WAYLAND_FEATURE_DESCRIPTION})
818
819 find_feature(ZLIB ${ZLIB_FEATURE_TYPE} ${ZLIB_FEATURE_PURPOSE} ${ZLIB_FEATURE_DESCRIPTION})
820 find_feature(OpenSSL ${OPENSSL_FEATURE_TYPE} ${OPENSSL_FEATURE_PURPOSE} ${OPENSSL_FEATURE_DESCRIPTION})
821 find_feature(MbedTLS ${MBEDTLS_FEATURE_TYPE} ${MBEDTLS_FEATURE_PURPOSE} ${MBEDTLS_FEATURE_DESCRIPTION})
822 find_feature(OpenSLES ${OPENSLES_FEATURE_TYPE} ${OPENSLES_FEATURE_PURPOSE} ${OPENSLES_FEATURE_DESCRIPTION})
823
824 find_feature(OSS ${OSS_FEATURE_TYPE} ${OSS_FEATURE_PURPOSE} ${OSS_FEATURE_DESCRIPTION})
825 find_feature(ALSA ${ALSA_FEATURE_TYPE} ${ALSA_FEATURE_PURPOSE} ${ALSA_FEATURE_DESCRIPTION})
826 find_feature(Pulse ${PULSE_FEATURE_TYPE} ${PULSE_FEATURE_PURPOSE} ${PULSE_FEATURE_DESCRIPTION})
827
828 find_feature(Cups ${CUPS_FEATURE_TYPE} ${CUPS_FEATURE_PURPOSE} ${CUPS_FEATURE_DESCRIPTION})
829 find_feature(PCSC ${PCSC_FEATURE_TYPE} ${PCSC_FEATURE_PURPOSE} ${PCSC_FEATURE_DESCRIPTION})
830
831 find_feature(FFmpeg ${FFMPEG_FEATURE_TYPE} ${FFMPEG_FEATURE_PURPOSE} ${FFMPEG_FEATURE_DESCRIPTION})
832
833 find_feature(JPEG ${JPEG_FEATURE_TYPE} ${JPEG_FEATURE_PURPOSE} ${JPEG_FEATURE_DESCRIPTION})
834 find_feature(x264 ${X264_FEATURE_TYPE} ${X264_FEATURE_PURPOSE} ${X264_FEATURE_DESCRIPTION})
835 find_feature(OpenH264 ${OPENH264_FEATURE_TYPE} ${OPENH264_FEATURE_PURPOSE} ${OPENH264_FEATURE_DESCRIPTION})
836 find_feature(OpenCL ${OPENCL_FEATURE_TYPE} ${OPENCL_FEATURE_PURPOSE} ${OPENCL_FEATURE_DESCRIPTION})
837 find_feature(GSM ${GSM_FEATURE_TYPE} ${GSM_FEATURE_PURPOSE} ${GSM_FEATURE_DESCRIPTION})
838 find_feature(LAME ${LAME_FEATURE_TYPE} ${LAME_FEATURE_PURPOSE} ${LAME_FEATURE_DESCRIPTION})
839 find_feature(FAAD2 ${FAAD2_FEATURE_TYPE} ${FAAD2_FEATURE_PURPOSE} ${FAAD2_FEATURE_DESCRIPTION})
840 find_feature(FAAC ${FAAC_FEATURE_TYPE} ${FAAC_FEATURE_PURPOSE} ${FAAC_FEATURE_DESCRIPTION})
841 find_feature(soxr ${SOXR_FEATURE_TYPE} ${SOXR_FEATURE_PURPOSE} ${SOXR_FEATURE_DESCRIPTION})
842
843 find_feature(GSSAPI ${GSSAPI_FEATURE_TYPE} ${GSSAPI_FEATURE_PURPOSE} ${GSSAPI_FEATURE_DESCRIPTION})
844
845 if (WITH_OPENH264 AND NOT WITH_OPENH264_LOADING)
846         option(WITH_OPENH264_LOADING "Use LoadLibrary to load openh264 at runtime" OFF)
847 endif (WITH_OPENH264 AND NOT WITH_OPENH264_LOADING)
848
849 if ((WITH_FFMPEG OR WITH_DSP_FFMPEG) AND NOT FFMPEG_FOUND)
850         message(FATAL_ERROR "FFMPEG support requested but not detected")
851 endif()
852 set(WITH_FFMPEG ${FFMPEG_FOUND})
853
854 # Version check, if we have detected FFMPEG but the version is too old
855 # deactivate it as sound backend.
856 if (WITH_DSP_FFMPEG)
857         # Deactivate FFmpeg backend for sound, if the version is too old.
858         # See libfreerdp/codec/dsp_ffmpeg.h
859         file(STRINGS "${AVCODEC_INCLUDE_DIR}/libavcodec/version.h" AV_VERSION_FILE REGEX "LIBAVCODEC_VERSION_M[A-Z]+[\t ]*[0-9]+")
860         FOREACH(item ${AV_VERSION_FILE})
861           STRING(REGEX MATCH "LIBAVCODEC_VERSION_M[A-Z]+[\t ]*[0-9]+" litem ${item})
862         IF(litem)
863                         string(REGEX REPLACE "[ \t]+" ";" VSPLIT_LINE ${litem})
864                         list(LENGTH VSPLIT_LINE VSPLIT_LINE_LEN)
865                         if (NOT "${VSPLIT_LINE_LEN}" EQUAL "2")
866                                 message(ERROR "invalid entry in libavcodec version header ${item}")
867                         endif(NOT "${VSPLIT_LINE_LEN}" EQUAL "2")
868                         list(GET VSPLIT_LINE 0 VNAME)
869                         list(GET VSPLIT_LINE 1 VVALUE)
870                         set(${VNAME} ${VVALUE})
871         ENDIF(litem)
872         ENDFOREACH(item ${AV_VERSION_FILE})
873
874         set(AVCODEC_VERSION "${LIBAVCODEC_VERSION_MAJOR}.${LIBAVCODEC_VERSION_MINOR}.${LIBAVCODEC_VERSION_MICRO}")
875         if (AVCODEC_VERSION VERSION_LESS "57.48.101")
876                 message(WARNING "FFmpeg version detected (${AVCODEC_VERSION}) is too old. (Require at least 57.48.101 for sound). Deactivating")
877                 set(WITH_DSP_FFMPEG OFF)
878         endif()
879 endif (WITH_DSP_FFMPEG)
880
881 if (WITH_OPENH264 AND NOT OPENH264_FOUND)
882         message(FATAL_ERROR "OpenH264 support requested but not detected")
883 endif()
884 set(WITH_OPENH264 ${OPENH264_FOUND})
885
886 if ( (WITH_GSSAPI) AND (NOT GSS_FOUND))
887         message(WARNING "-DWITH_GSSAPI=ON is set, but not GSSAPI implementation was found, disabling")
888 elseif(WITH_GSSAPI)
889         if(GSS_FLAVOUR STREQUAL "MIT")
890                 add_definitions("-DWITH_GSSAPI -DWITH_GSSAPI_MIT")
891                 if(GSS_VERSION_1_13)
892                         add_definitions("-DHAVE_AT_LEAST_KRB_V1_13")
893                 endif()
894                 include_directories(${_GSS_INCLUDE_DIR})
895         elseif(GSS_FLAVOUR STREQUAL "Heimdal")
896                 add_definitions("-DWITH_GSSAPI -DWITH_GSSAPI_HEIMDAL")
897                 include_directories(${_GSS_INCLUDE_DIR})
898         else()
899                 message(WARNING "Kerberos version not detected")
900         endif()
901 endif()
902
903 if(TARGET_ARCH MATCHES "x86|x64")
904         if (NOT APPLE)
905                 # Intel Performance Primitives
906                 find_feature(IPP ${IPP_FEATURE_TYPE} ${IPP_FEATURE_PURPOSE} ${IPP_FEATURE_DESCRIPTION})
907         endif()
908 endif()
909
910 if(OPENSSL_FOUND)
911         add_definitions("-DWITH_OPENSSL")
912         message(STATUS "Using OpenSSL Version: ${OPENSSL_VERSION}")
913         include_directories(${OPENSSL_INCLUDE_DIR})
914 endif()
915
916 if(MBEDTLS_FOUND)
917         add_definitions("-DWITH_MBEDTLS")
918 endif()
919
920 if (WITH_X264 OR WITH_OPENH264 OR WITH_MEDIA_FOUNDATION OR WITH_FFMPEG)
921         set(WITH_GFX_H264 ON)
922 else()
923         set(WITH_GFX_H264 OFF)
924 endif()
925
926 # Android expects all libraries to be loadable
927 # without paths.
928 if (ANDROID OR WIN32 OR MAC_BUNDLE)
929   set(FREERDP_DATA_PATH "share")
930   if (NOT FREERDP_INSTALL_PREFIX)
931           set(FREERDP_INSTALL_PREFIX ".")
932   endif()
933   set(FREERDP_LIBRARY_PATH ".")
934   set(FREERDP_PLUGIN_PATH ".")
935 else()
936         set(FREERDP_DATA_PATH "${CMAKE_INSTALL_PREFIX}/share/freerdp${FREERDP_VERSION_MAJOR}")
937         if (NOT FREERDP_INSTALL_PREFIX)
938                 set(FREERDP_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
939         endif()
940         set(FREERDP_LIBRARY_PATH "${CMAKE_INSTALL_LIBDIR}")
941         set(FREERDP_PLUGIN_PATH "${CMAKE_INSTALL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}")
942 endif()
943 set(FREERDP_ADDIN_PATH "${FREERDP_PLUGIN_PATH}")
944
945 # Path to put extensions
946 set(FREERDP_EXTENSION_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}/extensions")
947
948 # Proxy plugins path
949 if(NOT DEFINED PROXY_PLUGINDIR)
950         message("using default plugins location")
951         set(FREERDP_PROXY_PLUGINDIR "${CMAKE_BINARY_DIR}/server/proxy/plugins")
952 else()
953         set(FREERDP_PROXY_PLUGINDIR "${PROXY_PLUGINDIR}")
954 endif()
955
956 # Declare we have config.h, generated later on.
957 add_definitions("-DHAVE_CONFIG_H")
958
959 # Include directories
960 include_directories(${CMAKE_CURRENT_BINARY_DIR})
961 include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
962 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
963
964 # RPATH configuration
965 set(CMAKE_SKIP_BUILD_RPATH FALSE)
966 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
967 if (APPLE)
968         set(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)
969         set(CMAKE_INSTALL_RPATH "@loader_path/../Frameworks")
970 else (APPLE)
971         set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
972         if (NOT FREEBSD)
973                 set(CMAKE_INSTALL_RPATH "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}:\$ORIGIN/..")
974         endif()
975 endif(APPLE)
976
977 if (BUILD_SHARED_LIBS)
978         set(CMAKE_MACOSX_RPATH ON)
979 endif()
980
981 # Android profiling
982 if(ANDROID)
983         if(WITH_GPROF)
984                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
985                 set(PROFILER_LIBRARIES
986                         "${FREERDP_EXTERNAL_PROFILER_PATH}/obj/local/${ANDROID_ABI}/libandroid-ndk-profiler.a")
987                 include_directories("${FREERDP_EXTERNAL_PROFILER_PATH}")
988         endif()
989 endif()
990
991 # Unit Tests
992
993 include(CTest)
994
995 if(BUILD_TESTING)
996         enable_testing()
997
998         if(MSVC)
999                 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
1000         else()
1001                 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Testing")
1002         endif()
1003 endif()
1004
1005 # WinPR
1006 include_directories("${CMAKE_SOURCE_DIR}/winpr/include")
1007 include_directories("${CMAKE_BINARY_DIR}/winpr/include")
1008
1009 if (${CMAKE_VERSION} VERSION_LESS 2.8.12)
1010         set(PUBLIC_KEYWORD "")
1011         set(PRIVATE_KEYWORD "")
1012 else()
1013         set(PUBLIC_KEYWORD "PUBLIC")
1014         set(PRIVATE_KEYWORD "PRIVATE")
1015 endif()
1016
1017 if(BUILD_SHARED_LIBS)
1018         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINPR_DLL")
1019 endif()
1020
1021 add_subdirectory(winpr)
1022
1023 # Sub-directories
1024
1025 if(WITH_THIRD_PARTY)
1026         add_subdirectory(third-party)
1027         if (NOT "${THIRD_PARTY_INCLUDES}" STREQUAL "")
1028                 include_directories(${THIRD_PARTY_INCLUDES})
1029         endif()
1030 endif()
1031
1032 add_subdirectory(include)
1033
1034 add_subdirectory(libfreerdp)
1035
1036 if (IOS)
1037         set(CMAKE_OSX_DEPLOYMENT_TARGET "10.0")
1038         if (IOS_PLATFORM MATCHES "SIMULATOR")
1039                 set(CMAKE_OSX_SYSROOT "iphonesimulator")
1040         else()
1041                 set(CMAKE_OSX_SYSROOT "iphoneos")
1042         endif()
1043 endif()
1044
1045 # RdTk
1046 include_directories("${CMAKE_SOURCE_DIR}/rdtk/include")
1047 include_directories("${CMAKE_BINARY_DIR}/rdtk/include")
1048
1049 add_subdirectory(rdtk)
1050
1051 if(WAYLAND_FOUND)
1052         add_subdirectory(uwac)
1053 endif()
1054
1055 if(BSD)
1056         if(IS_DIRECTORY /usr/local/include)
1057                 include_directories(/usr/local/include)
1058                 link_directories(/usr/local/lib)
1059         endif()
1060         if(OPENBSD)
1061                 if(IS_DIRECTORY /usr/X11R6/include)
1062                         include_directories(/usr/X11R6/include)
1063                 endif()
1064         endif()
1065 endif()
1066
1067 if(WITH_CHANNELS)
1068         add_subdirectory(channels)
1069 endif()
1070
1071 if(WITH_CLIENT_COMMON OR WITH_CLIENT)
1072 add_subdirectory(client)
1073 endif()
1074
1075 if(WITH_SERVER)
1076         add_subdirectory(server)
1077 endif()
1078
1079 # Configure files - Add last so all symbols are defined
1080 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
1081
1082 # Packaging
1083
1084 set(CMAKE_CPACK_INCLUDE_FILE "CMakeCPack.cmake")
1085
1086 if(NOT (VENDOR MATCHES "FreeRDP"))
1087         if(DEFINED CLIENT_VENDOR_PATH)
1088                 if(EXISTS "${CMAKE_SOURCE_DIR}/${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
1089                         set(CMAKE_CPACK_INCLUDE_FILE "${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
1090                 endif()
1091         endif()
1092 endif()
1093
1094 #message("VENDOR: ${VENDOR} CLIENT_VENDOR_PATH: ${CLIENT_VENDOR_PATH} CMAKE_CPACK_INCLUDE_FILE: ${CMAKE_CPACK_INCLUDE_FILE}")
1095
1096 include(${CMAKE_CPACK_INCLUDE_FILE})
1097
1098 set(FREERDP_BUILD_CONFIG_LIST "")
1099 GET_CMAKE_PROPERTY(res VARIABLES)
1100 FOREACH(var ${res})
1101         IF (var MATCHES "^WITH_*|^BUILD_TESTING|^BUILTIN_CHANNELS|^HAVE_*")
1102                 LIST(APPEND FREERDP_BUILD_CONFIG_LIST "${var}=${${var}}")
1103         ENDIF()
1104 ENDFOREACH()
1105 string(REPLACE ";" " " FREERDP_BUILD_CONFIG "${FREERDP_BUILD_CONFIG_LIST}")
1106 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/buildflags.h.in ${CMAKE_CURRENT_BINARY_DIR}/buildflags.h)