Merge pull request #3957 from akallabeth/gfx_use_logger_instance
[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 include(CheckIncludeFiles)
55 include(CheckLibraryExists)
56 include(CheckSymbolExists)
57 include(CheckStructHasMember)
58 include(FindPkgConfig)
59 include(TestBigEndian)
60
61 include(FindFeature)
62 include(AutoVersioning)
63 include(ConfigOptions)
64 include(ComplexLibrary)
65 include(FeatureSummary)
66 include(CheckCCompilerFlag)
67 include(CheckCXXCompilerFlag)
68 include(GNUInstallDirsWrapper)
69 include(CMakePackageConfigHelpers)
70 include(InstallFreeRDPMan)
71
72 # Soname versioning
73 set(BUILD_NUMBER 0)
74 if ($ENV{BUILD_NUMBER})
75         set(BUILD_NUMBER $ENV{BUILD_NUMBER})
76 endif()
77 set(WITH_LIBRARY_VERSIONING "ON")
78 set(FREERDP_VERSION_MAJOR "2")
79 set(FREERDP_VERSION_MINOR "0")
80 set(FREERDP_VERSION_REVISION "0")
81 set(FREERDP_VERSION_SUFFIX "dev")
82 set(FREERDP_API_VERSION "${FREERDP_VERSION_MAJOR}")
83 set(FREERDP_VERSION "${FREERDP_VERSION_MAJOR}.${FREERDP_VERSION_MINOR}.${FREERDP_VERSION_REVISION}")
84 if (FREERDP_VERSION_SUFFIX)
85         set(FREERDP_VERSION_FULL "${FREERDP_VERSION}-${FREERDP_VERSION_SUFFIX}")
86 else()
87         set(FREERDP_VERSION_FULL "${FREERDP_VERSION}")
88 endif()
89 set(FREERDP_INCLUDE_DIR "include/freerdp${FREERDP_VERSION_MAJOR}/")
90
91 # Compatibility options
92 if(DEFINED STATIC_CHANNELS)
93         message(WARNING "STATIC_CHANNELS is obsolete, please use BUILTIN_CHANNELS instead")
94         set(BUILTIN_CHANNELS ${STATIC_CHANNELS} CACHE BOOL "" FORCE)
95 endif()
96
97 # Make paths absolute
98 if (CMAKE_INSTALL_PREFIX)
99         get_filename_component(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" ABSOLUTE)
100 endif()
101 if (FREERDP_EXTERNAL_PATH)
102         get_filename_component (FREERDP_EXTERNAL_PATH "${FREERDP_EXTERNAL_PATH}" ABSOLUTE)
103 endif()
104
105 # Allow to search the host machine for git
106 if(CMAKE_CROSSCOMPILING)
107         SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
108 endif(CMAKE_CROSSCOMPILING)
109
110 find_program(CCACHE ccache)
111 if(CCACHE AND WITH_CCACHE)
112         set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE})
113         set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE})
114 endif(CCACHE AND WITH_CCACHE)
115
116 include(GetGitRevisionDescription)
117 git_get_exact_tag(GIT_REVISION --tags --always)
118
119 if (${GIT_REVISION} STREQUAL "n/a")
120         git_rev_parse (GIT_REVISION --short)
121 endif()
122 if(CMAKE_CROSSCOMPILING)
123         SET (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
124 endif(CMAKE_CROSSCOMPILING)
125
126 message(STATUS "Git Revision ${GIT_REVISION}")
127
128 # Turn on solution folders (2.8.4+)
129 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
130
131 # Default to release build type
132 if(NOT CMAKE_BUILD_TYPE)
133         set(CMAKE_BUILD_TYPE "Release")
134 endif()
135
136 if(NOT DEFINED BUILD_SHARED_LIBS)
137         if(IOS)
138                 set(BUILD_SHARED_LIBS OFF)
139         else()
140                 set(BUILD_SHARED_LIBS ON)
141         endif()
142 endif()
143
144 if(BUILD_TESTING)
145         set(EXPORT_ALL_SYMBOLS TRUE)
146 elseif(NOT DEFINED EXPORT_ALL_SYMBOLS)
147         set(EXPORT_ALL_SYMBOLS FALSE)
148 endif()
149
150 if (EXPORT_ALL_SYMBOLS)
151 #       set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
152         add_definitions(-DFREERDP_TEST_EXPORTS -DBUILD_TESTING)
153 endif(EXPORT_ALL_SYMBOLS)
154
155 # BSD
156 if(${CMAKE_SYSTEM_NAME} MATCHES "BSD")
157         set(BSD TRUE)
158         if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
159                 set(FREEBSD TRUE)
160         endif()
161         if(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
162                 set(OPENBSD TRUE)
163         endif()
164 endif()
165
166 # Configure MSVC Runtime
167 if(MSVC)
168         include(MSVCRuntime)
169         if(NOT DEFINED MSVC_RUNTIME)
170                 set(MSVC_RUNTIME "dynamic")
171         endif()
172         if(MSVC_RUNTIME STREQUAL "static")
173                 if(BUILD_SHARED_LIBS)
174                         message(FATAL_ERROR "Static CRT is only supported in a fully static build")
175                 endif()
176                 message(STATUS "Use the MSVC static runtime option carefully!")
177                 message(STATUS "OpenSSL uses /MD by default, and is very picky")
178                 message(STATUS "Random freeing errors are a common sign of runtime issues")
179         endif()
180         configure_msvc_runtime()
181
182         if(NOT DEFINED CMAKE_SUPPRESS_REGENERATION)
183                 set(CMAKE_SUPPRESS_REGENERATION ON)
184         endif()
185 endif()
186
187 # Enable 64bit file support on linux.
188 if("${CMAKE_SYSTEM_NAME}" MATCHES "Linux")
189         add_definitions("-D_FILE_OFFSET_BITS=64")
190 endif()
191
192 # Compiler-specific flags
193 if(CMAKE_COMPILER_IS_GNUCC)
194         if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "i686")
195                 CHECK_SYMBOL_EXISTS(__x86_64__ "" IS_X86_64)
196                 if(IS_X86_64)
197                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
198                 else()
199                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686")
200                 endif()
201         else()
202                 if(CMAKE_POSITION_INDEPENDENT_CODE)
203                         if(${CMAKE_VERSION} VERSION_LESS 2.8.9)
204                                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
205                         endif()
206                 endif()
207         endif()
208
209         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
210
211         CHECK_C_COMPILER_FLAG (-Wno-unused-result Wno-unused-result)
212         if(Wno-unused-result)
213                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-result")
214         endif()
215         CHECK_C_COMPILER_FLAG (-Wno-unused-but-set-variable Wno-unused-but-set-variable)
216         if(Wno-unused-but-set-variable)
217                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-but-set-variable")
218         endif()
219         CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
220         if(Wno-deprecated-declarations)
221                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
222         endif()
223         CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
224         if(Wno-deprecated-declarationsCXX)
225                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
226         endif()
227
228         if(NOT EXPORT_ALL_SYMBOLS)
229                 message(STATUS "GCC default symbol visibility: hidden")
230                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
231         endif()
232         if(BUILD_TESTING)
233                 CHECK_C_COMPILER_FLAG(-Wno-format Wno-format)
234                 if(Wno-format)
235                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format")
236                 endif()
237         endif()
238         CHECK_C_COMPILER_FLAG (-Wimplicit-function-declaration Wimplicit-function-declaration)
239         if(Wimplicit-function-declaration)
240                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wimplicit-function-declaration")
241         endif()
242
243         if (NOT OPENBSD)
244                 CHECK_C_COMPILER_FLAG (-Wredundant-decls Wredundant-decls)
245                 if(Wredundant-decls)
246                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
247                 endif()
248         endif()
249         if(CMAKE_BUILD_TYPE STREQUAL "Release")
250                 add_definitions(-DNDEBUG)
251         else()
252                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
253                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
254         endif()
255         if(WITH_SSE2)
256                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2")
257         endif()
258 endif()
259
260 # When building with Unix Makefiles and doing any release builds
261 # try to set __FILE__ to relative paths via a make specific macro
262 if (CMAKE_GENERATOR MATCHES "Unix Makefile*")
263         if(CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
264                 string(TOUPPER ${CMAKE_BUILD_TYPE} UPPER_BUILD_TYPE)
265                 CHECK_C_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefined)
266                 if(Wno-builtin-macro-redefined)
267                         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 $<)))\"'")
268                 endif()
269
270                 CHECK_CXX_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefinedCXX)
271                 if(Wno-builtin-macro-redefinedCXX)
272                         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 $<)))\"'")
273                 endif()
274         endif()
275 endif()
276
277 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
278         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
279         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-macros -Wno-padded")
280         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-c11-extensions -Wno-gnu")
281         if(WITH_SSE2)
282                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mssse3")
283         endif()
284         CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
285         if(Wno-deprecated-declarations)
286                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
287         endif()
288         CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
289         if(Wno-deprecated-declarationsCXX)
290                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
291         endif()
292 endif()
293
294 # Enable address sanitizer, where supported and when required
295 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCC)
296         if(WITH_SANITIZE_ADDRESS)
297                 if (DEFINED CMAKE_REQUIRED_FLAGS)
298                         set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
299                 endif()
300                 set(CMAKE_REQUIRED_FLAGS "-fsanitize=address")
301                 CHECK_C_COMPILER_FLAG ("-fsanitize=address" fsanitize-address)
302                 if(fsanitize-address)
303                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
304                 endif()
305                 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
306                         set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
307                 else()
308                         unset(CMAKE_REQUIRED_FLAGS)
309                 endif()
310
311                 CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
312                 if(fno-omit-frame-pointer)
313                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
314                 endif()
315         elseif(WITH_SANITIZE_LEAK)
316                 if (DEFINED CMAKE_REQUIRED_FLAGS)
317                         set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
318                 endif()
319                 set(CMAKE_REQUIRED_FLAGS "-fsanitize=leak")
320                 CHECK_C_COMPILER_FLAG ("-fsanitize=leak" fsanitize-leak)
321                 if(fsanitize-leak)
322                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=leak")
323                 endif()
324                 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
325                         set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
326                 else()
327                         unset(CMAKE_REQUIRED_FLAGS)
328                 endif()
329
330                 CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
331                 if(fno-omit-frame-pointer)
332                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
333                 endif()
334         endif()
335
336         if (WITH_NO_UNDEFINED)
337                 if (DEFINED CMAKE_REQUIRED_FLAGS)
338                         set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
339                 endif()
340                 set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
341                 CHECK_C_COMPILER_FLAG (-Wl,--no-undefined no-undefined)
342                 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
343                         set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
344                         unset(SAVE_CMAKE_REQUIRED_FLAGS)
345                 else()
346                         unset(CMAKE_REQUIRED_FLAGS)
347                 endif()
348                 if(no-undefined)
349                         SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined" )
350                 endif()
351         endif()
352 endif()
353
354 if(MSVC)
355         # Remove previous warning definitions,
356         # NMake is otherwise complaining.
357         foreach (flags_var_to_scrub
358                 CMAKE_C_FLAGS
359                 CMAKE_CXX_FLAGS
360                 CMAKE_CXX_FLAGS_RELEASE
361                 CMAKE_CXX_FLAGS_RELWITHDEBINFO
362                 CMAKE_CXX_FLAGS_MINSIZEREL
363                 CMAKE_C_FLAGS_RELEASE
364                 CMAKE_C_FLAGS_RELWITHDEBINFO
365                 CMAKE_C_FLAGS_MINSIZEREL)
366                 string (REGEX REPLACE "(^| )[/-]W[ ]*[1-9]" " "
367                 "${flags_var_to_scrub}" "${${flags_var_to_scrub}}")
368         endforeach()
369
370         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gd")
371         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
372
373         if(CMAKE_SIZEOF_VOID_P EQUAL 8)
374                 add_definitions(-D_AMD64_)
375         else()
376                 add_definitions(-D_X86_)
377         endif()
378
379         set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
380         set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})
381
382         if(CMAKE_BUILD_TYPE STREQUAL "Release")
383         else()
384                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Zi")
385                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi")
386         endif()
387
388 endif()
389
390 if(WIN32)
391         add_definitions(-DUNICODE -D_UNICODE)
392         add_definitions(-D_CRT_SECURE_NO_WARNINGS)
393         add_definitions(-DWIN32_LEAN_AND_MEAN)
394         add_definitions(-D_WINSOCK_DEPRECATED_NO_WARNINGS)
395
396         set(CMAKE_USE_RELATIVE_PATH ON)
397         if (${CMAKE_GENERATOR} MATCHES "NMake Makefile*")
398                 set(CMAKE_PDB_BINARY_DIR ${CMAKE_BINARY_DIR})
399         elseif (${CMAKE_GENERATOR} MATCHES "Visual Studio*")
400                 set(CMAKE_PDB_BINARY_DIR "${CMAKE_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
401         else()
402                 message(FATAL "Unknown generator ${CMAKE_GENERATOR}")
403         endif()
404
405         # Set product and vendor for dll and exe version information.
406         set(RC_VERSION_VENDOR ${VENDOR})
407         set(RC_VERSION_PRODUCT ${PRODUCT})
408         set(RC_VERSION_PATCH ${BUILD_NUMBER})
409         set(RC_VERSION_DESCRIPTION ${GIT_REVISION})
410
411         string(TIMESTAMP RC_VERSION_YEAR "%Y")
412
413         if(NOT DEFINED CMAKE_WINDOWS_VERSION)
414                 set(CMAKE_WINDOWS_VERSION "WINXP")
415         endif()
416
417         if(CMAKE_WINDOWS_VERSION STREQUAL "WINXP")
418                 add_definitions(-DWINVER=0x0501 -D_WIN32_WINNT=0x0501)
419         elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN7")
420                 add_definitions(-DWINVER=0x0601 -D_WIN32_WINNT=0x0601)
421         elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN8")
422                 add_definitions(-DWINVER=0x0602 -D_WIN32_WINNT=0x0602)
423         elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN10")
424                 add_definitions(-DWINVER=0x0A00 -D_WIN32_WINNT=0x0A00)
425         endif()
426
427         if (FREERDP_EXTERNAL_SSL_PATH)
428                 set(OPENSSL_ROOT_DIR ${FREERDP_EXTERNAL_SSL_PATH})
429         endif()
430 endif()
431
432 if(IOS)
433         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_IOS_SDK_ROOT} -g")
434 endif()
435
436 add_definitions(-DWINPR_EXPORTS -DFREERDP_EXPORTS)
437
438 # Include files
439 if(NOT IOS)
440         check_include_files(fcntl.h HAVE_FCNTL_H)
441         check_include_files(unistd.h HAVE_UNISTD_H)
442         check_include_files(execinfo.h HAVE_EXECINFO_H)
443         check_include_files(inttypes.h HAVE_INTTYPES_H)
444         check_include_files(sys/modem.h HAVE_SYS_MODEM_H)
445         check_include_files(sys/filio.h HAVE_SYS_FILIO_H)
446         check_include_files(sys/sockio.h HAVE_SYS_SOCKIO_H)
447         check_include_files(sys/strtio.h HAVE_SYS_STRTIO_H)
448         check_include_files(sys/select.h HAVE_SYS_SELECT_H)
449         check_include_files(syslog.h HAVE_SYSLOG_H)
450 else()
451         set(HAVE_FCNTL_H 1)
452         set(HAVE_UNISTD_H 1)
453         set(HAVE_INTTYPES_H 1)
454         set(HAVE_SYS_FILIO_H 1)
455 endif()
456
457 if(NOT IOS)
458         check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
459 else()
460         set(HAVE_TM_GMTOFF 1)
461 endif()
462
463 # Mac OS X
464 if(APPLE)
465         if(IOS)
466                 if (NOT FREERDP_IOS_EXTERNAL_SSL_PATH)
467                         message(STATUS "FREERDP_IOS_EXTERNAL_SSL_PATH not set! Required if openssl is not found in the iOS SDK (which usually isn't")
468                 endif()
469                 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_IOS_EXTERNAL_SSL_PATH})
470                 set_property(GLOBAL PROPERTY XCODE_ATTRIBUTE_SKIP_INSTALL YES)
471         else(IOS)
472                 if(NOT DEFINED CMAKE_OSX_ARCHITECTURES)
473                         set(CMAKE_OSX_ARCHITECTURES i386 x86_64)
474                 endif()
475
476                 if(IS_DIRECTORY /opt/local/include)
477                         include_directories(/opt/local/include)
478                         link_directories(/opt/local/lib)
479                 endif()
480         endif(IOS)
481
482 # Temporarily disabled, causes the cmake script to be reexecuted, causing the compilation to fail.
483 # Workaround: specify the parameter in the command-line
484 #       if(WITH_CLANG)
485 #               set(CMAKE_C_COMPILER "clang")
486 #       endif()
487
488         if (WITH_VERBOSE)
489                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -v")
490                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v")
491         endif()
492 endif(APPLE)
493
494 # OpenBSD
495 if(OPENBSD)
496         set(WITH_MANPAGES "ON")
497         set(WITH_ALSA "OFF")
498         set(WITH_PULSE "OFF")
499         set(WITH_OSS "ON")
500         set(WITH_WAYLAND "OFF")
501 endif()
502
503 # Android
504 if(ANDROID)
505         set(WITH_LIBRARY_VERSIONING "OFF")
506
507         set_property( GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ${ANDROID_LIBRARY_USE_LIB64_PATHS} )
508
509         if (${ANDROID_ABI} STREQUAL "armeabi")
510                 set (WITH_NEON OFF)
511         endif()
512
513         if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
514                 add_definitions(-DNDK_DEBUG=1)
515
516                 # NOTE: Manually add -gdwarf-3, as newer toolchains default to -gdwarf-4,
517                 #       which is not supported by the gdbserver binary shipped with
518                 #       the android NDK (tested with r9b)
519                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG} -gdwarf-3")
520         endif()
521         set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -llog")
522
523         if (NOT FREERDP_EXTERNAL_PATH)
524                 if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/")
525                         set (FREERDP_EXTERNAL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/")
526                 else()
527                         message(STATUS "FREERDP_EXTERNAL_PATH not set!")
528                 endif()
529         endif()
530
531         list (APPEND CMAKE_INCLUDE_PATH ${FREERDP_EXTERNAL_PATH}/include)
532         list (APPEND CMAKE_LIBRARY_PATH ${FREERDP_EXTERNAL_PATH}/${ANDROID_ABI}/ )
533         set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH )
534         set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH )
535
536         if (WITH_GPROF)
537                 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/gprof_generate.sh.cmake
538                         ${CMAKE_BINARY_DIR}/scripts/gprof_generate.sh @ONLY)
539         endif(WITH_GPROF)
540 endif()
541
542 set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
543
544 if(NOT IOS)
545         find_package(Threads REQUIRED)
546 endif()
547
548 if(NOT WIN32)
549         CHECK_SYMBOL_EXISTS(pthread_mutex_timedlock pthread.h HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
550         if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
551                 CHECK_LIBRARY_EXISTS(pthread pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
552         endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
553         if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
554                 CHECK_LIBRARY_EXISTS(pthreads pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
555         endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
556
557         if (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
558                 set(HAVE_PTHREAD_MUTEX_TIMEDLOCK ON)
559         endif (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
560 endif()
561
562 if(WITH_VALGRIND_MEMCHECK)
563         check_include_files(valgrind/memcheck.h HAVE_VALGRIND_MEMCHECK_H)
564 else()
565         unset(HAVE_VALGRIND_MEMCHECK_H CACHE)
566 endif()
567
568 if(UNIX OR CYGWIN)
569         check_include_files(sys/eventfd.h HAVE_AIO_H)
570         check_include_files(sys/eventfd.h HAVE_EVENTFD_H)
571         if (HAVE_EVENTFD_H)
572                 check_symbol_exists(eventfd_read sys/eventfd.h WITH_EVENTFD_READ_WRITE)
573         endif()
574         check_include_files(sys/timerfd.h HAVE_TIMERFD_H)
575         check_include_files(poll.h HAVE_POLL_H)
576         list(APPEND CMAKE_REQUIRED_LIBRARIES m)
577         check_symbol_exists(ceill math.h HAVE_MATH_C99_LONG_DOUBLE)
578         list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES m)
579         set(X11_FEATURE_TYPE "RECOMMENDED")
580         set(WAYLAND_FEATURE_TYPE "RECOMMENDED")
581 else()
582         set(X11_FEATURE_TYPE "DISABLED")
583         set(WAYLAND_FEATURE_TYPE "DISABLED")
584 endif()
585
586 if(WITH_PCSC_WINPR)
587         find_package(PCSCWinPR)
588 endif()
589
590 set(X11_FEATURE_PURPOSE "X11")
591 set(X11_FEATURE_DESCRIPTION "X11 client and server")
592
593 set(WAYLAND_FEATURE_PURPOSE "Wayland")
594 set(WAYLAND_FEATURE_DESCRIPTION "Wayland client")
595
596 set(DIRECTFB_FEATURE_TYPE "OPTIONAL")
597 set(DIRECTFB_FEATURE_PURPOSE "DirectFB")
598 set(DIRECTFB_FEATURE_DESCRIPTION "DirectFB client")
599
600 set(ZLIB_FEATURE_TYPE "REQUIRED")
601 set(ZLIB_FEATURE_PURPOSE "compression")
602 set(ZLIB_FEATURE_DESCRIPTION "data compression")
603
604 set(OPENSSL_FEATURE_TYPE "REQUIRED")
605 set(OPENSSL_FEATURE_PURPOSE "cryptography")
606 set(OPENSSL_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
607
608 set(MBEDTLS_FEATURE_TYPE "OPTIONAL")
609 set(MBEDTLS_FEATURE_PURPOSE "cryptography")
610 set(MBEDTLS_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
611
612 set(OPENSLES_FEATURE_TYPE "OPTIONAL")
613 set(OPENSLES_FEATURE_PURPOSE "multimedia")
614 set(OPENSLES_FEATURE_DESCRIPTION "OpenSLES audio / video")
615
616 set(OSS_FEATURE_TYPE "RECOMMENDED")
617 set(OSS_FEATURE_PURPOSE "sound")
618 set(OSS_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
619
620 set(ALSA_FEATURE_TYPE "RECOMMENDED")
621 set(ALSA_FEATURE_PURPOSE "sound")
622 set(ALSA_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
623
624 set(PULSE_FEATURE_TYPE "OPTIONAL")
625 set(PULSE_FEATURE_PURPOSE "sound")
626 set(PULSE_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
627
628 set(CUPS_FEATURE_TYPE "OPTIONAL")
629 set(CUPS_FEATURE_PURPOSE "printing")
630 set(CUPS_FEATURE_DESCRIPTION "printer device redirection")
631
632 set(PCSC_FEATURE_TYPE "OPTIONAL")
633 set(PCSC_FEATURE_PURPOSE "smart card")
634 set(PCSC_FEATURE_DESCRIPTION "smart card device redirection")
635
636 set(FFMPEG_FEATURE_TYPE "RECOMMENDED")
637 set(FFMPEG_FEATURE_PURPOSE "multimedia")
638 set(FFMPEG_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
639
640 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
641 set(GSTREAMER_0_10_FEATURE_PURPOSE "multimedia")
642 set(GSTREAMER_0_10_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback, gstreamer 0.10 version")
643
644 set(GSTREAMER_1_0_FEATURE_TYPE "RECOMMENDED")
645 set(GSTREAMER_1_0_FEATURE_PURPOSE "multimedia")
646 set(GSTREAMER_1_0_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
647
648 set(IPP_FEATURE_TYPE "OPTIONAL")
649 set(IPP_FEATURE_PURPOSE "performance")
650 set(IPP_FEATURE_DESCRIPTION "Intel Integrated Performance Primitives library")
651
652 set(JPEG_FEATURE_TYPE "OPTIONAL")
653 set(JPEG_FEATURE_PURPOSE "codec")
654 set(JPEG_FEATURE_DESCRIPTION "use JPEG library")
655
656 set(X264_FEATURE_TYPE "OPTIONAL")
657 set(X264_FEATURE_PURPOSE "codec")
658 set(X264_FEATURE_DESCRIPTION "use x264 library")
659
660 set(OPENH264_FEATURE_TYPE "OPTIONAL")
661 set(OPENH264_FEATURE_PURPOSE "codec")
662 set(OPENH264_FEATURE_DESCRIPTION "use OpenH264 library")
663
664 set(KRB5_FEATURE_TYPE "OPTIONAL")
665 set(KRB5_FEATURE_PURPOSE "auth")
666 set(KRB5_FEATURE_DESCRIPTION "add kerberos support")
667
668 set(GSM_FEATURE_TYPE "OPTIONAL")
669 set(GSM_FEATURE_PURPOSE "codec")
670 set(GSM_FEATURE_DESCRIPTION "GSM audio codec library")
671
672 if(WIN32)
673         set(X11_FEATURE_TYPE "DISABLED")
674         set(WAYLAND_FEATURE_TYPE "DISABLED")
675         set(ZLIB_FEATURE_TYPE "DISABLED")
676         set(DIRECTFB_FEATURE_TYPE "DISABLED")
677         set(OSS_FEATURE_TYPE "DISABLED")
678         set(ALSA_FEATURE_TYPE "DISABLED")
679         set(PULSE_FEATURE_TYPE "DISABLED")
680         set(CUPS_FEATURE_TYPE "DISABLED")
681         set(PCSC_FEATURE_TYPE "DISABLED")
682         set(FFMPEG_FEATURE_TYPE "DISABLED")
683         set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
684         set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
685         set(OPENSLES_FEATURE_TYPE "DISABLED")
686 endif()
687
688 if(APPLE)
689         set(DIRECTFB_FEATURE_TYPE "DISABLED")
690         set(FFMPEG_FEATURE_TYPE "OPTIONAL")
691         set(GSTREAMER_1_0_FEATURE_TYPE "OPTIONAL")
692         set(X11_FEATURE_TYPE "OPTIONAL")
693         set(WAYLAND_FEATURE_TYPE "DISABLED")
694         set(OSS_FEATURE_TYPE "DISABLED")
695         set(ALSA_FEATURE_TYPE "DISABLED")
696         if(IOS)
697                 set(X11_FEATURE_TYPE "DISABLED")
698                 set(PULSE_FEATURE_TYPE "DISABLED")
699                 set(CUPS_FEATURE_TYPE "DISABLED")
700                 set(PCSC_FEATURE_TYPE "DISABLED")
701                 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
702                 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
703         endif()
704         set(OPENSLES_FEATURE_TYPE "DISABLED")
705 endif()
706
707 if(UNIX AND NOT ANDROID)
708         set(WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE "RECOMMENDED")
709         set(WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE "systemd journal appender")
710         set(WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION "allows to export wLog to systemd journal")
711
712         #include(Findlibsystemd)
713         find_feature(libsystemd ${WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION})
714
715         if(LIBSYSTEMD_FOUND)
716                 set(HAVE_JOURNALD_H TRUE)
717         else()
718                 unset(HAVE_JOURNALD_H)
719         endif()
720 endif(UNIX AND NOT ANDROID)
721
722 if(ANDROID)
723         set(X11_FEATURE_TYPE "DISABLED")
724         set(WAYLAND_FEATURE_TYPE "DISABLED")
725         set(DIRECTFB_FEATURE_TYPE "DISABLED")
726         set(OSS_FEATURE_TYPE "DISABLED")
727         set(ALSA_FEATURE_TYPE "DISABLED")
728         set(PULSE_FEATURE_TYPE "DISABLED")
729         set(CUPS_FEATURE_TYPE "DISABLED")
730         set(PCSC_FEATURE_TYPE "DISABLED")
731         set(FFMPEG_FEATURE_TYPE "DISABLED")
732         set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
733         set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
734         set(OPENSLES_FEATURE_TYPE "REQUIRED")
735 endif()
736
737 find_feature(X11 ${X11_FEATURE_TYPE} ${X11_FEATURE_PURPOSE} ${X11_FEATURE_DESCRIPTION})
738 find_feature(Wayland ${WAYLAND_FEATURE_TYPE} ${WAYLAND_FEATURE_PURPOSE} ${WAYLAND_FEATURE_DESCRIPTION})
739 find_feature(DirectFB ${DIRECTFB_FEATURE_TYPE} ${DIRECTFB_FEATURE_PURPOSE} ${DIRECTFB_FEATURE_DESCRIPTION})
740 if (${WITH_DIRECTFB})
741         message(WARNING "DIRECTFB is orphaned and not maintained see docs/README.directfb for details")
742 endif()
743
744 find_feature(ZLIB ${ZLIB_FEATURE_TYPE} ${ZLIB_FEATURE_PURPOSE} ${ZLIB_FEATURE_DESCRIPTION})
745 find_feature(OpenSSL ${OPENSSL_FEATURE_TYPE} ${OPENSSL_FEATURE_PURPOSE} ${OPENSSL_FEATURE_DESCRIPTION})
746 find_feature(MbedTLS ${MBEDTLS_FEATURE_TYPE} ${MBEDTLS_FEATURE_PURPOSE} ${MBEDTLS_FEATURE_DESCRIPTION})
747 find_feature(OpenSLES ${OPENSLES_FEATURE_TYPE} ${OPENSLES_FEATURE_PURPOSE} ${OPENSLES_FEATURE_DESCRIPTION})
748
749 find_feature(OSS ${OSS_FEATURE_TYPE} ${OSS_FEATURE_PURPOSE} ${OSS_FEATURE_DESCRIPTION})
750 find_feature(ALSA ${ALSA_FEATURE_TYPE} ${ALSA_FEATURE_PURPOSE} ${ALSA_FEATURE_DESCRIPTION})
751 find_feature(Pulse ${PULSE_FEATURE_TYPE} ${PULSE_FEATURE_PURPOSE} ${PULSE_FEATURE_DESCRIPTION})
752
753 find_feature(Cups ${CUPS_FEATURE_TYPE} ${CUPS_FEATURE_PURPOSE} ${CUPS_FEATURE_DESCRIPTION})
754 find_feature(PCSC ${PCSC_FEATURE_TYPE} ${PCSC_FEATURE_PURPOSE} ${PCSC_FEATURE_DESCRIPTION})
755
756 find_feature(FFmpeg ${FFMPEG_FEATURE_TYPE} ${FFMPEG_FEATURE_PURPOSE} ${FFMPEG_FEATURE_DESCRIPTION})
757
758 find_feature(GStreamer_0_10 ${GSTREAMER_0_10_FEATURE_TYPE} ${GSTREAMER_0_10_FEATURE_PURPOSE} ${GSTREAMER_0_10_FEATURE_DESCRIPTION})
759 find_feature(GStreamer_1_0 ${GSTREAMER_1_0_FEATURE_TYPE} ${GSTREAMER_1_0_FEATURE_PURPOSE} ${GSTREAMER_1_0_FEATURE_DESCRIPTION})
760
761 find_feature(JPEG ${JPEG_FEATURE_TYPE} ${JPEG_FEATURE_PURPOSE} ${JPEG_FEATURE_DESCRIPTION})
762 find_feature(x264 ${X264_FEATURE_TYPE} ${X264_FEATURE_PURPOSE} ${X264_FEATURE_DESCRIPTION})
763 find_feature(OpenH264 ${OPENH264_FEATURE_TYPE} ${OPENH264_FEATURE_PURPOSE} ${OPENH264_FEATURE_DESCRIPTION})
764 find_feature(GSM ${GSM_FEATURE_TYPE} ${GSM_FEATURE_PURPOSE} ${GSM_FEATURE_DESCRIPTION})
765 find_feature(KRB5 ${KRB5_FEATURE_TYPE} ${KRB5_FEATURE_PURPOSE} ${KRB5_FEATURE_DESCRIPTION})
766
767 if(TARGET_ARCH MATCHES "x86|x64")
768         if (NOT APPLE)
769                 # Intel Performance Primitives
770                 find_feature(IPP ${IPP_FEATURE_TYPE} ${IPP_FEATURE_PURPOSE} ${IPP_FEATURE_DESCRIPTION})
771         endif()
772 endif()
773
774 if(OPENSSL_FOUND)
775         add_definitions("-DWITH_OPENSSL")
776         message(STATUS "Using OpenSSL Version: ${OPENSSL_VERSION}")
777 endif()
778
779 if(MBEDTLS_FOUND)
780         add_definitions("-DWITH_MBEDTLS")
781 endif()
782
783 if (TARGET_ARCH MATCHES "sparc")
784         set(HAVE_ALIGNED_REQUIRED 1)
785 endif()
786
787 # Android expects all libraries to be loadable
788 # without paths.
789 if (ANDROID)
790         set(FREERDP_DATA_PATH "share")
791         set(FREERDP_INSTALL_PREFIX ".")
792         set(FREERDP_LIBRARY_PATH ".")
793         set(FREERDP_PLUGIN_PATH ".")
794         set(FREERDP_ADDIN_PATH ".")
795 else (ANDROID)
796         set(FREERDP_DATA_PATH "${CMAKE_INSTALL_PREFIX}/share/freerdp${FREERDP_VERSION_MAJOR}")
797         set(FREERDP_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
798         set(FREERDP_LIBRARY_PATH "${CMAKE_INSTALL_LIBDIR}")
799         set(FREERDP_PLUGIN_PATH "${CMAKE_INSTALL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}")
800         set(FREERDP_ADDIN_PATH "${FREERDP_PLUGIN_PATH}")
801 endif(ANDROID)
802
803 # Path to put extensions
804 set(FREERDP_EXTENSION_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}/extensions")
805
806 # Include directories
807 include_directories(${CMAKE_CURRENT_BINARY_DIR})
808 include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
809 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
810
811 # Configure files
812 add_definitions("-DHAVE_CONFIG_H")
813 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
814
815 # RPATH configuration
816 if(CMAKE_SKIP_RPATH)
817         set(CMAKE_SKIP_RPATH FALSE)
818         set(CMAKE_SKIP_INSTALL_RPATH TRUE)
819 endif()
820 set(CMAKE_SKIP_BUILD_RPATH FALSE)
821 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
822 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
823 set(CMAKE_INSTALL_RPATH "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}:\$ORIGIN/..")
824
825 if (BUILD_SHARED_LIBS)
826         set(CMAKE_MACOSX_RPATH ON)
827 endif()
828
829 # Android profiling
830 if(ANDROID)
831         if(WITH_GPROF)
832                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
833                 set(PROFILER_LIBRARIES
834                         "${FREERDP_EXTERNAL_PROFILER_PATH}/obj/local/${ANDROID_ABI}/libandroid-ndk-profiler.a")
835                 include_directories("${FREERDP_EXTERNAL_PROFILER_PATH}")
836         endif()
837 endif()
838
839 # Unit Tests
840
841 include(CTest)
842
843 if(BUILD_TESTING)
844         enable_testing()
845
846         if(MSVC)
847                 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
848         else()
849                 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Testing")
850         endif()
851 endif()
852
853 # WinPR
854 include_directories("${CMAKE_SOURCE_DIR}/winpr/include")
855 include_directories("${CMAKE_BINARY_DIR}/winpr/include")
856
857 if (${CMAKE_VERSION} VERSION_LESS 2.8.12)
858         set(PUBLIC_KEYWORD "")
859         set(PRIVATE_KEYWORD "")
860 else()
861         set(PUBLIC_KEYWORD "PUBLIC")
862         set(PRIVATE_KEYWORD "PRIVATE")
863 endif()
864
865 add_subdirectory(winpr)
866
867 # Sub-directories
868
869 if(WITH_THIRD_PARTY)
870         add_subdirectory(third-party)
871         if (NOT "${THIRD_PARTY_INCLUDES}" STREQUAL "")
872                 include_directories(${THIRD_PARTY_INCLUDES})
873         endif()
874 endif()
875
876 add_subdirectory(include)
877
878 add_subdirectory(libfreerdp)
879
880 if (IOS)
881         set(CMAKE_OSX_DEPLOYMENT_TARGET "")
882         if (IOS_PLATFORM MATCHES "SIMULATOR")
883                 set(CMAKE_OSX_SYSROOT "iphonesimulator")
884         else()
885                 set(CMAKE_OSX_SYSROOT "iphoneos")
886         endif()
887 endif()
888
889 # RdTk
890 include_directories("${CMAKE_SOURCE_DIR}/rdtk/include")
891 include_directories("${CMAKE_BINARY_DIR}/rdtk/include")
892
893 add_subdirectory(rdtk)
894
895 if(WAYLAND_FOUND)
896         add_subdirectory(uwac)
897 endif()
898
899 if(BSD)
900         if(IS_DIRECTORY /usr/local/include)
901                 include_directories(/usr/local/include)
902                 link_directories(/usr/local/lib)
903         endif()
904         if(OPENBSD)
905                 if(IS_DIRECTORY /usr/X11R6/include)
906                         include_directories(/usr/X11R6/include)
907                 endif()
908         endif()
909 endif()
910
911 if(WITH_CHANNELS)
912         add_subdirectory(channels)
913 endif()
914
915 if(WITH_CLIENT_COMMON OR WITH_CLIENT)
916 add_subdirectory(client)
917 endif()
918
919 if(WITH_SERVER)
920         add_subdirectory(server)
921 endif()
922
923 # Packaging
924
925 set(CMAKE_CPACK_INCLUDE_FILE "CMakeCPack.cmake")
926
927 if(NOT (VENDOR MATCHES "FreeRDP"))
928         if(DEFINED CLIENT_VENDOR_PATH)
929                 if(EXISTS "${CMAKE_SOURCE_DIR}/${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
930                         set(CMAKE_CPACK_INCLUDE_FILE "${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
931                 endif()
932         endif()
933 endif()
934
935 #message("VENDOR: ${VENDOR} CLIENT_VENDOR_PATH: ${CLIENT_VENDOR_PATH} CMAKE_CPACK_INCLUDE_FILE: ${CMAKE_CPACK_INCLUDE_FILE}")
936
937 include(${CMAKE_CPACK_INCLUDE_FILE})
938
939 set(FREERDP_BUILD_CONFIG_LIST "")
940 GET_CMAKE_PROPERTY(res VARIABLES)
941 FOREACH(var ${res})
942         IF (var MATCHES "^WITH_*|^BUILD_TESTING|^BUILTIN_CHANNELS|^HAVE_*")
943                 LIST(APPEND FREERDP_BUILD_CONFIG_LIST "${var}=${${var}}")
944         ENDIF()
945 ENDFOREACH()
946 string(REPLACE ";" " " FREERDP_BUILD_CONFIG "${FREERDP_BUILD_CONFIG_LIST}")
947 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/buildflags.h.in ${CMAKE_CURRENT_BINARY_DIR}/buildflags.h)