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)
70 include(InstallFreeRDPMan)
74 if ($ENV{BUILD_NUMBER})
75 set(BUILD_NUMBER $ENV{BUILD_NUMBER})
77 set(WITH_LIBRARY_VERSIONING "ON")
78 set(FREERDP_VERSION_MAJOR "2")
79 set(FREERDP_VERSION_MINOR "0")
80 set(FREERDP_VERSION_REVISION "0")
81 set(FREERDP_VERSION_SUFFIX "dev")
82 set(FREERDP_API_VERSION "${FREERDP_VERSION_MAJOR}")
83 set(FREERDP_VERSION "${FREERDP_VERSION_MAJOR}.${FREERDP_VERSION_MINOR}.${FREERDP_VERSION_REVISION}")
84 if (FREERDP_VERSION_SUFFIX)
85 set(FREERDP_VERSION_FULL "${FREERDP_VERSION}-${FREERDP_VERSION_SUFFIX}")
87 set(FREERDP_VERSION_FULL "${FREERDP_VERSION}")
89 set(FREERDP_INCLUDE_DIR "include/freerdp${FREERDP_VERSION_MAJOR}/")
91 # Compatibility options
92 if(DEFINED STATIC_CHANNELS)
93 message(WARNING "STATIC_CHANNELS is obsolete, please use BUILTIN_CHANNELS instead")
94 set(BUILTIN_CHANNELS ${STATIC_CHANNELS} CACHE BOOL "" FORCE)
98 if (CMAKE_INSTALL_PREFIX)
99 get_filename_component(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" ABSOLUTE)
101 if (FREERDP_EXTERNAL_PATH)
102 get_filename_component (FREERDP_EXTERNAL_PATH "${FREERDP_EXTERNAL_PATH}" ABSOLUTE)
105 # Allow to search the host machine for git
106 if(CMAKE_CROSSCOMPILING)
107 SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
108 endif(CMAKE_CROSSCOMPILING)
110 find_program(CCACHE ccache)
111 if(CCACHE AND WITH_CCACHE)
112 set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE})
113 set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE})
114 endif(CCACHE AND WITH_CCACHE)
116 include(GetGitRevisionDescription)
117 git_get_exact_tag(GIT_REVISION --tags --always)
119 if (${GIT_REVISION} STREQUAL "n/a")
120 git_rev_parse (GIT_REVISION --short)
122 if(CMAKE_CROSSCOMPILING)
123 SET (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
124 endif(CMAKE_CROSSCOMPILING)
126 message(STATUS "Git Revision ${GIT_REVISION}")
128 # Turn on solution folders (2.8.4+)
129 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
131 # Default to release build type
132 if(NOT CMAKE_BUILD_TYPE)
133 set(CMAKE_BUILD_TYPE "Release")
136 if(NOT DEFINED BUILD_SHARED_LIBS)
138 set(BUILD_SHARED_LIBS OFF)
140 set(BUILD_SHARED_LIBS ON)
145 set(EXPORT_ALL_SYMBOLS TRUE)
146 elseif(NOT DEFINED EXPORT_ALL_SYMBOLS)
147 set(EXPORT_ALL_SYMBOLS FALSE)
150 if (EXPORT_ALL_SYMBOLS)
151 # set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
152 add_definitions(-DFREERDP_TEST_EXPORTS -DBUILD_TESTING)
153 endif(EXPORT_ALL_SYMBOLS)
156 if(${CMAKE_SYSTEM_NAME} MATCHES "BSD")
158 if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
161 if(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
166 # Configure MSVC Runtime
169 if(NOT DEFINED MSVC_RUNTIME)
170 set(MSVC_RUNTIME "dynamic")
172 if(MSVC_RUNTIME STREQUAL "static")
173 if(BUILD_SHARED_LIBS)
174 message(FATAL_ERROR "Static CRT is only supported in a fully static build")
176 message(STATUS "Use the MSVC static runtime option carefully!")
177 message(STATUS "OpenSSL uses /MD by default, and is very picky")
178 message(STATUS "Random freeing errors are a common sign of runtime issues")
180 configure_msvc_runtime()
182 if(NOT DEFINED CMAKE_SUPPRESS_REGENERATION)
183 set(CMAKE_SUPPRESS_REGENERATION ON)
187 # Enable 64bit file support on linux.
188 if("${CMAKE_SYSTEM_NAME}" MATCHES "Linux")
189 add_definitions("-D_FILE_OFFSET_BITS=64")
192 # Use Standard conforming getpwnam_r() on Solaris.
193 if("${CMAKE_SYSTEM_NAME}" MATCHES "SunOS")
194 add_definitions("-D_POSIX_PTHREAD_SEMANTICS")
197 # Compiler-specific flags
198 if(CMAKE_COMPILER_IS_GNUCC)
199 if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "i686")
200 CHECK_SYMBOL_EXISTS(__x86_64__ "" IS_X86_64)
202 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
204 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686")
207 if(CMAKE_POSITION_INDEPENDENT_CODE)
208 if(${CMAKE_VERSION} VERSION_LESS 2.8.9)
209 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
214 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
216 CHECK_C_COMPILER_FLAG (-Wno-unused-result Wno-unused-result)
217 if(Wno-unused-result)
218 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-result")
220 CHECK_C_COMPILER_FLAG (-Wno-unused-but-set-variable Wno-unused-but-set-variable)
221 if(Wno-unused-but-set-variable)
222 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-but-set-variable")
224 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
225 if(Wno-deprecated-declarations)
226 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
228 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
229 if(Wno-deprecated-declarationsCXX)
230 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
233 if(NOT EXPORT_ALL_SYMBOLS)
234 message(STATUS "GCC default symbol visibility: hidden")
235 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
238 CHECK_C_COMPILER_FLAG(-Wno-format Wno-format)
240 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format")
243 CHECK_C_COMPILER_FLAG (-Wimplicit-function-declaration Wimplicit-function-declaration)
244 if(Wimplicit-function-declaration)
245 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wimplicit-function-declaration")
249 CHECK_C_COMPILER_FLAG (-Wredundant-decls Wredundant-decls)
251 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
254 if(CMAKE_BUILD_TYPE STREQUAL "Release")
255 add_definitions(-DNDEBUG)
257 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
258 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
261 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2")
265 # When building with Unix Makefiles and doing any release builds
266 # try to set __FILE__ to relative paths via a make specific macro
267 if (CMAKE_GENERATOR MATCHES "Unix Makefile*")
268 if(CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
269 string(TOUPPER ${CMAKE_BUILD_TYPE} UPPER_BUILD_TYPE)
270 CHECK_C_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefined)
271 if(Wno-builtin-macro-redefined)
272 set(CMAKE_C_FLAGS_${UPPER_BUILD_TYPE} "${CMAKE_C_FLAGS_${UPPER_BUILD_TYPE}} -Wno-builtin-macro-redefined -D__FILE__='\"$(subst ${CMAKE_BINARY_DIR}/,,$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<)))\"'")
275 CHECK_CXX_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefinedCXX)
276 if(Wno-builtin-macro-redefinedCXX)
277 set(CMAKE_CXX_FLAGS_${UPPER_BUILD_TYPE} "${CMAKE_CXX_FLAGS_${UPPER_BUILD_TYPE}} -Wno-builtin-macro-redefined -D__FILE__='\"$(subst ${CMAKE_BINARY_DIR}/,,$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<)))\"'")
282 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
283 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
284 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-macros -Wno-padded")
285 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-c11-extensions -Wno-gnu")
286 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-command-line-argument")
288 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mssse3")
290 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
291 if(Wno-deprecated-declarations)
292 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
294 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
295 if(Wno-deprecated-declarationsCXX)
296 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
300 # Enable address sanitizer, where supported and when required
301 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCC)
302 if(WITH_SANITIZE_ADDRESS)
303 if (DEFINED CMAKE_REQUIRED_FLAGS)
304 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
306 set(CMAKE_REQUIRED_FLAGS "-fsanitize=address")
307 CHECK_C_COMPILER_FLAG ("-fsanitize=address" fsanitize-address)
308 if(fsanitize-address)
309 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
311 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
312 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
314 unset(CMAKE_REQUIRED_FLAGS)
317 CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
318 if(fno-omit-frame-pointer)
319 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
321 elseif(WITH_SANITIZE_LEAK)
322 if (DEFINED CMAKE_REQUIRED_FLAGS)
323 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
325 set(CMAKE_REQUIRED_FLAGS "-fsanitize=leak")
326 CHECK_C_COMPILER_FLAG ("-fsanitize=leak" fsanitize-leak)
328 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=leak")
330 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
331 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
333 unset(CMAKE_REQUIRED_FLAGS)
336 CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
337 if(fno-omit-frame-pointer)
338 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
342 if (WITH_NO_UNDEFINED)
343 if (DEFINED CMAKE_REQUIRED_FLAGS)
344 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
346 set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
347 CHECK_C_COMPILER_FLAG (-Wl,--no-undefined no-undefined)
348 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
349 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
350 unset(SAVE_CMAKE_REQUIRED_FLAGS)
352 unset(CMAKE_REQUIRED_FLAGS)
355 SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined" )
361 # Remove previous warning definitions,
362 # NMake is otherwise complaining.
363 foreach (flags_var_to_scrub
366 CMAKE_CXX_FLAGS_RELEASE
367 CMAKE_CXX_FLAGS_RELWITHDEBINFO
368 CMAKE_CXX_FLAGS_MINSIZEREL
369 CMAKE_C_FLAGS_RELEASE
370 CMAKE_C_FLAGS_RELWITHDEBINFO
371 CMAKE_C_FLAGS_MINSIZEREL)
372 string (REGEX REPLACE "(^| )[/-]W[ ]*[1-9]" " "
373 "${flags_var_to_scrub}" "${${flags_var_to_scrub}}")
376 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gd")
377 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
379 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
380 add_definitions(-D_AMD64_)
382 add_definitions(-D_X86_)
385 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
386 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})
388 if(CMAKE_BUILD_TYPE STREQUAL "Release")
390 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Zi")
391 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi")
397 add_definitions(-DUNICODE -D_UNICODE)
398 add_definitions(-D_CRT_SECURE_NO_WARNINGS)
399 add_definitions(-DWIN32_LEAN_AND_MEAN)
400 add_definitions(-D_WINSOCK_DEPRECATED_NO_WARNINGS)
402 set(CMAKE_USE_RELATIVE_PATH ON)
403 if (${CMAKE_GENERATOR} MATCHES "NMake Makefile*")
404 set(CMAKE_PDB_BINARY_DIR ${CMAKE_BINARY_DIR})
405 elseif (${CMAKE_GENERATOR} MATCHES "Visual Studio*")
406 set(CMAKE_PDB_BINARY_DIR "${CMAKE_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
408 message(FATAL "Unknown generator ${CMAKE_GENERATOR}")
411 # Set product and vendor for dll and exe version information.
412 set(RC_VERSION_VENDOR ${VENDOR})
413 set(RC_VERSION_PRODUCT ${PRODUCT})
414 set(RC_VERSION_PATCH ${BUILD_NUMBER})
415 set(RC_VERSION_DESCRIPTION ${GIT_REVISION})
417 string(TIMESTAMP RC_VERSION_YEAR "%Y")
419 if(NOT DEFINED CMAKE_WINDOWS_VERSION)
420 set(CMAKE_WINDOWS_VERSION "WINXP")
423 if(CMAKE_WINDOWS_VERSION STREQUAL "WINXP")
424 add_definitions(-DWINVER=0x0501 -D_WIN32_WINNT=0x0501)
425 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN7")
426 add_definitions(-DWINVER=0x0601 -D_WIN32_WINNT=0x0601)
427 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN8")
428 add_definitions(-DWINVER=0x0602 -D_WIN32_WINNT=0x0602)
429 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN10")
430 add_definitions(-DWINVER=0x0A00 -D_WIN32_WINNT=0x0A00)
433 if (FREERDP_EXTERNAL_SSL_PATH)
434 set(OPENSSL_ROOT_DIR ${FREERDP_EXTERNAL_SSL_PATH})
439 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_IOS_SDK_ROOT} -g")
442 add_definitions(-DWINPR_EXPORTS -DFREERDP_EXPORTS)
446 check_include_files(fcntl.h HAVE_FCNTL_H)
447 check_include_files(unistd.h HAVE_UNISTD_H)
448 check_include_files(execinfo.h HAVE_EXECINFO_H)
449 check_include_files(inttypes.h HAVE_INTTYPES_H)
450 check_include_files(sys/modem.h HAVE_SYS_MODEM_H)
451 check_include_files(sys/filio.h HAVE_SYS_FILIO_H)
452 check_include_files(sys/sockio.h HAVE_SYS_SOCKIO_H)
453 check_include_files(sys/strtio.h HAVE_SYS_STRTIO_H)
454 check_include_files(sys/select.h HAVE_SYS_SELECT_H)
455 check_include_files(syslog.h HAVE_SYSLOG_H)
459 set(HAVE_INTTYPES_H 1)
460 set(HAVE_SYS_FILIO_H 1)
464 check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
466 set(HAVE_TM_GMTOFF 1)
472 if (NOT FREERDP_IOS_EXTERNAL_SSL_PATH)
473 message(STATUS "FREERDP_IOS_EXTERNAL_SSL_PATH not set! Required if openssl is not found in the iOS SDK (which usually isn't")
475 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_IOS_EXTERNAL_SSL_PATH})
476 set_property(GLOBAL PROPERTY XCODE_ATTRIBUTE_SKIP_INSTALL YES)
478 if(NOT DEFINED CMAKE_OSX_ARCHITECTURES)
479 set(CMAKE_OSX_ARCHITECTURES i386 x86_64)
482 if(IS_DIRECTORY /opt/local/include)
483 include_directories(/opt/local/include)
484 link_directories(/opt/local/lib)
488 # Temporarily disabled, causes the cmake script to be reexecuted, causing the compilation to fail.
489 # Workaround: specify the parameter in the command-line
491 # set(CMAKE_C_COMPILER "clang")
495 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -v")
496 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v")
502 set(WITH_MANPAGES "ON")
504 set(WITH_PULSE "OFF")
506 set(WITH_WAYLAND "OFF")
511 set(WITH_LIBRARY_VERSIONING "OFF")
513 set_property( GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ${ANDROID_LIBRARY_USE_LIB64_PATHS} )
515 if (${ANDROID_ABI} STREQUAL "armeabi")
519 if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
520 add_definitions(-DNDK_DEBUG=1)
522 # NOTE: Manually add -gdwarf-3, as newer toolchains default to -gdwarf-4,
523 # which is not supported by the gdbserver binary shipped with
524 # the android NDK (tested with r9b)
525 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG} -gdwarf-3")
527 set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -llog")
529 if (NOT FREERDP_EXTERNAL_PATH)
530 if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/")
531 set (FREERDP_EXTERNAL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/")
533 message(STATUS "FREERDP_EXTERNAL_PATH not set!")
537 list (APPEND CMAKE_INCLUDE_PATH ${FREERDP_EXTERNAL_PATH}/include)
538 list (APPEND CMAKE_LIBRARY_PATH ${FREERDP_EXTERNAL_PATH}/${ANDROID_ABI}/ )
539 set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH )
540 set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH )
543 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/gprof_generate.sh.cmake
544 ${CMAKE_BINARY_DIR}/scripts/gprof_generate.sh @ONLY)
548 set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
551 find_package(Threads REQUIRED)
555 CHECK_SYMBOL_EXISTS(pthread_mutex_timedlock pthread.h HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
556 if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
557 CHECK_LIBRARY_EXISTS(pthread pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
558 endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
559 if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
560 CHECK_LIBRARY_EXISTS(pthreads pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
561 endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
563 if (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
564 set(HAVE_PTHREAD_MUTEX_TIMEDLOCK ON)
565 endif (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
568 if(WITH_VALGRIND_MEMCHECK)
569 check_include_files(valgrind/memcheck.h HAVE_VALGRIND_MEMCHECK_H)
571 unset(HAVE_VALGRIND_MEMCHECK_H CACHE)
575 check_include_files(sys/eventfd.h HAVE_AIO_H)
576 check_include_files(sys/eventfd.h HAVE_EVENTFD_H)
578 check_symbol_exists(eventfd_read sys/eventfd.h WITH_EVENTFD_READ_WRITE)
580 check_include_files(sys/timerfd.h HAVE_TIMERFD_H)
581 check_include_files(poll.h HAVE_POLL_H)
582 list(APPEND CMAKE_REQUIRED_LIBRARIES m)
583 check_symbol_exists(ceill math.h HAVE_MATH_C99_LONG_DOUBLE)
584 list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES m)
585 set(X11_FEATURE_TYPE "RECOMMENDED")
586 set(WAYLAND_FEATURE_TYPE "RECOMMENDED")
588 set(X11_FEATURE_TYPE "DISABLED")
589 set(WAYLAND_FEATURE_TYPE "DISABLED")
593 find_package(PCSCWinPR)
596 set(X11_FEATURE_PURPOSE "X11")
597 set(X11_FEATURE_DESCRIPTION "X11 client and server")
599 set(WAYLAND_FEATURE_PURPOSE "Wayland")
600 set(WAYLAND_FEATURE_DESCRIPTION "Wayland client")
602 set(DIRECTFB_FEATURE_TYPE "OPTIONAL")
603 set(DIRECTFB_FEATURE_PURPOSE "DirectFB")
604 set(DIRECTFB_FEATURE_DESCRIPTION "DirectFB client")
606 set(ZLIB_FEATURE_TYPE "REQUIRED")
607 set(ZLIB_FEATURE_PURPOSE "compression")
608 set(ZLIB_FEATURE_DESCRIPTION "data compression")
610 set(OPENSSL_FEATURE_TYPE "REQUIRED")
611 set(OPENSSL_FEATURE_PURPOSE "cryptography")
612 set(OPENSSL_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
614 set(MBEDTLS_FEATURE_TYPE "OPTIONAL")
615 set(MBEDTLS_FEATURE_PURPOSE "cryptography")
616 set(MBEDTLS_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
618 set(OPENSLES_FEATURE_TYPE "OPTIONAL")
619 set(OPENSLES_FEATURE_PURPOSE "multimedia")
620 set(OPENSLES_FEATURE_DESCRIPTION "OpenSLES audio / video")
622 set(OSS_FEATURE_TYPE "RECOMMENDED")
623 set(OSS_FEATURE_PURPOSE "sound")
624 set(OSS_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
626 set(ALSA_FEATURE_TYPE "RECOMMENDED")
627 set(ALSA_FEATURE_PURPOSE "sound")
628 set(ALSA_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
630 set(PULSE_FEATURE_TYPE "OPTIONAL")
631 set(PULSE_FEATURE_PURPOSE "sound")
632 set(PULSE_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
634 set(CUPS_FEATURE_TYPE "OPTIONAL")
635 set(CUPS_FEATURE_PURPOSE "printing")
636 set(CUPS_FEATURE_DESCRIPTION "printer device redirection")
638 set(PCSC_FEATURE_TYPE "OPTIONAL")
639 set(PCSC_FEATURE_PURPOSE "smart card")
640 set(PCSC_FEATURE_DESCRIPTION "smart card device redirection")
642 set(FFMPEG_FEATURE_TYPE "RECOMMENDED")
643 set(FFMPEG_FEATURE_PURPOSE "multimedia")
644 set(FFMPEG_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
646 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
647 set(GSTREAMER_0_10_FEATURE_PURPOSE "multimedia")
648 set(GSTREAMER_0_10_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback, gstreamer 0.10 version")
650 set(GSTREAMER_1_0_FEATURE_TYPE "RECOMMENDED")
651 set(GSTREAMER_1_0_FEATURE_PURPOSE "multimedia")
652 set(GSTREAMER_1_0_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
654 set(IPP_FEATURE_TYPE "OPTIONAL")
655 set(IPP_FEATURE_PURPOSE "performance")
656 set(IPP_FEATURE_DESCRIPTION "Intel Integrated Performance Primitives library")
658 set(JPEG_FEATURE_TYPE "OPTIONAL")
659 set(JPEG_FEATURE_PURPOSE "codec")
660 set(JPEG_FEATURE_DESCRIPTION "use JPEG library")
662 set(X264_FEATURE_TYPE "OPTIONAL")
663 set(X264_FEATURE_PURPOSE "codec")
664 set(X264_FEATURE_DESCRIPTION "use x264 library")
666 set(OPENH264_FEATURE_TYPE "OPTIONAL")
667 set(OPENH264_FEATURE_PURPOSE "codec")
668 set(OPENH264_FEATURE_DESCRIPTION "use OpenH264 library")
670 set(KRB5_FEATURE_TYPE "OPTIONAL")
671 set(KRB5_FEATURE_PURPOSE "auth")
672 set(KRB5_FEATURE_DESCRIPTION "add kerberos support")
674 set(GSM_FEATURE_TYPE "OPTIONAL")
675 set(GSM_FEATURE_PURPOSE "codec")
676 set(GSM_FEATURE_DESCRIPTION "GSM audio codec library")
679 set(X11_FEATURE_TYPE "DISABLED")
680 set(WAYLAND_FEATURE_TYPE "DISABLED")
681 set(ZLIB_FEATURE_TYPE "DISABLED")
682 set(DIRECTFB_FEATURE_TYPE "DISABLED")
683 set(OSS_FEATURE_TYPE "DISABLED")
684 set(ALSA_FEATURE_TYPE "DISABLED")
685 set(PULSE_FEATURE_TYPE "DISABLED")
686 set(CUPS_FEATURE_TYPE "DISABLED")
687 set(PCSC_FEATURE_TYPE "DISABLED")
688 set(FFMPEG_FEATURE_TYPE "DISABLED")
689 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
690 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
691 set(OPENSLES_FEATURE_TYPE "DISABLED")
695 set(DIRECTFB_FEATURE_TYPE "DISABLED")
696 set(FFMPEG_FEATURE_TYPE "OPTIONAL")
697 set(GSTREAMER_1_0_FEATURE_TYPE "OPTIONAL")
698 set(X11_FEATURE_TYPE "OPTIONAL")
699 set(WAYLAND_FEATURE_TYPE "DISABLED")
700 set(OSS_FEATURE_TYPE "DISABLED")
701 set(ALSA_FEATURE_TYPE "DISABLED")
703 set(X11_FEATURE_TYPE "DISABLED")
704 set(PULSE_FEATURE_TYPE "DISABLED")
705 set(CUPS_FEATURE_TYPE "DISABLED")
706 set(PCSC_FEATURE_TYPE "DISABLED")
707 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
708 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
710 set(OPENSLES_FEATURE_TYPE "DISABLED")
713 if(UNIX AND NOT ANDROID)
714 set(WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE "RECOMMENDED")
715 set(WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE "systemd journal appender")
716 set(WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION "allows to export wLog to systemd journal")
718 #include(Findlibsystemd)
719 find_feature(libsystemd ${WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION})
722 set(HAVE_JOURNALD_H TRUE)
724 unset(HAVE_JOURNALD_H)
726 endif(UNIX AND NOT ANDROID)
729 set(X11_FEATURE_TYPE "DISABLED")
730 set(WAYLAND_FEATURE_TYPE "DISABLED")
731 set(DIRECTFB_FEATURE_TYPE "DISABLED")
732 set(OSS_FEATURE_TYPE "DISABLED")
733 set(ALSA_FEATURE_TYPE "DISABLED")
734 set(PULSE_FEATURE_TYPE "DISABLED")
735 set(CUPS_FEATURE_TYPE "DISABLED")
736 set(PCSC_FEATURE_TYPE "DISABLED")
737 set(FFMPEG_FEATURE_TYPE "DISABLED")
738 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
739 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
740 set(OPENSLES_FEATURE_TYPE "REQUIRED")
743 find_feature(X11 ${X11_FEATURE_TYPE} ${X11_FEATURE_PURPOSE} ${X11_FEATURE_DESCRIPTION})
744 find_feature(Wayland ${WAYLAND_FEATURE_TYPE} ${WAYLAND_FEATURE_PURPOSE} ${WAYLAND_FEATURE_DESCRIPTION})
745 find_feature(DirectFB ${DIRECTFB_FEATURE_TYPE} ${DIRECTFB_FEATURE_PURPOSE} ${DIRECTFB_FEATURE_DESCRIPTION})
746 if (${WITH_DIRECTFB})
747 message(WARNING "DIRECTFB is orphaned and not maintained see docs/README.directfb for details")
750 find_feature(ZLIB ${ZLIB_FEATURE_TYPE} ${ZLIB_FEATURE_PURPOSE} ${ZLIB_FEATURE_DESCRIPTION})
751 find_feature(OpenSSL ${OPENSSL_FEATURE_TYPE} ${OPENSSL_FEATURE_PURPOSE} ${OPENSSL_FEATURE_DESCRIPTION})
752 find_feature(MbedTLS ${MBEDTLS_FEATURE_TYPE} ${MBEDTLS_FEATURE_PURPOSE} ${MBEDTLS_FEATURE_DESCRIPTION})
753 find_feature(OpenSLES ${OPENSLES_FEATURE_TYPE} ${OPENSLES_FEATURE_PURPOSE} ${OPENSLES_FEATURE_DESCRIPTION})
755 find_feature(OSS ${OSS_FEATURE_TYPE} ${OSS_FEATURE_PURPOSE} ${OSS_FEATURE_DESCRIPTION})
756 find_feature(ALSA ${ALSA_FEATURE_TYPE} ${ALSA_FEATURE_PURPOSE} ${ALSA_FEATURE_DESCRIPTION})
757 find_feature(Pulse ${PULSE_FEATURE_TYPE} ${PULSE_FEATURE_PURPOSE} ${PULSE_FEATURE_DESCRIPTION})
759 find_feature(Cups ${CUPS_FEATURE_TYPE} ${CUPS_FEATURE_PURPOSE} ${CUPS_FEATURE_DESCRIPTION})
760 find_feature(PCSC ${PCSC_FEATURE_TYPE} ${PCSC_FEATURE_PURPOSE} ${PCSC_FEATURE_DESCRIPTION})
762 find_feature(FFmpeg ${FFMPEG_FEATURE_TYPE} ${FFMPEG_FEATURE_PURPOSE} ${FFMPEG_FEATURE_DESCRIPTION})
764 find_feature(GStreamer_0_10 ${GSTREAMER_0_10_FEATURE_TYPE} ${GSTREAMER_0_10_FEATURE_PURPOSE} ${GSTREAMER_0_10_FEATURE_DESCRIPTION})
765 find_feature(GStreamer_1_0 ${GSTREAMER_1_0_FEATURE_TYPE} ${GSTREAMER_1_0_FEATURE_PURPOSE} ${GSTREAMER_1_0_FEATURE_DESCRIPTION})
767 find_feature(JPEG ${JPEG_FEATURE_TYPE} ${JPEG_FEATURE_PURPOSE} ${JPEG_FEATURE_DESCRIPTION})
768 find_feature(x264 ${X264_FEATURE_TYPE} ${X264_FEATURE_PURPOSE} ${X264_FEATURE_DESCRIPTION})
769 find_feature(OpenH264 ${OPENH264_FEATURE_TYPE} ${OPENH264_FEATURE_PURPOSE} ${OPENH264_FEATURE_DESCRIPTION})
770 find_feature(GSM ${GSM_FEATURE_TYPE} ${GSM_FEATURE_PURPOSE} ${GSM_FEATURE_DESCRIPTION})
771 find_feature(KRB5 ${KRB5_FEATURE_TYPE} ${KRB5_FEATURE_PURPOSE} ${KRB5_FEATURE_DESCRIPTION})
773 if(TARGET_ARCH MATCHES "x86|x64")
775 # Intel Performance Primitives
776 find_feature(IPP ${IPP_FEATURE_TYPE} ${IPP_FEATURE_PURPOSE} ${IPP_FEATURE_DESCRIPTION})
781 add_definitions("-DWITH_OPENSSL")
782 message(STATUS "Using OpenSSL Version: ${OPENSSL_VERSION}")
786 add_definitions("-DWITH_MBEDTLS")
789 if (TARGET_ARCH MATCHES "sparc")
790 set(HAVE_ALIGNED_REQUIRED 1)
793 if (WITH_X264 OR WITH_OPENH264 OR WITH_MEDIA_FOUNDATION OR WITH_FFMPEG)
794 set(WITH_GFX_H264 ON)
796 set(WITH_GFX_H264 OFF)
799 # Android expects all libraries to be loadable
802 set(FREERDP_DATA_PATH "share")
803 set(FREERDP_INSTALL_PREFIX ".")
804 set(FREERDP_LIBRARY_PATH ".")
805 set(FREERDP_PLUGIN_PATH ".")
806 set(FREERDP_ADDIN_PATH ".")
808 set(FREERDP_DATA_PATH "${CMAKE_INSTALL_PREFIX}/share/freerdp${FREERDP_VERSION_MAJOR}")
809 set(FREERDP_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
810 set(FREERDP_LIBRARY_PATH "${CMAKE_INSTALL_LIBDIR}")
811 set(FREERDP_PLUGIN_PATH "${CMAKE_INSTALL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}")
812 set(FREERDP_ADDIN_PATH "${FREERDP_PLUGIN_PATH}")
815 # Path to put extensions
816 set(FREERDP_EXTENSION_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}/extensions")
818 # Include directories
819 include_directories(${CMAKE_CURRENT_BINARY_DIR})
820 include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
821 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
824 add_definitions("-DHAVE_CONFIG_H")
825 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
827 # RPATH configuration
829 set(CMAKE_SKIP_RPATH FALSE)
830 set(CMAKE_SKIP_INSTALL_RPATH TRUE)
832 set(CMAKE_SKIP_BUILD_RPATH FALSE)
833 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
834 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
835 set(CMAKE_INSTALL_RPATH "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}:\$ORIGIN/..")
837 if (BUILD_SHARED_LIBS)
838 set(CMAKE_MACOSX_RPATH ON)
844 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
845 set(PROFILER_LIBRARIES
846 "${FREERDP_EXTERNAL_PROFILER_PATH}/obj/local/${ANDROID_ABI}/libandroid-ndk-profiler.a")
847 include_directories("${FREERDP_EXTERNAL_PROFILER_PATH}")
859 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
861 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Testing")
866 include_directories("${CMAKE_SOURCE_DIR}/winpr/include")
867 include_directories("${CMAKE_BINARY_DIR}/winpr/include")
869 if (${CMAKE_VERSION} VERSION_LESS 2.8.12)
870 set(PUBLIC_KEYWORD "")
871 set(PRIVATE_KEYWORD "")
873 set(PUBLIC_KEYWORD "PUBLIC")
874 set(PRIVATE_KEYWORD "PRIVATE")
877 add_subdirectory(winpr)
882 add_subdirectory(third-party)
883 if (NOT "${THIRD_PARTY_INCLUDES}" STREQUAL "")
884 include_directories(${THIRD_PARTY_INCLUDES})
888 add_subdirectory(include)
890 add_subdirectory(libfreerdp)
893 set(CMAKE_OSX_DEPLOYMENT_TARGET "")
894 if (IOS_PLATFORM MATCHES "SIMULATOR")
895 set(CMAKE_OSX_SYSROOT "iphonesimulator")
897 set(CMAKE_OSX_SYSROOT "iphoneos")
902 include_directories("${CMAKE_SOURCE_DIR}/rdtk/include")
903 include_directories("${CMAKE_BINARY_DIR}/rdtk/include")
905 add_subdirectory(rdtk)
908 add_subdirectory(uwac)
912 if(IS_DIRECTORY /usr/local/include)
913 include_directories(/usr/local/include)
914 link_directories(/usr/local/lib)
917 if(IS_DIRECTORY /usr/X11R6/include)
918 include_directories(/usr/X11R6/include)
924 add_subdirectory(channels)
927 if(WITH_CLIENT_COMMON OR WITH_CLIENT)
928 add_subdirectory(client)
932 add_subdirectory(server)
937 set(CMAKE_CPACK_INCLUDE_FILE "CMakeCPack.cmake")
939 if(NOT (VENDOR MATCHES "FreeRDP"))
940 if(DEFINED CLIENT_VENDOR_PATH)
941 if(EXISTS "${CMAKE_SOURCE_DIR}/${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
942 set(CMAKE_CPACK_INCLUDE_FILE "${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
947 #message("VENDOR: ${VENDOR} CLIENT_VENDOR_PATH: ${CLIENT_VENDOR_PATH} CMAKE_CPACK_INCLUDE_FILE: ${CMAKE_CPACK_INCLUDE_FILE}")
949 include(${CMAKE_CPACK_INCLUDE_FILE})
951 set(FREERDP_BUILD_CONFIG_LIST "")
952 GET_CMAKE_PROPERTY(res VARIABLES)
954 IF (var MATCHES "^WITH_*|^BUILD_TESTING|^BUILTIN_CHANNELS|^HAVE_*")
955 LIST(APPEND FREERDP_BUILD_CONFIG_LIST "${var}=${${var}}")
958 string(REPLACE ";" " " FREERDP_BUILD_CONFIG "${FREERDP_BUILD_CONFIG_LIST}")
959 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/buildflags.h.in ${CMAKE_CURRENT_BINARY_DIR}/buildflags.h)