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")
287 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mssse3")
289 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
290 if(Wno-deprecated-declarations)
291 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
293 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
294 if(Wno-deprecated-declarationsCXX)
295 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
299 # Enable address sanitizer, where supported and when required
300 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCC)
301 if(WITH_SANITIZE_ADDRESS)
302 if (DEFINED CMAKE_REQUIRED_FLAGS)
303 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
305 set(CMAKE_REQUIRED_FLAGS "-fsanitize=address")
306 CHECK_C_COMPILER_FLAG ("-fsanitize=address" fsanitize-address)
307 if(fsanitize-address)
308 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
310 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
311 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
313 unset(CMAKE_REQUIRED_FLAGS)
316 CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
317 if(fno-omit-frame-pointer)
318 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
320 elseif(WITH_SANITIZE_LEAK)
321 if (DEFINED CMAKE_REQUIRED_FLAGS)
322 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
324 set(CMAKE_REQUIRED_FLAGS "-fsanitize=leak")
325 CHECK_C_COMPILER_FLAG ("-fsanitize=leak" fsanitize-leak)
327 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=leak")
329 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
330 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
332 unset(CMAKE_REQUIRED_FLAGS)
335 CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
336 if(fno-omit-frame-pointer)
337 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
341 if (WITH_NO_UNDEFINED)
342 if (DEFINED CMAKE_REQUIRED_FLAGS)
343 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
345 set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
346 CHECK_C_COMPILER_FLAG (-Wl,--no-undefined no-undefined)
347 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
348 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
349 unset(SAVE_CMAKE_REQUIRED_FLAGS)
351 unset(CMAKE_REQUIRED_FLAGS)
354 SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined" )
360 # Remove previous warning definitions,
361 # NMake is otherwise complaining.
362 foreach (flags_var_to_scrub
365 CMAKE_CXX_FLAGS_RELEASE
366 CMAKE_CXX_FLAGS_RELWITHDEBINFO
367 CMAKE_CXX_FLAGS_MINSIZEREL
368 CMAKE_C_FLAGS_RELEASE
369 CMAKE_C_FLAGS_RELWITHDEBINFO
370 CMAKE_C_FLAGS_MINSIZEREL)
371 string (REGEX REPLACE "(^| )[/-]W[ ]*[1-9]" " "
372 "${flags_var_to_scrub}" "${${flags_var_to_scrub}}")
375 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gd")
376 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
378 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
379 add_definitions(-D_AMD64_)
381 add_definitions(-D_X86_)
384 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
385 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})
387 if(CMAKE_BUILD_TYPE STREQUAL "Release")
389 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Zi")
390 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi")
396 add_definitions(-DUNICODE -D_UNICODE)
397 add_definitions(-D_CRT_SECURE_NO_WARNINGS)
398 add_definitions(-DWIN32_LEAN_AND_MEAN)
399 add_definitions(-D_WINSOCK_DEPRECATED_NO_WARNINGS)
401 set(CMAKE_USE_RELATIVE_PATH ON)
402 if (${CMAKE_GENERATOR} MATCHES "NMake Makefile*")
403 set(CMAKE_PDB_BINARY_DIR ${CMAKE_BINARY_DIR})
404 elseif (${CMAKE_GENERATOR} MATCHES "Visual Studio*")
405 set(CMAKE_PDB_BINARY_DIR "${CMAKE_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
407 message(FATAL "Unknown generator ${CMAKE_GENERATOR}")
410 # Set product and vendor for dll and exe version information.
411 set(RC_VERSION_VENDOR ${VENDOR})
412 set(RC_VERSION_PRODUCT ${PRODUCT})
413 set(RC_VERSION_PATCH ${BUILD_NUMBER})
414 set(RC_VERSION_DESCRIPTION ${GIT_REVISION})
416 string(TIMESTAMP RC_VERSION_YEAR "%Y")
418 if(NOT DEFINED CMAKE_WINDOWS_VERSION)
419 set(CMAKE_WINDOWS_VERSION "WINXP")
422 if(CMAKE_WINDOWS_VERSION STREQUAL "WINXP")
423 add_definitions(-DWINVER=0x0501 -D_WIN32_WINNT=0x0501)
424 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN7")
425 add_definitions(-DWINVER=0x0601 -D_WIN32_WINNT=0x0601)
426 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN8")
427 add_definitions(-DWINVER=0x0602 -D_WIN32_WINNT=0x0602)
428 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN10")
429 add_definitions(-DWINVER=0x0A00 -D_WIN32_WINNT=0x0A00)
432 if (FREERDP_EXTERNAL_SSL_PATH)
433 set(OPENSSL_ROOT_DIR ${FREERDP_EXTERNAL_SSL_PATH})
438 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_IOS_SDK_ROOT} -g")
441 add_definitions(-DWINPR_EXPORTS -DFREERDP_EXPORTS)
445 check_include_files(fcntl.h HAVE_FCNTL_H)
446 check_include_files(unistd.h HAVE_UNISTD_H)
447 check_include_files(execinfo.h HAVE_EXECINFO_H)
448 check_include_files(inttypes.h HAVE_INTTYPES_H)
449 check_include_files(sys/modem.h HAVE_SYS_MODEM_H)
450 check_include_files(sys/filio.h HAVE_SYS_FILIO_H)
451 check_include_files(sys/sockio.h HAVE_SYS_SOCKIO_H)
452 check_include_files(sys/strtio.h HAVE_SYS_STRTIO_H)
453 check_include_files(sys/select.h HAVE_SYS_SELECT_H)
454 check_include_files(syslog.h HAVE_SYSLOG_H)
458 set(HAVE_INTTYPES_H 1)
459 set(HAVE_SYS_FILIO_H 1)
463 check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
465 set(HAVE_TM_GMTOFF 1)
471 if (NOT FREERDP_IOS_EXTERNAL_SSL_PATH)
472 message(STATUS "FREERDP_IOS_EXTERNAL_SSL_PATH not set! Required if openssl is not found in the iOS SDK (which usually isn't")
474 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_IOS_EXTERNAL_SSL_PATH})
475 set_property(GLOBAL PROPERTY XCODE_ATTRIBUTE_SKIP_INSTALL YES)
477 if(NOT DEFINED CMAKE_OSX_ARCHITECTURES)
478 set(CMAKE_OSX_ARCHITECTURES i386 x86_64)
481 if(IS_DIRECTORY /opt/local/include)
482 include_directories(/opt/local/include)
483 link_directories(/opt/local/lib)
487 # Temporarily disabled, causes the cmake script to be reexecuted, causing the compilation to fail.
488 # Workaround: specify the parameter in the command-line
490 # set(CMAKE_C_COMPILER "clang")
494 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -v")
495 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v")
501 set(WITH_MANPAGES "ON")
503 set(WITH_PULSE "OFF")
505 set(WITH_WAYLAND "OFF")
510 set(WITH_LIBRARY_VERSIONING "OFF")
512 set_property( GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ${ANDROID_LIBRARY_USE_LIB64_PATHS} )
514 if (${ANDROID_ABI} STREQUAL "armeabi")
518 if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
519 add_definitions(-DNDK_DEBUG=1)
521 # NOTE: Manually add -gdwarf-3, as newer toolchains default to -gdwarf-4,
522 # which is not supported by the gdbserver binary shipped with
523 # the android NDK (tested with r9b)
524 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG} -gdwarf-3")
526 set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -llog")
528 if (NOT FREERDP_EXTERNAL_PATH)
529 if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/")
530 set (FREERDP_EXTERNAL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/")
532 message(STATUS "FREERDP_EXTERNAL_PATH not set!")
536 list (APPEND CMAKE_INCLUDE_PATH ${FREERDP_EXTERNAL_PATH}/include)
537 list (APPEND CMAKE_LIBRARY_PATH ${FREERDP_EXTERNAL_PATH}/${ANDROID_ABI}/ )
538 set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH )
539 set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH )
542 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/gprof_generate.sh.cmake
543 ${CMAKE_BINARY_DIR}/scripts/gprof_generate.sh @ONLY)
547 set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
550 find_package(Threads REQUIRED)
554 CHECK_SYMBOL_EXISTS(pthread_mutex_timedlock pthread.h HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
555 if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
556 CHECK_LIBRARY_EXISTS(pthread pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
557 endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
558 if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
559 CHECK_LIBRARY_EXISTS(pthreads pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
560 endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
562 if (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
563 set(HAVE_PTHREAD_MUTEX_TIMEDLOCK ON)
564 endif (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
567 if(WITH_VALGRIND_MEMCHECK)
568 check_include_files(valgrind/memcheck.h HAVE_VALGRIND_MEMCHECK_H)
570 unset(HAVE_VALGRIND_MEMCHECK_H CACHE)
574 check_include_files(sys/eventfd.h HAVE_AIO_H)
575 check_include_files(sys/eventfd.h HAVE_EVENTFD_H)
577 check_symbol_exists(eventfd_read sys/eventfd.h WITH_EVENTFD_READ_WRITE)
579 check_include_files(sys/timerfd.h HAVE_TIMERFD_H)
580 check_include_files(poll.h HAVE_POLL_H)
581 list(APPEND CMAKE_REQUIRED_LIBRARIES m)
582 check_symbol_exists(ceill math.h HAVE_MATH_C99_LONG_DOUBLE)
583 list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES m)
584 set(X11_FEATURE_TYPE "RECOMMENDED")
585 set(WAYLAND_FEATURE_TYPE "RECOMMENDED")
587 set(X11_FEATURE_TYPE "DISABLED")
588 set(WAYLAND_FEATURE_TYPE "DISABLED")
592 find_package(PCSCWinPR)
595 set(X11_FEATURE_PURPOSE "X11")
596 set(X11_FEATURE_DESCRIPTION "X11 client and server")
598 set(WAYLAND_FEATURE_PURPOSE "Wayland")
599 set(WAYLAND_FEATURE_DESCRIPTION "Wayland client")
601 set(DIRECTFB_FEATURE_TYPE "OPTIONAL")
602 set(DIRECTFB_FEATURE_PURPOSE "DirectFB")
603 set(DIRECTFB_FEATURE_DESCRIPTION "DirectFB client")
605 set(ZLIB_FEATURE_TYPE "REQUIRED")
606 set(ZLIB_FEATURE_PURPOSE "compression")
607 set(ZLIB_FEATURE_DESCRIPTION "data compression")
609 set(OPENSSL_FEATURE_TYPE "REQUIRED")
610 set(OPENSSL_FEATURE_PURPOSE "cryptography")
611 set(OPENSSL_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
613 set(MBEDTLS_FEATURE_TYPE "OPTIONAL")
614 set(MBEDTLS_FEATURE_PURPOSE "cryptography")
615 set(MBEDTLS_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
617 set(OPENSLES_FEATURE_TYPE "OPTIONAL")
618 set(OPENSLES_FEATURE_PURPOSE "multimedia")
619 set(OPENSLES_FEATURE_DESCRIPTION "OpenSLES audio / video")
621 set(OSS_FEATURE_TYPE "RECOMMENDED")
622 set(OSS_FEATURE_PURPOSE "sound")
623 set(OSS_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
625 set(ALSA_FEATURE_TYPE "RECOMMENDED")
626 set(ALSA_FEATURE_PURPOSE "sound")
627 set(ALSA_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
629 set(PULSE_FEATURE_TYPE "OPTIONAL")
630 set(PULSE_FEATURE_PURPOSE "sound")
631 set(PULSE_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
633 set(CUPS_FEATURE_TYPE "OPTIONAL")
634 set(CUPS_FEATURE_PURPOSE "printing")
635 set(CUPS_FEATURE_DESCRIPTION "printer device redirection")
637 set(PCSC_FEATURE_TYPE "OPTIONAL")
638 set(PCSC_FEATURE_PURPOSE "smart card")
639 set(PCSC_FEATURE_DESCRIPTION "smart card device redirection")
641 set(FFMPEG_FEATURE_TYPE "RECOMMENDED")
642 set(FFMPEG_FEATURE_PURPOSE "multimedia")
643 set(FFMPEG_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
645 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
646 set(GSTREAMER_0_10_FEATURE_PURPOSE "multimedia")
647 set(GSTREAMER_0_10_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback, gstreamer 0.10 version")
649 set(GSTREAMER_1_0_FEATURE_TYPE "RECOMMENDED")
650 set(GSTREAMER_1_0_FEATURE_PURPOSE "multimedia")
651 set(GSTREAMER_1_0_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
653 set(IPP_FEATURE_TYPE "OPTIONAL")
654 set(IPP_FEATURE_PURPOSE "performance")
655 set(IPP_FEATURE_DESCRIPTION "Intel Integrated Performance Primitives library")
657 set(JPEG_FEATURE_TYPE "OPTIONAL")
658 set(JPEG_FEATURE_PURPOSE "codec")
659 set(JPEG_FEATURE_DESCRIPTION "use JPEG library")
661 set(X264_FEATURE_TYPE "OPTIONAL")
662 set(X264_FEATURE_PURPOSE "codec")
663 set(X264_FEATURE_DESCRIPTION "use x264 library")
665 set(OPENH264_FEATURE_TYPE "OPTIONAL")
666 set(OPENH264_FEATURE_PURPOSE "codec")
667 set(OPENH264_FEATURE_DESCRIPTION "use OpenH264 library")
669 set(KRB5_FEATURE_TYPE "OPTIONAL")
670 set(KRB5_FEATURE_PURPOSE "auth")
671 set(KRB5_FEATURE_DESCRIPTION "add kerberos support")
673 set(GSM_FEATURE_TYPE "OPTIONAL")
674 set(GSM_FEATURE_PURPOSE "codec")
675 set(GSM_FEATURE_DESCRIPTION "GSM audio codec library")
678 set(X11_FEATURE_TYPE "DISABLED")
679 set(WAYLAND_FEATURE_TYPE "DISABLED")
680 set(ZLIB_FEATURE_TYPE "DISABLED")
681 set(DIRECTFB_FEATURE_TYPE "DISABLED")
682 set(OSS_FEATURE_TYPE "DISABLED")
683 set(ALSA_FEATURE_TYPE "DISABLED")
684 set(PULSE_FEATURE_TYPE "DISABLED")
685 set(CUPS_FEATURE_TYPE "DISABLED")
686 set(PCSC_FEATURE_TYPE "DISABLED")
687 set(FFMPEG_FEATURE_TYPE "DISABLED")
688 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
689 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
690 set(OPENSLES_FEATURE_TYPE "DISABLED")
694 set(DIRECTFB_FEATURE_TYPE "DISABLED")
695 set(FFMPEG_FEATURE_TYPE "OPTIONAL")
696 set(GSTREAMER_1_0_FEATURE_TYPE "OPTIONAL")
697 set(X11_FEATURE_TYPE "OPTIONAL")
698 set(WAYLAND_FEATURE_TYPE "DISABLED")
699 set(OSS_FEATURE_TYPE "DISABLED")
700 set(ALSA_FEATURE_TYPE "DISABLED")
702 set(X11_FEATURE_TYPE "DISABLED")
703 set(PULSE_FEATURE_TYPE "DISABLED")
704 set(CUPS_FEATURE_TYPE "DISABLED")
705 set(PCSC_FEATURE_TYPE "DISABLED")
706 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
707 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
709 set(OPENSLES_FEATURE_TYPE "DISABLED")
712 if(UNIX AND NOT ANDROID)
713 set(WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE "RECOMMENDED")
714 set(WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE "systemd journal appender")
715 set(WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION "allows to export wLog to systemd journal")
717 #include(Findlibsystemd)
718 find_feature(libsystemd ${WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION})
721 set(HAVE_JOURNALD_H TRUE)
723 unset(HAVE_JOURNALD_H)
725 endif(UNIX AND NOT ANDROID)
728 set(X11_FEATURE_TYPE "DISABLED")
729 set(WAYLAND_FEATURE_TYPE "DISABLED")
730 set(DIRECTFB_FEATURE_TYPE "DISABLED")
731 set(OSS_FEATURE_TYPE "DISABLED")
732 set(ALSA_FEATURE_TYPE "DISABLED")
733 set(PULSE_FEATURE_TYPE "DISABLED")
734 set(CUPS_FEATURE_TYPE "DISABLED")
735 set(PCSC_FEATURE_TYPE "DISABLED")
736 set(FFMPEG_FEATURE_TYPE "DISABLED")
737 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
738 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
739 set(OPENSLES_FEATURE_TYPE "REQUIRED")
742 find_feature(X11 ${X11_FEATURE_TYPE} ${X11_FEATURE_PURPOSE} ${X11_FEATURE_DESCRIPTION})
743 find_feature(Wayland ${WAYLAND_FEATURE_TYPE} ${WAYLAND_FEATURE_PURPOSE} ${WAYLAND_FEATURE_DESCRIPTION})
744 find_feature(DirectFB ${DIRECTFB_FEATURE_TYPE} ${DIRECTFB_FEATURE_PURPOSE} ${DIRECTFB_FEATURE_DESCRIPTION})
745 if (${WITH_DIRECTFB})
746 message(WARNING "DIRECTFB is orphaned and not maintained see docs/README.directfb for details")
749 find_feature(ZLIB ${ZLIB_FEATURE_TYPE} ${ZLIB_FEATURE_PURPOSE} ${ZLIB_FEATURE_DESCRIPTION})
750 find_feature(OpenSSL ${OPENSSL_FEATURE_TYPE} ${OPENSSL_FEATURE_PURPOSE} ${OPENSSL_FEATURE_DESCRIPTION})
751 find_feature(MbedTLS ${MBEDTLS_FEATURE_TYPE} ${MBEDTLS_FEATURE_PURPOSE} ${MBEDTLS_FEATURE_DESCRIPTION})
752 find_feature(OpenSLES ${OPENSLES_FEATURE_TYPE} ${OPENSLES_FEATURE_PURPOSE} ${OPENSLES_FEATURE_DESCRIPTION})
754 find_feature(OSS ${OSS_FEATURE_TYPE} ${OSS_FEATURE_PURPOSE} ${OSS_FEATURE_DESCRIPTION})
755 find_feature(ALSA ${ALSA_FEATURE_TYPE} ${ALSA_FEATURE_PURPOSE} ${ALSA_FEATURE_DESCRIPTION})
756 find_feature(Pulse ${PULSE_FEATURE_TYPE} ${PULSE_FEATURE_PURPOSE} ${PULSE_FEATURE_DESCRIPTION})
758 find_feature(Cups ${CUPS_FEATURE_TYPE} ${CUPS_FEATURE_PURPOSE} ${CUPS_FEATURE_DESCRIPTION})
759 find_feature(PCSC ${PCSC_FEATURE_TYPE} ${PCSC_FEATURE_PURPOSE} ${PCSC_FEATURE_DESCRIPTION})
761 find_feature(FFmpeg ${FFMPEG_FEATURE_TYPE} ${FFMPEG_FEATURE_PURPOSE} ${FFMPEG_FEATURE_DESCRIPTION})
763 find_feature(GStreamer_0_10 ${GSTREAMER_0_10_FEATURE_TYPE} ${GSTREAMER_0_10_FEATURE_PURPOSE} ${GSTREAMER_0_10_FEATURE_DESCRIPTION})
764 find_feature(GStreamer_1_0 ${GSTREAMER_1_0_FEATURE_TYPE} ${GSTREAMER_1_0_FEATURE_PURPOSE} ${GSTREAMER_1_0_FEATURE_DESCRIPTION})
766 find_feature(JPEG ${JPEG_FEATURE_TYPE} ${JPEG_FEATURE_PURPOSE} ${JPEG_FEATURE_DESCRIPTION})
767 find_feature(x264 ${X264_FEATURE_TYPE} ${X264_FEATURE_PURPOSE} ${X264_FEATURE_DESCRIPTION})
768 find_feature(OpenH264 ${OPENH264_FEATURE_TYPE} ${OPENH264_FEATURE_PURPOSE} ${OPENH264_FEATURE_DESCRIPTION})
769 find_feature(GSM ${GSM_FEATURE_TYPE} ${GSM_FEATURE_PURPOSE} ${GSM_FEATURE_DESCRIPTION})
770 find_feature(KRB5 ${KRB5_FEATURE_TYPE} ${KRB5_FEATURE_PURPOSE} ${KRB5_FEATURE_DESCRIPTION})
772 if(TARGET_ARCH MATCHES "x86|x64")
774 # Intel Performance Primitives
775 find_feature(IPP ${IPP_FEATURE_TYPE} ${IPP_FEATURE_PURPOSE} ${IPP_FEATURE_DESCRIPTION})
780 add_definitions("-DWITH_OPENSSL")
781 message(STATUS "Using OpenSSL Version: ${OPENSSL_VERSION}")
785 add_definitions("-DWITH_MBEDTLS")
788 if (TARGET_ARCH MATCHES "sparc")
789 set(HAVE_ALIGNED_REQUIRED 1)
792 if (WITH_X264 OR WITH_OPENH264 OR WITH_MEDIA_FOUNDATION OR WITH_FFMPEG)
793 set(WITH_GFX_H264 ON)
795 set(WITH_GFX_H264 OFF)
798 # Android expects all libraries to be loadable
801 set(FREERDP_DATA_PATH "share")
802 set(FREERDP_INSTALL_PREFIX ".")
803 set(FREERDP_LIBRARY_PATH ".")
804 set(FREERDP_PLUGIN_PATH ".")
805 set(FREERDP_ADDIN_PATH ".")
807 set(FREERDP_DATA_PATH "${CMAKE_INSTALL_PREFIX}/share/freerdp${FREERDP_VERSION_MAJOR}")
808 set(FREERDP_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
809 set(FREERDP_LIBRARY_PATH "${CMAKE_INSTALL_LIBDIR}")
810 set(FREERDP_PLUGIN_PATH "${CMAKE_INSTALL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}")
811 set(FREERDP_ADDIN_PATH "${FREERDP_PLUGIN_PATH}")
814 # Path to put extensions
815 set(FREERDP_EXTENSION_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}/extensions")
817 # Include directories
818 include_directories(${CMAKE_CURRENT_BINARY_DIR})
819 include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
820 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
823 add_definitions("-DHAVE_CONFIG_H")
824 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
826 # RPATH configuration
828 set(CMAKE_SKIP_RPATH FALSE)
829 set(CMAKE_SKIP_INSTALL_RPATH TRUE)
831 set(CMAKE_SKIP_BUILD_RPATH FALSE)
832 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
833 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
834 set(CMAKE_INSTALL_RPATH "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}:\$ORIGIN/..")
836 if (BUILD_SHARED_LIBS)
837 set(CMAKE_MACOSX_RPATH ON)
843 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
844 set(PROFILER_LIBRARIES
845 "${FREERDP_EXTERNAL_PROFILER_PATH}/obj/local/${ANDROID_ABI}/libandroid-ndk-profiler.a")
846 include_directories("${FREERDP_EXTERNAL_PROFILER_PATH}")
858 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
860 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Testing")
865 include_directories("${CMAKE_SOURCE_DIR}/winpr/include")
866 include_directories("${CMAKE_BINARY_DIR}/winpr/include")
868 if (${CMAKE_VERSION} VERSION_LESS 2.8.12)
869 set(PUBLIC_KEYWORD "")
870 set(PRIVATE_KEYWORD "")
872 set(PUBLIC_KEYWORD "PUBLIC")
873 set(PRIVATE_KEYWORD "PRIVATE")
876 add_subdirectory(winpr)
881 add_subdirectory(third-party)
882 if (NOT "${THIRD_PARTY_INCLUDES}" STREQUAL "")
883 include_directories(${THIRD_PARTY_INCLUDES})
887 add_subdirectory(include)
889 add_subdirectory(libfreerdp)
892 set(CMAKE_OSX_DEPLOYMENT_TARGET "")
893 if (IOS_PLATFORM MATCHES "SIMULATOR")
894 set(CMAKE_OSX_SYSROOT "iphonesimulator")
896 set(CMAKE_OSX_SYSROOT "iphoneos")
901 include_directories("${CMAKE_SOURCE_DIR}/rdtk/include")
902 include_directories("${CMAKE_BINARY_DIR}/rdtk/include")
904 add_subdirectory(rdtk)
907 add_subdirectory(uwac)
911 if(IS_DIRECTORY /usr/local/include)
912 include_directories(/usr/local/include)
913 link_directories(/usr/local/lib)
916 if(IS_DIRECTORY /usr/X11R6/include)
917 include_directories(/usr/X11R6/include)
923 add_subdirectory(channels)
926 if(WITH_CLIENT_COMMON OR WITH_CLIENT)
927 add_subdirectory(client)
931 add_subdirectory(server)
936 set(CMAKE_CPACK_INCLUDE_FILE "CMakeCPack.cmake")
938 if(NOT (VENDOR MATCHES "FreeRDP"))
939 if(DEFINED CLIENT_VENDOR_PATH)
940 if(EXISTS "${CMAKE_SOURCE_DIR}/${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
941 set(CMAKE_CPACK_INCLUDE_FILE "${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
946 #message("VENDOR: ${VENDOR} CLIENT_VENDOR_PATH: ${CLIENT_VENDOR_PATH} CMAKE_CPACK_INCLUDE_FILE: ${CMAKE_CPACK_INCLUDE_FILE}")
948 include(${CMAKE_CPACK_INCLUDE_FILE})
950 set(FREERDP_BUILD_CONFIG_LIST "")
951 GET_CMAKE_PROPERTY(res VARIABLES)
953 IF (var MATCHES "^WITH_*|^BUILD_TESTING|^BUILTIN_CHANNELS|^HAVE_*")
954 LIST(APPEND FREERDP_BUILD_CONFIG_LIST "${var}=${${var}}")
957 string(REPLACE ";" " " FREERDP_BUILD_CONFIG "${FREERDP_BUILD_CONFIG_LIST}")
958 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/buildflags.h.in ${CMAKE_CURRENT_BINARY_DIR}/buildflags.h)