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