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