1 # FreeRDP: A Remote Desktop Protocol Implementation
2 # FreeRDP cmake build script
4 # Copyright 2011 O.S. Systems Software Ltda.
5 # Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
6 # Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
7 # Copyright 2012 HP Development Company, LLC
9 # Licensed under the Apache License, Version 2.0 (the "License");
10 # you may not use this file except in compliance with the License.
11 # You may obtain a copy of the License at
13 # http://www.apache.org/licenses/LICENSE-2.0
15 # Unless required by applicable law or agreed to in writing, software
16 # distributed under the License is distributed on an "AS IS" BASIS,
17 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 # See the License for the specific language governing permissions and
19 # limitations under the License.
21 cmake_minimum_required(VERSION 2.8)
23 project(FreeRDP C CXX)
25 if(NOT DEFINED VENDOR)
26 set(VENDOR "FreeRDP" CACHE STRING "FreeRDP package vendor")
29 if(NOT DEFINED PRODUCT)
30 set(PRODUCT "FreeRDP" CACHE STRING "FreeRDP package name")
33 if(NOT DEFINED FREERDP_VENDOR)
37 set(CMAKE_COLOR_MAKEFILE ON)
39 set(CMAKE_POSITION_INDEPENDENT_CODE ON)
41 # Include our extra modules
42 set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/)
44 if((CMAKE_SYSTEM_NAME MATCHES "WindowsStore") AND (CMAKE_SYSTEM_VERSION MATCHES "10.0"))
46 add_definitions("-D_UWP")
47 set(CMAKE_WINDOWS_VERSION "WIN10")
50 # Check for cmake compatibility (enable/disable features)
51 include(CheckCmakeCompat)
53 # Include cmake modules
54 include(CheckIncludeFiles)
55 include(CheckLibraryExists)
56 include(CheckSymbolExists)
57 include(CheckStructHasMember)
58 include(FindPkgConfig)
59 include(TestBigEndian)
62 include(AutoVersioning)
63 include(ConfigOptions)
64 include(ComplexLibrary)
65 include(FeatureSummary)
66 include(CheckCCompilerFlag)
67 include(CheckCXXCompilerFlag)
68 include(GNUInstallDirsWrapper)
69 include(CMakePackageConfigHelpers)
73 if ($ENV{BUILD_NUMBER})
74 set(BUILD_NUMBER $ENV{BUILD_NUMBER})
76 set(WITH_LIBRARY_VERSIONING "ON")
77 set(FREERDP_VERSION_MAJOR "2")
78 set(FREERDP_VERSION_MINOR "0")
79 set(FREERDP_VERSION_REVISION "0")
80 set(FREERDP_VERSION_SUFFIX "dev")
81 set(FREERDP_API_VERSION "${FREERDP_VERSION_MAJOR}")
82 set(FREERDP_VERSION "${FREERDP_VERSION_MAJOR}.${FREERDP_VERSION_MINOR}.${FREERDP_VERSION_REVISION}")
83 if (FREERDP_VERSION_SUFFIX)
84 set(FREERDP_VERSION_FULL "${FREERDP_VERSION}-${FREERDP_VERSION_SUFFIX}")
86 set(FREERDP_VERSION_FULL "${FREERDP_VERSION}")
88 set(FREERDP_INCLUDE_DIR "include/freerdp${FREERDP_VERSION_MAJOR}/")
91 if (CMAKE_INSTALL_PREFIX)
92 get_filename_component(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" ABSOLUTE)
94 if (FREERDP_EXTERNAL_PATH)
95 get_filename_component (FREERDP_EXTERNAL_PATH "${FREERDP_EXTERNAL_PATH}" ABSOLUTE)
98 # Allow to search the host machine for git
100 SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
101 endif(ANDROID OR IOS)
103 include(GetGitRevisionDescription)
104 git_get_exact_tag(GIT_REVISION --tags --always)
106 if (${GIT_REVISION} STREQUAL "n/a")
107 git_rev_parse (GIT_REVISION --short)
110 SET (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
111 endif(ANDROID OR IOS)
113 message(STATUS "Git Revision ${GIT_REVISION}")
115 # Turn on solution folders (2.8.4+)
116 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
118 # Default to release build type
119 if(NOT CMAKE_BUILD_TYPE)
120 set(CMAKE_BUILD_TYPE "Release")
123 if(NOT DEFINED BUILD_SHARED_LIBS)
125 set(BUILD_SHARED_LIBS OFF)
127 set(BUILD_SHARED_LIBS ON)
132 set(EXPORT_ALL_SYMBOLS TRUE)
133 elseif(NOT DEFINED EXPORT_ALL_SYMBOLS)
134 set(EXPORT_ALL_SYMBOLS FALSE)
138 if(${CMAKE_SYSTEM_NAME} MATCHES "BSD")
140 if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
143 if(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
148 # Configure MSVC Runtime
151 if(NOT DEFINED MSVC_RUNTIME)
152 set(MSVC_RUNTIME "dynamic")
154 if(${MSVC_RUNTIME} STREQUAL "static")
155 message(STATUS "Use the MSVC static runtime option carefully!")
156 message(STATUS "OpenSSL uses /MD by default, and is very picky")
157 message(STATUS "Random freeing errors are a common sign of runtime issues")
159 configure_msvc_runtime()
161 if(NOT DEFINED CMAKE_SUPPRESS_REGENERATION)
162 set(CMAKE_SUPPRESS_REGENERATION ON)
166 # Compiler-specific flags
167 if(CMAKE_COMPILER_IS_GNUCC)
168 if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "i686")
169 CHECK_SYMBOL_EXISTS(__x86_64__ "" IS_X86_64)
171 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
173 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686")
176 if(CMAKE_POSITION_INDEPENDENT_CODE)
177 if(${CMAKE_VERSION} VERSION_LESS 2.8.9)
178 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
183 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
185 CHECK_C_COMPILER_FLAG (-Wno-unused-result Wno-unused-result)
186 if(Wno-unused-result)
187 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-result")
189 CHECK_C_COMPILER_FLAG (-Wno-unused-but-set-variable Wno-unused-but-set-variable)
190 if(Wno-unused-but-set-variable)
191 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-but-set-variable")
193 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
194 if(Wno-deprecated-declarations)
195 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
197 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
198 if(Wno-deprecated-declarationsCXX)
199 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
202 if(NOT EXPORT_ALL_SYMBOLS)
203 message(STATUS "GCC default symbol visibility: hidden")
204 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
207 CHECK_C_COMPILER_FLAG(-Wno-format Wno-format)
209 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format")
212 CHECK_C_COMPILER_FLAG (-Wimplicit-function-declaration Wimplicit-function-declaration)
213 if(Wimplicit-function-declaration)
214 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wimplicit-function-declaration")
218 CHECK_C_COMPILER_FLAG (-Wredundant-decls Wredundant-decls)
220 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
223 if(CMAKE_BUILD_TYPE STREQUAL "Release")
224 set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG")
225 set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG")
227 CHECK_C_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefined)
228 if(Wno-builtin-macro-redefined)
229 set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Wno-builtin-macro-redefined")
230 set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -D__FILE__='\"$(subst ${CMAKE_BINARY_DIR}/,,$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<)))\"'")
233 CHECK_CXX_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefinedCXX)
234 if(Wno-builtin-macro-redefinedCXX)
235 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wno-builtin-macro-redefined")
236 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -D__FILE__='\"$(subst ${CMAKE_BINARY_DIR}/,,$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<)))\"'")
239 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
240 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
243 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2")
247 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
248 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
249 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-macros -Wno-padded")
250 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-c11-extensions -Wno-gnu")
252 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mssse3")
254 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
255 if(Wno-deprecated-declarations)
256 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
258 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
259 if(Wno-deprecated-declarationsCXX)
260 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
264 # Enable address sanitizer, where supported and when required
265 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCC)
266 if(WITH_SANITIZE_ADDRESS)
267 if (DEFINED CMAKE_REQUIRED_FLAGS)
268 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
270 set(CMAKE_REQUIRED_FLAGS "-fsanitize=address")
271 CHECK_C_COMPILER_FLAG ("-fsanitize=address" fsanitize-address)
272 if(fsanitize-address)
273 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
275 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
276 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
278 unset(CMAKE_REQUIRED_FLAGS)
281 CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
282 if(fno-omit-frame-pointer)
283 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
286 if (WITH_NO_UNDEFINED)
287 if (DEFINED CMAKE_REQUIRED_FLAGS)
288 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
290 set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
291 CHECK_C_COMPILER_FLAG (-Wl,--no-undefined no-undefined)
292 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
293 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
294 unset(SAVE_CMAKE_REQUIRED_FLAGS)
296 unset(CMAKE_REQUIRED_FLAGS)
299 SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined" )
305 # Remove previous warning definitions,
306 # NMake is otherwise complaining.
307 foreach (flags_var_to_scrub
310 CMAKE_CXX_FLAGS_RELEASE
311 CMAKE_CXX_FLAGS_RELWITHDEBINFO
312 CMAKE_CXX_FLAGS_MINSIZEREL
313 CMAKE_C_FLAGS_RELEASE
314 CMAKE_C_FLAGS_RELWITHDEBINFO
315 CMAKE_C_FLAGS_MINSIZEREL)
316 string (REGEX REPLACE "(^| )[/-]W[ ]*[1-9]" " "
317 "${flags_var_to_scrub}" "${${flags_var_to_scrub}}")
320 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gd")
321 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
323 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
324 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_AMD64_")
326 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_X86_")
329 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
330 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})
332 if(CMAKE_BUILD_TYPE STREQUAL "Release")
334 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Zi")
335 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi")
341 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUNICODE -D_UNICODE")
342 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_SECURE_NO_WARNINGS")
343 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWIN32_LEAN_AND_MEAN")
344 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_WINSOCK_DEPRECATED_NO_WARNINGS")
346 set(CMAKE_USE_RELATIVE_PATH ON)
347 if (${CMAKE_GENERATOR} MATCHES "NMake Makefile*")
348 set(CMAKE_PDB_BINARY_DIR ${CMAKE_BINARY_DIR})
349 elseif (${CMAKE_GENERATOR} MATCHES "Visual Studio*")
350 set(CMAKE_PDB_BINARY_DIR "${CMAKE_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
352 message(FATAL "Unknown generator ${CMAKE_GENERATOR}")
355 # Set product and vendor for dll and exe version information.
356 set(RC_VERSION_VENDOR ${VENDOR})
357 set(RC_VERSION_PRODUCT ${PRODUCT})
358 set(RC_VERSION_PATCH ${BUILD_NUMBER})
359 set(RC_VERSION_DESCRIPTION ${GIT_REVISION})
361 string(TIMESTAMP RC_VERSION_YEAR "%Y")
363 if(NOT DEFINED CMAKE_WINDOWS_VERSION)
364 set(CMAKE_WINDOWS_VERSION "WINXP")
367 if(CMAKE_WINDOWS_VERSION STREQUAL "WINXP")
368 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0501 -D_WIN32_WINNT=0x0501")
369 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0501 -D_WIN32_WINNT=0x0501")
370 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN7")
371 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0601 -D_WIN32_WINNT=0x0601")
372 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0601 -D_WIN32_WINNT=0x0601")
373 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN8")
374 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0602 -D_WIN32_WINNT=0x0602")
375 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0602 -D_WIN32_WINNT=0x0602")
376 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN10")
377 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0A00 -D_WIN32_WINNT=0x0A00")
378 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0A00 -D_WIN32_WINNT=0x0A00")
381 if (FREERDP_EXTERNAL_SSL_PATH)
382 set(OPENSSL_ROOT_DIR ${FREERDP_EXTERNAL_SSL_PATH})
387 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_IOS_SDK_ROOT} -g")
390 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINPR_EXPORTS -DFREERDP_EXPORTS")
391 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINPR_EXPORTS -DFREERDP_EXPORTS")
395 check_include_files(fcntl.h HAVE_FCNTL_H)
396 check_include_files(unistd.h HAVE_UNISTD_H)
397 check_include_files(execinfo.h HAVE_EXECINFO_H)
398 check_include_files(inttypes.h HAVE_INTTYPES_H)
399 check_include_files(sys/modem.h HAVE_SYS_MODEM_H)
400 check_include_files(sys/filio.h HAVE_SYS_FILIO_H)
401 check_include_files(sys/sockio.h HAVE_SYS_SOCKIO_H)
402 check_include_files(sys/strtio.h HAVE_SYS_STRTIO_H)
403 check_include_files(sys/select.h HAVE_SYS_SELECT_H)
404 check_include_files(syslog.h HAVE_SYSLOG_H)
408 set(HAVE_INTTYPES_H 1)
409 set(HAVE_SYS_FILIO_H 1)
413 check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
415 set(HAVE_TM_GMTOFF 1)
421 if (NOT FREERDP_IOS_EXTERNAL_SSL_PATH)
422 message(STATUS "FREERDP_IOS_EXTERNAL_SSL_PATH not set! Required if openssl is not found in the iOS SDK (which usually isn't")
424 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_IOS_EXTERNAL_SSL_PATH})
425 set_property(GLOBAL PROPERTY XCODE_ATTRIBUTE_SKIP_INSTALL YES)
427 if(NOT DEFINED CMAKE_OSX_ARCHITECTURES)
428 set(CMAKE_OSX_ARCHITECTURES i386 x86_64)
431 if(IS_DIRECTORY /opt/local/include)
432 include_directories(/opt/local/include)
433 link_directories(/opt/local/lib)
437 # Temporarily disabled, causes the cmake script to be reexecuted, causing the compilation to fail.
438 # Workaround: specify the parameter in the command-line
440 # set(CMAKE_C_COMPILER "clang")
444 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -v")
445 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v")
451 set(WITH_MANPAGES "ON")
453 set(WITH_PULSE "OFF")
455 set(WITH_WAYLAND "OFF")
460 set(WITH_LIBRARY_VERSIONING "OFF")
462 if (${ANDROID_ABI} STREQUAL "armeabi")
466 if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
467 add_definitions(-DNDK_DEBUG=1)
469 # NOTE: Manually add -gdwarf-3, as newer toolchains default to -gdwarf-4,
470 # which is not supported by the gdbserver binary shipped with
471 # the android NDK (tested with r9b)
472 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG} -gdwarf-3")
474 set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -llog")
476 if (NOT FREERDP_EXTERNAL_PATH)
477 if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/")
478 set (FREERDP_EXTERNAL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/")
480 message(STATUS "FREERDP_EXTERNAL_PATH not set!")
484 list (APPEND CMAKE_INCLUDE_PATH ${FREERDP_EXTERNAL_PATH}/include)
485 list (APPEND CMAKE_LIBRARY_PATH ${FREERDP_EXTERNAL_PATH}/${ANDROID_ABI}/ )
486 set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH )
487 set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH )
490 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/gprof_generate.sh.cmake
491 ${CMAKE_BINARY_DIR}/scripts/gprof_generate.sh @ONLY)
495 set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
498 find_package(Threads REQUIRED)
502 check_symbol_exists(pthread_mutex_timedlock pthread.h HAVE_PTHREAD_MUTEX_TIMEDLOCK)
505 if(WITH_VALGRIND_MEMCHECK)
506 check_include_files(valgrind/memcheck.h HAVE_VALGRIND_MEMCHECK_H)
508 unset(HAVE_VALGRIND_MEMCHECK_H CACHE)
512 check_include_files(sys/eventfd.h HAVE_AIO_H)
513 check_include_files(sys/eventfd.h HAVE_EVENTFD_H)
515 check_symbol_exists(eventfd_read sys/eventfd.h WITH_EVENTFD_READ_WRITE)
517 check_include_files(sys/timerfd.h HAVE_TIMERFD_H)
518 check_include_files(poll.h HAVE_POLL_H)
519 list(APPEND CMAKE_REQUIRED_LIBRARIES m)
520 check_symbol_exists(ceill math.h HAVE_MATH_C99_LONG_DOUBLE)
521 list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES m)
522 set(X11_FEATURE_TYPE "RECOMMENDED")
523 set(WAYLAND_FEATURE_TYPE "RECOMMENDED")
525 set(X11_FEATURE_TYPE "DISABLED")
526 set(WAYLAND_FEATURE_TYPE "DISABLED")
530 find_package(PCSCWinPR)
533 set(X11_FEATURE_PURPOSE "X11")
534 set(X11_FEATURE_DESCRIPTION "X11 client and server")
536 set(WAYLAND_FEATURE_PURPOSE "Wayland")
537 set(WAYLAND_FEATURE_DESCRIPTION "Wayland client")
539 set(DIRECTFB_FEATURE_TYPE "OPTIONAL")
540 set(DIRECTFB_FEATURE_PURPOSE "DirectFB")
541 set(DIRECTFB_FEATURE_DESCRIPTION "DirectFB client")
543 set(ZLIB_FEATURE_TYPE "REQUIRED")
544 set(ZLIB_FEATURE_PURPOSE "compression")
545 set(ZLIB_FEATURE_DESCRIPTION "data compression")
547 set(OPENSSL_FEATURE_TYPE "REQUIRED")
548 set(OPENSSL_FEATURE_PURPOSE "cryptography")
549 set(OPENSSL_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
551 set(MBEDTLS_FEATURE_TYPE "OPTIONAL")
552 set(MBEDTLS_FEATURE_PURPOSE "cryptography")
553 set(MBEDTLS_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
555 set(OPENSLES_FEATURE_TYPE "OPTIONAL")
556 set(OPENSLES_FEATURE_PURPOSE "multimedia")
557 set(OPENSLES_FEATURE_DESCRIPTION "OpenSLES audio / video")
559 set(OSS_FEATURE_TYPE "RECOMMENDED")
560 set(OSS_FEATURE_PURPOSE "sound")
561 set(OSS_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
563 set(ALSA_FEATURE_TYPE "RECOMMENDED")
564 set(ALSA_FEATURE_PURPOSE "sound")
565 set(ALSA_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
567 set(PULSE_FEATURE_TYPE "OPTIONAL")
568 set(PULSE_FEATURE_PURPOSE "sound")
569 set(PULSE_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
571 set(CUPS_FEATURE_TYPE "OPTIONAL")
572 set(CUPS_FEATURE_PURPOSE "printing")
573 set(CUPS_FEATURE_DESCRIPTION "printer device redirection")
575 set(PCSC_FEATURE_TYPE "OPTIONAL")
576 set(PCSC_FEATURE_PURPOSE "smart card")
577 set(PCSC_FEATURE_DESCRIPTION "smart card device redirection")
579 set(FFMPEG_FEATURE_TYPE "RECOMMENDED")
580 set(FFMPEG_FEATURE_PURPOSE "multimedia")
581 set(FFMPEG_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
583 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
584 set(GSTREAMER_0_10_FEATURE_PURPOSE "multimedia")
585 set(GSTREAMER_0_10_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback, gstreamer 0.10 version")
587 set(GSTREAMER_1_0_FEATURE_TYPE "RECOMMENDED")
588 set(GSTREAMER_1_0_FEATURE_PURPOSE "multimedia")
589 set(GSTREAMER_1_0_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
591 set(IPP_FEATURE_TYPE "OPTIONAL")
592 set(IPP_FEATURE_PURPOSE "performance")
593 set(IPP_FEATURE_DESCRIPTION "Intel Integrated Performance Primitives library")
595 set(JPEG_FEATURE_TYPE "OPTIONAL")
596 set(JPEG_FEATURE_PURPOSE "codec")
597 set(JPEG_FEATURE_DESCRIPTION "use JPEG library")
599 set(X264_FEATURE_TYPE "OPTIONAL")
600 set(X264_FEATURE_PURPOSE "codec")
601 set(X264_FEATURE_DESCRIPTION "use x264 library")
603 set(OPENH264_FEATURE_TYPE "OPTIONAL")
604 set(OPENH264_FEATURE_PURPOSE "codec")
605 set(OPENH264_FEATURE_DESCRIPTION "use OpenH264 library")
607 set(GSM_FEATURE_TYPE "OPTIONAL")
608 set(GSM_FEATURE_PURPOSE "codec")
609 set(GSM_FEATURE_DESCRIPTION "GSM audio codec library")
612 set(X11_FEATURE_TYPE "DISABLED")
613 set(WAYLAND_FEATURE_TYPE "DISABLED")
614 set(ZLIB_FEATURE_TYPE "DISABLED")
615 set(DIRECTFB_FEATURE_TYPE "DISABLED")
616 set(OSS_FEATURE_TYPE "DISABLED")
617 set(ALSA_FEATURE_TYPE "DISABLED")
618 set(PULSE_FEATURE_TYPE "DISABLED")
619 set(CUPS_FEATURE_TYPE "DISABLED")
620 set(PCSC_FEATURE_TYPE "DISABLED")
621 set(FFMPEG_FEATURE_TYPE "DISABLED")
622 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
623 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
624 set(OPENSLES_FEATURE_TYPE "DISABLED")
628 set(DIRECTFB_FEATURE_TYPE "DISABLED")
629 set(FFMPEG_FEATURE_TYPE "OPTIONAL")
630 set(GSTREAMER_1_0_FEATURE_TYPE "OPTIONAL")
631 set(X11_FEATURE_TYPE "OPTIONAL")
632 set(WAYLAND_FEATURE_TYPE "DISABLED")
633 set(OSS_FEATURE_TYPE "DISABLED")
634 set(ALSA_FEATURE_TYPE "DISABLED")
636 set(X11_FEATURE_TYPE "DISABLED")
637 set(PULSE_FEATURE_TYPE "DISABLED")
638 set(CUPS_FEATURE_TYPE "DISABLED")
639 set(PCSC_FEATURE_TYPE "DISABLED")
640 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
641 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
643 set(OPENSLES_FEATURE_TYPE "DISABLED")
646 if(UNIX AND NOT ANDROID)
647 set(WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE "RECOMMENDED")
648 set(WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE "systemd journal appender")
649 set(WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION "allows to export wLog to systemd journal")
651 #include(Findlibsystemd)
652 find_feature(libsystemd ${WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION})
655 set(HAVE_JOURNALD_H TRUE)
657 unset(HAVE_JOURNALD_H)
659 endif(UNIX AND NOT ANDROID)
662 set(X11_FEATURE_TYPE "DISABLED")
663 set(WAYLAND_FEATURE_TYPE "DISABLED")
664 set(DIRECTFB_FEATURE_TYPE "DISABLED")
665 set(OSS_FEATURE_TYPE "DISABLED")
666 set(ALSA_FEATURE_TYPE "DISABLED")
667 set(PULSE_FEATURE_TYPE "DISABLED")
668 set(CUPS_FEATURE_TYPE "DISABLED")
669 set(PCSC_FEATURE_TYPE "DISABLED")
670 set(FFMPEG_FEATURE_TYPE "DISABLED")
671 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
672 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
673 set(OPENSLES_FEATURE_TYPE "REQUIRED")
676 find_feature(X11 ${X11_FEATURE_TYPE} ${X11_FEATURE_PURPOSE} ${X11_FEATURE_DESCRIPTION})
677 find_feature(Wayland ${WAYLAND_FEATURE_TYPE} ${WAYLAND_FEATURE_PURPOSE} ${WAYLAND_FEATURE_DESCRIPTION})
678 find_feature(DirectFB ${DIRECTFB_FEATURE_TYPE} ${DIRECTFB_FEATURE_PURPOSE} ${DIRECTFB_FEATURE_DESCRIPTION})
679 if (${WITH_DIRECTFB})
680 message(WARNING "DIRECTFB is orphaned and not maintained see docs/README.directfb for details")
683 find_feature(ZLIB ${ZLIB_FEATURE_TYPE} ${ZLIB_FEATURE_PURPOSE} ${ZLIB_FEATURE_DESCRIPTION})
684 find_feature(OpenSSL ${OPENSSL_FEATURE_TYPE} ${OPENSSL_FEATURE_PURPOSE} ${OPENSSL_FEATURE_DESCRIPTION})
685 find_feature(MbedTLS ${MBEDTLS_FEATURE_TYPE} ${MBEDTLS_FEATURE_PURPOSE} ${MBEDTLS_FEATURE_DESCRIPTION})
686 find_feature(OpenSLES ${OPENSLES_FEATURE_TYPE} ${OPENSLES_FEATURE_PURPOSE} ${OPENSLES_FEATURE_DESCRIPTION})
688 find_feature(OSS ${OSS_FEATURE_TYPE} ${OSS_FEATURE_PURPOSE} ${OSS_FEATURE_DESCRIPTION})
689 find_feature(ALSA ${ALSA_FEATURE_TYPE} ${ALSA_FEATURE_PURPOSE} ${ALSA_FEATURE_DESCRIPTION})
690 find_feature(Pulse ${PULSE_FEATURE_TYPE} ${PULSE_FEATURE_PURPOSE} ${PULSE_FEATURE_DESCRIPTION})
692 find_feature(Cups ${CUPS_FEATURE_TYPE} ${CUPS_FEATURE_PURPOSE} ${CUPS_FEATURE_DESCRIPTION})
693 find_feature(PCSC ${PCSC_FEATURE_TYPE} ${PCSC_FEATURE_PURPOSE} ${PCSC_FEATURE_DESCRIPTION})
695 find_feature(FFmpeg ${FFMPEG_FEATURE_TYPE} ${FFMPEG_FEATURE_PURPOSE} ${FFMPEG_FEATURE_DESCRIPTION})
697 find_feature(GStreamer_0_10 ${GSTREAMER_0_10_FEATURE_TYPE} ${GSTREAMER_0_10_FEATURE_PURPOSE} ${GSTREAMER_0_10_FEATURE_DESCRIPTION})
698 find_feature(GStreamer_1_0 ${GSTREAMER_1_0_FEATURE_TYPE} ${GSTREAMER_1_0_FEATURE_PURPOSE} ${GSTREAMER_1_0_FEATURE_DESCRIPTION})
700 find_feature(JPEG ${JPEG_FEATURE_TYPE} ${JPEG_FEATURE_PURPOSE} ${JPEG_FEATURE_DESCRIPTION})
701 find_feature(x264 ${X264_FEATURE_TYPE} ${X264_FEATURE_PURPOSE} ${X264_FEATURE_DESCRIPTION})
702 find_feature(OpenH264 ${OPENH264_FEATURE_TYPE} ${OPENH264_FEATURE_PURPOSE} ${OPENH264_FEATURE_DESCRIPTION})
703 find_feature(GSM ${GSM_FEATURE_TYPE} ${GSM_FEATURE_PURPOSE} ${GSM_FEATURE_DESCRIPTION})
705 if(TARGET_ARCH MATCHES "x86|x64")
707 # Intel Performance Primitives
708 find_feature(IPP ${IPP_FEATURE_TYPE} ${IPP_FEATURE_PURPOSE} ${IPP_FEATURE_DESCRIPTION})
713 add_definitions("-DWITH_OPENSSL")
717 add_definitions("-DWITH_MBEDTLS")
720 if (TARGET_ARCH MATCHES "sparc")
721 set(HAVE_ALIGNED_REQUIRED 1)
724 # Path to put FreeRDP data
725 set(FREERDP_DATA_PATH "${CMAKE_INSTALL_PREFIX}/share/freerdp${FREERDP_VERSION_MAJOR}")
727 # Path to put plugins
729 set(FREERDP_LIBRARY_PATH "${CMAKE_INSTALL_LIBDIR}")
731 set(FREERDP_PLUGIN_PATH "${CMAKE_INSTALL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}")
732 set(FREERDP_ADDIN_PATH "${FREERDP_PLUGIN_PATH}")
734 # Path to put extensions
735 set(FREERDP_EXTENSION_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}/extensions")
737 # Include directories
738 include_directories(${CMAKE_CURRENT_BINARY_DIR})
739 include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
740 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
743 add_definitions("-DHAVE_CONFIG_H")
744 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
746 # RPATH configuration
748 set(CMAKE_SKIP_RPATH FALSE)
749 set(CMAKE_SKIP_INSTALL_RPATH TRUE)
751 set(CMAKE_SKIP_BUILD_RPATH FALSE)
752 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
753 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
754 set(CMAKE_INSTALL_RPATH "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}:\$ORIGIN/..")
759 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
760 set(PROFILER_LIBRARIES
761 "${FREERDP_EXTERNAL_PROFILER_PATH}/obj/local/${ANDROID_ABI}/libandroid-ndk-profiler.a")
762 include_directories("${FREERDP_EXTERNAL_PROFILER_PATH}")
771 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFREERDP_TEST_EXPORTS")
776 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
778 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Testing")
783 include_directories("${CMAKE_SOURCE_DIR}/winpr/include")
784 include_directories("${CMAKE_BINARY_DIR}/winpr/include")
786 if (${CMAKE_VERSION} VERSION_LESS 2.8.12)
787 set(PUBLIC_KEYWORD "")
788 set(PRIVATE_KEYWORD "")
790 set(PUBLIC_KEYWORD "PUBLIC")
791 set(PRIVATE_KEYWORD "PRIVATE")
794 add_subdirectory(winpr)
799 add_subdirectory(third-party)
800 if (NOT "${THIRD_PARTY_INCLUDES}" STREQUAL "")
801 include_directories(${THIRD_PARTY_INCLUDES})
805 add_subdirectory(include)
807 add_subdirectory(libfreerdp)
810 set(CMAKE_OSX_DEPLOYMENT_TARGET "")
811 if (IOS_PLATFORM MATCHES "SIMULATOR")
812 set(CMAKE_OSX_SYSROOT "iphonesimulator")
814 set(CMAKE_OSX_SYSROOT "iphoneos")
819 include_directories("${CMAKE_SOURCE_DIR}/rdtk/include")
820 include_directories("${CMAKE_BINARY_DIR}/rdtk/include")
822 add_subdirectory(rdtk)
825 add_subdirectory(uwac)
829 if(IS_DIRECTORY /usr/local/include)
830 include_directories(/usr/local/include)
831 link_directories(/usr/local/lib)
834 if(IS_DIRECTORY /usr/X11R6/include)
835 include_directories(/usr/X11R6/include)
841 add_subdirectory(channels)
844 if(WITH_CLIENT_COMMON OR WITH_CLIENT)
845 add_subdirectory(client)
849 add_subdirectory(server)
854 set(CMAKE_CPACK_INCLUDE_FILE "CMakeCPack.cmake")
856 if(NOT (VENDOR MATCHES "FreeRDP"))
857 if(DEFINED CLIENT_VENDOR_PATH)
858 if(EXISTS "${CMAKE_SOURCE_DIR}/${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
859 set(CMAKE_CPACK_INCLUDE_FILE "${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
864 #message("VENDOR: ${VENDOR} CLIENT_VENDOR_PATH: ${CLIENT_VENDOR_PATH} CMAKE_CPACK_INCLUDE_FILE: ${CMAKE_CPACK_INCLUDE_FILE}")
866 include(${CMAKE_CPACK_INCLUDE_FILE})
868 set(FREERDP_BUILD_CONFIG_LIST "")
869 GET_CMAKE_PROPERTY(res VARIABLES)
871 IF (var MATCHES "^WITH_*|^BUILD_TESTING|^STATIC_CHANNELS|^HAVE_*")
872 LIST(APPEND FREERDP_BUILD_CONFIG_LIST "${var}=${${var}}")
875 string(REPLACE ";" " " FREERDP_BUILD_CONFIG "${FREERDP_BUILD_CONFIG_LIST}")
876 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/buildflags.h.in ${CMAKE_CURRENT_BINARY_DIR}/buildflags.h)