libfreerdp-core: alternative RDG BIO 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 # Check for cmake compatibility (enable/disable features)
45 include(CheckCmakeCompat)
46
47 # Include cmake modules
48 include(CheckIncludeFiles)
49 include(CheckLibraryExists)
50 include(CheckSymbolExists)
51 include(CheckStructHasMember)
52 include(FindPkgConfig)
53 include(TestBigEndian)
54
55 include(FindFeature)
56 include(AutoVersioning)
57 include(ConfigOptions)
58 include(ComplexLibrary)
59 include(FeatureSummary)
60 include(CheckCCompilerFlag)
61 include(CheckCXXCompilerFlag)
62 include(GNUInstallDirsWrapper)
63 include(CMakePackageConfigHelpers)
64
65 # Soname versioning
66 set(BUILD_NUMBER 0)
67 if ($ENV{BUILD_NUMBER})
68   set(BUILD_NUMBER $ENV{BUILD_NUMBER})
69 endif()
70 set(WITH_LIBRARY_VERSIONING "ON")
71 set(FREERDP_VERSION_MAJOR "1")
72 set(FREERDP_VERSION_MINOR "2")
73 set(FREERDP_VERSION_REVISION "5")
74 set(FREERDP_VERSION_SUFFIX "dev")
75 set(FREERDP_API_VERSION "${FREERDP_VERSION_MAJOR}.${FREERDP_VERSION_MINOR}")
76 set(FREERDP_VERSION "${FREERDP_API_VERSION}.${FREERDP_VERSION_REVISION}")
77 if (FREERDP_VERSION_SUFFIX)
78         set(FREERDP_VERSION_FULL "${FREERDP_VERSION}-${FREERDP_VERSION_SUFFIX}")
79 else()
80         set(FREERDP_VERSION_FULL "${FREERDP_VERSION}")
81 endif()
82
83 # Allow to search the host machine for git
84 if(ANDROID OR IOS)
85         SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
86 endif(ANDROID OR IOS)
87 include(GetGitRevisionDescription)
88 git_get_exact_tag(GIT_REVISION --tags --always)
89 if (${GIT_REVISION} STREQUAL "n/a")
90   git_rev_parse(GIT_REVISION --short)
91 endif()
92 if(ANDROID OR IOS)
93     SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
94 endif(ANDROID OR IOS)
95
96 message(STATUS "Git Revision ${GIT_REVISION}")
97
98 # Turn on solution folders (2.8.4+)
99 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
100
101 # Default to release build type
102 if(NOT CMAKE_BUILD_TYPE)
103         set(CMAKE_BUILD_TYPE "Release")
104 endif()
105
106 if(NOT DEFINED BUILD_SHARED_LIBS)
107         if(ANDROID OR IOS OR APPLE)
108                 set(BUILD_SHARED_LIBS OFF)
109         else()
110                 set(BUILD_SHARED_LIBS ON)
111         endif()
112 endif()
113
114 if(NOT DEFINED EXPORT_ALL_SYMBOLS)
115         set(EXPORT_ALL_SYMBOLS TRUE)
116 endif()
117
118 # BSD
119 if(${CMAKE_SYSTEM_NAME} MATCHES "BSD")
120         set(BSD TRUE)
121         if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
122                 set(FREEBSD TRUE)
123         endif()
124         if(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
125                 set(OPENBSD TRUE)
126         endif()
127 endif()
128
129 # Configure MSVC Runtime
130 if(MSVC)
131         include(MSVCRuntime)
132         if(NOT DEFINED MSVC_RUNTIME)
133                 set(MSVC_RUNTIME "dynamic")
134         endif()
135         if(${MSVC_RUNTIME} STREQUAL "static")
136                 message(STATUS "Use the MSVC static runtime option carefully!")
137                 message(STATUS "OpenSSL uses /MD by default, and is very picky")
138                 message(STATUS "Random freeing errors are a common sign of runtime issues")
139         endif()
140         configure_msvc_runtime()
141
142         if(NOT DEFINED CMAKE_SUPPRESS_REGENERATION)
143                 set(CMAKE_SUPPRESS_REGENERATION ON)
144         endif()
145 endif()
146
147 # Compiler-specific flags
148 if(CMAKE_COMPILER_IS_GNUCC)
149         if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "i686")
150                 CHECK_SYMBOL_EXISTS(__x86_64__ "" IS_X86_64)
151                 if(IS_X86_64)
152                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
153                 else()
154                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686")
155                 endif()
156         else()
157                 if(CMAKE_POSITION_INDEPENDENT_CODE)
158                         if(${CMAKE_VERSION} VERSION_LESS 2.8.9)
159                                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
160                         endif()
161                 endif()
162         endif()
163
164         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
165
166         CHECK_C_COMPILER_FLAG (-Wno-unused-result Wno-unused-result)
167         if(Wno-unused-result)
168                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-result")
169         endif()
170         CHECK_C_COMPILER_FLAG (-Wno-unused-but-set-variable Wno-unused-but-set-variable)
171         if(Wno-unused-but-set-variable)
172                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-but-set-variable")
173         endif()
174         CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
175         if(Wno-deprecated-declarations)
176                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
177         endif()
178         CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
179         if(Wno-deprecated-declarationsCXX)
180                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
181         endif()
182
183         if(NOT EXPORT_ALL_SYMBOLS)
184                 message(STATUS "GCC default symbol visibility: hidden")
185                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
186         endif()
187         if(BUILD_TESTING)
188                 CHECK_C_COMPILER_FLAG(-Wno-format Wno-format)
189                 if(Wno-format)
190                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format")
191                 endif()
192         endif()
193         CHECK_C_COMPILER_FLAG (-Wimplicit-function-declaration Wimplicit-function-declaration)
194         if(Wimplicit-function-declaration)
195                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wimplicit-function-declaration")
196         endif()
197
198         if (NOT OPENBSD)
199                 CHECK_C_COMPILER_FLAG (-Wredundant-decls Wredundant-decls)
200                 if(Wredundant-decls)
201                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
202                 endif()
203         endif()
204         if(CMAKE_BUILD_TYPE STREQUAL "Release")
205                 set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG")
206                 set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG")
207                 if(NOT OPENBSD)
208                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2")
209                         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2")
210                 endif()
211
212                 CHECK_C_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefined)
213                 if(Wno-builtin-macro-redefined)
214                         set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Wno-builtin-macro-redefined")
215                         set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -D__FILE__='\"$(subst ${CMAKE_BINARY_DIR}/,,$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<)))\"'")
216                 endif()
217
218                 CHECK_CXX_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefinedCXX)
219                 if(Wno-builtin-macro-redefinedCXX)
220                         set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wno-builtin-macro-redefined")
221                         set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -D__FILE__='\"$(subst ${CMAKE_BINARY_DIR}/,,$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<)))\"'")
222                 endif()
223         else()
224                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
225                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
226         endif()
227         if(WITH_SSE2)
228                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2")
229         endif()
230 endif()
231
232 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
233         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
234         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-macros -Wno-padded")
235         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-c11-extensions -Wno-gnu")
236         if(WITH_SSE2)
237                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mssse3")
238         endif()
239         CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
240         if(Wno-deprecated-declarations)
241                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
242         endif()
243         CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
244         if(Wno-deprecated-declarationsCXX)
245                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
246         endif()
247 endif()
248
249 if(MSVC)
250         # Remove previous warning definitions,
251         # NMake is otherwise complaining.
252         foreach (flags_var_to_scrub
253                 CMAKE_C_FLAGS
254                 CMAKE_CXX_FLAGS
255                 CMAKE_CXX_FLAGS_RELEASE
256                 CMAKE_CXX_FLAGS_RELWITHDEBINFO
257                 CMAKE_CXX_FLAGS_MINSIZEREL
258                 CMAKE_C_FLAGS_RELEASE
259                 CMAKE_C_FLAGS_RELWITHDEBINFO
260                 CMAKE_C_FLAGS_MINSIZEREL)
261                 string (REGEX REPLACE "(^| )[/-]W[ ]*[1-9]" " "
262                 "${flags_var_to_scrub}" "${${flags_var_to_scrub}}")
263         endforeach()
264
265         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gd")
266         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
267
268         if(CMAKE_SIZEOF_VOID_P EQUAL 8)
269                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_AMD64_")
270         else()
271                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_X86_")
272         endif()
273
274         set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
275         set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})
276
277         if(CMAKE_BUILD_TYPE STREQUAL "Release")
278         else()
279                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Zi")
280                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi")
281         endif()
282
283 endif()
284
285 if(WIN32)
286         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUNICODE -D_UNICODE")
287         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_SECURE_NO_WARNINGS")
288         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWIN32_LEAN_AND_MEAN")
289
290   # Set product and vendor for dll and exe version information.
291   set(RC_VERSION_VENDOR ${VENDOR})
292   set(RC_VERSION_PRODUCT ${PRODUCT})
293   set(RC_VERSION_PATCH ${BUILD_NUMBER})
294   set(RC_VERSION_DESCRIPTION ${GIT_REVISION})
295
296   string(TIMESTAMP RC_VERSION_YEAR "%Y")
297
298         if(NOT DEFINED CMAKE_WINDOWS_VERSION)
299                 set(CMAKE_WINDOWS_VERSION "WINXP")
300         endif()
301
302         if(CMAKE_WINDOWS_VERSION STREQUAL "WINXP")
303                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0501 -DWIN32_WINNT=0x0501")
304                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0501 -DWIN32_WINNT=0x0501")
305         elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN7")
306                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0601 -DWIN32_WINNT=0x0601")
307                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0601 -DWIN32_WINNT=0x0601")
308         elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN8")
309                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0602 -DWIN32_WINNT=0x0602")
310                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0602 -DWIN32_WINNT=0x0602")
311         endif()
312
313         if (FREERDP_EXTERNAL_SSL_PATH)
314                 set(OPENSSL_ROOT_DIR ${FREERDP_EXTERNAL_SSL_PATH})
315         endif()
316 endif()
317
318 if(IOS)
319         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_IOS_SDK_ROOT} -g")
320 endif()
321
322 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINPR_EXPORTS -DFREERDP_EXPORTS")
323 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINPR_EXPORTS -DFREERDP_EXPORTS")
324
325 # Include files
326 if(NOT IOS)
327         check_include_files(fcntl.h HAVE_FCNTL_H)
328         check_include_files(unistd.h HAVE_UNISTD_H)
329         check_include_files(execinfo.h HAVE_EXECINFO_H)
330         check_include_files(stdint.h HAVE_STDINT_H)
331         check_include_files(inttypes.h HAVE_INTTYPES_H)
332         check_include_files(sys/modem.h HAVE_SYS_MODEM_H)
333         check_include_files(sys/filio.h HAVE_SYS_FILIO_H)
334         check_include_files(sys/sockio.h HAVE_SYS_SOCKIO_H)
335         check_include_files(sys/strtio.h HAVE_SYS_STRTIO_H)
336         check_include_files(sys/select.h HAVE_SYS_SELECT_H)
337 else()
338         set(HAVE_FCNTL_H 1)
339         set(HAVE_UNISTD_H 1)
340         set(HAVE_STDINT_H 1)
341         set(HAVE_INTTYPES_H 1)
342         set(HAVE_SYS_FILIO_H 1)
343 endif()
344
345 if(NOT IOS)
346         check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
347 else()
348         set(HAVE_TM_GMTOFF 1)
349 endif()
350
351 # Mac OS X
352 if(APPLE)
353         if(IOS)
354                 if (NOT FREERDP_IOS_EXTERNAL_SSL_PATH)
355                         message(STATUS "FREERDP_IOS_EXTERNAL_SSL_PATH not set! Required if openssl is not found in the iOS SDK (which usually isn't")
356                 endif()
357                 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_IOS_EXTERNAL_SSL_PATH})
358                 set_property(GLOBAL PROPERTY XCODE_ATTRIBUTE_SKIP_INSTALL YES)
359         else(IOS)
360                 if(NOT DEFINED CMAKE_OSX_ARCHITECTURES)
361                         set(CMAKE_OSX_ARCHITECTURES i386 x86_64)
362                 endif()
363
364                 if(IS_DIRECTORY /opt/local/include)
365                         include_directories(/opt/local/include)
366                         link_directories(/opt/local/lib)
367                 endif()
368         endif(IOS)
369
370 # Temporarily disabled, causes the cmake script to be reexecuted, causing the compilation to fail.
371 # Workaround: specify the parameter in the command-line
372 #        if(WITH_CLANG)
373 #                set(CMAKE_C_COMPILER "clang")
374 #        endif()
375
376         if (WITH_VERBOSE)
377                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -v")
378                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v")
379         endif()
380 endif(APPLE)
381
382 # OpenBSD
383 if(OPENBSD)
384         set(WITH_MANPAGES "ON")
385         set(WITH_ALSA "OFF")
386         set(WITH_PULSE "ON")
387         set(WITH_WAYLAND "OFF")
388 endif()
389
390 # Android
391 if(ANDROID)
392   set(WITH_LIBRARY_VERSIONING "OFF")
393
394         if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
395                 add_definitions(-DNDK_DEBUG=1)
396
397                 # NOTE: Manually add -gdwarf-3, as newer toolchains default to -gdwarf-4,
398                 #       which is not supported by the gdbserver binary shipped with
399                 #       the android NDK (tested with r9b)
400                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG} -gdwarf-3")
401         endif()
402         set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -llog")
403
404         if (NOT FREERDP_EXTERNAL_JPEG_PATH)
405                 if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/jpeg8d")
406                         set(FREERDP_EXTERNAL_JPEG_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/jpeg8d")
407                 else()
408                         message(STATUS "FREERDP_EXTERNAL_SSL_PATH not set! - Needs to be set if openssl is not found in the android NDK (which usually isn't)")
409                 endif()
410         endif()
411         if (NOT FREERDP_EXTERNAL_SSL_PATH)
412                 if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/openssl")
413                         set(FREERDP_EXTERNAL_SSL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/openssl")
414                 else()
415                         message(STATUS "FREERDP_EXTERNAL_SSL_PATH not set! - Needs to be set if openssl is not found in the android NDK (which usually isn't)")
416                 endif()
417                 if(WITH_GPROF)
418                         if (NOT FREERDP_EXTERNAL_PROFILER_PATH)
419                         if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/android-ndk-profiler")
420                                 set(FREERDP_EXTERNAL_PROFILER_PATH
421                                         "${CMAKE_CURRENT_SOURCE_DIR}/external/android-ndk-profiler")
422                         else()
423                                 message(STATUS "FREERDP_EXTERNAL_PROFILER_PATH not set!")
424                         endif()
425                 endif()
426         endif()
427 endif()
428 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_EXTERNAL_SSL_PATH} ${FREERDP_EXTERNAL_JPEG_PATH})
429 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_EXTERNAL_PROFILER_PATH})
430
431         set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/client/Android/FreeRDPCore/jni/${ANDROID_ABI})
432         CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/regenerate_jni_headers.sh.cmake
433                 ${CMAKE_BINARY_DIR}/scripts/regenerate_jni_headers.sh @ONLY)
434         if (WITH_GPROF)
435                 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/gprof_generate.sh.cmake ${CMAKE_BINARY_DIR}/scripts/gprof_generate.sh @ONLY)
436         endif(WITH_GPROF)
437
438 endif()
439
440 set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
441
442 if(NOT IOS AND NOT ANDROID)
443         find_package(Threads REQUIRED)
444 endif()
445
446 if(NOT WIN32)
447         check_library_exists(pthread pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK)
448 endif()
449
450 if(WITH_VALGRIND_MEMCHECK)
451     check_include_files(valgrind/memcheck.h HAVE_VALGRIND_MEMCHECK_H)
452 else()
453     unset(HAVE_VALGRIND_MEMCHECK_H CACHE)
454 endif()
455
456 if(UNIX OR CYGWIN)
457         check_include_files(sys/eventfd.h HAVE_AIO_H)
458         check_include_files(sys/eventfd.h HAVE_EVENTFD_H)
459         if (HAVE_EVENTFD_H)
460                 check_symbol_exists(eventfd_read sys/eventfd.h WITH_EVENTFD_READ_WRITE)
461         endif()
462         check_include_files(sys/timerfd.h HAVE_TIMERFD_H)
463         check_include_files(poll.h HAVE_POLL_H)
464         list(APPEND CMAKE_REQUIRED_LIBRARIES m)
465         check_symbol_exists(ceill math.h HAVE_MATH_C99_LONG_DOUBLE)
466         list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES m)
467         set(X11_FEATURE_TYPE "RECOMMENDED")
468         set(WAYLAND_FEATURE_TYPE "RECOMMENDED")
469 else()
470         set(X11_FEATURE_TYPE "DISABLED")
471         set(WAYLAND_FEATURE_TYPE "DISABLED")
472 endif()
473
474 if(WITH_PCSC_WINPR)
475         find_package(PCSCWinPR)
476 endif()
477
478 set(X11_FEATURE_PURPOSE "X11")
479 set(X11_FEATURE_DESCRIPTION "X11 client and server")
480
481 set(WAYLAND_FEATURE_PURPOSE "Wayland")
482 set(WAYLAND_FEATURE_DESCRIPTION "Wayland client")
483
484 set(DIRECTFB_FEATURE_TYPE "OPTIONAL")
485 set(DIRECTFB_FEATURE_PURPOSE "DirectFB")
486 set(DIRECTFB_FEATURE_DESCRIPTION "DirectFB client")
487
488 set(ZLIB_FEATURE_TYPE "REQUIRED")
489 set(ZLIB_FEATURE_PURPOSE "compression")
490 set(ZLIB_FEATURE_DESCRIPTION "data compression")
491
492 set(OPENSSL_FEATURE_TYPE "REQUIRED")
493 set(OPENSSL_FEATURE_PURPOSE "cryptography")
494 set(OPENSSL_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
495
496 set(OPENSLES_FEATURE_TYPE "OPTIONAL")
497 set(OPENSLES_FEATURE_PURPOSE "multimedia")
498 set(OPENSLES_FEATURE_DESCRIPTION "OpenSLES audio / video")
499
500 set(OSS_FEATURE_TYPE "RECOMMENDED")
501 set(OSS_FEATURE_PURPOSE "sound")
502 set(OSS_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
503
504 set(ALSA_FEATURE_TYPE "RECOMMENDED")
505 set(ALSA_FEATURE_PURPOSE "sound")
506 set(ALSA_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
507
508 set(PULSE_FEATURE_TYPE "OPTIONAL")
509 set(PULSE_FEATURE_PURPOSE "sound")
510 set(PULSE_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
511
512 set(CUPS_FEATURE_TYPE "OPTIONAL")
513 set(CUPS_FEATURE_PURPOSE "printing")
514 set(CUPS_FEATURE_DESCRIPTION "printer device redirection")
515
516 set(PCSC_FEATURE_TYPE "OPTIONAL")
517 set(PCSC_FEATURE_PURPOSE "smart card")
518 set(PCSC_FEATURE_DESCRIPTION "smart card device redirection")
519
520 set(FFMPEG_FEATURE_TYPE "RECOMMENDED")
521 set(FFMPEG_FEATURE_PURPOSE "multimedia")
522 set(FFMPEG_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
523
524 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
525 set(GSTREAMER_0_10_FEATURE_PURPOSE "multimedia")
526 set(GSTREAMER_0_10_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback, gstreamer 0.10 version")
527
528 set(GSTREAMER_1_0_FEATURE_TYPE "RECOMMENDED")
529 set(GSTREAMER_1_0_FEATURE_PURPOSE "multimedia")
530 set(GSTREAMER_1_0_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
531
532 set(IPP_FEATURE_TYPE "OPTIONAL")
533 set(IPP_FEATURE_PURPOSE "performance")
534 set(IPP_FEATURE_DESCRIPTION "Intel Integrated Performance Primitives library")
535
536 set(JPEG_FEATURE_TYPE "OPTIONAL")
537 set(JPEG_FEATURE_PURPOSE "codec")
538 set(JPEG_FEATURE_DESCRIPTION "use JPEG library")
539
540 set(X264_FEATURE_TYPE "OPTIONAL")
541 set(X264_FEATURE_PURPOSE "codec")
542 set(X264_FEATURE_DESCRIPTION "use x264 library")
543
544 set(OPENH264_FEATURE_TYPE "OPTIONAL")
545 set(OPENH264_FEATURE_PURPOSE "codec")
546 set(OPENH264_FEATURE_DESCRIPTION "use OpenH264 library")
547
548 set(GSM_FEATURE_TYPE "OPTIONAL")
549 set(GSM_FEATURE_PURPOSE "codec")
550 set(GSM_FEATURE_DESCRIPTION "GSM audio codec library")
551
552 if(WIN32)
553         set(X11_FEATURE_TYPE "DISABLED")
554         set(WAYLAND_FEATURE_TYPE "DISABLED")
555         set(ZLIB_FEATURE_TYPE "DISABLED")
556         set(DIRECTFB_FEATURE_TYPE "DISABLED")
557         set(OSS_FEATURE_TYPE "DISABLED")
558         set(ALSA_FEATURE_TYPE "DISABLED")
559         set(PULSE_FEATURE_TYPE "DISABLED")
560         set(CUPS_FEATURE_TYPE "DISABLED")
561         set(PCSC_FEATURE_TYPE "DISABLED")
562         set(FFMPEG_FEATURE_TYPE "DISABLED")
563         set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
564         set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
565         set(OPENSLES_FEATURE_TYPE "DISABLED")
566 endif()
567
568 if(APPLE)
569         set(DIRECTFB_FEATURE_TYPE "DISABLED")
570         set(FFMPEG_FEATURE_TYPE "OPTIONAL")
571         set(GSTREAMER_1_0_FEATURE_TYPE "OPTIONAL")
572         set(X11_FEATURE_TYPE "OPTIONAL")
573         set(WAYLAND_FEATURE_TYPE "DISABLED")
574         set(OSS_FEATURE_TYPE "DISABLED")
575         set(ALSA_FEATURE_TYPE "DISABLED")
576         if(IOS)
577                 set(X11_FEATURE_TYPE "DISABLED")
578                 set(PULSE_FEATURE_TYPE "DISABLED")
579                 set(CUPS_FEATURE_TYPE "DISABLED")
580                 set(PCSC_FEATURE_TYPE "DISABLED")
581                 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
582                 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
583         endif()
584         set(OPENSLES_FEATURE_TYPE "DISABLED")
585 endif()
586
587 if(ANDROID)
588         set(X11_FEATURE_TYPE "DISABLED")
589         set(WAYLAND_FEATURE_TYPE "DISABLED")
590         set(DIRECTFB_FEATURE_TYPE "DISABLED")
591         set(OSS_FEATURE_TYPE "DISABLED")
592         set(ALSA_FEATURE_TYPE "DISABLED")
593         set(PULSE_FEATURE_TYPE "DISABLED")
594         set(CUPS_FEATURE_TYPE "DISABLED")
595         set(PCSC_FEATURE_TYPE "DISABLED")
596         set(FFMPEG_FEATURE_TYPE "DISABLED")
597         set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
598         set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
599         set(OPENSLES_FEATURE_TYPE "REQUIRED")
600 endif()
601
602
603 find_feature(X11 ${X11_FEATURE_TYPE} ${X11_FEATURE_PURPOSE} ${X11_FEATURE_DESCRIPTION})
604 find_feature(Wayland ${WAYLAND_FEATURE_TYPE} ${WAYLAND_FEATURE_PURPOSE} ${WAYLAND_FEATURE_DESCRIPTION})
605 find_feature(DirectFB ${DIRECTFB_FEATURE_TYPE} ${DIRECTFB_FEATURE_PURPOSE} ${DIRECTFB_FEATURE_DESCRIPTION})
606 if (${WITH_DIRECTFB})
607         message(WARNING "DIRECTFB is orphaned and not maintained see docs/README.directfb for details")
608 endif()
609
610 find_feature(ZLIB ${ZLIB_FEATURE_TYPE} ${ZLIB_FEATURE_PURPOSE} ${ZLIB_FEATURE_DESCRIPTION})
611 find_feature(OpenSSL ${OPENSSL_FEATURE_TYPE} ${OPENSSL_FEATURE_PURPOSE} ${OPENSSL_FEATURE_DESCRIPTION})
612 find_feature(OpenSLES ${OPENSLES_FEATURE_TYPE} ${OPENSLES_FEATURE_PURPOSE} ${OPENSLES_FEATURE_DESCRIPTION})
613
614 find_feature(OSS ${OSS_FEATURE_TYPE} ${OSS_FEATURE_PURPOSE} ${OSS_FEATURE_DESCRIPTION})
615 find_feature(ALSA ${ALSA_FEATURE_TYPE} ${ALSA_FEATURE_PURPOSE} ${ALSA_FEATURE_DESCRIPTION})
616 find_feature(Pulse ${PULSE_FEATURE_TYPE} ${PULSE_FEATURE_PURPOSE} ${PULSE_FEATURE_DESCRIPTION})
617
618 find_feature(Cups ${CUPS_FEATURE_TYPE} ${CUPS_FEATURE_PURPOSE} ${CUPS_FEATURE_DESCRIPTION})
619 find_feature(PCSC ${PCSC_FEATURE_TYPE} ${PCSC_FEATURE_PURPOSE} ${PCSC_FEATURE_DESCRIPTION})
620
621 find_feature(FFmpeg ${FFMPEG_FEATURE_TYPE} ${FFMPEG_FEATURE_PURPOSE} ${FFMPEG_FEATURE_DESCRIPTION})
622
623 find_feature(GStreamer_0_10 ${GSTREAMER_0_10_FEATURE_TYPE} ${GSTREAMER_0_10_FEATURE_PURPOSE} ${GSTREAMER_0_10_FEATURE_DESCRIPTION})
624 find_feature(GStreamer_1_0 ${GSTREAMER_1_0_FEATURE_TYPE} ${GSTREAMER_1_0_FEATURE_PURPOSE} ${GSTREAMER_1_0_FEATURE_DESCRIPTION})
625
626 find_feature(JPEG ${JPEG_FEATURE_TYPE} ${JPEG_FEATURE_PURPOSE} ${JPEG_FEATURE_DESCRIPTION})
627 find_feature(x264 ${X264_FEATURE_TYPE} ${X264_FEATURE_PURPOSE} ${X264_FEATURE_DESCRIPTION})
628 find_feature(OpenH264 ${OPENH264_FEATURE_TYPE} ${OPENH264_FEATURE_PURPOSE} ${OPENH264_FEATURE_DESCRIPTION})
629 find_feature(GSM ${GSM_FEATURE_TYPE} ${GSM_FEATURE_PURPOSE} ${GSM_FEATURE_DESCRIPTION})
630
631 if(TARGET_ARCH MATCHES "x86|x64")
632         if (NOT APPLE)
633                 # Intel Performance Primitives
634                 find_feature(IPP ${IPP_FEATURE_TYPE} ${IPP_FEATURE_PURPOSE} ${IPP_FEATURE_DESCRIPTION})
635         endif()
636 endif()
637
638 if (TARGET_ARCH MATCHES "sparc")
639         set(HAVE_ALIGNED_REQUIRED 1)
640 endif()
641
642 # Path to put FreeRDP data
643 set(FREERDP_DATA_PATH "${CMAKE_INSTALL_PREFIX}/share/freerdp")
644
645 # Path to put plugins
646
647 set(FREERDP_LIBRARY_PATH "${CMAKE_INSTALL_LIBDIR}")
648
649 set(FREERDP_PLUGIN_PATH "${CMAKE_INSTALL_LIBDIR}/freerdp")
650 set(FREERDP_ADDIN_PATH "${FREERDP_PLUGIN_PATH}")
651
652 # Path to put extensions
653 set(FREERDP_EXTENSION_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/freerdp/extensions")
654
655 # Include directories
656 include_directories(${CMAKE_CURRENT_BINARY_DIR})
657 include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
658 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
659
660 # Configure files
661 add_definitions("-DHAVE_CONFIG_H")
662 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
663
664 # RPATH configuration
665 if(CMAKE_SKIP_RPATH)
666        set(CMAKE_SKIP_RPATH FALSE)
667        set(CMAKE_SKIP_INSTALL_RPATH TRUE)
668 endif()
669 set(CMAKE_SKIP_BUILD_RPATH FALSE)
670 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
671 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
672 set(CMAKE_INSTALL_RPATH "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}:\$ORIGIN/..")
673
674 # Android profiling
675 if(ANDROID)
676         if(WITH_GPROF)
677                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
678                 set(PROFILER_LIBRARIES
679                         "${FREERDP_EXTERNAL_PROFILER_PATH}/obj/local/${ANDROID_ABI}/libandroid-ndk-profiler.a")
680                 include_directories("${FREERDP_EXTERNAL_PROFILER_PATH}")
681         endif()
682 endif()
683
684 # Unit Tests
685
686 include(CTest)
687
688 if(BUILD_TESTING)
689         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFREERDP_TEST_EXPORTS")
690
691         enable_testing()
692
693         if(MSVC)
694                 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
695         else()
696                 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Testing")
697         endif()
698 endif()
699
700 # WinPR
701 include_directories("${CMAKE_SOURCE_DIR}/winpr/include")
702 include_directories("${CMAKE_BINARY_DIR}/winpr/include")
703
704 add_subdirectory(winpr)
705
706 # Sub-directories
707
708 if(WITH_THIRD_PARTY)
709         add_subdirectory(third-party)
710         if (NOT "${THIRD_PARTY_INCLUDES}" STREQUAL "")
711                 include_directories(${THIRD_PARTY_INCLUDES})
712         endif()
713 endif()
714
715 add_subdirectory(include)
716
717 add_subdirectory(libfreerdp)
718
719 if (IOS)
720         set(CMAKE_OSX_DEPLOYMENT_TARGET "")
721         if (IOS_PLATFORM MATCHES "SIMULATOR")
722                 set(CMAKE_OSX_SYSROOT "iphonesimulator")
723         else()
724                 set(CMAKE_OSX_SYSROOT "iphoneos")
725         endif()
726 endif()
727
728 # RdTk
729 include_directories("${CMAKE_SOURCE_DIR}/rdtk/include")
730 include_directories("${CMAKE_BINARY_DIR}/rdtk/include")
731
732 add_subdirectory(rdtk)
733
734 if(BSD)
735         if(IS_DIRECTORY /usr/local/include)
736                 include_directories(/usr/local/include)
737                 link_directories(/usr/local/lib)
738         endif()
739         if(OPENBSD)
740                 if(IS_DIRECTORY /usr/X11R6/include)
741                         include_directories(/usr/X11R6/include)
742                 endif()
743         endif()
744 endif()
745
746 if(WITH_CHANNELS)
747         add_subdirectory(channels)
748 endif()
749
750 if(WITH_CLIENT)
751         add_subdirectory(client)
752 endif()
753
754 if(WITH_SERVER)
755         add_subdirectory(server)
756 endif()
757
758
759 # Exporting
760
761 if(${CMAKE_VERSION} VERSION_GREATER "2.8.10")
762
763         export(PACKAGE freerdp)
764
765         set(FREERDP_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/FreeRDP")
766
767         set(FREERDP_INCLUDE_DIR "include")
768
769         # keep for legacy builds
770         set(FREERDP_MONOLITHIC_BUILD OFF)
771
772         configure_package_config_file(FreeRDPConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfig.cmake
773                 INSTALL_DESTINATION ${FREERDP_CMAKE_INSTALL_DIR}
774                 PATH_VARS FREERDP_INCLUDE_DIR FREERDP_MONOLITHIC_BUILD)
775
776         write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfigVersion.cmake
777                 VERSION ${FREERDP_VERSION} COMPATIBILITY SameMajorVersion)
778
779         install(FILES ${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfigVersion.cmake
780                 DESTINATION ${FREERDP_CMAKE_INSTALL_DIR})
781
782         install(EXPORT FreeRDPTargets DESTINATION ${FREERDP_CMAKE_INSTALL_DIR})
783
784 endif()
785
786 # Packaging
787
788 set(CMAKE_CPACK_INCLUDE_FILE "CMakeCPack.cmake")
789
790 if(NOT (VENDOR MATCHES "FreeRDP"))
791         if(DEFINED CLIENT_VENDOR_PATH)
792                 if(EXISTS "${CMAKE_SOURCE_DIR}/${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
793                         set(CMAKE_CPACK_INCLUDE_FILE "${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
794                 endif()
795         endif()
796 endif()
797
798 #message("VENDOR: ${VENDOR} CLIENT_VENDOR_PATH: ${CLIENT_VENDOR_PATH} CMAKE_CPACK_INCLUDE_FILE: ${CMAKE_CPACK_INCLUDE_FILE}")
799
800 include(${CMAKE_CPACK_INCLUDE_FILE})
801
802 set(FREERDP_PC_LIBS "-lfreerdp -lfreerdp-client")
803 set(WINPR_PC_LIBS "-lwinpr")
804 if (WITH_SERVER)
805         set(FREERDP_PC_LIBS "${FREERDP_PC_LIBS} -lfreerdp-server")
806 endif()
807
808 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/freerdp.pc.in ${CMAKE_CURRENT_BINARY_DIR}/freerdp.pc @ONLY)
809 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/winpr.pc.in ${CMAKE_CURRENT_BINARY_DIR}/winpr.pc @ONLY)
810 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/freerdp.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
811 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/winpr.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)