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 # Compiler-specific flags
193 if(CMAKE_COMPILER_IS_GNUCC)
194 if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "i686")
195 CHECK_SYMBOL_EXISTS(__x86_64__ "" IS_X86_64)
197 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
199 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686")
202 if(CMAKE_POSITION_INDEPENDENT_CODE)
203 if(${CMAKE_VERSION} VERSION_LESS 2.8.9)
204 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
209 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
211 CHECK_C_COMPILER_FLAG (-Wno-unused-result Wno-unused-result)
212 if(Wno-unused-result)
213 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-result")
215 CHECK_C_COMPILER_FLAG (-Wno-unused-but-set-variable Wno-unused-but-set-variable)
216 if(Wno-unused-but-set-variable)
217 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-but-set-variable")
219 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
220 if(Wno-deprecated-declarations)
221 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
223 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
224 if(Wno-deprecated-declarationsCXX)
225 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
228 if(NOT EXPORT_ALL_SYMBOLS)
229 message(STATUS "GCC default symbol visibility: hidden")
230 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
233 CHECK_C_COMPILER_FLAG(-Wno-format Wno-format)
235 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format")
238 CHECK_C_COMPILER_FLAG (-Wimplicit-function-declaration Wimplicit-function-declaration)
239 if(Wimplicit-function-declaration)
240 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wimplicit-function-declaration")
244 CHECK_C_COMPILER_FLAG (-Wredundant-decls Wredundant-decls)
246 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
249 if(CMAKE_BUILD_TYPE STREQUAL "Release")
250 add_definitions(-DNDEBUG)
252 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
253 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
256 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2")
260 # When building with Unix Makefiles and doing any release builds
261 # try to set __FILE__ to relative paths via a make specific macro
262 if (CMAKE_GENERATOR MATCHES "Unix Makefile*")
263 if(CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
264 string(TOUPPER ${CMAKE_BUILD_TYPE} UPPER_BUILD_TYPE)
265 CHECK_C_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefined)
266 if(Wno-builtin-macro-redefined)
267 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 $<)))\"'")
270 CHECK_CXX_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefinedCXX)
271 if(Wno-builtin-macro-redefinedCXX)
272 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 $<)))\"'")
277 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
278 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
279 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-macros -Wno-padded")
280 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-c11-extensions -Wno-gnu")
282 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mssse3")
284 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
285 if(Wno-deprecated-declarations)
286 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
288 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
289 if(Wno-deprecated-declarationsCXX)
290 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
294 # Enable address sanitizer, where supported and when required
295 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCC)
296 if(WITH_SANITIZE_ADDRESS)
297 if (DEFINED CMAKE_REQUIRED_FLAGS)
298 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
300 set(CMAKE_REQUIRED_FLAGS "-fsanitize=address")
301 CHECK_C_COMPILER_FLAG ("-fsanitize=address" fsanitize-address)
302 if(fsanitize-address)
303 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
305 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
306 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
308 unset(CMAKE_REQUIRED_FLAGS)
311 CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
312 if(fno-omit-frame-pointer)
313 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
315 elseif(WITH_SANITIZE_LEAK)
316 if (DEFINED CMAKE_REQUIRED_FLAGS)
317 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
319 set(CMAKE_REQUIRED_FLAGS "-fsanitize=leak")
320 CHECK_C_COMPILER_FLAG ("-fsanitize=leak" fsanitize-leak)
322 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=leak")
324 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
325 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
327 unset(CMAKE_REQUIRED_FLAGS)
330 CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
331 if(fno-omit-frame-pointer)
332 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
336 if (WITH_NO_UNDEFINED)
337 if (DEFINED CMAKE_REQUIRED_FLAGS)
338 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
340 set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
341 CHECK_C_COMPILER_FLAG (-Wl,--no-undefined no-undefined)
342 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
343 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
344 unset(SAVE_CMAKE_REQUIRED_FLAGS)
346 unset(CMAKE_REQUIRED_FLAGS)
349 SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined" )
355 # Remove previous warning definitions,
356 # NMake is otherwise complaining.
357 foreach (flags_var_to_scrub
360 CMAKE_CXX_FLAGS_RELEASE
361 CMAKE_CXX_FLAGS_RELWITHDEBINFO
362 CMAKE_CXX_FLAGS_MINSIZEREL
363 CMAKE_C_FLAGS_RELEASE
364 CMAKE_C_FLAGS_RELWITHDEBINFO
365 CMAKE_C_FLAGS_MINSIZEREL)
366 string (REGEX REPLACE "(^| )[/-]W[ ]*[1-9]" " "
367 "${flags_var_to_scrub}" "${${flags_var_to_scrub}}")
370 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gd")
371 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
373 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
374 add_definitions(-D_AMD64_)
376 add_definitions(-D_X86_)
379 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
380 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})
382 if(CMAKE_BUILD_TYPE STREQUAL "Release")
384 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Zi")
385 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi")
391 add_definitions(-DUNICODE -D_UNICODE)
392 add_definitions(-D_CRT_SECURE_NO_WARNINGS)
393 add_definitions(-DWIN32_LEAN_AND_MEAN)
394 add_definitions(-D_WINSOCK_DEPRECATED_NO_WARNINGS)
396 set(CMAKE_USE_RELATIVE_PATH ON)
397 if (${CMAKE_GENERATOR} MATCHES "NMake Makefile*")
398 set(CMAKE_PDB_BINARY_DIR ${CMAKE_BINARY_DIR})
399 elseif (${CMAKE_GENERATOR} MATCHES "Visual Studio*")
400 set(CMAKE_PDB_BINARY_DIR "${CMAKE_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
402 message(FATAL "Unknown generator ${CMAKE_GENERATOR}")
405 # Set product and vendor for dll and exe version information.
406 set(RC_VERSION_VENDOR ${VENDOR})
407 set(RC_VERSION_PRODUCT ${PRODUCT})
408 set(RC_VERSION_PATCH ${BUILD_NUMBER})
409 set(RC_VERSION_DESCRIPTION ${GIT_REVISION})
411 string(TIMESTAMP RC_VERSION_YEAR "%Y")
413 if(NOT DEFINED CMAKE_WINDOWS_VERSION)
414 set(CMAKE_WINDOWS_VERSION "WINXP")
417 if(CMAKE_WINDOWS_VERSION STREQUAL "WINXP")
418 add_definitions(-DWINVER=0x0501 -D_WIN32_WINNT=0x0501)
419 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN7")
420 add_definitions(-DWINVER=0x0601 -D_WIN32_WINNT=0x0601)
421 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN8")
422 add_definitions(-DWINVER=0x0602 -D_WIN32_WINNT=0x0602)
423 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN10")
424 add_definitions(-DWINVER=0x0A00 -D_WIN32_WINNT=0x0A00)
427 if (FREERDP_EXTERNAL_SSL_PATH)
428 set(OPENSSL_ROOT_DIR ${FREERDP_EXTERNAL_SSL_PATH})
433 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_IOS_SDK_ROOT} -g")
436 add_definitions(-DWINPR_EXPORTS -DFREERDP_EXPORTS)
440 check_include_files(fcntl.h HAVE_FCNTL_H)
441 check_include_files(unistd.h HAVE_UNISTD_H)
442 check_include_files(execinfo.h HAVE_EXECINFO_H)
443 check_include_files(inttypes.h HAVE_INTTYPES_H)
444 check_include_files(sys/modem.h HAVE_SYS_MODEM_H)
445 check_include_files(sys/filio.h HAVE_SYS_FILIO_H)
446 check_include_files(sys/sockio.h HAVE_SYS_SOCKIO_H)
447 check_include_files(sys/strtio.h HAVE_SYS_STRTIO_H)
448 check_include_files(sys/select.h HAVE_SYS_SELECT_H)
449 check_include_files(syslog.h HAVE_SYSLOG_H)
453 set(HAVE_INTTYPES_H 1)
454 set(HAVE_SYS_FILIO_H 1)
458 check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
460 set(HAVE_TM_GMTOFF 1)
466 if (NOT FREERDP_IOS_EXTERNAL_SSL_PATH)
467 message(STATUS "FREERDP_IOS_EXTERNAL_SSL_PATH not set! Required if openssl is not found in the iOS SDK (which usually isn't")
469 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_IOS_EXTERNAL_SSL_PATH})
470 set_property(GLOBAL PROPERTY XCODE_ATTRIBUTE_SKIP_INSTALL YES)
472 if(NOT DEFINED CMAKE_OSX_ARCHITECTURES)
473 set(CMAKE_OSX_ARCHITECTURES i386 x86_64)
476 if(IS_DIRECTORY /opt/local/include)
477 include_directories(/opt/local/include)
478 link_directories(/opt/local/lib)
482 # Temporarily disabled, causes the cmake script to be reexecuted, causing the compilation to fail.
483 # Workaround: specify the parameter in the command-line
485 # set(CMAKE_C_COMPILER "clang")
489 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -v")
490 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v")
496 set(WITH_MANPAGES "ON")
498 set(WITH_PULSE "OFF")
500 set(WITH_WAYLAND "OFF")
505 set(WITH_LIBRARY_VERSIONING "OFF")
507 set_property( GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ${ANDROID_LIBRARY_USE_LIB64_PATHS} )
509 if (${ANDROID_ABI} STREQUAL "armeabi")
513 if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
514 add_definitions(-DNDK_DEBUG=1)
516 # NOTE: Manually add -gdwarf-3, as newer toolchains default to -gdwarf-4,
517 # which is not supported by the gdbserver binary shipped with
518 # the android NDK (tested with r9b)
519 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG} -gdwarf-3")
521 set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -llog")
523 if (NOT FREERDP_EXTERNAL_PATH)
524 if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/")
525 set (FREERDP_EXTERNAL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/")
527 message(STATUS "FREERDP_EXTERNAL_PATH not set!")
531 list (APPEND CMAKE_INCLUDE_PATH ${FREERDP_EXTERNAL_PATH}/include)
532 list (APPEND CMAKE_LIBRARY_PATH ${FREERDP_EXTERNAL_PATH}/${ANDROID_ABI}/ )
533 set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH )
534 set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH )
537 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/gprof_generate.sh.cmake
538 ${CMAKE_BINARY_DIR}/scripts/gprof_generate.sh @ONLY)
542 set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
545 find_package(Threads REQUIRED)
549 CHECK_SYMBOL_EXISTS(pthread_mutex_timedlock pthread.h HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
550 if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
551 CHECK_LIBRARY_EXISTS(pthread pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
552 endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
553 if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
554 CHECK_LIBRARY_EXISTS(pthreads pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
555 endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
557 if (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
558 set(HAVE_PTHREAD_MUTEX_TIMEDLOCK ON)
559 endif (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
562 if(WITH_VALGRIND_MEMCHECK)
563 check_include_files(valgrind/memcheck.h HAVE_VALGRIND_MEMCHECK_H)
565 unset(HAVE_VALGRIND_MEMCHECK_H CACHE)
569 check_include_files(sys/eventfd.h HAVE_AIO_H)
570 check_include_files(sys/eventfd.h HAVE_EVENTFD_H)
572 check_symbol_exists(eventfd_read sys/eventfd.h WITH_EVENTFD_READ_WRITE)
574 check_include_files(sys/timerfd.h HAVE_TIMERFD_H)
575 check_include_files(poll.h HAVE_POLL_H)
576 list(APPEND CMAKE_REQUIRED_LIBRARIES m)
577 check_symbol_exists(ceill math.h HAVE_MATH_C99_LONG_DOUBLE)
578 list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES m)
579 set(X11_FEATURE_TYPE "RECOMMENDED")
580 set(WAYLAND_FEATURE_TYPE "RECOMMENDED")
582 set(X11_FEATURE_TYPE "DISABLED")
583 set(WAYLAND_FEATURE_TYPE "DISABLED")
587 find_package(PCSCWinPR)
590 set(X11_FEATURE_PURPOSE "X11")
591 set(X11_FEATURE_DESCRIPTION "X11 client and server")
593 set(WAYLAND_FEATURE_PURPOSE "Wayland")
594 set(WAYLAND_FEATURE_DESCRIPTION "Wayland client")
596 set(DIRECTFB_FEATURE_TYPE "OPTIONAL")
597 set(DIRECTFB_FEATURE_PURPOSE "DirectFB")
598 set(DIRECTFB_FEATURE_DESCRIPTION "DirectFB client")
600 set(ZLIB_FEATURE_TYPE "REQUIRED")
601 set(ZLIB_FEATURE_PURPOSE "compression")
602 set(ZLIB_FEATURE_DESCRIPTION "data compression")
604 set(OPENSSL_FEATURE_TYPE "REQUIRED")
605 set(OPENSSL_FEATURE_PURPOSE "cryptography")
606 set(OPENSSL_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
608 set(MBEDTLS_FEATURE_TYPE "OPTIONAL")
609 set(MBEDTLS_FEATURE_PURPOSE "cryptography")
610 set(MBEDTLS_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
612 set(OPENSLES_FEATURE_TYPE "OPTIONAL")
613 set(OPENSLES_FEATURE_PURPOSE "multimedia")
614 set(OPENSLES_FEATURE_DESCRIPTION "OpenSLES audio / video")
616 set(OSS_FEATURE_TYPE "RECOMMENDED")
617 set(OSS_FEATURE_PURPOSE "sound")
618 set(OSS_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
620 set(ALSA_FEATURE_TYPE "RECOMMENDED")
621 set(ALSA_FEATURE_PURPOSE "sound")
622 set(ALSA_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
624 set(PULSE_FEATURE_TYPE "OPTIONAL")
625 set(PULSE_FEATURE_PURPOSE "sound")
626 set(PULSE_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
628 set(CUPS_FEATURE_TYPE "OPTIONAL")
629 set(CUPS_FEATURE_PURPOSE "printing")
630 set(CUPS_FEATURE_DESCRIPTION "printer device redirection")
632 set(PCSC_FEATURE_TYPE "OPTIONAL")
633 set(PCSC_FEATURE_PURPOSE "smart card")
634 set(PCSC_FEATURE_DESCRIPTION "smart card device redirection")
636 set(FFMPEG_FEATURE_TYPE "RECOMMENDED")
637 set(FFMPEG_FEATURE_PURPOSE "multimedia")
638 set(FFMPEG_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
640 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
641 set(GSTREAMER_0_10_FEATURE_PURPOSE "multimedia")
642 set(GSTREAMER_0_10_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback, gstreamer 0.10 version")
644 set(GSTREAMER_1_0_FEATURE_TYPE "RECOMMENDED")
645 set(GSTREAMER_1_0_FEATURE_PURPOSE "multimedia")
646 set(GSTREAMER_1_0_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
648 set(IPP_FEATURE_TYPE "OPTIONAL")
649 set(IPP_FEATURE_PURPOSE "performance")
650 set(IPP_FEATURE_DESCRIPTION "Intel Integrated Performance Primitives library")
652 set(JPEG_FEATURE_TYPE "OPTIONAL")
653 set(JPEG_FEATURE_PURPOSE "codec")
654 set(JPEG_FEATURE_DESCRIPTION "use JPEG library")
656 set(X264_FEATURE_TYPE "OPTIONAL")
657 set(X264_FEATURE_PURPOSE "codec")
658 set(X264_FEATURE_DESCRIPTION "use x264 library")
660 set(OPENH264_FEATURE_TYPE "OPTIONAL")
661 set(OPENH264_FEATURE_PURPOSE "codec")
662 set(OPENH264_FEATURE_DESCRIPTION "use OpenH264 library")
664 set(KRB5_FEATURE_TYPE "OPTIONAL")
665 set(KRB5_FEATURE_PURPOSE "auth")
666 set(KRB5_FEATURE_DESCRIPTION "add kerberos support")
668 set(GSM_FEATURE_TYPE "OPTIONAL")
669 set(GSM_FEATURE_PURPOSE "codec")
670 set(GSM_FEATURE_DESCRIPTION "GSM audio codec library")
673 set(X11_FEATURE_TYPE "DISABLED")
674 set(WAYLAND_FEATURE_TYPE "DISABLED")
675 set(ZLIB_FEATURE_TYPE "DISABLED")
676 set(DIRECTFB_FEATURE_TYPE "DISABLED")
677 set(OSS_FEATURE_TYPE "DISABLED")
678 set(ALSA_FEATURE_TYPE "DISABLED")
679 set(PULSE_FEATURE_TYPE "DISABLED")
680 set(CUPS_FEATURE_TYPE "DISABLED")
681 set(PCSC_FEATURE_TYPE "DISABLED")
682 set(FFMPEG_FEATURE_TYPE "DISABLED")
683 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
684 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
685 set(OPENSLES_FEATURE_TYPE "DISABLED")
689 set(DIRECTFB_FEATURE_TYPE "DISABLED")
690 set(FFMPEG_FEATURE_TYPE "OPTIONAL")
691 set(GSTREAMER_1_0_FEATURE_TYPE "OPTIONAL")
692 set(X11_FEATURE_TYPE "OPTIONAL")
693 set(WAYLAND_FEATURE_TYPE "DISABLED")
694 set(OSS_FEATURE_TYPE "DISABLED")
695 set(ALSA_FEATURE_TYPE "DISABLED")
697 set(X11_FEATURE_TYPE "DISABLED")
698 set(PULSE_FEATURE_TYPE "DISABLED")
699 set(CUPS_FEATURE_TYPE "DISABLED")
700 set(PCSC_FEATURE_TYPE "DISABLED")
701 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
702 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
704 set(OPENSLES_FEATURE_TYPE "DISABLED")
707 if(UNIX AND NOT ANDROID)
708 set(WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE "RECOMMENDED")
709 set(WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE "systemd journal appender")
710 set(WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION "allows to export wLog to systemd journal")
712 #include(Findlibsystemd)
713 find_feature(libsystemd ${WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION})
716 set(HAVE_JOURNALD_H TRUE)
718 unset(HAVE_JOURNALD_H)
720 endif(UNIX AND NOT ANDROID)
723 set(X11_FEATURE_TYPE "DISABLED")
724 set(WAYLAND_FEATURE_TYPE "DISABLED")
725 set(DIRECTFB_FEATURE_TYPE "DISABLED")
726 set(OSS_FEATURE_TYPE "DISABLED")
727 set(ALSA_FEATURE_TYPE "DISABLED")
728 set(PULSE_FEATURE_TYPE "DISABLED")
729 set(CUPS_FEATURE_TYPE "DISABLED")
730 set(PCSC_FEATURE_TYPE "DISABLED")
731 set(FFMPEG_FEATURE_TYPE "DISABLED")
732 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
733 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
734 set(OPENSLES_FEATURE_TYPE "REQUIRED")
737 find_feature(X11 ${X11_FEATURE_TYPE} ${X11_FEATURE_PURPOSE} ${X11_FEATURE_DESCRIPTION})
738 find_feature(Wayland ${WAYLAND_FEATURE_TYPE} ${WAYLAND_FEATURE_PURPOSE} ${WAYLAND_FEATURE_DESCRIPTION})
739 find_feature(DirectFB ${DIRECTFB_FEATURE_TYPE} ${DIRECTFB_FEATURE_PURPOSE} ${DIRECTFB_FEATURE_DESCRIPTION})
740 if (${WITH_DIRECTFB})
741 message(WARNING "DIRECTFB is orphaned and not maintained see docs/README.directfb for details")
744 find_feature(ZLIB ${ZLIB_FEATURE_TYPE} ${ZLIB_FEATURE_PURPOSE} ${ZLIB_FEATURE_DESCRIPTION})
745 find_feature(OpenSSL ${OPENSSL_FEATURE_TYPE} ${OPENSSL_FEATURE_PURPOSE} ${OPENSSL_FEATURE_DESCRIPTION})
746 find_feature(MbedTLS ${MBEDTLS_FEATURE_TYPE} ${MBEDTLS_FEATURE_PURPOSE} ${MBEDTLS_FEATURE_DESCRIPTION})
747 find_feature(OpenSLES ${OPENSLES_FEATURE_TYPE} ${OPENSLES_FEATURE_PURPOSE} ${OPENSLES_FEATURE_DESCRIPTION})
749 find_feature(OSS ${OSS_FEATURE_TYPE} ${OSS_FEATURE_PURPOSE} ${OSS_FEATURE_DESCRIPTION})
750 find_feature(ALSA ${ALSA_FEATURE_TYPE} ${ALSA_FEATURE_PURPOSE} ${ALSA_FEATURE_DESCRIPTION})
751 find_feature(Pulse ${PULSE_FEATURE_TYPE} ${PULSE_FEATURE_PURPOSE} ${PULSE_FEATURE_DESCRIPTION})
753 find_feature(Cups ${CUPS_FEATURE_TYPE} ${CUPS_FEATURE_PURPOSE} ${CUPS_FEATURE_DESCRIPTION})
754 find_feature(PCSC ${PCSC_FEATURE_TYPE} ${PCSC_FEATURE_PURPOSE} ${PCSC_FEATURE_DESCRIPTION})
756 find_feature(FFmpeg ${FFMPEG_FEATURE_TYPE} ${FFMPEG_FEATURE_PURPOSE} ${FFMPEG_FEATURE_DESCRIPTION})
758 find_feature(GStreamer_0_10 ${GSTREAMER_0_10_FEATURE_TYPE} ${GSTREAMER_0_10_FEATURE_PURPOSE} ${GSTREAMER_0_10_FEATURE_DESCRIPTION})
759 find_feature(GStreamer_1_0 ${GSTREAMER_1_0_FEATURE_TYPE} ${GSTREAMER_1_0_FEATURE_PURPOSE} ${GSTREAMER_1_0_FEATURE_DESCRIPTION})
761 find_feature(JPEG ${JPEG_FEATURE_TYPE} ${JPEG_FEATURE_PURPOSE} ${JPEG_FEATURE_DESCRIPTION})
762 find_feature(x264 ${X264_FEATURE_TYPE} ${X264_FEATURE_PURPOSE} ${X264_FEATURE_DESCRIPTION})
763 find_feature(OpenH264 ${OPENH264_FEATURE_TYPE} ${OPENH264_FEATURE_PURPOSE} ${OPENH264_FEATURE_DESCRIPTION})
764 find_feature(GSM ${GSM_FEATURE_TYPE} ${GSM_FEATURE_PURPOSE} ${GSM_FEATURE_DESCRIPTION})
765 find_feature(KRB5 ${KRB5_FEATURE_TYPE} ${KRB5_FEATURE_PURPOSE} ${KRB5_FEATURE_DESCRIPTION})
767 if(TARGET_ARCH MATCHES "x86|x64")
769 # Intel Performance Primitives
770 find_feature(IPP ${IPP_FEATURE_TYPE} ${IPP_FEATURE_PURPOSE} ${IPP_FEATURE_DESCRIPTION})
775 add_definitions("-DWITH_OPENSSL")
776 message(STATUS "Using OpenSSL Version: ${OPENSSL_VERSION}")
780 add_definitions("-DWITH_MBEDTLS")
783 if (TARGET_ARCH MATCHES "sparc")
784 set(HAVE_ALIGNED_REQUIRED 1)
787 if (WITH_X264 OR WITH_OPENH264 OR WITH_MEDIA_FOUNDATION OR WITH_FFMPEG)
788 set(WITH_GFX_H264 ON)
790 set(WITH_GFX_H264 OFF)
793 # Android expects all libraries to be loadable
796 set(FREERDP_DATA_PATH "share")
797 set(FREERDP_INSTALL_PREFIX ".")
798 set(FREERDP_LIBRARY_PATH ".")
799 set(FREERDP_PLUGIN_PATH ".")
800 set(FREERDP_ADDIN_PATH ".")
802 set(FREERDP_DATA_PATH "${CMAKE_INSTALL_PREFIX}/share/freerdp${FREERDP_VERSION_MAJOR}")
803 set(FREERDP_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
804 set(FREERDP_LIBRARY_PATH "${CMAKE_INSTALL_LIBDIR}")
805 set(FREERDP_PLUGIN_PATH "${CMAKE_INSTALL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}")
806 set(FREERDP_ADDIN_PATH "${FREERDP_PLUGIN_PATH}")
809 # Path to put extensions
810 set(FREERDP_EXTENSION_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}/extensions")
812 # Include directories
813 include_directories(${CMAKE_CURRENT_BINARY_DIR})
814 include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
815 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
818 add_definitions("-DHAVE_CONFIG_H")
819 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
821 # RPATH configuration
823 set(CMAKE_SKIP_RPATH FALSE)
824 set(CMAKE_SKIP_INSTALL_RPATH TRUE)
826 set(CMAKE_SKIP_BUILD_RPATH FALSE)
827 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
828 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
829 set(CMAKE_INSTALL_RPATH "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}:\$ORIGIN/..")
831 if (BUILD_SHARED_LIBS)
832 set(CMAKE_MACOSX_RPATH ON)
838 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
839 set(PROFILER_LIBRARIES
840 "${FREERDP_EXTERNAL_PROFILER_PATH}/obj/local/${ANDROID_ABI}/libandroid-ndk-profiler.a")
841 include_directories("${FREERDP_EXTERNAL_PROFILER_PATH}")
853 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
855 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Testing")
860 include_directories("${CMAKE_SOURCE_DIR}/winpr/include")
861 include_directories("${CMAKE_BINARY_DIR}/winpr/include")
863 if (${CMAKE_VERSION} VERSION_LESS 2.8.12)
864 set(PUBLIC_KEYWORD "")
865 set(PRIVATE_KEYWORD "")
867 set(PUBLIC_KEYWORD "PUBLIC")
868 set(PRIVATE_KEYWORD "PRIVATE")
871 add_subdirectory(winpr)
876 add_subdirectory(third-party)
877 if (NOT "${THIRD_PARTY_INCLUDES}" STREQUAL "")
878 include_directories(${THIRD_PARTY_INCLUDES})
882 add_subdirectory(include)
884 add_subdirectory(libfreerdp)
887 set(CMAKE_OSX_DEPLOYMENT_TARGET "")
888 if (IOS_PLATFORM MATCHES "SIMULATOR")
889 set(CMAKE_OSX_SYSROOT "iphonesimulator")
891 set(CMAKE_OSX_SYSROOT "iphoneos")
896 include_directories("${CMAKE_SOURCE_DIR}/rdtk/include")
897 include_directories("${CMAKE_BINARY_DIR}/rdtk/include")
899 add_subdirectory(rdtk)
902 add_subdirectory(uwac)
906 if(IS_DIRECTORY /usr/local/include)
907 include_directories(/usr/local/include)
908 link_directories(/usr/local/lib)
911 if(IS_DIRECTORY /usr/X11R6/include)
912 include_directories(/usr/X11R6/include)
918 add_subdirectory(channels)
921 if(WITH_CLIENT_COMMON OR WITH_CLIENT)
922 add_subdirectory(client)
926 add_subdirectory(server)
931 set(CMAKE_CPACK_INCLUDE_FILE "CMakeCPack.cmake")
933 if(NOT (VENDOR MATCHES "FreeRDP"))
934 if(DEFINED CLIENT_VENDOR_PATH)
935 if(EXISTS "${CMAKE_SOURCE_DIR}/${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
936 set(CMAKE_CPACK_INCLUDE_FILE "${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
941 #message("VENDOR: ${VENDOR} CLIENT_VENDOR_PATH: ${CLIENT_VENDOR_PATH} CMAKE_CPACK_INCLUDE_FILE: ${CMAKE_CPACK_INCLUDE_FILE}")
943 include(${CMAKE_CPACK_INCLUDE_FILE})
945 set(FREERDP_BUILD_CONFIG_LIST "")
946 GET_CMAKE_PROPERTY(res VARIABLES)
948 IF (var MATCHES "^WITH_*|^BUILD_TESTING|^BUILTIN_CHANNELS|^HAVE_*")
949 LIST(APPEND FREERDP_BUILD_CONFIG_LIST "${var}=${${var}}")
952 string(REPLACE ";" " " FREERDP_BUILD_CONFIG "${FREERDP_BUILD_CONFIG_LIST}")
953 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/buildflags.h.in ${CMAKE_CURRENT_BINARY_DIR}/buildflags.h)