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