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 # Check for cmake compatibility (enable/disable features)
45 include(CheckCmakeCompat)
47 # Include cmake modules
48 include(CheckIncludeFiles)
49 include(CheckLibraryExists)
50 include(CheckSymbolExists)
51 include(CheckStructHasMember)
52 include(FindPkgConfig)
53 include(TestBigEndian)
56 include(AutoVersioning)
57 include(ConfigOptions)
58 include(ComplexLibrary)
59 include(FeatureSummary)
60 include(CheckCCompilerFlag)
61 include(CheckCXXCompilerFlag)
62 include(GNUInstallDirsWrapper)
63 include(CMakePackageConfigHelpers)
67 if ($ENV{BUILD_NUMBER})
68 set(BUILD_NUMBER $ENV{BUILD_NUMBER})
70 set(WITH_LIBRARY_VERSIONING "ON")
71 set(FREERDP_VERSION_MAJOR "2")
72 set(FREERDP_VERSION_MINOR "0")
73 set(FREERDP_VERSION_REVISION "0")
74 set(FREERDP_VERSION_SUFFIX "dev")
75 set(FREERDP_API_VERSION "${FREERDP_VERSION_MAJOR}")
76 set(FREERDP_VERSION "${FREERDP_VERSION_MAJOR}.${FREERDP_VERSION_MINOR}.${FREERDP_VERSION_REVISION}")
77 if (FREERDP_VERSION_SUFFIX)
78 set(FREERDP_VERSION_FULL "${FREERDP_VERSION}-${FREERDP_VERSION_SUFFIX}")
80 set(FREERDP_VERSION_FULL "${FREERDP_VERSION}")
82 set(FREERDP_INCLUDE_DIR "include/freerdp${FREERDP_VERSION_MAJOR}/")
85 if (CMAKE_INSTALL_PREFIX)
86 get_filename_component(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" ABSOLUTE)
88 if (FREERDP_EXTERNAL_PATH)
89 get_filename_component (FREERDP_EXTERNAL_PATH "${FREERDP_EXTERNAL_PATH}" ABSOLUTE)
92 # Allow to search the host machine for git
94 SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
97 include(GetGitRevisionDescription)
98 git_get_exact_tag(GIT_REVISION --tags --always)
100 if (${GIT_REVISION} STREQUAL "n/a")
101 git_rev_parse (GIT_REVISION --short)
104 SET (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
105 endif(ANDROID OR IOS)
107 message(STATUS "Git Revision ${GIT_REVISION}")
109 # Turn on solution folders (2.8.4+)
110 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
112 # Default to release build type
113 if(NOT CMAKE_BUILD_TYPE)
114 set(CMAKE_BUILD_TYPE "Release")
117 if(NOT DEFINED BUILD_SHARED_LIBS)
119 set(BUILD_SHARED_LIBS OFF)
121 set(BUILD_SHARED_LIBS ON)
126 set(EXPORT_ALL_SYMBOLS TRUE)
127 elseif(NOT DEFINED EXPORT_ALL_SYMBOLS)
128 set(EXPORT_ALL_SYMBOLS FALSE)
132 if(${CMAKE_SYSTEM_NAME} MATCHES "BSD")
134 if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
137 if(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
142 # Configure MSVC Runtime
145 if(NOT DEFINED MSVC_RUNTIME)
146 set(MSVC_RUNTIME "dynamic")
148 if(${MSVC_RUNTIME} STREQUAL "static")
149 message(STATUS "Use the MSVC static runtime option carefully!")
150 message(STATUS "OpenSSL uses /MD by default, and is very picky")
151 message(STATUS "Random freeing errors are a common sign of runtime issues")
153 configure_msvc_runtime()
155 if(NOT DEFINED CMAKE_SUPPRESS_REGENERATION)
156 set(CMAKE_SUPPRESS_REGENERATION ON)
160 # Compiler-specific flags
161 if(CMAKE_COMPILER_IS_GNUCC)
162 if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "i686")
163 CHECK_SYMBOL_EXISTS(__x86_64__ "" IS_X86_64)
165 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
167 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686")
170 if(CMAKE_POSITION_INDEPENDENT_CODE)
171 if(${CMAKE_VERSION} VERSION_LESS 2.8.9)
172 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
177 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
179 CHECK_C_COMPILER_FLAG (-Wno-unused-result Wno-unused-result)
180 if(Wno-unused-result)
181 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-result")
183 CHECK_C_COMPILER_FLAG (-Wno-unused-but-set-variable Wno-unused-but-set-variable)
184 if(Wno-unused-but-set-variable)
185 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-but-set-variable")
187 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
188 if(Wno-deprecated-declarations)
189 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
191 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
192 if(Wno-deprecated-declarationsCXX)
193 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
196 if(NOT EXPORT_ALL_SYMBOLS)
197 message(STATUS "GCC default symbol visibility: hidden")
198 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
201 CHECK_C_COMPILER_FLAG(-Wno-format Wno-format)
203 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format")
206 CHECK_C_COMPILER_FLAG (-Wimplicit-function-declaration Wimplicit-function-declaration)
207 if(Wimplicit-function-declaration)
208 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wimplicit-function-declaration")
212 CHECK_C_COMPILER_FLAG (-Wredundant-decls Wredundant-decls)
214 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
217 if(CMAKE_BUILD_TYPE STREQUAL "Release")
218 set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG")
219 set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG")
221 CHECK_C_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefined)
222 if(Wno-builtin-macro-redefined)
223 set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Wno-builtin-macro-redefined")
224 set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -D__FILE__='\"$(subst ${CMAKE_BINARY_DIR}/,,$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<)))\"'")
227 CHECK_CXX_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefinedCXX)
228 if(Wno-builtin-macro-redefinedCXX)
229 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wno-builtin-macro-redefined")
230 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -D__FILE__='\"$(subst ${CMAKE_BINARY_DIR}/,,$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<)))\"'")
233 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
234 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
237 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2")
241 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
242 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
243 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-macros -Wno-padded")
244 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-c11-extensions -Wno-gnu")
246 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mssse3")
248 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
249 if(Wno-deprecated-declarations)
250 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
252 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
253 if(Wno-deprecated-declarationsCXX)
254 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
258 # Enable address sanitizer, where supported and when required
259 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCC)
260 if(WITH_SANITIZE_ADDRESS)
261 if (DEFINED CMAKE_REQUIRED_FLAGS)
262 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
264 set(CMAKE_REQUIRED_FLAGS "-fsanitize=address")
265 CHECK_C_COMPILER_FLAG ("-fsanitize=address" fsanitize-address)
266 if(fsanitize-address)
267 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
269 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
270 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
272 unset(CMAKE_REQUIRED_FLAGS)
275 CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
276 if(fno-omit-frame-pointer)
277 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
280 if (WITH_NO_UNDEFINED)
281 if (DEFINED CMAKE_REQUIRED_FLAGS)
282 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
284 set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
285 CHECK_C_COMPILER_FLAG (-Wl,--no-undefined no-undefined)
286 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
287 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
288 unset(SAVE_CMAKE_REQUIRED_FLAGS)
290 unset(CMAKE_REQUIRED_FLAGS)
293 SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined" )
299 # Remove previous warning definitions,
300 # NMake is otherwise complaining.
301 foreach (flags_var_to_scrub
304 CMAKE_CXX_FLAGS_RELEASE
305 CMAKE_CXX_FLAGS_RELWITHDEBINFO
306 CMAKE_CXX_FLAGS_MINSIZEREL
307 CMAKE_C_FLAGS_RELEASE
308 CMAKE_C_FLAGS_RELWITHDEBINFO
309 CMAKE_C_FLAGS_MINSIZEREL)
310 string (REGEX REPLACE "(^| )[/-]W[ ]*[1-9]" " "
311 "${flags_var_to_scrub}" "${${flags_var_to_scrub}}")
314 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gd")
315 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
317 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
318 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_AMD64_")
320 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_X86_")
323 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
324 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})
326 if(CMAKE_BUILD_TYPE STREQUAL "Release")
328 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Zi")
329 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi")
335 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUNICODE -D_UNICODE")
336 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_SECURE_NO_WARNINGS")
337 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWIN32_LEAN_AND_MEAN")
339 set(CMAKE_USE_RELATIVE_PATH ON)
340 if (${CMAKE_GENERATOR} MATCHES "NMake Makefile*")
341 set(CMAKE_PDB_BINARY_DIR ${CMAKE_BINARY_DIR})
342 elseif (${CMAKE_GENERATOR} MATCHES "Visual Studio*")
343 set(CMAKE_PDB_BINARY_DIR "${CMAKE_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
345 message(FATAL "Unknown generator ${CMAKE_GENERATOR}")
348 # Set product and vendor for dll and exe version information.
349 set(RC_VERSION_VENDOR ${VENDOR})
350 set(RC_VERSION_PRODUCT ${PRODUCT})
351 set(RC_VERSION_PATCH ${BUILD_NUMBER})
352 set(RC_VERSION_DESCRIPTION ${GIT_REVISION})
354 string(TIMESTAMP RC_VERSION_YEAR "%Y")
356 if(NOT DEFINED CMAKE_WINDOWS_VERSION)
357 set(CMAKE_WINDOWS_VERSION "WINXP")
360 if(CMAKE_WINDOWS_VERSION STREQUAL "WINXP")
361 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0501 -DWIN32_WINNT=0x0501")
362 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0501 -DWIN32_WINNT=0x0501")
363 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN7")
364 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0601 -DWIN32_WINNT=0x0601")
365 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0601 -DWIN32_WINNT=0x0601")
366 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN8")
367 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0602 -DWIN32_WINNT=0x0602")
368 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0602 -DWIN32_WINNT=0x0602")
371 if (FREERDP_EXTERNAL_SSL_PATH)
372 set(OPENSSL_ROOT_DIR ${FREERDP_EXTERNAL_SSL_PATH})
377 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_IOS_SDK_ROOT} -g")
380 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINPR_EXPORTS -DFREERDP_EXPORTS")
381 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINPR_EXPORTS -DFREERDP_EXPORTS")
385 check_include_files(fcntl.h HAVE_FCNTL_H)
386 check_include_files(unistd.h HAVE_UNISTD_H)
387 check_include_files(execinfo.h HAVE_EXECINFO_H)
388 check_include_files(inttypes.h HAVE_INTTYPES_H)
389 check_include_files(sys/modem.h HAVE_SYS_MODEM_H)
390 check_include_files(sys/filio.h HAVE_SYS_FILIO_H)
391 check_include_files(sys/sockio.h HAVE_SYS_SOCKIO_H)
392 check_include_files(sys/strtio.h HAVE_SYS_STRTIO_H)
393 check_include_files(sys/select.h HAVE_SYS_SELECT_H)
394 check_include_files(syslog.h HAVE_SYSLOG_H)
398 set(HAVE_INTTYPES_H 1)
399 set(HAVE_SYS_FILIO_H 1)
403 check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
405 set(HAVE_TM_GMTOFF 1)
411 if (NOT FREERDP_IOS_EXTERNAL_SSL_PATH)
412 message(STATUS "FREERDP_IOS_EXTERNAL_SSL_PATH not set! Required if openssl is not found in the iOS SDK (which usually isn't")
414 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_IOS_EXTERNAL_SSL_PATH})
415 set_property(GLOBAL PROPERTY XCODE_ATTRIBUTE_SKIP_INSTALL YES)
417 if(NOT DEFINED CMAKE_OSX_ARCHITECTURES)
418 set(CMAKE_OSX_ARCHITECTURES i386 x86_64)
421 if(IS_DIRECTORY /opt/local/include)
422 include_directories(/opt/local/include)
423 link_directories(/opt/local/lib)
427 # Temporarily disabled, causes the cmake script to be reexecuted, causing the compilation to fail.
428 # Workaround: specify the parameter in the command-line
430 # set(CMAKE_C_COMPILER "clang")
434 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -v")
435 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v")
441 set(WITH_MANPAGES "ON")
443 set(WITH_PULSE "OFF")
445 set(WITH_WAYLAND "OFF")
450 set(WITH_LIBRARY_VERSIONING "OFF")
452 if (${ANDROID_ABI} STREQUAL "armeabi")
456 if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
457 add_definitions(-DNDK_DEBUG=1)
459 # NOTE: Manually add -gdwarf-3, as newer toolchains default to -gdwarf-4,
460 # which is not supported by the gdbserver binary shipped with
461 # the android NDK (tested with r9b)
462 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG} -gdwarf-3")
464 set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -llog")
466 if (NOT FREERDP_EXTERNAL_PATH)
467 if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/")
468 set (FREERDP_EXTERNAL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/")
470 message(STATUS "FREERDP_EXTERNAL_PATH not set!")
474 list (APPEND CMAKE_INCLUDE_PATH ${FREERDP_EXTERNAL_PATH}/include)
475 list (APPEND CMAKE_LIBRARY_PATH ${FREERDP_EXTERNAL_PATH}/${ANDROID_ABI}/ )
476 set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH )
477 set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH )
480 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/gprof_generate.sh.cmake
481 ${CMAKE_BINARY_DIR}/scripts/gprof_generate.sh @ONLY)
485 set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
487 if(NOT IOS AND NOT ANDROID)
488 find_package(Threads REQUIRED)
492 check_library_exists(pthread pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK)
495 if(WITH_VALGRIND_MEMCHECK)
496 check_include_files(valgrind/memcheck.h HAVE_VALGRIND_MEMCHECK_H)
498 unset(HAVE_VALGRIND_MEMCHECK_H CACHE)
502 check_include_files(sys/eventfd.h HAVE_AIO_H)
503 check_include_files(sys/eventfd.h HAVE_EVENTFD_H)
505 check_symbol_exists(eventfd_read sys/eventfd.h WITH_EVENTFD_READ_WRITE)
507 check_include_files(sys/timerfd.h HAVE_TIMERFD_H)
508 check_include_files(poll.h HAVE_POLL_H)
509 list(APPEND CMAKE_REQUIRED_LIBRARIES m)
510 check_symbol_exists(ceill math.h HAVE_MATH_C99_LONG_DOUBLE)
511 list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES m)
512 set(X11_FEATURE_TYPE "RECOMMENDED")
513 set(WAYLAND_FEATURE_TYPE "RECOMMENDED")
515 set(X11_FEATURE_TYPE "DISABLED")
516 set(WAYLAND_FEATURE_TYPE "DISABLED")
520 find_package(PCSCWinPR)
523 set(X11_FEATURE_PURPOSE "X11")
524 set(X11_FEATURE_DESCRIPTION "X11 client and server")
526 set(WAYLAND_FEATURE_PURPOSE "Wayland")
527 set(WAYLAND_FEATURE_DESCRIPTION "Wayland client")
529 set(DIRECTFB_FEATURE_TYPE "OPTIONAL")
530 set(DIRECTFB_FEATURE_PURPOSE "DirectFB")
531 set(DIRECTFB_FEATURE_DESCRIPTION "DirectFB client")
533 set(ZLIB_FEATURE_TYPE "REQUIRED")
534 set(ZLIB_FEATURE_PURPOSE "compression")
535 set(ZLIB_FEATURE_DESCRIPTION "data compression")
537 set(OPENSSL_FEATURE_TYPE "REQUIRED")
538 set(OPENSSL_FEATURE_PURPOSE "cryptography")
539 set(OPENSSL_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
541 set(MBEDTLS_FEATURE_TYPE "OPTIONAL")
542 set(MBEDTLS_FEATURE_PURPOSE "cryptography")
543 set(MBEDTLS_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
545 set(OPENSLES_FEATURE_TYPE "OPTIONAL")
546 set(OPENSLES_FEATURE_PURPOSE "multimedia")
547 set(OPENSLES_FEATURE_DESCRIPTION "OpenSLES audio / video")
549 set(OSS_FEATURE_TYPE "RECOMMENDED")
550 set(OSS_FEATURE_PURPOSE "sound")
551 set(OSS_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
553 set(ALSA_FEATURE_TYPE "RECOMMENDED")
554 set(ALSA_FEATURE_PURPOSE "sound")
555 set(ALSA_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
557 set(PULSE_FEATURE_TYPE "OPTIONAL")
558 set(PULSE_FEATURE_PURPOSE "sound")
559 set(PULSE_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
561 set(CUPS_FEATURE_TYPE "OPTIONAL")
562 set(CUPS_FEATURE_PURPOSE "printing")
563 set(CUPS_FEATURE_DESCRIPTION "printer device redirection")
565 set(PCSC_FEATURE_TYPE "OPTIONAL")
566 set(PCSC_FEATURE_PURPOSE "smart card")
567 set(PCSC_FEATURE_DESCRIPTION "smart card device redirection")
569 set(FFMPEG_FEATURE_TYPE "RECOMMENDED")
570 set(FFMPEG_FEATURE_PURPOSE "multimedia")
571 set(FFMPEG_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
573 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
574 set(GSTREAMER_0_10_FEATURE_PURPOSE "multimedia")
575 set(GSTREAMER_0_10_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback, gstreamer 0.10 version")
577 set(GSTREAMER_1_0_FEATURE_TYPE "RECOMMENDED")
578 set(GSTREAMER_1_0_FEATURE_PURPOSE "multimedia")
579 set(GSTREAMER_1_0_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
581 set(IPP_FEATURE_TYPE "OPTIONAL")
582 set(IPP_FEATURE_PURPOSE "performance")
583 set(IPP_FEATURE_DESCRIPTION "Intel Integrated Performance Primitives library")
585 set(JPEG_FEATURE_TYPE "OPTIONAL")
586 set(JPEG_FEATURE_PURPOSE "codec")
587 set(JPEG_FEATURE_DESCRIPTION "use JPEG library")
589 set(X264_FEATURE_TYPE "OPTIONAL")
590 set(X264_FEATURE_PURPOSE "codec")
591 set(X264_FEATURE_DESCRIPTION "use x264 library")
593 set(OPENH264_FEATURE_TYPE "OPTIONAL")
594 set(OPENH264_FEATURE_PURPOSE "codec")
595 set(OPENH264_FEATURE_DESCRIPTION "use OpenH264 library")
597 set(GSM_FEATURE_TYPE "OPTIONAL")
598 set(GSM_FEATURE_PURPOSE "codec")
599 set(GSM_FEATURE_DESCRIPTION "GSM audio codec library")
602 set(X11_FEATURE_TYPE "DISABLED")
603 set(WAYLAND_FEATURE_TYPE "DISABLED")
604 set(ZLIB_FEATURE_TYPE "DISABLED")
605 set(DIRECTFB_FEATURE_TYPE "DISABLED")
606 set(OSS_FEATURE_TYPE "DISABLED")
607 set(ALSA_FEATURE_TYPE "DISABLED")
608 set(PULSE_FEATURE_TYPE "DISABLED")
609 set(CUPS_FEATURE_TYPE "DISABLED")
610 set(PCSC_FEATURE_TYPE "DISABLED")
611 set(FFMPEG_FEATURE_TYPE "DISABLED")
612 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
613 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
614 set(OPENSLES_FEATURE_TYPE "DISABLED")
618 set(DIRECTFB_FEATURE_TYPE "DISABLED")
619 set(FFMPEG_FEATURE_TYPE "OPTIONAL")
620 set(GSTREAMER_1_0_FEATURE_TYPE "OPTIONAL")
621 set(X11_FEATURE_TYPE "OPTIONAL")
622 set(WAYLAND_FEATURE_TYPE "DISABLED")
623 set(OSS_FEATURE_TYPE "DISABLED")
624 set(ALSA_FEATURE_TYPE "DISABLED")
626 set(X11_FEATURE_TYPE "DISABLED")
627 set(PULSE_FEATURE_TYPE "DISABLED")
628 set(CUPS_FEATURE_TYPE "DISABLED")
629 set(PCSC_FEATURE_TYPE "DISABLED")
630 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
631 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
633 set(OPENSLES_FEATURE_TYPE "DISABLED")
636 if(UNIX AND NOT ANDROID)
637 set(WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE "RECOMMENDED")
638 set(WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE "systemd journal appender")
639 set(WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION "allows to export wLog to systemd journal")
641 #include(Findlibsystemd)
642 find_feature(libsystemd ${WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION})
645 set(HAVE_JOURNALD_H TRUE)
647 unset(HAVE_JOURNALD_H)
649 endif(UNIX AND NOT ANDROID)
652 set(X11_FEATURE_TYPE "DISABLED")
653 set(WAYLAND_FEATURE_TYPE "DISABLED")
654 set(DIRECTFB_FEATURE_TYPE "DISABLED")
655 set(OSS_FEATURE_TYPE "DISABLED")
656 set(ALSA_FEATURE_TYPE "DISABLED")
657 set(PULSE_FEATURE_TYPE "DISABLED")
658 set(CUPS_FEATURE_TYPE "DISABLED")
659 set(PCSC_FEATURE_TYPE "DISABLED")
660 set(FFMPEG_FEATURE_TYPE "DISABLED")
661 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
662 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
663 set(OPENSLES_FEATURE_TYPE "REQUIRED")
666 find_feature(X11 ${X11_FEATURE_TYPE} ${X11_FEATURE_PURPOSE} ${X11_FEATURE_DESCRIPTION})
667 find_feature(Wayland ${WAYLAND_FEATURE_TYPE} ${WAYLAND_FEATURE_PURPOSE} ${WAYLAND_FEATURE_DESCRIPTION})
668 find_feature(DirectFB ${DIRECTFB_FEATURE_TYPE} ${DIRECTFB_FEATURE_PURPOSE} ${DIRECTFB_FEATURE_DESCRIPTION})
669 if (${WITH_DIRECTFB})
670 message(WARNING "DIRECTFB is orphaned and not maintained see docs/README.directfb for details")
673 find_feature(ZLIB ${ZLIB_FEATURE_TYPE} ${ZLIB_FEATURE_PURPOSE} ${ZLIB_FEATURE_DESCRIPTION})
674 find_feature(OpenSSL ${OPENSSL_FEATURE_TYPE} ${OPENSSL_FEATURE_PURPOSE} ${OPENSSL_FEATURE_DESCRIPTION})
675 find_feature(MbedTLS ${MBEDTLS_FEATURE_TYPE} ${MBEDTLS_FEATURE_PURPOSE} ${MBEDTLS_FEATURE_DESCRIPTION})
676 find_feature(OpenSLES ${OPENSLES_FEATURE_TYPE} ${OPENSLES_FEATURE_PURPOSE} ${OPENSLES_FEATURE_DESCRIPTION})
678 find_feature(OSS ${OSS_FEATURE_TYPE} ${OSS_FEATURE_PURPOSE} ${OSS_FEATURE_DESCRIPTION})
679 find_feature(ALSA ${ALSA_FEATURE_TYPE} ${ALSA_FEATURE_PURPOSE} ${ALSA_FEATURE_DESCRIPTION})
680 find_feature(Pulse ${PULSE_FEATURE_TYPE} ${PULSE_FEATURE_PURPOSE} ${PULSE_FEATURE_DESCRIPTION})
682 find_feature(Cups ${CUPS_FEATURE_TYPE} ${CUPS_FEATURE_PURPOSE} ${CUPS_FEATURE_DESCRIPTION})
683 find_feature(PCSC ${PCSC_FEATURE_TYPE} ${PCSC_FEATURE_PURPOSE} ${PCSC_FEATURE_DESCRIPTION})
685 find_feature(FFmpeg ${FFMPEG_FEATURE_TYPE} ${FFMPEG_FEATURE_PURPOSE} ${FFMPEG_FEATURE_DESCRIPTION})
687 find_feature(GStreamer_0_10 ${GSTREAMER_0_10_FEATURE_TYPE} ${GSTREAMER_0_10_FEATURE_PURPOSE} ${GSTREAMER_0_10_FEATURE_DESCRIPTION})
688 find_feature(GStreamer_1_0 ${GSTREAMER_1_0_FEATURE_TYPE} ${GSTREAMER_1_0_FEATURE_PURPOSE} ${GSTREAMER_1_0_FEATURE_DESCRIPTION})
690 find_feature(JPEG ${JPEG_FEATURE_TYPE} ${JPEG_FEATURE_PURPOSE} ${JPEG_FEATURE_DESCRIPTION})
691 find_feature(x264 ${X264_FEATURE_TYPE} ${X264_FEATURE_PURPOSE} ${X264_FEATURE_DESCRIPTION})
692 find_feature(OpenH264 ${OPENH264_FEATURE_TYPE} ${OPENH264_FEATURE_PURPOSE} ${OPENH264_FEATURE_DESCRIPTION})
693 find_feature(GSM ${GSM_FEATURE_TYPE} ${GSM_FEATURE_PURPOSE} ${GSM_FEATURE_DESCRIPTION})
695 if(TARGET_ARCH MATCHES "x86|x64")
697 # Intel Performance Primitives
698 find_feature(IPP ${IPP_FEATURE_TYPE} ${IPP_FEATURE_PURPOSE} ${IPP_FEATURE_DESCRIPTION})
703 add_definitions("-DWITH_OPENSSL")
707 add_definitions("-DWITH_MBEDTLS")
710 if (TARGET_ARCH MATCHES "sparc")
711 set(HAVE_ALIGNED_REQUIRED 1)
714 # Path to put FreeRDP data
715 set(FREERDP_DATA_PATH "${CMAKE_INSTALL_PREFIX}/share/freerdp${FREERDP_VERSION_MAJOR}")
717 # Path to put plugins
719 set(FREERDP_LIBRARY_PATH "${CMAKE_INSTALL_LIBDIR}")
721 set(FREERDP_PLUGIN_PATH "${CMAKE_INSTALL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}")
722 set(FREERDP_ADDIN_PATH "${FREERDP_PLUGIN_PATH}")
724 # Path to put extensions
725 set(FREERDP_EXTENSION_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}/extensions")
727 # Include directories
728 include_directories(${CMAKE_CURRENT_BINARY_DIR})
729 include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
730 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
733 add_definitions("-DHAVE_CONFIG_H")
734 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
736 # RPATH configuration
738 set(CMAKE_SKIP_RPATH FALSE)
739 set(CMAKE_SKIP_INSTALL_RPATH TRUE)
741 set(CMAKE_SKIP_BUILD_RPATH FALSE)
742 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
743 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
744 set(CMAKE_INSTALL_RPATH "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}:\$ORIGIN/..")
749 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
750 set(PROFILER_LIBRARIES
751 "${FREERDP_EXTERNAL_PROFILER_PATH}/obj/local/${ANDROID_ABI}/libandroid-ndk-profiler.a")
752 include_directories("${FREERDP_EXTERNAL_PROFILER_PATH}")
761 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFREERDP_TEST_EXPORTS")
766 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
768 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Testing")
773 include_directories("${CMAKE_SOURCE_DIR}/winpr/include")
774 include_directories("${CMAKE_BINARY_DIR}/winpr/include")
776 if (${CMAKE_VERSION} VERSION_LESS 2.8.12)
777 set(PUBLIC_KEYWORD "")
778 set(PRIVATE_KEYWORD "")
780 set(PUBLIC_KEYWORD "PUBLIC")
781 set(PRIVATE_KEYWORD "PRIVATE")
784 add_subdirectory(winpr)
789 add_subdirectory(third-party)
790 if (NOT "${THIRD_PARTY_INCLUDES}" STREQUAL "")
791 include_directories(${THIRD_PARTY_INCLUDES})
795 add_subdirectory(include)
797 add_subdirectory(libfreerdp)
800 set(CMAKE_OSX_DEPLOYMENT_TARGET "")
801 if (IOS_PLATFORM MATCHES "SIMULATOR")
802 set(CMAKE_OSX_SYSROOT "iphonesimulator")
804 set(CMAKE_OSX_SYSROOT "iphoneos")
809 include_directories("${CMAKE_SOURCE_DIR}/rdtk/include")
810 include_directories("${CMAKE_BINARY_DIR}/rdtk/include")
812 add_subdirectory(rdtk)
815 add_subdirectory(uwac)
819 if(IS_DIRECTORY /usr/local/include)
820 include_directories(/usr/local/include)
821 link_directories(/usr/local/lib)
824 if(IS_DIRECTORY /usr/X11R6/include)
825 include_directories(/usr/X11R6/include)
831 add_subdirectory(channels)
834 if(WITH_CLIENT_COMMON OR WITH_CLIENT)
835 add_subdirectory(client)
839 add_subdirectory(server)
844 set(CMAKE_CPACK_INCLUDE_FILE "CMakeCPack.cmake")
846 if(NOT (VENDOR MATCHES "FreeRDP"))
847 if(DEFINED CLIENT_VENDOR_PATH)
848 if(EXISTS "${CMAKE_SOURCE_DIR}/${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
849 set(CMAKE_CPACK_INCLUDE_FILE "${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
854 #message("VENDOR: ${VENDOR} CLIENT_VENDOR_PATH: ${CLIENT_VENDOR_PATH} CMAKE_CPACK_INCLUDE_FILE: ${CMAKE_CPACK_INCLUDE_FILE}")
856 include(${CMAKE_CPACK_INCLUDE_FILE})
858 set(FREERDP_BUILD_CONFIG_LIST "")
859 GET_CMAKE_PROPERTY(res VARIABLES)
861 IF (var MATCHES "^WITH_*|^BUILD_TESTING|^STATIC_CHANNELS|^HAVE_*")
862 LIST(APPEND FREERDP_BUILD_CONFIG_LIST "${var}=${${var}}")
865 string(REPLACE ";" " " FREERDP_BUILD_CONFIG "${FREERDP_BUILD_CONFIG_LIST}")
866 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/buildflags.h.in ${CMAKE_CURRENT_BINARY_DIR}/buildflags.h)