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