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