Fixed typo and invalid domain name.
[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 "4")
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(OPENH264_FEATURE_TYPE "OPTIONAL")
541 set(OPENH264_FEATURE_PURPOSE "codec")
542 set(OPENH264_FEATURE_DESCRIPTION "use OpenH264 library")
543
544 set(GSM_FEATURE_TYPE "OPTIONAL")
545 set(GSM_FEATURE_PURPOSE "codec")
546 set(GSM_FEATURE_DESCRIPTION "GSM audio codec library")
547
548 if(WIN32)
549         set(X11_FEATURE_TYPE "DISABLED")
550         set(WAYLAND_FEATURE_TYPE "DISABLED")
551         set(ZLIB_FEATURE_TYPE "DISABLED")
552         set(DIRECTFB_FEATURE_TYPE "DISABLED")
553         set(OSS_FEATURE_TYPE "DISABLED")
554         set(ALSA_FEATURE_TYPE "DISABLED")
555         set(PULSE_FEATURE_TYPE "DISABLED")
556         set(CUPS_FEATURE_TYPE "DISABLED")
557         set(PCSC_FEATURE_TYPE "DISABLED")
558         set(FFMPEG_FEATURE_TYPE "DISABLED")
559         set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
560         set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
561         set(OPENSLES_FEATURE_TYPE "DISABLED")
562 endif()
563
564 if(APPLE)
565         set(DIRECTFB_FEATURE_TYPE "DISABLED")
566         set(FFMPEG_FEATURE_TYPE "OPTIONAL")
567         set(GSTREAMER_1_0_FEATURE_TYPE "OPTIONAL")
568         set(X11_FEATURE_TYPE "OPTIONAL")
569         set(WAYLAND_FEATURE_TYPE "DISABLED")
570         set(OSS_FEATURE_TYPE "DISABLED")
571         set(ALSA_FEATURE_TYPE "DISABLED")
572         if(IOS)
573                 set(X11_FEATURE_TYPE "DISABLED")
574                 set(PULSE_FEATURE_TYPE "DISABLED")
575                 set(CUPS_FEATURE_TYPE "DISABLED")
576                 set(PCSC_FEATURE_TYPE "DISABLED")
577                 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
578                 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
579         endif()
580         set(OPENSLES_FEATURE_TYPE "DISABLED")
581 endif()
582
583 if(ANDROID)
584         set(X11_FEATURE_TYPE "DISABLED")
585         set(WAYLAND_FEATURE_TYPE "DISABLED")
586         set(DIRECTFB_FEATURE_TYPE "DISABLED")
587         set(OSS_FEATURE_TYPE "DISABLED")
588         set(ALSA_FEATURE_TYPE "DISABLED")
589         set(PULSE_FEATURE_TYPE "DISABLED")
590         set(CUPS_FEATURE_TYPE "DISABLED")
591         set(PCSC_FEATURE_TYPE "DISABLED")
592         set(FFMPEG_FEATURE_TYPE "DISABLED")
593         set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
594         set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
595         set(OPENSLES_FEATURE_TYPE "REQUIRED")
596 endif()
597
598
599 find_feature(X11 ${X11_FEATURE_TYPE} ${X11_FEATURE_PURPOSE} ${X11_FEATURE_DESCRIPTION})
600 find_feature(Wayland ${WAYLAND_FEATURE_TYPE} ${WAYLAND_FEATURE_PURPOSE} ${WAYLAND_FEATURE_DESCRIPTION})
601 find_feature(DirectFB ${DIRECTFB_FEATURE_TYPE} ${DIRECTFB_FEATURE_PURPOSE} ${DIRECTFB_FEATURE_DESCRIPTION})
602 if (${WITH_DIRECTFB})
603         message(WARNING "DIRECTFB is orphaned and not maintained see docs/README.directfb for details")
604 endif()
605
606 find_feature(ZLIB ${ZLIB_FEATURE_TYPE} ${ZLIB_FEATURE_PURPOSE} ${ZLIB_FEATURE_DESCRIPTION})
607 find_feature(OpenSSL ${OPENSSL_FEATURE_TYPE} ${OPENSSL_FEATURE_PURPOSE} ${OPENSSL_FEATURE_DESCRIPTION})
608 find_feature(OpenSLES ${OPENSLES_FEATURE_TYPE} ${OPENSLES_FEATURE_PURPOSE} ${OPENSLES_FEATURE_DESCRIPTION})
609
610 find_feature(OSS ${OSS_FEATURE_TYPE} ${OSS_FEATURE_PURPOSE} ${OSS_FEATURE_DESCRIPTION})
611 find_feature(ALSA ${ALSA_FEATURE_TYPE} ${ALSA_FEATURE_PURPOSE} ${ALSA_FEATURE_DESCRIPTION})
612 find_feature(Pulse ${PULSE_FEATURE_TYPE} ${PULSE_FEATURE_PURPOSE} ${PULSE_FEATURE_DESCRIPTION})
613
614 find_feature(Cups ${CUPS_FEATURE_TYPE} ${CUPS_FEATURE_PURPOSE} ${CUPS_FEATURE_DESCRIPTION})
615 find_feature(PCSC ${PCSC_FEATURE_TYPE} ${PCSC_FEATURE_PURPOSE} ${PCSC_FEATURE_DESCRIPTION})
616
617 find_feature(FFmpeg ${FFMPEG_FEATURE_TYPE} ${FFMPEG_FEATURE_PURPOSE} ${FFMPEG_FEATURE_DESCRIPTION})
618
619 find_feature(GStreamer_0_10 ${GSTREAMER_0_10_FEATURE_TYPE} ${GSTREAMER_0_10_FEATURE_PURPOSE} ${GSTREAMER_0_10_FEATURE_DESCRIPTION})
620 find_feature(GStreamer_1_0 ${GSTREAMER_1_0_FEATURE_TYPE} ${GSTREAMER_1_0_FEATURE_PURPOSE} ${GSTREAMER_1_0_FEATURE_DESCRIPTION})
621
622 find_feature(JPEG ${JPEG_FEATURE_TYPE} ${JPEG_FEATURE_PURPOSE} ${JPEG_FEATURE_DESCRIPTION})
623 find_feature(OpenH264 ${OPENH264_FEATURE_TYPE} ${OPENH264_FEATURE_PURPOSE} ${OPENH264_FEATURE_DESCRIPTION})
624 find_feature(GSM ${GSM_FEATURE_TYPE} ${GSM_FEATURE_PURPOSE} ${GSM_FEATURE_DESCRIPTION})
625
626 if(TARGET_ARCH MATCHES "x86|x64")
627         if (NOT APPLE)
628                 # Intel Performance Primitives
629                 find_feature(IPP ${IPP_FEATURE_TYPE} ${IPP_FEATURE_PURPOSE} ${IPP_FEATURE_DESCRIPTION})
630         endif()
631 endif()
632
633 if (TARGET_ARCH MATCHES "sparc")
634         set(HAVE_ALIGNED_REQUIRED 1)
635 endif()
636
637 # Path to put FreeRDP data
638 set(FREERDP_DATA_PATH "${CMAKE_INSTALL_PREFIX}/share/freerdp")
639
640 # Path to put plugins
641
642 set(FREERDP_LIBRARY_PATH "${CMAKE_INSTALL_LIBDIR}")
643
644 set(FREERDP_PLUGIN_PATH "${CMAKE_INSTALL_LIBDIR}/freerdp")
645 set(FREERDP_ADDIN_PATH "${FREERDP_PLUGIN_PATH}")
646
647 # Path to put extensions
648 set(FREERDP_EXTENSION_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/freerdp/extensions")
649
650 # Include directories
651 include_directories(${CMAKE_CURRENT_BINARY_DIR})
652 include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
653 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
654 if(BSD)
655         if(IS_DIRECTORY /usr/local/include)
656                 include_directories(/usr/local/include)
657                 link_directories(/usr/local/lib)
658         endif()
659         if(OPENBSD)
660                 if(IS_DIRECTORY /usr/X11R6/include)
661                         include_directories(/usr/X11R6/include)
662                 endif()
663         endif()
664 endif()
665
666 # Configure files
667 add_definitions("-DHAVE_CONFIG_H")
668 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
669
670 # RPATH configuration
671 if(CMAKE_SKIP_RPATH)
672        set(CMAKE_SKIP_RPATH FALSE)
673        set(CMAKE_SKIP_INSTALL_RPATH TRUE)
674 endif()
675 set(CMAKE_SKIP_BUILD_RPATH FALSE)
676 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
677 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
678 set(CMAKE_INSTALL_RPATH "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}:\$ORIGIN/..")
679
680 # Android profiling
681 if(ANDROID)
682         if(WITH_GPROF)
683                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
684                 set(PROFILER_LIBRARIES
685                         "${FREERDP_EXTERNAL_PROFILER_PATH}/obj/local/${ANDROID_ABI}/libandroid-ndk-profiler.a")
686                 include_directories("${FREERDP_EXTERNAL_PROFILER_PATH}")
687         endif()
688 endif()
689
690 # Unit Tests
691
692 include(CTest)
693
694 if(BUILD_TESTING)
695         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFREERDP_TEST_EXPORTS")
696
697         enable_testing()
698
699         if(MSVC)
700                 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
701         else()
702                 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Testing")
703         endif()
704 endif()
705
706 # WinPR
707 include_directories("${CMAKE_SOURCE_DIR}/winpr/include")
708 include_directories("${CMAKE_BINARY_DIR}/winpr/include")
709
710 add_subdirectory(winpr)
711
712 # Sub-directories
713
714 if(WITH_THIRD_PARTY)
715         add_subdirectory(third-party)
716         if (NOT "${THIRD_PARTY_INCLUDES}" STREQUAL "")
717                 include_directories(${THIRD_PARTY_INCLUDES})
718         endif()
719 endif()
720
721 add_subdirectory(include)
722
723 add_subdirectory(libfreerdp)
724
725 if(WITH_CHANNELS)
726         add_subdirectory(channels)
727 endif()
728
729 if (IOS)
730         set(CMAKE_OSX_DEPLOYMENT_TARGET "")
731         if (IOS_PLATFORM MATCHES "SIMULATOR")
732                 set(CMAKE_OSX_SYSROOT "iphonesimulator")
733         else()
734                 set(CMAKE_OSX_SYSROOT "iphoneos")
735         endif()
736 endif()
737
738 # RdTk
739 include_directories("${CMAKE_SOURCE_DIR}/rdtk/include")
740 include_directories("${CMAKE_BINARY_DIR}/rdtk/include")
741
742 add_subdirectory(rdtk)
743
744 if(WITH_CLIENT)
745         add_subdirectory(client)
746 endif()
747
748 if(WITH_SERVER)
749         add_subdirectory(server)
750 endif()
751
752 # Exporting
753
754 if(${CMAKE_VERSION} VERSION_GREATER "2.8.10")
755
756         export(PACKAGE freerdp)
757
758         set(FREERDP_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/FreeRDP")
759
760         set(FREERDP_INCLUDE_DIR "include")
761
762         # keep for legacy builds
763         set(FREERDP_MONOLITHIC_BUILD OFF)
764
765         configure_package_config_file(FreeRDPConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfig.cmake
766                 INSTALL_DESTINATION ${FREERDP_CMAKE_INSTALL_DIR}
767                 PATH_VARS FREERDP_INCLUDE_DIR FREERDP_MONOLITHIC_BUILD)
768
769         write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfigVersion.cmake
770                 VERSION ${FREERDP_VERSION} COMPATIBILITY SameMajorVersion)
771
772         install(FILES ${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfigVersion.cmake
773                 DESTINATION ${FREERDP_CMAKE_INSTALL_DIR})
774
775         install(EXPORT FreeRDPTargets DESTINATION ${FREERDP_CMAKE_INSTALL_DIR})
776
777 endif()
778
779 # Packaging
780
781 set(CMAKE_CPACK_INCLUDE_FILE "CMakeCPack.cmake")
782
783 if(NOT (VENDOR MATCHES "FreeRDP"))
784         if(DEFINED CLIENT_VENDOR_PATH)
785                 if(EXISTS "${CMAKE_SOURCE_DIR}/${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
786                         set(CMAKE_CPACK_INCLUDE_FILE "${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
787                 endif()
788         endif()
789 endif()
790
791 #message("VENDOR: ${VENDOR} CLIENT_VENDOR_PATH: ${CLIENT_VENDOR_PATH} CMAKE_CPACK_INCLUDE_FILE: ${CMAKE_CPACK_INCLUDE_FILE}")
792
793 include(${CMAKE_CPACK_INCLUDE_FILE})
794
795 set(FREERDP_PC_LIBS "-lfreerdp -lfreerdp-client")
796 set(WINPR_PC_LIBS "-lwinpr")
797 if (WITH_SERVER)
798         set(FREERDP_PC_LIBS "${FREERDP_PC_LIBS} -lfreerdp-server")
799 endif()
800
801 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/freerdp.pc.in ${CMAKE_CURRENT_BINARY_DIR}/freerdp.pc @ONLY)
802 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/winpr.pc.in ${CMAKE_CURRENT_BINARY_DIR}/winpr.pc @ONLY)
803 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/freerdp.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
804 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/winpr.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)