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 "1")
72 set(FREERDP_VERSION_MINOR "2")
73 set(FREERDP_VERSION_REVISION "4")
74 set(FREERDP_VERSION_SUFFIX "dev")
75 set(FREERDP_API_VERSION "${FREERDP_VERSION_MAJOR}.${FREERDP_VERSION_MINOR}")
76 set(FREERDP_VERSION "${FREERDP_API_VERSION}.${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}")
83 # Allow to search the host machine for git
85 SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
87 include(GetGitRevisionDescription)
88 git_get_exact_tag(GIT_REVISION --tags --always)
89 if (${GIT_REVISION} STREQUAL "n/a")
90 git_rev_parse(GIT_REVISION --short)
93 SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
96 message(STATUS "Git Revision ${GIT_REVISION}")
98 # Turn on solution folders (2.8.4+)
99 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
101 # Default to release build type
102 if(NOT CMAKE_BUILD_TYPE)
103 set(CMAKE_BUILD_TYPE "Release")
106 if(NOT DEFINED BUILD_SHARED_LIBS)
107 if(ANDROID OR IOS OR APPLE)
108 set(BUILD_SHARED_LIBS OFF)
110 set(BUILD_SHARED_LIBS ON)
114 if(NOT DEFINED EXPORT_ALL_SYMBOLS)
115 set(EXPORT_ALL_SYMBOLS TRUE)
119 if(${CMAKE_SYSTEM_NAME} MATCHES "BSD")
121 if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
124 if(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
129 # Configure MSVC Runtime
132 if(NOT DEFINED MSVC_RUNTIME)
133 set(MSVC_RUNTIME "dynamic")
135 if(${MSVC_RUNTIME} STREQUAL "static")
136 message(STATUS "Use the MSVC static runtime option carefully!")
137 message(STATUS "OpenSSL uses /MD by default, and is very picky")
138 message(STATUS "Random freeing errors are a common sign of runtime issues")
140 configure_msvc_runtime()
142 if(NOT DEFINED CMAKE_SUPPRESS_REGENERATION)
143 set(CMAKE_SUPPRESS_REGENERATION ON)
147 # Compiler-specific flags
148 if(CMAKE_COMPILER_IS_GNUCC)
149 if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "i686")
150 CHECK_SYMBOL_EXISTS(__x86_64__ "" IS_X86_64)
152 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
154 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686")
157 if(CMAKE_POSITION_INDEPENDENT_CODE)
158 if(${CMAKE_VERSION} VERSION_LESS 2.8.9)
159 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
164 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
166 CHECK_C_COMPILER_FLAG (-Wno-unused-result Wno-unused-result)
167 if(Wno-unused-result)
168 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-result")
170 CHECK_C_COMPILER_FLAG (-Wno-unused-but-set-variable Wno-unused-but-set-variable)
171 if(Wno-unused-but-set-variable)
172 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-but-set-variable")
174 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
175 if(Wno-deprecated-declarations)
176 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
178 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
179 if(Wno-deprecated-declarationsCXX)
180 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
183 if(NOT EXPORT_ALL_SYMBOLS)
184 message(STATUS "GCC default symbol visibility: hidden")
185 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
188 CHECK_C_COMPILER_FLAG(-Wno-format Wno-format)
190 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format")
193 CHECK_C_COMPILER_FLAG (-Wimplicit-function-declaration Wimplicit-function-declaration)
194 if(Wimplicit-function-declaration)
195 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wimplicit-function-declaration")
199 CHECK_C_COMPILER_FLAG (-Wredundant-decls Wredundant-decls)
201 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
204 if(CMAKE_BUILD_TYPE STREQUAL "Release")
205 set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG")
206 set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG")
208 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2")
209 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2")
212 CHECK_C_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefined)
213 if(Wno-builtin-macro-redefined)
214 set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Wno-builtin-macro-redefined")
215 set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -D__FILE__='\"$(subst ${CMAKE_BINARY_DIR}/,,$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<)))\"'")
218 CHECK_CXX_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefinedCXX)
219 if(Wno-builtin-macro-redefinedCXX)
220 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wno-builtin-macro-redefined")
221 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -D__FILE__='\"$(subst ${CMAKE_BINARY_DIR}/,,$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<)))\"'")
224 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
225 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
228 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2")
232 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
233 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
234 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-macros -Wno-padded")
235 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-c11-extensions -Wno-gnu")
237 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mssse3")
239 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
240 if(Wno-deprecated-declarations)
241 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
243 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
244 if(Wno-deprecated-declarationsCXX)
245 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
250 # Remove previous warning definitions,
251 # NMake is otherwise complaining.
252 foreach (flags_var_to_scrub
255 CMAKE_CXX_FLAGS_RELEASE
256 CMAKE_CXX_FLAGS_RELWITHDEBINFO
257 CMAKE_CXX_FLAGS_MINSIZEREL
258 CMAKE_C_FLAGS_RELEASE
259 CMAKE_C_FLAGS_RELWITHDEBINFO
260 CMAKE_C_FLAGS_MINSIZEREL)
261 string (REGEX REPLACE "(^| )[/-]W[ ]*[1-9]" " "
262 "${flags_var_to_scrub}" "${${flags_var_to_scrub}}")
265 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gd")
266 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
268 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
269 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_AMD64_")
271 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_X86_")
274 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
275 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})
277 if(CMAKE_BUILD_TYPE STREQUAL "Release")
279 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Zi")
280 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi")
286 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUNICODE -D_UNICODE")
287 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_SECURE_NO_WARNINGS")
288 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWIN32_LEAN_AND_MEAN")
290 # Set product and vendor for dll and exe version information.
291 set(RC_VERSION_VENDOR ${VENDOR})
292 set(RC_VERSION_PRODUCT ${PRODUCT})
293 set(RC_VERSION_PATCH ${BUILD_NUMBER})
294 set(RC_VERSION_DESCRIPTION ${GIT_REVISION})
296 string(TIMESTAMP RC_VERSION_YEAR "%Y")
298 if(NOT DEFINED CMAKE_WINDOWS_VERSION)
299 set(CMAKE_WINDOWS_VERSION "WINXP")
302 if(CMAKE_WINDOWS_VERSION STREQUAL "WINXP")
303 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0501 -DWIN32_WINNT=0x0501")
304 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0501 -DWIN32_WINNT=0x0501")
305 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN7")
306 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0601 -DWIN32_WINNT=0x0601")
307 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0601 -DWIN32_WINNT=0x0601")
308 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN8")
309 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0602 -DWIN32_WINNT=0x0602")
310 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0602 -DWIN32_WINNT=0x0602")
313 if (FREERDP_EXTERNAL_SSL_PATH)
314 set(OPENSSL_ROOT_DIR ${FREERDP_EXTERNAL_SSL_PATH})
319 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_IOS_SDK_ROOT} -g")
322 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINPR_EXPORTS -DFREERDP_EXPORTS")
323 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINPR_EXPORTS -DFREERDP_EXPORTS")
327 check_include_files(fcntl.h HAVE_FCNTL_H)
328 check_include_files(unistd.h HAVE_UNISTD_H)
329 check_include_files(execinfo.h HAVE_EXECINFO_H)
330 check_include_files(stdint.h HAVE_STDINT_H)
331 check_include_files(inttypes.h HAVE_INTTYPES_H)
332 check_include_files(sys/modem.h HAVE_SYS_MODEM_H)
333 check_include_files(sys/filio.h HAVE_SYS_FILIO_H)
334 check_include_files(sys/sockio.h HAVE_SYS_SOCKIO_H)
335 check_include_files(sys/strtio.h HAVE_SYS_STRTIO_H)
336 check_include_files(sys/select.h HAVE_SYS_SELECT_H)
341 set(HAVE_INTTYPES_H 1)
342 set(HAVE_SYS_FILIO_H 1)
346 check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
348 set(HAVE_TM_GMTOFF 1)
354 if (NOT FREERDP_IOS_EXTERNAL_SSL_PATH)
355 message(STATUS "FREERDP_IOS_EXTERNAL_SSL_PATH not set! Required if openssl is not found in the iOS SDK (which usually isn't")
357 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_IOS_EXTERNAL_SSL_PATH})
358 set_property(GLOBAL PROPERTY XCODE_ATTRIBUTE_SKIP_INSTALL YES)
360 if(NOT DEFINED CMAKE_OSX_ARCHITECTURES)
361 set(CMAKE_OSX_ARCHITECTURES i386 x86_64)
364 if(IS_DIRECTORY /opt/local/include)
365 include_directories(/opt/local/include)
366 link_directories(/opt/local/lib)
370 # Temporarily disabled, causes the cmake script to be reexecuted, causing the compilation to fail.
371 # Workaround: specify the parameter in the command-line
373 # set(CMAKE_C_COMPILER "clang")
377 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -v")
378 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v")
384 set(WITH_MANPAGES "ON")
387 set(WITH_WAYLAND "OFF")
392 set(WITH_LIBRARY_VERSIONING "OFF")
394 if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
395 add_definitions(-DNDK_DEBUG=1)
397 # NOTE: Manually add -gdwarf-3, as newer toolchains default to -gdwarf-4,
398 # which is not supported by the gdbserver binary shipped with
399 # the android NDK (tested with r9b)
400 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG} -gdwarf-3")
402 set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -llog")
404 if (NOT FREERDP_EXTERNAL_JPEG_PATH)
405 if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/jpeg8d")
406 set(FREERDP_EXTERNAL_JPEG_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/jpeg8d")
408 message(STATUS "FREERDP_EXTERNAL_SSL_PATH not set! - Needs to be set if openssl is not found in the android NDK (which usually isn't)")
411 if (NOT FREERDP_EXTERNAL_SSL_PATH)
412 if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/openssl")
413 set(FREERDP_EXTERNAL_SSL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/openssl")
415 message(STATUS "FREERDP_EXTERNAL_SSL_PATH not set! - Needs to be set if openssl is not found in the android NDK (which usually isn't)")
418 if (NOT FREERDP_EXTERNAL_PROFILER_PATH)
419 if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/android-ndk-profiler")
420 set(FREERDP_EXTERNAL_PROFILER_PATH
421 "${CMAKE_CURRENT_SOURCE_DIR}/external/android-ndk-profiler")
423 message(STATUS "FREERDP_EXTERNAL_PROFILER_PATH not set!")
428 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_EXTERNAL_SSL_PATH} ${FREERDP_EXTERNAL_JPEG_PATH})
429 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_EXTERNAL_PROFILER_PATH})
431 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/client/Android/FreeRDPCore/jni/${ANDROID_ABI})
432 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/regenerate_jni_headers.sh.cmake
433 ${CMAKE_BINARY_DIR}/scripts/regenerate_jni_headers.sh @ONLY)
435 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/gprof_generate.sh.cmake ${CMAKE_BINARY_DIR}/scripts/gprof_generate.sh @ONLY)
440 set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
442 if(NOT IOS AND NOT ANDROID)
443 find_package(Threads REQUIRED)
447 check_library_exists(pthread pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK)
450 if(WITH_VALGRIND_MEMCHECK)
451 check_include_files(valgrind/memcheck.h HAVE_VALGRIND_MEMCHECK_H)
453 unset(HAVE_VALGRIND_MEMCHECK_H CACHE)
457 check_include_files(sys/eventfd.h HAVE_AIO_H)
458 check_include_files(sys/eventfd.h HAVE_EVENTFD_H)
460 check_symbol_exists(eventfd_read sys/eventfd.h WITH_EVENTFD_READ_WRITE)
462 check_include_files(sys/timerfd.h HAVE_TIMERFD_H)
463 check_include_files(poll.h HAVE_POLL_H)
464 list(APPEND CMAKE_REQUIRED_LIBRARIES m)
465 check_symbol_exists(ceill math.h HAVE_MATH_C99_LONG_DOUBLE)
466 list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES m)
467 set(X11_FEATURE_TYPE "RECOMMENDED")
468 set(WAYLAND_FEATURE_TYPE "RECOMMENDED")
470 set(X11_FEATURE_TYPE "DISABLED")
471 set(WAYLAND_FEATURE_TYPE "DISABLED")
475 find_package(PCSCWinPR)
478 set(X11_FEATURE_PURPOSE "X11")
479 set(X11_FEATURE_DESCRIPTION "X11 client and server")
481 set(WAYLAND_FEATURE_PURPOSE "Wayland")
482 set(WAYLAND_FEATURE_DESCRIPTION "Wayland client")
484 set(DIRECTFB_FEATURE_TYPE "OPTIONAL")
485 set(DIRECTFB_FEATURE_PURPOSE "DirectFB")
486 set(DIRECTFB_FEATURE_DESCRIPTION "DirectFB client")
488 set(ZLIB_FEATURE_TYPE "REQUIRED")
489 set(ZLIB_FEATURE_PURPOSE "compression")
490 set(ZLIB_FEATURE_DESCRIPTION "data compression")
492 set(OPENSSL_FEATURE_TYPE "REQUIRED")
493 set(OPENSSL_FEATURE_PURPOSE "cryptography")
494 set(OPENSSL_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
496 set(OPENSLES_FEATURE_TYPE "OPTIONAL")
497 set(OPENSLES_FEATURE_PURPOSE "multimedia")
498 set(OPENSLES_FEATURE_DESCRIPTION "OpenSLES audio / video")
500 set(OSS_FEATURE_TYPE "RECOMMENDED")
501 set(OSS_FEATURE_PURPOSE "sound")
502 set(OSS_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
504 set(ALSA_FEATURE_TYPE "RECOMMENDED")
505 set(ALSA_FEATURE_PURPOSE "sound")
506 set(ALSA_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
508 set(PULSE_FEATURE_TYPE "OPTIONAL")
509 set(PULSE_FEATURE_PURPOSE "sound")
510 set(PULSE_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
512 set(CUPS_FEATURE_TYPE "OPTIONAL")
513 set(CUPS_FEATURE_PURPOSE "printing")
514 set(CUPS_FEATURE_DESCRIPTION "printer device redirection")
516 set(PCSC_FEATURE_TYPE "OPTIONAL")
517 set(PCSC_FEATURE_PURPOSE "smart card")
518 set(PCSC_FEATURE_DESCRIPTION "smart card device redirection")
520 set(FFMPEG_FEATURE_TYPE "RECOMMENDED")
521 set(FFMPEG_FEATURE_PURPOSE "multimedia")
522 set(FFMPEG_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
524 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
525 set(GSTREAMER_0_10_FEATURE_PURPOSE "multimedia")
526 set(GSTREAMER_0_10_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback, gstreamer 0.10 version")
528 set(GSTREAMER_1_0_FEATURE_TYPE "RECOMMENDED")
529 set(GSTREAMER_1_0_FEATURE_PURPOSE "multimedia")
530 set(GSTREAMER_1_0_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
532 set(IPP_FEATURE_TYPE "OPTIONAL")
533 set(IPP_FEATURE_PURPOSE "performance")
534 set(IPP_FEATURE_DESCRIPTION "Intel Integrated Performance Primitives library")
536 set(JPEG_FEATURE_TYPE "OPTIONAL")
537 set(JPEG_FEATURE_PURPOSE "codec")
538 set(JPEG_FEATURE_DESCRIPTION "use JPEG library")
540 set(OPENH264_FEATURE_TYPE "OPTIONAL")
541 set(OPENH264_FEATURE_PURPOSE "codec")
542 set(OPENH264_FEATURE_DESCRIPTION "use OpenH264 library")
544 set(GSM_FEATURE_TYPE "OPTIONAL")
545 set(GSM_FEATURE_PURPOSE "codec")
546 set(GSM_FEATURE_DESCRIPTION "GSM audio codec library")
549 set(X11_FEATURE_TYPE "DISABLED")
550 set(WAYLAND_FEATURE_TYPE "DISABLED")
551 set(ZLIB_FEATURE_TYPE "DISABLED")
552 set(DIRECTFB_FEATURE_TYPE "DISABLED")
553 set(OSS_FEATURE_TYPE "DISABLED")
554 set(ALSA_FEATURE_TYPE "DISABLED")
555 set(PULSE_FEATURE_TYPE "DISABLED")
556 set(CUPS_FEATURE_TYPE "DISABLED")
557 set(PCSC_FEATURE_TYPE "DISABLED")
558 set(FFMPEG_FEATURE_TYPE "DISABLED")
559 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
560 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
561 set(OPENSLES_FEATURE_TYPE "DISABLED")
565 set(DIRECTFB_FEATURE_TYPE "DISABLED")
566 set(FFMPEG_FEATURE_TYPE "OPTIONAL")
567 set(GSTREAMER_1_0_FEATURE_TYPE "OPTIONAL")
568 set(X11_FEATURE_TYPE "OPTIONAL")
569 set(WAYLAND_FEATURE_TYPE "DISABLED")
570 set(OSS_FEATURE_TYPE "DISABLED")
571 set(ALSA_FEATURE_TYPE "DISABLED")
573 set(X11_FEATURE_TYPE "DISABLED")
574 set(PULSE_FEATURE_TYPE "DISABLED")
575 set(CUPS_FEATURE_TYPE "DISABLED")
576 set(PCSC_FEATURE_TYPE "DISABLED")
577 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
578 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
580 set(OPENSLES_FEATURE_TYPE "DISABLED")
584 set(X11_FEATURE_TYPE "DISABLED")
585 set(WAYLAND_FEATURE_TYPE "DISABLED")
586 set(DIRECTFB_FEATURE_TYPE "DISABLED")
587 set(OSS_FEATURE_TYPE "DISABLED")
588 set(ALSA_FEATURE_TYPE "DISABLED")
589 set(PULSE_FEATURE_TYPE "DISABLED")
590 set(CUPS_FEATURE_TYPE "DISABLED")
591 set(PCSC_FEATURE_TYPE "DISABLED")
592 set(FFMPEG_FEATURE_TYPE "DISABLED")
593 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
594 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
595 set(OPENSLES_FEATURE_TYPE "REQUIRED")
599 find_feature(X11 ${X11_FEATURE_TYPE} ${X11_FEATURE_PURPOSE} ${X11_FEATURE_DESCRIPTION})
600 find_feature(Wayland ${WAYLAND_FEATURE_TYPE} ${WAYLAND_FEATURE_PURPOSE} ${WAYLAND_FEATURE_DESCRIPTION})
601 find_feature(DirectFB ${DIRECTFB_FEATURE_TYPE} ${DIRECTFB_FEATURE_PURPOSE} ${DIRECTFB_FEATURE_DESCRIPTION})
602 if (${WITH_DIRECTFB})
603 message(WARNING "DIRECTFB is orphaned and not maintained see docs/README.directfb for details")
606 find_feature(ZLIB ${ZLIB_FEATURE_TYPE} ${ZLIB_FEATURE_PURPOSE} ${ZLIB_FEATURE_DESCRIPTION})
607 find_feature(OpenSSL ${OPENSSL_FEATURE_TYPE} ${OPENSSL_FEATURE_PURPOSE} ${OPENSSL_FEATURE_DESCRIPTION})
608 find_feature(OpenSLES ${OPENSLES_FEATURE_TYPE} ${OPENSLES_FEATURE_PURPOSE} ${OPENSLES_FEATURE_DESCRIPTION})
610 find_feature(OSS ${OSS_FEATURE_TYPE} ${OSS_FEATURE_PURPOSE} ${OSS_FEATURE_DESCRIPTION})
611 find_feature(ALSA ${ALSA_FEATURE_TYPE} ${ALSA_FEATURE_PURPOSE} ${ALSA_FEATURE_DESCRIPTION})
612 find_feature(Pulse ${PULSE_FEATURE_TYPE} ${PULSE_FEATURE_PURPOSE} ${PULSE_FEATURE_DESCRIPTION})
614 find_feature(Cups ${CUPS_FEATURE_TYPE} ${CUPS_FEATURE_PURPOSE} ${CUPS_FEATURE_DESCRIPTION})
615 find_feature(PCSC ${PCSC_FEATURE_TYPE} ${PCSC_FEATURE_PURPOSE} ${PCSC_FEATURE_DESCRIPTION})
617 find_feature(FFmpeg ${FFMPEG_FEATURE_TYPE} ${FFMPEG_FEATURE_PURPOSE} ${FFMPEG_FEATURE_DESCRIPTION})
619 find_feature(GStreamer_0_10 ${GSTREAMER_0_10_FEATURE_TYPE} ${GSTREAMER_0_10_FEATURE_PURPOSE} ${GSTREAMER_0_10_FEATURE_DESCRIPTION})
620 find_feature(GStreamer_1_0 ${GSTREAMER_1_0_FEATURE_TYPE} ${GSTREAMER_1_0_FEATURE_PURPOSE} ${GSTREAMER_1_0_FEATURE_DESCRIPTION})
622 find_feature(JPEG ${JPEG_FEATURE_TYPE} ${JPEG_FEATURE_PURPOSE} ${JPEG_FEATURE_DESCRIPTION})
623 find_feature(OpenH264 ${OPENH264_FEATURE_TYPE} ${OPENH264_FEATURE_PURPOSE} ${OPENH264_FEATURE_DESCRIPTION})
624 find_feature(GSM ${GSM_FEATURE_TYPE} ${GSM_FEATURE_PURPOSE} ${GSM_FEATURE_DESCRIPTION})
626 if(TARGET_ARCH MATCHES "x86|x64")
628 # Intel Performance Primitives
629 find_feature(IPP ${IPP_FEATURE_TYPE} ${IPP_FEATURE_PURPOSE} ${IPP_FEATURE_DESCRIPTION})
633 if (TARGET_ARCH MATCHES "sparc")
634 set(HAVE_ALIGNED_REQUIRED 1)
637 # Path to put FreeRDP data
638 set(FREERDP_DATA_PATH "${CMAKE_INSTALL_PREFIX}/share/freerdp")
640 # Path to put plugins
642 set(FREERDP_LIBRARY_PATH "${CMAKE_INSTALL_LIBDIR}")
644 set(FREERDP_PLUGIN_PATH "${CMAKE_INSTALL_LIBDIR}/freerdp")
645 set(FREERDP_ADDIN_PATH "${FREERDP_PLUGIN_PATH}")
647 # Path to put extensions
648 set(FREERDP_EXTENSION_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/freerdp/extensions")
650 # Include directories
651 include_directories(${CMAKE_CURRENT_BINARY_DIR})
652 include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
653 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
655 if(IS_DIRECTORY /usr/local/include)
656 include_directories(/usr/local/include)
657 link_directories(/usr/local/lib)
660 if(IS_DIRECTORY /usr/X11R6/include)
661 include_directories(/usr/X11R6/include)
667 add_definitions("-DHAVE_CONFIG_H")
668 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
670 # RPATH configuration
672 set(CMAKE_SKIP_RPATH FALSE)
673 set(CMAKE_SKIP_INSTALL_RPATH TRUE)
675 set(CMAKE_SKIP_BUILD_RPATH FALSE)
676 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
677 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
678 set(CMAKE_INSTALL_RPATH "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}:\$ORIGIN/..")
683 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
684 set(PROFILER_LIBRARIES
685 "${FREERDP_EXTERNAL_PROFILER_PATH}/obj/local/${ANDROID_ABI}/libandroid-ndk-profiler.a")
686 include_directories("${FREERDP_EXTERNAL_PROFILER_PATH}")
695 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFREERDP_TEST_EXPORTS")
700 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
702 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Testing")
707 include_directories("${CMAKE_SOURCE_DIR}/winpr/include")
708 include_directories("${CMAKE_BINARY_DIR}/winpr/include")
710 add_subdirectory(winpr)
715 add_subdirectory(third-party)
716 if (NOT "${THIRD_PARTY_INCLUDES}" STREQUAL "")
717 include_directories(${THIRD_PARTY_INCLUDES})
721 add_subdirectory(include)
723 add_subdirectory(libfreerdp)
726 add_subdirectory(channels)
730 set(CMAKE_OSX_DEPLOYMENT_TARGET "")
731 if (IOS_PLATFORM MATCHES "SIMULATOR")
732 set(CMAKE_OSX_SYSROOT "iphonesimulator")
734 set(CMAKE_OSX_SYSROOT "iphoneos")
739 include_directories("${CMAKE_SOURCE_DIR}/rdtk/include")
740 include_directories("${CMAKE_BINARY_DIR}/rdtk/include")
742 add_subdirectory(rdtk)
745 add_subdirectory(client)
749 add_subdirectory(server)
754 if(${CMAKE_VERSION} VERSION_GREATER "2.8.10")
756 export(PACKAGE freerdp)
758 set(FREERDP_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/FreeRDP")
760 set(FREERDP_INCLUDE_DIR "include")
762 # keep for legacy builds
763 set(FREERDP_MONOLITHIC_BUILD OFF)
765 configure_package_config_file(FreeRDPConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfig.cmake
766 INSTALL_DESTINATION ${FREERDP_CMAKE_INSTALL_DIR}
767 PATH_VARS FREERDP_INCLUDE_DIR FREERDP_MONOLITHIC_BUILD)
769 write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfigVersion.cmake
770 VERSION ${FREERDP_VERSION} COMPATIBILITY SameMajorVersion)
772 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfigVersion.cmake
773 DESTINATION ${FREERDP_CMAKE_INSTALL_DIR})
775 install(EXPORT FreeRDPTargets DESTINATION ${FREERDP_CMAKE_INSTALL_DIR})
781 set(CMAKE_CPACK_INCLUDE_FILE "CMakeCPack.cmake")
783 if(NOT (VENDOR MATCHES "FreeRDP"))
784 if(DEFINED CLIENT_VENDOR_PATH)
785 if(EXISTS "${CMAKE_SOURCE_DIR}/${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
786 set(CMAKE_CPACK_INCLUDE_FILE "${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
791 #message("VENDOR: ${VENDOR} CLIENT_VENDOR_PATH: ${CLIENT_VENDOR_PATH} CMAKE_CPACK_INCLUDE_FILE: ${CMAKE_CPACK_INCLUDE_FILE}")
793 include(${CMAKE_CPACK_INCLUDE_FILE})
795 set(FREERDP_PC_LIBS "-lfreerdp -lfreerdp-client")
796 set(WINPR_PC_LIBS "-lwinpr")
798 set(FREERDP_PC_LIBS "${FREERDP_PC_LIBS} -lfreerdp-server")
801 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/freerdp.pc.in ${CMAKE_CURRENT_BINARY_DIR}/freerdp.pc @ONLY)
802 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/winpr.pc.in ${CMAKE_CURRENT_BINARY_DIR}/winpr.pc @ONLY)
803 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/freerdp.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
804 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/winpr.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)