Fix build with newer uclibc versions
[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 "2")
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/strtio.h HAVE_SYS_STRTIO_H)
331         check_include_files(sys/select.h HAVE_SYS_SELECT_H)
332 else()
333         set(HAVE_FCNTL_H 1)
334         set(HAVE_UNISTD_H 1)
335         set(HAVE_STDINT_H 1)
336         set(HAVE_INTTYPES_H 1)
337         set(HAVE_SYS_FILIO_H 1)
338 endif()
339
340 if(NOT IOS)
341         check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
342 else()
343         set(HAVE_TM_GMTOFF 1)
344 endif()
345
346 # Mac OS X
347 if(APPLE)
348         if(IOS)
349                 if (NOT FREERDP_IOS_EXTERNAL_SSL_PATH)
350                         message(STATUS "FREERDP_IOS_EXTERNAL_SSL_PATH not set! Required if openssl is not found in the iOS SDK (which usually isn't")
351                 endif()
352                 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_IOS_EXTERNAL_SSL_PATH})
353                 set_property(GLOBAL PROPERTY XCODE_ATTRIBUTE_SKIP_INSTALL YES)
354         else(IOS)
355                 if(NOT DEFINED CMAKE_OSX_ARCHITECTURES)
356                         set(CMAKE_OSX_ARCHITECTURES i386 x86_64)
357                 endif()
358
359                 if(IS_DIRECTORY /opt/local/include)
360                         include_directories(/opt/local/include)
361                         link_directories(/opt/local/lib)
362                 endif()
363         endif(IOS)
364
365 # Temporarily disabled, causes the cmake script to be reexecuted, causing the compilation to fail.
366 # Workaround: specify the parameter in the command-line
367 #        if(WITH_CLANG)
368 #                set(CMAKE_C_COMPILER "clang")
369 #        endif()
370
371         if (WITH_VERBOSE)
372                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -v")
373                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v")
374         endif()
375 endif(APPLE)
376
377 # OpenBSD
378 if(OPENBSD)
379         set(WITH_MANPAGES "ON")
380         set(WITH_ALSA "OFF")
381         set(WITH_PULSE "ON")
382         set(WITH_WAYLAND "OFF")
383 endif()
384
385 # Android
386 if(ANDROID)
387   set(WITH_LIBRARY_VERSIONING "OFF")
388
389         if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
390                 add_definitions(-DNDK_DEBUG=1)
391
392                 # NOTE: Manually add -gdwarf-3, as newer toolchains default to -gdwarf-4,
393                 #       which is not supported by the gdbserver binary shipped with
394                 #       the android NDK (tested with r9b)
395                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG} -gdwarf-3")
396         endif()
397         set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -llog")
398
399         if (NOT FREERDP_EXTERNAL_JPEG_PATH)
400                 if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/jpeg8d")
401                         set(FREERDP_EXTERNAL_JPEG_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/jpeg8d")
402                 else()
403                         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)")
404                 endif()
405         endif()
406         if (NOT FREERDP_EXTERNAL_SSL_PATH)
407                 if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/openssl")
408                         set(FREERDP_EXTERNAL_SSL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/openssl")
409                 else()
410                         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)")
411                 endif()
412                 if(WITH_GPROF)
413                         if (NOT FREERDP_EXTERNAL_PROFILER_PATH)
414                         if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/android-ndk-profiler")
415                                 set(FREERDP_EXTERNAL_PROFILER_PATH
416                                         "${CMAKE_CURRENT_SOURCE_DIR}/external/android-ndk-profiler")
417                         else()
418                                 message(STATUS "FREERDP_EXTERNAL_PROFILER_PATH not set!")
419                         endif()
420                 endif()
421         endif()
422 endif()
423 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_EXTERNAL_SSL_PATH} ${FREERDP_EXTERNAL_JPEG_PATH})
424 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_EXTERNAL_PROFILER_PATH})
425
426         set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/client/Android/FreeRDPCore/jni/${ANDROID_ABI})
427         CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/regenerate_jni_headers.sh.cmake
428                 ${CMAKE_BINARY_DIR}/scripts/regenerate_jni_headers.sh @ONLY)
429         if (WITH_GPROF)
430                 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/gprof_generate.sh.cmake ${CMAKE_BINARY_DIR}/scripts/gprof_generate.sh @ONLY)
431         endif(WITH_GPROF)
432
433 endif()
434
435 set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
436
437 if(NOT IOS AND NOT ANDROID)
438         find_package(Threads REQUIRED)
439 endif()
440
441 if(NOT WIN32)
442         check_library_exists(pthread pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK)
443 endif()
444
445 if(WITH_VALGRIND_MEMCHECK)
446     check_include_files(valgrind/memcheck.h HAVE_VALGRIND_MEMCHECK_H)
447 else()
448     unset(HAVE_VALGRIND_MEMCHECK_H CACHE)
449 endif()
450
451 if(UNIX OR CYGWIN)
452         check_include_files(sys/eventfd.h HAVE_AIO_H)
453         check_include_files(sys/eventfd.h HAVE_EVENTFD_H)
454         if (HAVE_EVENTFD_H)
455                 check_symbol_exists(eventfd_read sys/eventfd.h WITH_EVENTFD_READ_WRITE)
456         endif()
457         check_include_files(sys/timerfd.h HAVE_TIMERFD_H)
458         check_include_files(poll.h HAVE_POLL_H)
459         set(X11_FEATURE_TYPE "RECOMMENDED")
460         set(WAYLAND_FEATURE_TYPE "RECOMMENDED")
461 else()
462         set(X11_FEATURE_TYPE "DISABLED")
463         set(WAYLAND_FEATURE_TYPE "DISABLED")
464 endif()
465
466 if(WITH_PCSC_WINPR)
467         find_package(PCSCWinPR)
468 endif()
469
470 set(X11_FEATURE_PURPOSE "X11")
471 set(X11_FEATURE_DESCRIPTION "X11 client and server")
472
473 set(WAYLAND_FEATURE_PURPOSE "Wayland")
474 set(WAYLAND_FEATURE_DESCRIPTION "Wayland client")
475
476 set(DIRECTFB_FEATURE_TYPE "OPTIONAL")
477 set(DIRECTFB_FEATURE_PURPOSE "DirectFB")
478 set(DIRECTFB_FEATURE_DESCRIPTION "DirectFB client")
479
480 set(ZLIB_FEATURE_TYPE "REQUIRED")
481 set(ZLIB_FEATURE_PURPOSE "compression")
482 set(ZLIB_FEATURE_DESCRIPTION "data compression")
483
484 set(OPENSSL_FEATURE_TYPE "REQUIRED")
485 set(OPENSSL_FEATURE_PURPOSE "cryptography")
486 set(OPENSSL_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
487
488 set(OPENSLES_FEATURE_TYPE "OPTIONAL")
489 set(OPENSLES_FEATURE_PURPOSE "multimedia")
490 set(OPENSLES_FEATURE_DESCRIPTION "OpenSLES audio / video")
491
492 set(OSS_FEATURE_TYPE "RECOMMENDED")
493 set(OSS_FEATURE_PURPOSE "sound")
494 set(OSS_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
495
496 set(ALSA_FEATURE_TYPE "RECOMMENDED")
497 set(ALSA_FEATURE_PURPOSE "sound")
498 set(ALSA_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
499
500 set(PULSE_FEATURE_TYPE "OPTIONAL")
501 set(PULSE_FEATURE_PURPOSE "sound")
502 set(PULSE_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
503
504 set(CUPS_FEATURE_TYPE "OPTIONAL")
505 set(CUPS_FEATURE_PURPOSE "printing")
506 set(CUPS_FEATURE_DESCRIPTION "printer device redirection")
507
508 set(PCSC_FEATURE_TYPE "OPTIONAL")
509 set(PCSC_FEATURE_PURPOSE "smart card")
510 set(PCSC_FEATURE_DESCRIPTION "smart card device redirection")
511
512 set(FFMPEG_FEATURE_TYPE "RECOMMENDED")
513 set(FFMPEG_FEATURE_PURPOSE "multimedia")
514 set(FFMPEG_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
515
516 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
517 set(GSTREAMER_0_10_FEATURE_PURPOSE "multimedia")
518 set(GSTREAMER_0_10_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback, gstreamer 0.10 version")
519
520 set(GSTREAMER_1_0_FEATURE_TYPE "RECOMMENDED")
521 set(GSTREAMER_1_0_FEATURE_PURPOSE "multimedia")
522 set(GSTREAMER_1_0_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
523
524 set(IPP_FEATURE_TYPE "OPTIONAL")
525 set(IPP_FEATURE_PURPOSE "performance")
526 set(IPP_FEATURE_DESCRIPTION "Intel Integrated Performance Primitives library")
527
528 set(JPEG_FEATURE_TYPE "OPTIONAL")
529 set(JPEG_FEATURE_PURPOSE "codec")
530 set(JPEG_FEATURE_DESCRIPTION "use JPEG library")
531
532 set(OPENH264_FEATURE_TYPE "OPTIONAL")
533 set(OPENH264_FEATURE_PURPOSE "codec")
534 set(OPENH264_FEATURE_DESCRIPTION "use OpenH264 library")
535
536 set(GSM_FEATURE_TYPE "OPTIONAL")
537 set(GSM_FEATURE_PURPOSE "codec")
538 set(GSM_FEATURE_DESCRIPTION "GSM audio codec library")
539
540 if(WIN32)
541         set(X11_FEATURE_TYPE "DISABLED")
542         set(WAYLAND_FEATURE_TYPE "DISABLED")
543         set(ZLIB_FEATURE_TYPE "DISABLED")
544         set(DIRECTFB_FEATURE_TYPE "DISABLED")
545         set(OSS_FEATURE_TYPE "DISABLED")
546         set(ALSA_FEATURE_TYPE "DISABLED")
547         set(PULSE_FEATURE_TYPE "DISABLED")
548         set(CUPS_FEATURE_TYPE "DISABLED")
549         set(PCSC_FEATURE_TYPE "DISABLED")
550         set(FFMPEG_FEATURE_TYPE "DISABLED")
551         set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
552         set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
553         set(OPENSLES_FEATURE_TYPE "DISABLED")
554 endif()
555
556 if(APPLE)
557         set(DIRECTFB_FEATURE_TYPE "DISABLED")
558         set(FFMPEG_FEATURE_TYPE "OPTIONAL")
559         set(GSTREAMER_1_0_FEATURE_TYPE "OPTIONAL")
560         set(X11_FEATURE_TYPE "OPTIONAL")
561         set(WAYLAND_FEATURE_TYPE "DISABLED")
562         set(OSS_FEATURE_TYPE "DISABLED")
563         set(ALSA_FEATURE_TYPE "DISABLED")
564         if(IOS)
565                 set(X11_FEATURE_TYPE "DISABLED")
566                 set(PULSE_FEATURE_TYPE "DISABLED")
567                 set(CUPS_FEATURE_TYPE "DISABLED")
568                 set(PCSC_FEATURE_TYPE "DISABLED")
569                 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
570                 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
571         endif()
572         set(OPENSLES_FEATURE_TYPE "DISABLED")
573 endif()
574
575 if(ANDROID)
576         set(X11_FEATURE_TYPE "DISABLED")
577         set(WAYLAND_FEATURE_TYPE "DISABLED")
578         set(DIRECTFB_FEATURE_TYPE "DISABLED")
579         set(OSS_FEATURE_TYPE "DISABLED")
580         set(ALSA_FEATURE_TYPE "DISABLED")
581         set(PULSE_FEATURE_TYPE "DISABLED")
582         set(CUPS_FEATURE_TYPE "DISABLED")
583         set(PCSC_FEATURE_TYPE "DISABLED")
584         set(FFMPEG_FEATURE_TYPE "DISABLED")
585         set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
586         set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
587         set(OPENSLES_FEATURE_TYPE "REQUIRED")
588 endif()
589
590
591 find_feature(X11 ${X11_FEATURE_TYPE} ${X11_FEATURE_PURPOSE} ${X11_FEATURE_DESCRIPTION})
592 find_feature(Wayland ${WAYLAND_FEATURE_TYPE} ${WAYLAND_FEATURE_PURPOSE} ${WAYLAND_FEATURE_DESCRIPTION})
593 find_feature(DirectFB ${DIRECTFB_FEATURE_TYPE} ${DIRECTFB_FEATURE_PURPOSE} ${DIRECTFB_FEATURE_DESCRIPTION})
594 if (${WITH_DIRECTFB})
595         message(WARNING "DIRECTFB is orphaned and not maintained see docs/README.directfb for details")
596 endif()
597
598 find_feature(ZLIB ${ZLIB_FEATURE_TYPE} ${ZLIB_FEATURE_PURPOSE} ${ZLIB_FEATURE_DESCRIPTION})
599 find_feature(OpenSSL ${OPENSSL_FEATURE_TYPE} ${OPENSSL_FEATURE_PURPOSE} ${OPENSSL_FEATURE_DESCRIPTION})
600 find_feature(OpenSLES ${OPENSLES_FEATURE_TYPE} ${OPENSLES_FEATURE_PURPOSE} ${OPENSLES_FEATURE_DESCRIPTION})
601
602 find_feature(OSS ${OSS_FEATURE_TYPE} ${OSS_FEATURE_PURPOSE} ${OSS_FEATURE_DESCRIPTION})
603 find_feature(ALSA ${ALSA_FEATURE_TYPE} ${ALSA_FEATURE_PURPOSE} ${ALSA_FEATURE_DESCRIPTION})
604 find_feature(Pulse ${PULSE_FEATURE_TYPE} ${PULSE_FEATURE_PURPOSE} ${PULSE_FEATURE_DESCRIPTION})
605
606 find_feature(Cups ${CUPS_FEATURE_TYPE} ${CUPS_FEATURE_PURPOSE} ${CUPS_FEATURE_DESCRIPTION})
607 find_feature(PCSC ${PCSC_FEATURE_TYPE} ${PCSC_FEATURE_PURPOSE} ${PCSC_FEATURE_DESCRIPTION})
608
609 find_feature(FFmpeg ${FFMPEG_FEATURE_TYPE} ${FFMPEG_FEATURE_PURPOSE} ${FFMPEG_FEATURE_DESCRIPTION})
610
611 find_feature(GStreamer_0_10 ${GSTREAMER_0_10_FEATURE_TYPE} ${GSTREAMER_0_10_FEATURE_PURPOSE} ${GSTREAMER_0_10_FEATURE_DESCRIPTION})
612 find_feature(GStreamer_1_0 ${GSTREAMER_1_0_FEATURE_TYPE} ${GSTREAMER_1_0_FEATURE_PURPOSE} ${GSTREAMER_1_0_FEATURE_DESCRIPTION})
613
614 find_feature(JPEG ${JPEG_FEATURE_TYPE} ${JPEG_FEATURE_PURPOSE} ${JPEG_FEATURE_DESCRIPTION})
615 find_feature(OpenH264 ${OPENH264_FEATURE_TYPE} ${OPENH264_FEATURE_PURPOSE} ${OPENH264_FEATURE_DESCRIPTION})
616 find_feature(GSM ${GSM_FEATURE_TYPE} ${GSM_FEATURE_PURPOSE} ${GSM_FEATURE_DESCRIPTION})
617
618 if(TARGET_ARCH MATCHES "x86|x64")
619         if (NOT APPLE)
620                 # Intel Performance Primitives
621                 find_feature(IPP ${IPP_FEATURE_TYPE} ${IPP_FEATURE_PURPOSE} ${IPP_FEATURE_DESCRIPTION})
622         endif()
623 endif()
624
625 if (TARGET_ARCH MATCHES "sparc")
626         set(HAVE_ALIGNED_REQUIRED 1)
627 endif()
628
629 # Path to put FreeRDP data
630 set(FREERDP_DATA_PATH "${CMAKE_INSTALL_PREFIX}/share/freerdp")
631
632 # Path to put plugins
633
634 set(FREERDP_LIBRARY_PATH "${CMAKE_INSTALL_LIBDIR}")
635
636 set(FREERDP_PLUGIN_PATH "${CMAKE_INSTALL_LIBDIR}/freerdp")
637 set(FREERDP_ADDIN_PATH "${FREERDP_PLUGIN_PATH}")
638
639 # Path to put extensions
640 set(FREERDP_EXTENSION_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/freerdp/extensions")
641
642 # Include directories
643 include_directories(${CMAKE_CURRENT_BINARY_DIR})
644 include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
645 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
646 if(BSD)
647         if(IS_DIRECTORY /usr/local/include)
648                 include_directories(/usr/local/include)
649                 link_directories(/usr/local/lib)
650         endif()
651         if(OPENBSD)
652                 if(IS_DIRECTORY /usr/X11R6/include)
653                         include_directories(/usr/X11R6/include)
654                 endif()
655         endif()
656 endif()
657
658 # Configure files
659 add_definitions("-DHAVE_CONFIG_H")
660 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
661
662 # RPATH configuration
663 if(CMAKE_SKIP_RPATH)
664        set(CMAKE_SKIP_RPATH FALSE)
665        set(CMAKE_SKIP_INSTALL_RPATH TRUE)
666 endif()
667 set(CMAKE_SKIP_BUILD_RPATH FALSE)
668 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
669 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
670 set(CMAKE_INSTALL_RPATH "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}:\$ORIGIN/..")
671
672 # Android profiling
673 if(ANDROID)
674         if(WITH_GPROF)
675                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
676                 set(PROFILER_LIBRARIES
677                         "${FREERDP_EXTERNAL_PROFILER_PATH}/obj/local/${ANDROID_ABI}/libandroid-ndk-profiler.a")
678                 include_directories("${FREERDP_EXTERNAL_PROFILER_PATH}")
679         endif()
680 endif()
681
682 # Unit Tests
683
684 include(CTest)
685
686 if(BUILD_TESTING)
687         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFREERDP_TEST_EXPORTS")
688
689         enable_testing()
690
691         if(MSVC)
692                 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
693         else()
694                 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Testing")
695         endif()
696 endif()
697
698 # WinPR
699 include_directories("${CMAKE_SOURCE_DIR}/winpr/include")
700 include_directories("${CMAKE_BINARY_DIR}/winpr/include")
701
702 add_subdirectory(winpr)
703
704 # Sub-directories
705
706 if(WITH_THIRD_PARTY)
707         add_subdirectory(third-party)
708         if (NOT "${THIRD_PARTY_INCLUDES}" STREQUAL "")
709                 include_directories(${THIRD_PARTY_INCLUDES})
710         endif()
711 endif()
712
713 add_subdirectory(include)
714
715 add_subdirectory(libfreerdp)
716
717 if(WITH_CHANNELS)
718         add_subdirectory(channels)
719 endif()
720
721 if (IOS)
722         set(CMAKE_OSX_DEPLOYMENT_TARGET "")
723         if (IOS_PLATFORM MATCHES "SIMULATOR")
724                 set(CMAKE_OSX_SYSROOT "iphonesimulator")
725         else()
726                 set(CMAKE_OSX_SYSROOT "iphoneos")
727         endif()
728 endif()
729
730 # RdTk
731 include_directories("${CMAKE_SOURCE_DIR}/rdtk/include")
732 include_directories("${CMAKE_BINARY_DIR}/rdtk/include")
733
734 add_subdirectory(rdtk)
735
736 if(WITH_CLIENT)
737         add_subdirectory(client)
738 endif()
739
740 if(WITH_SERVER)
741         add_subdirectory(server)
742 endif()
743
744 # Exporting
745
746 if(${CMAKE_VERSION} VERSION_GREATER "2.8.10")
747
748         export(PACKAGE freerdp)
749
750         set(FREERDP_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/FreeRDP")
751
752         set(FREERDP_INCLUDE_DIR "include")
753
754         # keep for legacy builds
755         set(FREERDP_MONOLITHIC_BUILD OFF)
756
757         configure_package_config_file(FreeRDPConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfig.cmake
758                 INSTALL_DESTINATION ${FREERDP_CMAKE_INSTALL_DIR}
759                 PATH_VARS FREERDP_INCLUDE_DIR FREERDP_MONOLITHIC_BUILD)
760
761         write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfigVersion.cmake
762                 VERSION ${FREERDP_VERSION} COMPATIBILITY SameMajorVersion)
763
764         install(FILES ${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfigVersion.cmake
765                 DESTINATION ${FREERDP_CMAKE_INSTALL_DIR})
766
767         install(EXPORT FreeRDPTargets DESTINATION ${FREERDP_CMAKE_INSTALL_DIR})
768
769 endif()
770
771 # Packaging
772
773 set(CMAKE_CPACK_INCLUDE_FILE "CMakeCPack.cmake")
774
775 if(NOT (VENDOR MATCHES "FreeRDP"))
776         if(DEFINED CLIENT_VENDOR_PATH)
777                 if(EXISTS "${CMAKE_SOURCE_DIR}/${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
778                         set(CMAKE_CPACK_INCLUDE_FILE "${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
779                 endif()
780         endif()
781 endif()
782
783 #message("VENDOR: ${VENDOR} CLIENT_VENDOR_PATH: ${CLIENT_VENDOR_PATH} CMAKE_CPACK_INCLUDE_FILE: ${CMAKE_CPACK_INCLUDE_FILE}")
784
785 include(${CMAKE_CPACK_INCLUDE_FILE})
786
787 set(FREERDP_PC_LIBS "-lfreerdp -lfreerdp-client")
788 set(WINPR_PC_LIBS "-lwinpr")
789 if (WITH_SERVER)
790         set(FREERDP_PC_LIBS "${FREERDP_PC_LIBS} -lfreerdp-server")
791 endif()
792
793 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/freerdp.pc.in ${CMAKE_CURRENT_BINARY_DIR}/freerdp.pc @ONLY)
794 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/winpr.pc.in ${CMAKE_CURRENT_BINARY_DIR}/winpr.pc @ONLY)
795 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/freerdp.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
796 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/winpr.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)