1 # FreeRDP: A Remote Desktop Protocol Implementation
2 # FreeRDP cmake build script
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
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
13 # http://www.apache.org/licenses/LICENSE-2.0
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.
21 cmake_minimum_required(VERSION 2.8)
23 project(FreeRDP C CXX)
25 if(NOT DEFINED VENDOR)
26 set(VENDOR "FreeRDP" CACHE STRING "FreeRDP package vendor")
29 if(NOT DEFINED PRODUCT)
30 set(PRODUCT "FreeRDP" CACHE STRING "FreeRDP package name")
33 if(NOT DEFINED FREERDP_VENDOR)
37 set(CMAKE_COLOR_MAKEFILE ON)
39 set(CMAKE_POSITION_INDEPENDENT_CODE ON)
41 # Include our extra modules
42 set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/)
44 if((CMAKE_SYSTEM_NAME MATCHES "WindowsStore") AND (CMAKE_SYSTEM_VERSION MATCHES "10.0"))
46 add_definitions("-D_UWP")
47 set(CMAKE_WINDOWS_VERSION "WIN10")
50 # Check for cmake compatibility (enable/disable features)
51 include(CheckCmakeCompat)
53 # Include cmake modules
54 include(CheckIncludeFiles)
55 include(CheckLibraryExists)
56 include(CheckSymbolExists)
57 include(CheckStructHasMember)
58 include(FindPkgConfig)
59 include(TestBigEndian)
62 include(AutoVersioning)
63 include(ConfigOptions)
64 include(ComplexLibrary)
65 include(FeatureSummary)
66 include(CheckCCompilerFlag)
67 include(CheckCXXCompilerFlag)
68 include(GNUInstallDirsWrapper)
69 include(CMakePackageConfigHelpers)
73 if ($ENV{BUILD_NUMBER})
74 set(BUILD_NUMBER $ENV{BUILD_NUMBER})
76 set(WITH_LIBRARY_VERSIONING "ON")
77 set(FREERDP_VERSION_MAJOR "2")
78 set(FREERDP_VERSION_MINOR "0")
79 set(FREERDP_VERSION_REVISION "0")
80 set(FREERDP_VERSION_SUFFIX "dev")
81 set(FREERDP_API_VERSION "${FREERDP_VERSION_MAJOR}")
82 set(FREERDP_VERSION "${FREERDP_VERSION_MAJOR}.${FREERDP_VERSION_MINOR}.${FREERDP_VERSION_REVISION}")
83 if (FREERDP_VERSION_SUFFIX)
84 set(FREERDP_VERSION_FULL "${FREERDP_VERSION}-${FREERDP_VERSION_SUFFIX}")
86 set(FREERDP_VERSION_FULL "${FREERDP_VERSION}")
88 set(FREERDP_INCLUDE_DIR "include/freerdp${FREERDP_VERSION_MAJOR}/")
90 # Compatibility options
91 if(DEFINED STATIC_CHANNELS)
92 message(WARNING "STATIC_CHANNELS is obsolete, please use BUILTIN_CHANNELS instead")
93 set(BUILTIN_CHANNELS ${STATIC_CHANNELS} CACHE BOOL "" FORCE)
97 if (CMAKE_INSTALL_PREFIX)
98 get_filename_component(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" ABSOLUTE)
100 if (FREERDP_EXTERNAL_PATH)
101 get_filename_component (FREERDP_EXTERNAL_PATH "${FREERDP_EXTERNAL_PATH}" ABSOLUTE)
104 # Allow to search the host machine for git
106 SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
107 endif(ANDROID OR IOS)
109 include(GetGitRevisionDescription)
110 git_get_exact_tag(GIT_REVISION --tags --always)
112 if (${GIT_REVISION} STREQUAL "n/a")
113 git_rev_parse (GIT_REVISION --short)
116 SET (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
117 endif(ANDROID OR IOS)
119 message(STATUS "Git Revision ${GIT_REVISION}")
121 # Turn on solution folders (2.8.4+)
122 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
124 # Default to release build type
125 if(NOT CMAKE_BUILD_TYPE)
126 set(CMAKE_BUILD_TYPE "Release")
129 if(NOT DEFINED BUILD_SHARED_LIBS)
131 set(BUILD_SHARED_LIBS OFF)
133 set(BUILD_SHARED_LIBS ON)
138 set(EXPORT_ALL_SYMBOLS TRUE)
139 elseif(NOT DEFINED EXPORT_ALL_SYMBOLS)
140 set(EXPORT_ALL_SYMBOLS FALSE)
144 if(${CMAKE_SYSTEM_NAME} MATCHES "BSD")
146 if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
149 if(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
154 # Configure MSVC Runtime
157 if(NOT DEFINED MSVC_RUNTIME)
158 set(MSVC_RUNTIME "dynamic")
160 if(MSVC_RUNTIME STREQUAL "static")
161 if(BUILD_SHARED_LIBS)
162 message(FATAL_ERROR "Static CRT is only supported in a fully static build")
164 message(STATUS "Use the MSVC static runtime option carefully!")
165 message(STATUS "OpenSSL uses /MD by default, and is very picky")
166 message(STATUS "Random freeing errors are a common sign of runtime issues")
168 configure_msvc_runtime()
170 if(NOT DEFINED CMAKE_SUPPRESS_REGENERATION)
171 set(CMAKE_SUPPRESS_REGENERATION ON)
175 # Compiler-specific flags
176 if(CMAKE_COMPILER_IS_GNUCC)
177 if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "i686")
178 CHECK_SYMBOL_EXISTS(__x86_64__ "" IS_X86_64)
180 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
182 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686")
185 if(CMAKE_POSITION_INDEPENDENT_CODE)
186 if(${CMAKE_VERSION} VERSION_LESS 2.8.9)
187 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
192 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
194 CHECK_C_COMPILER_FLAG (-Wno-unused-result Wno-unused-result)
195 if(Wno-unused-result)
196 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-result")
198 CHECK_C_COMPILER_FLAG (-Wno-unused-but-set-variable Wno-unused-but-set-variable)
199 if(Wno-unused-but-set-variable)
200 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-but-set-variable")
202 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
203 if(Wno-deprecated-declarations)
204 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
206 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
207 if(Wno-deprecated-declarationsCXX)
208 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
211 if(NOT EXPORT_ALL_SYMBOLS)
212 message(STATUS "GCC default symbol visibility: hidden")
213 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
216 CHECK_C_COMPILER_FLAG(-Wno-format Wno-format)
218 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format")
221 CHECK_C_COMPILER_FLAG (-Wimplicit-function-declaration Wimplicit-function-declaration)
222 if(Wimplicit-function-declaration)
223 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wimplicit-function-declaration")
227 CHECK_C_COMPILER_FLAG (-Wredundant-decls Wredundant-decls)
229 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
232 if(CMAKE_BUILD_TYPE STREQUAL "Release")
233 set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG")
234 set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG")
236 CHECK_C_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefined)
237 if(Wno-builtin-macro-redefined)
238 set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Wno-builtin-macro-redefined")
239 set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -D__FILE__='\"$(subst ${CMAKE_BINARY_DIR}/,,$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<)))\"'")
242 CHECK_CXX_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefinedCXX)
243 if(Wno-builtin-macro-redefinedCXX)
244 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wno-builtin-macro-redefined")
245 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -D__FILE__='\"$(subst ${CMAKE_BINARY_DIR}/,,$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<)))\"'")
248 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
249 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
252 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2")
256 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
257 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
258 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-macros -Wno-padded")
259 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-c11-extensions -Wno-gnu")
261 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mssse3")
263 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
264 if(Wno-deprecated-declarations)
265 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
267 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
268 if(Wno-deprecated-declarationsCXX)
269 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
273 # Enable address sanitizer, where supported and when required
274 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCC)
275 if(WITH_SANITIZE_ADDRESS)
276 if (DEFINED CMAKE_REQUIRED_FLAGS)
277 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
279 set(CMAKE_REQUIRED_FLAGS "-fsanitize=address")
280 CHECK_C_COMPILER_FLAG ("-fsanitize=address" fsanitize-address)
281 if(fsanitize-address)
282 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
284 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
285 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
287 unset(CMAKE_REQUIRED_FLAGS)
290 CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
291 if(fno-omit-frame-pointer)
292 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
295 if (WITH_NO_UNDEFINED)
296 if (DEFINED CMAKE_REQUIRED_FLAGS)
297 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
299 set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
300 CHECK_C_COMPILER_FLAG (-Wl,--no-undefined no-undefined)
301 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
302 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
303 unset(SAVE_CMAKE_REQUIRED_FLAGS)
305 unset(CMAKE_REQUIRED_FLAGS)
308 SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined" )
314 # Remove previous warning definitions,
315 # NMake is otherwise complaining.
316 foreach (flags_var_to_scrub
319 CMAKE_CXX_FLAGS_RELEASE
320 CMAKE_CXX_FLAGS_RELWITHDEBINFO
321 CMAKE_CXX_FLAGS_MINSIZEREL
322 CMAKE_C_FLAGS_RELEASE
323 CMAKE_C_FLAGS_RELWITHDEBINFO
324 CMAKE_C_FLAGS_MINSIZEREL)
325 string (REGEX REPLACE "(^| )[/-]W[ ]*[1-9]" " "
326 "${flags_var_to_scrub}" "${${flags_var_to_scrub}}")
329 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gd")
330 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
332 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
333 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_AMD64_")
335 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_X86_")
338 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
339 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})
341 if(CMAKE_BUILD_TYPE STREQUAL "Release")
343 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Zi")
344 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi")
350 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUNICODE -D_UNICODE")
351 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_SECURE_NO_WARNINGS")
352 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWIN32_LEAN_AND_MEAN")
353 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_WINSOCK_DEPRECATED_NO_WARNINGS")
355 set(CMAKE_USE_RELATIVE_PATH ON)
356 if (${CMAKE_GENERATOR} MATCHES "NMake Makefile*")
357 set(CMAKE_PDB_BINARY_DIR ${CMAKE_BINARY_DIR})
358 elseif (${CMAKE_GENERATOR} MATCHES "Visual Studio*")
359 set(CMAKE_PDB_BINARY_DIR "${CMAKE_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
361 message(FATAL "Unknown generator ${CMAKE_GENERATOR}")
364 # Set product and vendor for dll and exe version information.
365 set(RC_VERSION_VENDOR ${VENDOR})
366 set(RC_VERSION_PRODUCT ${PRODUCT})
367 set(RC_VERSION_PATCH ${BUILD_NUMBER})
368 set(RC_VERSION_DESCRIPTION ${GIT_REVISION})
370 string(TIMESTAMP RC_VERSION_YEAR "%Y")
372 if(NOT DEFINED CMAKE_WINDOWS_VERSION)
373 set(CMAKE_WINDOWS_VERSION "WINXP")
376 if(CMAKE_WINDOWS_VERSION STREQUAL "WINXP")
377 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0501 -D_WIN32_WINNT=0x0501")
378 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0501 -D_WIN32_WINNT=0x0501")
379 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN7")
380 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0601 -D_WIN32_WINNT=0x0601")
381 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0601 -D_WIN32_WINNT=0x0601")
382 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN8")
383 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0602 -D_WIN32_WINNT=0x0602")
384 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0602 -D_WIN32_WINNT=0x0602")
385 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN10")
386 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0A00 -D_WIN32_WINNT=0x0A00")
387 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0A00 -D_WIN32_WINNT=0x0A00")
390 if (FREERDP_EXTERNAL_SSL_PATH)
391 set(OPENSSL_ROOT_DIR ${FREERDP_EXTERNAL_SSL_PATH})
396 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_IOS_SDK_ROOT} -g")
399 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINPR_EXPORTS -DFREERDP_EXPORTS")
400 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINPR_EXPORTS -DFREERDP_EXPORTS")
404 check_include_files(fcntl.h HAVE_FCNTL_H)
405 check_include_files(unistd.h HAVE_UNISTD_H)
406 check_include_files(execinfo.h HAVE_EXECINFO_H)
407 check_include_files(inttypes.h HAVE_INTTYPES_H)
408 check_include_files(sys/modem.h HAVE_SYS_MODEM_H)
409 check_include_files(sys/filio.h HAVE_SYS_FILIO_H)
410 check_include_files(sys/sockio.h HAVE_SYS_SOCKIO_H)
411 check_include_files(sys/strtio.h HAVE_SYS_STRTIO_H)
412 check_include_files(sys/select.h HAVE_SYS_SELECT_H)
413 check_include_files(syslog.h HAVE_SYSLOG_H)
417 set(HAVE_INTTYPES_H 1)
418 set(HAVE_SYS_FILIO_H 1)
422 check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
424 set(HAVE_TM_GMTOFF 1)
430 if (NOT FREERDP_IOS_EXTERNAL_SSL_PATH)
431 message(STATUS "FREERDP_IOS_EXTERNAL_SSL_PATH not set! Required if openssl is not found in the iOS SDK (which usually isn't")
433 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_IOS_EXTERNAL_SSL_PATH})
434 set_property(GLOBAL PROPERTY XCODE_ATTRIBUTE_SKIP_INSTALL YES)
436 if(NOT DEFINED CMAKE_OSX_ARCHITECTURES)
437 set(CMAKE_OSX_ARCHITECTURES i386 x86_64)
440 if(IS_DIRECTORY /opt/local/include)
441 include_directories(/opt/local/include)
442 link_directories(/opt/local/lib)
446 # Temporarily disabled, causes the cmake script to be reexecuted, causing the compilation to fail.
447 # Workaround: specify the parameter in the command-line
449 # set(CMAKE_C_COMPILER "clang")
453 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -v")
454 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v")
460 set(WITH_MANPAGES "ON")
462 set(WITH_PULSE "OFF")
464 set(WITH_WAYLAND "OFF")
469 set(WITH_LIBRARY_VERSIONING "OFF")
471 if (${ANDROID_ABI} STREQUAL "armeabi")
475 if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
476 add_definitions(-DNDK_DEBUG=1)
478 # NOTE: Manually add -gdwarf-3, as newer toolchains default to -gdwarf-4,
479 # which is not supported by the gdbserver binary shipped with
480 # the android NDK (tested with r9b)
481 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG} -gdwarf-3")
483 set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -llog")
485 if (NOT FREERDP_EXTERNAL_PATH)
486 if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/")
487 set (FREERDP_EXTERNAL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/")
489 message(STATUS "FREERDP_EXTERNAL_PATH not set!")
493 list (APPEND CMAKE_INCLUDE_PATH ${FREERDP_EXTERNAL_PATH}/include)
494 list (APPEND CMAKE_LIBRARY_PATH ${FREERDP_EXTERNAL_PATH}/${ANDROID_ABI}/ )
495 set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH )
496 set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH )
499 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/gprof_generate.sh.cmake
500 ${CMAKE_BINARY_DIR}/scripts/gprof_generate.sh @ONLY)
504 set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
506 if(NOT IOS AND NOT ANDROID)
507 find_package(Threads REQUIRED)
511 check_library_exists(pthread pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK)
514 if(WITH_VALGRIND_MEMCHECK)
515 check_include_files(valgrind/memcheck.h HAVE_VALGRIND_MEMCHECK_H)
517 unset(HAVE_VALGRIND_MEMCHECK_H CACHE)
521 check_include_files(sys/eventfd.h HAVE_AIO_H)
522 check_include_files(sys/eventfd.h HAVE_EVENTFD_H)
524 check_symbol_exists(eventfd_read sys/eventfd.h WITH_EVENTFD_READ_WRITE)
526 check_include_files(sys/timerfd.h HAVE_TIMERFD_H)
527 check_include_files(poll.h HAVE_POLL_H)
528 list(APPEND CMAKE_REQUIRED_LIBRARIES m)
529 check_symbol_exists(ceill math.h HAVE_MATH_C99_LONG_DOUBLE)
530 list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES m)
531 set(X11_FEATURE_TYPE "RECOMMENDED")
532 set(WAYLAND_FEATURE_TYPE "RECOMMENDED")
534 set(X11_FEATURE_TYPE "DISABLED")
535 set(WAYLAND_FEATURE_TYPE "DISABLED")
539 find_package(PCSCWinPR)
542 set(X11_FEATURE_PURPOSE "X11")
543 set(X11_FEATURE_DESCRIPTION "X11 client and server")
545 set(WAYLAND_FEATURE_PURPOSE "Wayland")
546 set(WAYLAND_FEATURE_DESCRIPTION "Wayland client")
548 set(DIRECTFB_FEATURE_TYPE "OPTIONAL")
549 set(DIRECTFB_FEATURE_PURPOSE "DirectFB")
550 set(DIRECTFB_FEATURE_DESCRIPTION "DirectFB client")
552 set(ZLIB_FEATURE_TYPE "REQUIRED")
553 set(ZLIB_FEATURE_PURPOSE "compression")
554 set(ZLIB_FEATURE_DESCRIPTION "data compression")
556 set(OPENSSL_FEATURE_TYPE "REQUIRED")
557 set(OPENSSL_FEATURE_PURPOSE "cryptography")
558 set(OPENSSL_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
560 set(MBEDTLS_FEATURE_TYPE "OPTIONAL")
561 set(MBEDTLS_FEATURE_PURPOSE "cryptography")
562 set(MBEDTLS_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
564 set(OPENSLES_FEATURE_TYPE "OPTIONAL")
565 set(OPENSLES_FEATURE_PURPOSE "multimedia")
566 set(OPENSLES_FEATURE_DESCRIPTION "OpenSLES audio / video")
568 set(OSS_FEATURE_TYPE "RECOMMENDED")
569 set(OSS_FEATURE_PURPOSE "sound")
570 set(OSS_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
572 set(ALSA_FEATURE_TYPE "RECOMMENDED")
573 set(ALSA_FEATURE_PURPOSE "sound")
574 set(ALSA_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
576 set(PULSE_FEATURE_TYPE "OPTIONAL")
577 set(PULSE_FEATURE_PURPOSE "sound")
578 set(PULSE_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
580 set(CUPS_FEATURE_TYPE "OPTIONAL")
581 set(CUPS_FEATURE_PURPOSE "printing")
582 set(CUPS_FEATURE_DESCRIPTION "printer device redirection")
584 set(PCSC_FEATURE_TYPE "OPTIONAL")
585 set(PCSC_FEATURE_PURPOSE "smart card")
586 set(PCSC_FEATURE_DESCRIPTION "smart card device redirection")
588 set(FFMPEG_FEATURE_TYPE "RECOMMENDED")
589 set(FFMPEG_FEATURE_PURPOSE "multimedia")
590 set(FFMPEG_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
592 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
593 set(GSTREAMER_0_10_FEATURE_PURPOSE "multimedia")
594 set(GSTREAMER_0_10_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback, gstreamer 0.10 version")
596 set(GSTREAMER_1_0_FEATURE_TYPE "RECOMMENDED")
597 set(GSTREAMER_1_0_FEATURE_PURPOSE "multimedia")
598 set(GSTREAMER_1_0_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
600 set(IPP_FEATURE_TYPE "OPTIONAL")
601 set(IPP_FEATURE_PURPOSE "performance")
602 set(IPP_FEATURE_DESCRIPTION "Intel Integrated Performance Primitives library")
604 set(JPEG_FEATURE_TYPE "OPTIONAL")
605 set(JPEG_FEATURE_PURPOSE "codec")
606 set(JPEG_FEATURE_DESCRIPTION "use JPEG library")
608 set(X264_FEATURE_TYPE "OPTIONAL")
609 set(X264_FEATURE_PURPOSE "codec")
610 set(X264_FEATURE_DESCRIPTION "use x264 library")
612 set(OPENH264_FEATURE_TYPE "OPTIONAL")
613 set(OPENH264_FEATURE_PURPOSE "codec")
614 set(OPENH264_FEATURE_DESCRIPTION "use OpenH264 library")
616 set(GSM_FEATURE_TYPE "OPTIONAL")
617 set(GSM_FEATURE_PURPOSE "codec")
618 set(GSM_FEATURE_DESCRIPTION "GSM audio codec library")
621 set(X11_FEATURE_TYPE "DISABLED")
622 set(WAYLAND_FEATURE_TYPE "DISABLED")
623 set(ZLIB_FEATURE_TYPE "DISABLED")
624 set(DIRECTFB_FEATURE_TYPE "DISABLED")
625 set(OSS_FEATURE_TYPE "DISABLED")
626 set(ALSA_FEATURE_TYPE "DISABLED")
627 set(PULSE_FEATURE_TYPE "DISABLED")
628 set(CUPS_FEATURE_TYPE "DISABLED")
629 set(PCSC_FEATURE_TYPE "DISABLED")
630 set(FFMPEG_FEATURE_TYPE "DISABLED")
631 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
632 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
633 set(OPENSLES_FEATURE_TYPE "DISABLED")
637 set(DIRECTFB_FEATURE_TYPE "DISABLED")
638 set(FFMPEG_FEATURE_TYPE "OPTIONAL")
639 set(GSTREAMER_1_0_FEATURE_TYPE "OPTIONAL")
640 set(X11_FEATURE_TYPE "OPTIONAL")
641 set(WAYLAND_FEATURE_TYPE "DISABLED")
642 set(OSS_FEATURE_TYPE "DISABLED")
643 set(ALSA_FEATURE_TYPE "DISABLED")
645 set(X11_FEATURE_TYPE "DISABLED")
646 set(PULSE_FEATURE_TYPE "DISABLED")
647 set(CUPS_FEATURE_TYPE "DISABLED")
648 set(PCSC_FEATURE_TYPE "DISABLED")
649 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
650 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
652 set(OPENSLES_FEATURE_TYPE "DISABLED")
655 if(UNIX AND NOT ANDROID)
656 set(WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE "RECOMMENDED")
657 set(WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE "systemd journal appender")
658 set(WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION "allows to export wLog to systemd journal")
660 #include(Findlibsystemd)
661 find_feature(libsystemd ${WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION})
664 set(HAVE_JOURNALD_H TRUE)
666 unset(HAVE_JOURNALD_H)
668 endif(UNIX AND NOT ANDROID)
671 set(X11_FEATURE_TYPE "DISABLED")
672 set(WAYLAND_FEATURE_TYPE "DISABLED")
673 set(DIRECTFB_FEATURE_TYPE "DISABLED")
674 set(OSS_FEATURE_TYPE "DISABLED")
675 set(ALSA_FEATURE_TYPE "DISABLED")
676 set(PULSE_FEATURE_TYPE "DISABLED")
677 set(CUPS_FEATURE_TYPE "DISABLED")
678 set(PCSC_FEATURE_TYPE "DISABLED")
679 set(FFMPEG_FEATURE_TYPE "DISABLED")
680 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
681 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
682 set(OPENSLES_FEATURE_TYPE "REQUIRED")
685 find_feature(X11 ${X11_FEATURE_TYPE} ${X11_FEATURE_PURPOSE} ${X11_FEATURE_DESCRIPTION})
686 find_feature(Wayland ${WAYLAND_FEATURE_TYPE} ${WAYLAND_FEATURE_PURPOSE} ${WAYLAND_FEATURE_DESCRIPTION})
687 find_feature(DirectFB ${DIRECTFB_FEATURE_TYPE} ${DIRECTFB_FEATURE_PURPOSE} ${DIRECTFB_FEATURE_DESCRIPTION})
688 if (${WITH_DIRECTFB})
689 message(WARNING "DIRECTFB is orphaned and not maintained see docs/README.directfb for details")
692 find_feature(ZLIB ${ZLIB_FEATURE_TYPE} ${ZLIB_FEATURE_PURPOSE} ${ZLIB_FEATURE_DESCRIPTION})
693 find_feature(OpenSSL ${OPENSSL_FEATURE_TYPE} ${OPENSSL_FEATURE_PURPOSE} ${OPENSSL_FEATURE_DESCRIPTION})
694 find_feature(MbedTLS ${MBEDTLS_FEATURE_TYPE} ${MBEDTLS_FEATURE_PURPOSE} ${MBEDTLS_FEATURE_DESCRIPTION})
695 find_feature(OpenSLES ${OPENSLES_FEATURE_TYPE} ${OPENSLES_FEATURE_PURPOSE} ${OPENSLES_FEATURE_DESCRIPTION})
697 find_feature(OSS ${OSS_FEATURE_TYPE} ${OSS_FEATURE_PURPOSE} ${OSS_FEATURE_DESCRIPTION})
698 find_feature(ALSA ${ALSA_FEATURE_TYPE} ${ALSA_FEATURE_PURPOSE} ${ALSA_FEATURE_DESCRIPTION})
699 find_feature(Pulse ${PULSE_FEATURE_TYPE} ${PULSE_FEATURE_PURPOSE} ${PULSE_FEATURE_DESCRIPTION})
701 find_feature(Cups ${CUPS_FEATURE_TYPE} ${CUPS_FEATURE_PURPOSE} ${CUPS_FEATURE_DESCRIPTION})
702 find_feature(PCSC ${PCSC_FEATURE_TYPE} ${PCSC_FEATURE_PURPOSE} ${PCSC_FEATURE_DESCRIPTION})
704 find_feature(FFmpeg ${FFMPEG_FEATURE_TYPE} ${FFMPEG_FEATURE_PURPOSE} ${FFMPEG_FEATURE_DESCRIPTION})
706 find_feature(GStreamer_0_10 ${GSTREAMER_0_10_FEATURE_TYPE} ${GSTREAMER_0_10_FEATURE_PURPOSE} ${GSTREAMER_0_10_FEATURE_DESCRIPTION})
707 find_feature(GStreamer_1_0 ${GSTREAMER_1_0_FEATURE_TYPE} ${GSTREAMER_1_0_FEATURE_PURPOSE} ${GSTREAMER_1_0_FEATURE_DESCRIPTION})
709 find_feature(JPEG ${JPEG_FEATURE_TYPE} ${JPEG_FEATURE_PURPOSE} ${JPEG_FEATURE_DESCRIPTION})
710 find_feature(x264 ${X264_FEATURE_TYPE} ${X264_FEATURE_PURPOSE} ${X264_FEATURE_DESCRIPTION})
711 find_feature(OpenH264 ${OPENH264_FEATURE_TYPE} ${OPENH264_FEATURE_PURPOSE} ${OPENH264_FEATURE_DESCRIPTION})
712 find_feature(GSM ${GSM_FEATURE_TYPE} ${GSM_FEATURE_PURPOSE} ${GSM_FEATURE_DESCRIPTION})
714 if(TARGET_ARCH MATCHES "x86|x64")
716 # Intel Performance Primitives
717 find_feature(IPP ${IPP_FEATURE_TYPE} ${IPP_FEATURE_PURPOSE} ${IPP_FEATURE_DESCRIPTION})
722 add_definitions("-DWITH_OPENSSL")
726 add_definitions("-DWITH_MBEDTLS")
729 if (TARGET_ARCH MATCHES "sparc")
730 set(HAVE_ALIGNED_REQUIRED 1)
733 # Path to put FreeRDP data
734 set(FREERDP_DATA_PATH "${CMAKE_INSTALL_PREFIX}/share/freerdp${FREERDP_VERSION_MAJOR}")
736 # Path to put plugins
738 set(FREERDP_LIBRARY_PATH "${CMAKE_INSTALL_LIBDIR}")
740 set(FREERDP_PLUGIN_PATH "${CMAKE_INSTALL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}")
741 set(FREERDP_ADDIN_PATH "${FREERDP_PLUGIN_PATH}")
743 # Path to put extensions
744 set(FREERDP_EXTENSION_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}/extensions")
746 # Include directories
747 include_directories(${CMAKE_CURRENT_BINARY_DIR})
748 include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
749 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
752 add_definitions("-DHAVE_CONFIG_H")
753 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
755 # RPATH configuration
757 set(CMAKE_SKIP_RPATH FALSE)
758 set(CMAKE_SKIP_INSTALL_RPATH TRUE)
760 set(CMAKE_SKIP_BUILD_RPATH FALSE)
761 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
762 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
763 set(CMAKE_INSTALL_RPATH "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}:\$ORIGIN/..")
768 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
769 set(PROFILER_LIBRARIES
770 "${FREERDP_EXTERNAL_PROFILER_PATH}/obj/local/${ANDROID_ABI}/libandroid-ndk-profiler.a")
771 include_directories("${FREERDP_EXTERNAL_PROFILER_PATH}")
780 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFREERDP_TEST_EXPORTS")
785 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
787 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Testing")
792 include_directories("${CMAKE_SOURCE_DIR}/winpr/include")
793 include_directories("${CMAKE_BINARY_DIR}/winpr/include")
795 if (${CMAKE_VERSION} VERSION_LESS 2.8.12)
796 set(PUBLIC_KEYWORD "")
797 set(PRIVATE_KEYWORD "")
799 set(PUBLIC_KEYWORD "PUBLIC")
800 set(PRIVATE_KEYWORD "PRIVATE")
803 add_subdirectory(winpr)
808 add_subdirectory(third-party)
809 if (NOT "${THIRD_PARTY_INCLUDES}" STREQUAL "")
810 include_directories(${THIRD_PARTY_INCLUDES})
814 add_subdirectory(include)
816 add_subdirectory(libfreerdp)
819 set(CMAKE_OSX_DEPLOYMENT_TARGET "")
820 if (IOS_PLATFORM MATCHES "SIMULATOR")
821 set(CMAKE_OSX_SYSROOT "iphonesimulator")
823 set(CMAKE_OSX_SYSROOT "iphoneos")
828 include_directories("${CMAKE_SOURCE_DIR}/rdtk/include")
829 include_directories("${CMAKE_BINARY_DIR}/rdtk/include")
831 add_subdirectory(rdtk)
834 add_subdirectory(uwac)
838 if(IS_DIRECTORY /usr/local/include)
839 include_directories(/usr/local/include)
840 link_directories(/usr/local/lib)
843 if(IS_DIRECTORY /usr/X11R6/include)
844 include_directories(/usr/X11R6/include)
850 add_subdirectory(channels)
853 if(WITH_CLIENT_COMMON OR WITH_CLIENT)
854 add_subdirectory(client)
858 add_subdirectory(server)
863 set(CMAKE_CPACK_INCLUDE_FILE "CMakeCPack.cmake")
865 if(NOT (VENDOR MATCHES "FreeRDP"))
866 if(DEFINED CLIENT_VENDOR_PATH)
867 if(EXISTS "${CMAKE_SOURCE_DIR}/${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
868 set(CMAKE_CPACK_INCLUDE_FILE "${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
873 #message("VENDOR: ${VENDOR} CLIENT_VENDOR_PATH: ${CLIENT_VENDOR_PATH} CMAKE_CPACK_INCLUDE_FILE: ${CMAKE_CPACK_INCLUDE_FILE}")
875 include(${CMAKE_CPACK_INCLUDE_FILE})
877 set(FREERDP_BUILD_CONFIG_LIST "")
878 GET_CMAKE_PROPERTY(res VARIABLES)
880 IF (var MATCHES "^WITH_*|^BUILD_TESTING|^BUILTIN_CHANNELS|^HAVE_*")
881 LIST(APPEND FREERDP_BUILD_CONFIG_LIST "${var}=${${var}}")
884 string(REPLACE ";" " " FREERDP_BUILD_CONFIG "${FREERDP_BUILD_CONFIG_LIST}")
885 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/buildflags.h.in ${CMAKE_CURRENT_BINARY_DIR}/buildflags.h)