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
58 include(CheckIncludeFiles)
59 include(CheckLibraryExists)
60 include(CheckSymbolExists)
61 include(CheckStructHasMember)
62 include(FindPkgConfig)
63 include(TestBigEndian)
66 include(ConfigOptions)
67 include(ComplexLibrary)
68 include(FeatureSummary)
69 include(CheckCCompilerFlag)
70 include(CheckCXXCompilerFlag)
71 include(GNUInstallDirsWrapper)
72 include(CMakePackageConfigHelpers)
73 include(InstallFreeRDPMan)
74 include(GetGitRevisionDescription)
75 include(SetFreeRDPCMakeInstallDir)
79 if ($ENV{BUILD_NUMBER})
80 set(BUILD_NUMBER $ENV{BUILD_NUMBER})
82 set(WITH_LIBRARY_VERSIONING "ON")
84 set(RAW_VERSION_STRING "2.3.0")
85 if(EXISTS "${CMAKE_SOURCE_DIR}/.source_tag")
86 file(READ ${CMAKE_SOURCE_DIR}/.source_tag RAW_VERSION_STRING)
87 elseif(USE_VERSION_FROM_GIT_TAG)
88 git_get_exact_tag(_GIT_TAG --tags --always)
89 if (NOT ${_GIT_TAG} STREQUAL "n/a")
90 set(RAW_VERSION_STRING ${_GIT_TAG})
93 string(STRIP ${RAW_VERSION_STRING} RAW_VERSION_STRING)
95 set(VERSION_REGEX "^.?([0-9]+)\\.([0-9]+)\\.([0-9]+)-?(.*)")
96 string(REGEX REPLACE "${VERSION_REGEX}" "\\1" FREERDP_VERSION_MAJOR "${RAW_VERSION_STRING}")
97 string(REGEX REPLACE "${VERSION_REGEX}" "\\2" FREERDP_VERSION_MINOR "${RAW_VERSION_STRING}")
98 string(REGEX REPLACE "${VERSION_REGEX}" "\\3" FREERDP_VERSION_REVISION "${RAW_VERSION_STRING}")
99 string(REGEX REPLACE "${VERSION_REGEX}" "\\4" FREERDP_VERSION_SUFFIX "${RAW_VERSION_STRING}")
101 set(FREERDP_API_VERSION "${FREERDP_VERSION_MAJOR}")
102 set(FREERDP_VERSION "${FREERDP_VERSION_MAJOR}.${FREERDP_VERSION_MINOR}.${FREERDP_VERSION_REVISION}")
103 if (FREERDP_VERSION_SUFFIX)
104 set(FREERDP_VERSION_FULL "${FREERDP_VERSION}-${FREERDP_VERSION_SUFFIX}")
106 set(FREERDP_VERSION_FULL "${FREERDP_VERSION}")
108 message("FREERDP_VERSION=${FREERDP_VERSION_FULL}")
110 set(FREERDP_INCLUDE_DIR "include/freerdp${FREERDP_VERSION_MAJOR}/")
112 # Compatibility options
113 if(DEFINED STATIC_CHANNELS)
114 message(WARNING "STATIC_CHANNELS is obsolete, please use BUILTIN_CHANNELS instead")
115 set(BUILTIN_CHANNELS ${STATIC_CHANNELS} CACHE BOOL "" FORCE)
118 # Make paths absolute
119 if (CMAKE_INSTALL_PREFIX)
120 get_filename_component(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" ABSOLUTE)
122 if (FREERDP_EXTERNAL_PATH)
123 get_filename_component (FREERDP_EXTERNAL_PATH "${FREERDP_EXTERNAL_PATH}" ABSOLUTE)
126 # Allow to search the host machine for git/ccache
127 if(CMAKE_CROSSCOMPILING)
128 SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
129 endif(CMAKE_CROSSCOMPILING)
131 find_program(CCACHE ccache)
132 if(CCACHE AND WITH_CCACHE)
133 if(CMAKE_VERSION VERSION_GREATER 3.3.2)
134 if(NOT DEFINED CMAKE_C_COMPILER_LAUNCHER)
135 SET(CMAKE_C_COMPILER_LAUNCHER ${CCACHE})
136 endif(NOT DEFINED CMAKE_C_COMPILER_LAUNCHER)
137 if(NOT DEFINED CMAKE_CXX_COMPILER_LAUNCHER)
138 SET(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE})
139 endif(NOT DEFINED CMAKE_CXX_COMPILER_LAUNCHER)
141 set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE})
142 set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE})
144 endif(CCACHE AND WITH_CCACHE)
146 if(EXISTS "${CMAKE_SOURCE_DIR}/.source_version" )
147 file(READ ${CMAKE_SOURCE_DIR}/.source_version GIT_REVISION)
149 string(STRIP ${GIT_REVISION} GIT_REVISION)
151 git_get_exact_tag(GIT_REVISION --tags --always)
153 if (${GIT_REVISION} STREQUAL "n/a")
154 git_rev_parse (GIT_REVISION --short)
158 if(CMAKE_CROSSCOMPILING)
159 SET (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
160 endif(CMAKE_CROSSCOMPILING)
161 # /Allow to search the host machine for git/ccache
163 message(STATUS "Git Revision ${GIT_REVISION}")
165 # Turn on solution folders (2.8.4+)
166 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
168 # Default to release build type
169 if(NOT CMAKE_BUILD_TYPE)
170 set(CMAKE_BUILD_TYPE "Release")
173 if(NOT DEFINED BUILD_SHARED_LIBS)
175 set(BUILD_SHARED_LIBS OFF)
177 set(BUILD_SHARED_LIBS ON)
182 set(EXPORT_ALL_SYMBOLS TRUE)
183 elseif(NOT DEFINED EXPORT_ALL_SYMBOLS)
184 set(EXPORT_ALL_SYMBOLS FALSE)
187 if (EXPORT_ALL_SYMBOLS)
188 # set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
189 add_definitions(-DFREERDP_TEST_EXPORTS -DBUILD_TESTING)
190 endif(EXPORT_ALL_SYMBOLS)
193 if(${CMAKE_SYSTEM_NAME} MATCHES "BSD")
195 if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
198 if(${CMAKE_SYSTEM_NAME} MATCHES "kFreeBSD")
201 if(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
206 if(${CMAKE_SYSTEM_NAME} MATCHES "DragonFly")
212 find_path(EPOLLSHIM_INCLUDE_DIR NAMES sys/epoll.h sys/timerfd.h HINTS /usr/local/include/libepoll-shim)
213 find_library(EPOLLSHIM_LIBS NAMES epoll-shim libepoll-shim HINTS /usr/local/lib)
216 # Configure MSVC Runtime
219 if(NOT DEFINED MSVC_RUNTIME)
220 set(MSVC_RUNTIME "dynamic")
222 if(MSVC_RUNTIME STREQUAL "static")
223 if(BUILD_SHARED_LIBS)
224 message(FATAL_ERROR "Static CRT is only supported in a fully static build")
226 message(STATUS "Use the MSVC static runtime option carefully!")
227 message(STATUS "OpenSSL uses /MD by default, and is very picky")
228 message(STATUS "Random freeing errors are a common sign of runtime issues")
230 configure_msvc_runtime()
232 if(NOT DEFINED CMAKE_SUPPRESS_REGENERATION)
233 set(CMAKE_SUPPRESS_REGENERATION ON)
237 # Enable 64bit file support on linux and FreeBSD.
238 if("${CMAKE_SYSTEM_NAME}" MATCHES "Linux" OR FREEBSD)
239 add_definitions("-D_FILE_OFFSET_BITS=64")
242 # Use Standard conforming getpwnam_r() on Solaris.
243 if("${CMAKE_SYSTEM_NAME}" MATCHES "SunOS")
244 add_definitions("-D_POSIX_PTHREAD_SEMANTICS")
247 # Compiler-specific flags
248 if(CMAKE_COMPILER_IS_GNUCC)
249 if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "i686")
250 CHECK_SYMBOL_EXISTS(__x86_64__ "" IS_X86_64)
252 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
254 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686")
257 if(CMAKE_POSITION_INDEPENDENT_CODE)
258 if(${CMAKE_VERSION} VERSION_LESS 2.8.9)
259 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
264 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
266 CHECK_C_COMPILER_FLAG (-Wno-unused-result Wno-unused-result)
267 if(Wno-unused-result)
268 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-result")
270 CHECK_C_COMPILER_FLAG (-Wno-unused-but-set-variable Wno-unused-but-set-variable)
271 if(Wno-unused-but-set-variable)
272 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-but-set-variable")
274 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
275 if(Wno-deprecated-declarations)
276 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
278 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
279 if(Wno-deprecated-declarationsCXX)
280 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
283 if(NOT EXPORT_ALL_SYMBOLS)
284 message(STATUS "GCC default symbol visibility: hidden")
285 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
288 CHECK_C_COMPILER_FLAG(-Wno-format Wno-format)
290 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format")
293 CHECK_C_COMPILER_FLAG (-Wimplicit-function-declaration Wimplicit-function-declaration)
294 if(Wimplicit-function-declaration)
295 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wimplicit-function-declaration")
299 CHECK_C_COMPILER_FLAG (-Wredundant-decls Wredundant-decls)
301 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
304 if(CMAKE_BUILD_TYPE STREQUAL "Release")
305 add_definitions(-DNDEBUG)
307 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
308 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
312 # When building with Unix Makefiles and doing any release builds
313 # try to set __FILE__ to relative paths via a make specific macro
314 if (CMAKE_GENERATOR MATCHES "Unix Makefile*")
315 if(CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
316 string(TOUPPER ${CMAKE_BUILD_TYPE} UPPER_BUILD_TYPE)
317 CHECK_C_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefined)
318 if(Wno-builtin-macro-redefined)
319 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 $<)))\"'")
322 CHECK_CXX_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefinedCXX)
323 if(Wno-builtin-macro-redefinedCXX)
324 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 $<)))\"'")
329 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
330 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
331 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-macros -Wno-padded")
332 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-c11-extensions -Wno-gnu")
333 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-command-line-argument")
334 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
335 if(Wno-deprecated-declarations)
336 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
338 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
339 if(Wno-deprecated-declarationsCXX)
340 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
344 set(THREAD_PREFER_PTHREAD_FLAG TRUE)
347 find_package(Threads REQUIRED)
351 CHECK_SYMBOL_EXISTS(pthread_mutex_timedlock pthread.h HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
352 if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
353 CHECK_LIBRARY_EXISTS(pthread pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
354 endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
355 if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
356 CHECK_LIBRARY_EXISTS(pthreads pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
357 endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
359 if (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
360 set(HAVE_PTHREAD_MUTEX_TIMEDLOCK ON)
361 endif (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
364 # Enable address sanitizer, where supported and when required
365 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCC)
366 CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
368 if (fno-omit-frame-pointer)
369 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
372 set(CMAKE_REQUIRED_LINK_OPTIONS_SAVED ${CMAKE_REQUIRED_LINK_OPTIONS})
373 file(WRITE ${CMAKE_BINARY_DIR}/foo.txt "")
374 if(WITH_SANITIZE_ADDRESS)
375 list(APPEND CMAKE_REQUIRED_LINK_OPTIONS "-fsanitize=address")
376 CHECK_C_COMPILER_FLAG ("-fsanitize=address" fsanitize-address)
377 CHECK_C_COMPILER_FLAG ("-fsanitize-blacklist=${CMAKE_BINARY_DIR}/foo.txt" fsanitize-blacklist)
378 CHECK_C_COMPILER_FLAG ("-fsanitize-address-use-after-scope" fsanitize-address-use-after-scope)
380 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
381 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=address")
382 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
384 if(fsanitize-blacklist)
385 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/scripts/blacklist-address-sanitizer.txt")
386 endif(fsanitize-blacklist)
388 if(fsanitize-address-use-after-scope)
389 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-address-use-after-scope")
390 endif(fsanitize-address-use-after-scope)
391 elseif(WITH_SANITIZE_MEMORY)
392 list(APPEND CMAKE_REQUIRED_LINK_OPTIONS "-fsanitize=memory")
393 CHECK_C_COMPILER_FLAG ("-fsanitize=memory" fsanitize-memory)
394 CHECK_C_COMPILER_FLAG ("-fsanitize-blacklist=${CMAKE_BINARY_DIR}/foo.txt" fsanitize-blacklist)
395 CHECK_C_COMPILER_FLAG ("-fsanitize-memory-use-after-dtor" fsanitize-memory-use-after-dtor)
396 CHECK_C_COMPILER_FLAG ("-fsanitize-memory-track-origins" fsanitize-memory-track-origins)
398 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=memory")
399 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=memory")
400 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=memory")
402 if(fsanitize-blacklist)
403 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/scripts/blacklist-memory-sanitizer.txt")
404 endif(fsanitize-blacklist)
406 if (fsanitize-memory-use-after-dtor)
407 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-memory-use-after-dtor")
408 endif(fsanitize-memory-use-after-dtor)
410 if (fsanitize-memory-track-origins)
411 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-memory-track-origins")
412 endif(fsanitize-memory-track-origins)
413 elseif(WITH_SANITIZE_THREAD)
414 list(APPEND CMAKE_REQUIRED_LINK_OPTIONS "-fsanitize=thread")
415 CHECK_C_COMPILER_FLAG ("-fsanitize=thread" fsanitize-thread)
416 CHECK_C_COMPILER_FLAG ("-fsanitize-blacklist=${CMAKE_BINARY_DIR}/foo.txt" fsanitize-blacklist)
418 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=thread")
419 if(fsanitize-blacklist)
420 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/scripts/blacklist-thread-sanitizer.txt")
421 endif(fsanitize-blacklist)
422 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=thread")
423 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=thread")
426 file(REMOVE ${CMAKE_BINARY_DIR}/foo.txt)
427 set(CMAKE_REQUIRED_LINK_OPTIONS ${CMAKE_REQUIRED_LINK_OPTIONS_SAVED})
429 if (WITH_NO_UNDEFINED)
430 CHECK_C_COMPILER_FLAG (-Wl,--no-undefined no-undefined)
433 SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--no-undefined" )
434 SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined" )
440 # Remove previous warning definitions,
441 # NMake is otherwise complaining.
442 foreach (flags_var_to_scrub
445 CMAKE_CXX_FLAGS_RELEASE
446 CMAKE_CXX_FLAGS_RELWITHDEBINFO
447 CMAKE_CXX_FLAGS_MINSIZEREL
448 CMAKE_C_FLAGS_RELEASE
449 CMAKE_C_FLAGS_RELWITHDEBINFO
450 CMAKE_C_FLAGS_MINSIZEREL)
451 string (REGEX REPLACE "(^| )[/-]W[ ]*[1-9]" " "
452 "${flags_var_to_scrub}" "${${flags_var_to_scrub}}")
455 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gd")
456 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
458 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
459 add_definitions(-D_AMD64_)
461 add_definitions(-D_X86_)
464 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
465 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})
467 if(CMAKE_BUILD_TYPE STREQUAL "Release")
469 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Zi")
470 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi")
476 add_definitions(-DUNICODE -D_UNICODE)
477 add_definitions(-D_CRT_SECURE_NO_WARNINGS)
478 add_definitions(-DWIN32_LEAN_AND_MEAN)
479 add_definitions(-D_WINSOCK_DEPRECATED_NO_WARNINGS)
481 set(CMAKE_USE_RELATIVE_PATH ON)
482 if (${CMAKE_GENERATOR} MATCHES "NMake Makefile*" OR ${CMAKE_GENERATOR} MATCHES "Ninja*" OR ${CMAKE_GENERATOR} MATCHES "Unix Makefiles")
483 set(CMAKE_PDB_BINARY_DIR ${CMAKE_BINARY_DIR})
484 elseif (${CMAKE_GENERATOR} MATCHES "Visual Studio*")
485 set(CMAKE_PDB_BINARY_DIR "${CMAKE_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
487 message(FATAL_ERROR "Unknown generator ${CMAKE_GENERATOR}")
490 string(TIMESTAMP RC_VERSION_YEAR "%Y")
492 if(NOT DEFINED CMAKE_WINDOWS_VERSION)
493 set(CMAKE_WINDOWS_VERSION "WIN7")
496 if(CMAKE_WINDOWS_VERSION STREQUAL "WINXP")
497 add_definitions(-DWINVER=0x0501 -D_WIN32_WINNT=0x0501)
498 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN7")
499 add_definitions(-DWINVER=0x0601 -D_WIN32_WINNT=0x0601)
500 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN8")
501 add_definitions(-DWINVER=0x0602 -D_WIN32_WINNT=0x0602)
502 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN10")
503 add_definitions(-DWINVER=0x0A00 -D_WIN32_WINNT=0x0A00)
506 # Set product and vendor for dll and exe version information.
507 set(RC_VERSION_VENDOR ${VENDOR})
508 set(RC_VERSION_PRODUCT ${PRODUCT})
509 set(RC_VERSION_PATCH ${BUILD_NUMBER})
510 set(RC_VERSION_DESCRIPTION "${FREERDP_VERSION_FULL} ${GIT_REVISION} ${CMAKE_WINDOWS_VERSION} ${CMAKE_SYSTEM_PROCESSOR}")
512 if (FREERDP_EXTERNAL_SSL_PATH)
513 set(OPENSSL_ROOT_DIR ${FREERDP_EXTERNAL_SSL_PATH})
518 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_IOS_SDK_ROOT} -g")
521 add_definitions(-DWINPR_EXPORTS -DFREERDP_EXPORTS)
525 check_include_files(fcntl.h HAVE_FCNTL_H)
526 check_include_files(unistd.h HAVE_UNISTD_H)
527 check_include_files(execinfo.h HAVE_EXECINFO_H)
528 check_include_files(inttypes.h HAVE_INTTYPES_H)
529 check_include_files(sys/modem.h HAVE_SYS_MODEM_H)
530 check_include_files(sys/filio.h HAVE_SYS_FILIO_H)
531 check_include_files(sys/sockio.h HAVE_SYS_SOCKIO_H)
532 check_include_files(sys/strtio.h HAVE_SYS_STRTIO_H)
533 check_include_files(sys/select.h HAVE_SYS_SELECT_H)
534 check_include_files(syslog.h HAVE_SYSLOG_H)
538 set(HAVE_INTTYPES_H 1)
539 set(HAVE_SYS_FILIO_H 1)
543 check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
545 set(HAVE_TM_GMTOFF 1)
551 if (NOT FREERDP_IOS_EXTERNAL_SSL_PATH)
552 message(STATUS "FREERDP_IOS_EXTERNAL_SSL_PATH not set! Required if openssl is not found in the iOS SDK (which usually isn't")
554 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_IOS_EXTERNAL_SSL_PATH})
555 set_property(GLOBAL PROPERTY XCODE_ATTRIBUTE_SKIP_INSTALL YES)
557 if(NOT DEFINED CMAKE_OSX_ARCHITECTURES)
558 set(CMAKE_OSX_ARCHITECTURES i386 x86_64)
562 # Temporarily disabled, causes the cmake script to be reexecuted, causing the compilation to fail.
563 # Workaround: specify the parameter in the command-line
565 # set(CMAKE_C_COMPILER "clang")
569 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -v")
570 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v")
576 set(WITH_MANPAGES "ON")
578 set(WITH_PULSE "OFF")
580 set(WITH_WAYLAND "OFF")
585 set(WITH_LIBRARY_VERSIONING "OFF")
587 set_property( GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ${ANDROID_LIBRARY_USE_LIB64_PATHS} )
589 if (${ANDROID_ABI} STREQUAL "armeabi")
593 if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
594 add_definitions(-DNDK_DEBUG=1)
596 # NOTE: Manually add -gdwarf-3, as newer toolchains default to -gdwarf-4,
597 # which is not supported by the gdbserver binary shipped with
598 # the android NDK (tested with r9b)
599 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG} -gdwarf-3")
601 set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -llog")
603 if (NOT FREERDP_EXTERNAL_PATH)
604 if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/")
605 set (FREERDP_EXTERNAL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/")
607 message(STATUS "FREERDP_EXTERNAL_PATH not set!")
611 list (APPEND CMAKE_INCLUDE_PATH ${FREERDP_EXTERNAL_PATH}/${ANDROID_ABI}/include)
612 list (APPEND CMAKE_LIBRARY_PATH ${FREERDP_EXTERNAL_PATH}/${ANDROID_ABI}/ )
613 set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH )
614 set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH )
617 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/gprof_generate.sh.cmake
618 ${CMAKE_BINARY_DIR}/scripts/gprof_generate.sh @ONLY)
622 if(WITH_VALGRIND_MEMCHECK)
623 check_include_files(valgrind/memcheck.h HAVE_VALGRIND_MEMCHECK_H)
625 unset(HAVE_VALGRIND_MEMCHECK_H CACHE)
629 check_include_files(aio.h HAVE_AIO_H)
630 check_include_files(sys/eventfd.h HAVE_SYS_EVENTFD_H)
631 if (HAVE_SYS_EVENTFD_H)
632 check_symbol_exists(eventfd_read sys/eventfd.h WITH_EVENTFD_READ_WRITE)
635 list(APPEND CMAKE_REQUIRED_INCLUDES ${EPOLLSHIM_INCLUDE_DIR})
637 check_include_files(sys/timerfd.h HAVE_SYS_TIMERFD_H)
639 list(REMOVE_ITEM CMAKE_REQUIRED_INCLUDES ${EPOLLSHIM_INCLUDE_DIR})
641 check_include_files(poll.h HAVE_POLL_H)
642 list(APPEND CMAKE_REQUIRED_LIBRARIES m)
643 check_symbol_exists(ceill math.h HAVE_MATH_C99_LONG_DOUBLE)
644 list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES m)
645 set(X11_FEATURE_TYPE "RECOMMENDED")
646 set(WAYLAND_FEATURE_TYPE "RECOMMENDED")
648 include(CheckFunctionExists)
650 check_function_exists(getlogin_r HAVE_GETLOGIN_R)
652 set(X11_FEATURE_TYPE "DISABLED")
653 set(WAYLAND_FEATURE_TYPE "DISABLED")
657 find_package(PCSCWinPR)
660 set(X11_FEATURE_PURPOSE "X11")
661 set(X11_FEATURE_DESCRIPTION "X11 client and server")
663 set(WAYLAND_FEATURE_PURPOSE "Wayland")
664 set(WAYLAND_FEATURE_DESCRIPTION "Wayland client")
666 set(ZLIB_FEATURE_TYPE "REQUIRED")
667 set(ZLIB_FEATURE_PURPOSE "compression")
668 set(ZLIB_FEATURE_DESCRIPTION "data compression")
670 set(OPENSSL_FEATURE_TYPE "REQUIRED")
671 set(OPENSSL_FEATURE_PURPOSE "cryptography")
672 set(OPENSSL_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
674 set(MBEDTLS_FEATURE_TYPE "OPTIONAL")
675 set(MBEDTLS_FEATURE_PURPOSE "cryptography")
676 set(MBEDTLS_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
678 set(OPENSLES_FEATURE_TYPE "OPTIONAL")
679 set(OPENSLES_FEATURE_PURPOSE "multimedia")
680 set(OPENSLES_FEATURE_DESCRIPTION "OpenSLES audio / video")
682 set(OSS_FEATURE_TYPE "RECOMMENDED")
683 set(OSS_FEATURE_PURPOSE "sound")
684 set(OSS_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
686 set(ALSA_FEATURE_TYPE "RECOMMENDED")
687 set(ALSA_FEATURE_PURPOSE "sound")
688 set(ALSA_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
690 set(PULSE_FEATURE_TYPE "RECOMMENDED")
691 set(PULSE_FEATURE_PURPOSE "sound")
692 set(PULSE_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
694 set(CUPS_FEATURE_TYPE "RECOMMENDED")
695 set(CUPS_FEATURE_PURPOSE "printing")
696 set(CUPS_FEATURE_DESCRIPTION "printer device redirection")
698 set(PCSC_FEATURE_TYPE "RECOMMENDED")
699 set(PCSC_FEATURE_PURPOSE "smart card")
700 set(PCSC_FEATURE_DESCRIPTION "smart card device redirection")
702 set(FFMPEG_FEATURE_TYPE "RECOMMENDED")
703 set(FFMPEG_FEATURE_PURPOSE "multimedia")
704 set(FFMPEG_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
706 set(VAAPI_FEATURE_TYPE "OPTIONAL")
707 set(VAAPI_FEATURE_PURPOSE "multimedia")
708 set(VAAPI_FEATURE_DESCRIPTION "VA-API hardware acceleration for video playback")
710 set(IPP_FEATURE_TYPE "OPTIONAL")
711 set(IPP_FEATURE_PURPOSE "performance")
712 set(IPP_FEATURE_DESCRIPTION "Intel Integrated Performance Primitives library")
714 set(JPEG_FEATURE_TYPE "OPTIONAL")
715 set(JPEG_FEATURE_PURPOSE "codec")
716 set(JPEG_FEATURE_DESCRIPTION "use JPEG library")
718 set(X264_FEATURE_TYPE "OPTIONAL")
719 set(X264_FEATURE_PURPOSE "codec")
720 set(X264_FEATURE_DESCRIPTION "use x264 library")
722 set(OPENH264_FEATURE_TYPE "OPTIONAL")
723 set(OPENH264_FEATURE_PURPOSE "codec")
724 set(OPENH264_FEATURE_DESCRIPTION "use OpenH264 library")
726 set(OPENCL_FEATURE_TYPE "OPTIONAL")
727 set(OPENCL_FEATURE_PURPOSE "codec")
728 set(OPENCL_FEATURE_DESCRIPTION "use OpenCL library")
730 set(GSM_FEATURE_TYPE "OPTIONAL")
731 set(GSM_FEATURE_PURPOSE "codec")
732 set(GSM_FEATURE_DESCRIPTION "GSM audio codec library")
734 set(LAME_FEATURE_TYPE "OPTIONAL")
735 set(LAME_FEATURE_PURPOSE "codec")
736 set(LAME_FEATURE_DESCRIPTION "lame MP3 audio codec library")
738 set(FAAD2_FEATURE_TYPE "OPTIONAL")
739 set(FAAD2_FEATURE_PURPOSE "codec")
740 set(FAAD2_FEATURE_DESCRIPTION "FAAD2 AAC audio codec library")
742 set(FAAC_FEATURE_TYPE "OPTIONAL")
743 set(FAAC_FEATURE_PURPOSE "codec")
744 set(FAAC_FEATURE_DESCRIPTION "FAAC AAC audio codec library")
746 set(SOXR_FEATURE_TYPE "OPTIONAL")
747 set(SOXR_FEATURE_PURPOSE "codec")
748 set(SOXR_FEATURE_DESCRIPTION "SOX audio resample library")
750 set(GSSAPI_FEATURE_TYPE "OPTIONAL")
751 set(GSSAPI_FEATURE_PURPOSE "auth")
752 set(GSSAPI_FEATURE_DESCRIPTION "add kerberos support")
755 set(X11_FEATURE_TYPE "DISABLED")
756 set(WAYLAND_FEATURE_TYPE "DISABLED")
757 set(ZLIB_FEATURE_TYPE "DISABLED")
758 set(OSS_FEATURE_TYPE "DISABLED")
759 set(ALSA_FEATURE_TYPE "DISABLED")
760 set(PULSE_FEATURE_TYPE "DISABLED")
761 set(CUPS_FEATURE_TYPE "DISABLED")
762 set(PCSC_FEATURE_TYPE "DISABLED")
763 set(FFMPEG_FEATURE_TYPE "DISABLED")
764 set(VAAPI_FEATURE_TYPE "DISABLED")
765 set(OPENSLES_FEATURE_TYPE "DISABLED")
769 set(FFMPEG_FEATURE_TYPE "OPTIONAL")
770 set(VAAPI_FEATURE_TYPE "DISABLED")
771 set(X11_FEATURE_TYPE "OPTIONAL")
772 set(WAYLAND_FEATURE_TYPE "DISABLED")
773 set(OSS_FEATURE_TYPE "DISABLED")
774 set(ALSA_FEATURE_TYPE "DISABLED")
776 set(X11_FEATURE_TYPE "DISABLED")
777 set(PULSE_FEATURE_TYPE "DISABLED")
778 set(CUPS_FEATURE_TYPE "DISABLED")
779 set(PCSC_FEATURE_TYPE "DISABLED")
781 set(OPENSLES_FEATURE_TYPE "DISABLED")
784 if(UNIX AND NOT ANDROID)
785 set(WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE "RECOMMENDED")
786 set(WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE "systemd journal appender")
787 set(WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION "allows to export wLog to systemd journal")
789 #include(Findlibsystemd)
790 find_feature(libsystemd ${WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION})
793 set(HAVE_JOURNALD_H TRUE)
795 unset(HAVE_JOURNALD_H)
797 endif(UNIX AND NOT ANDROID)
800 set(X11_FEATURE_TYPE "DISABLED")
801 set(WAYLAND_FEATURE_TYPE "DISABLED")
802 set(OSS_FEATURE_TYPE "DISABLED")
803 set(ALSA_FEATURE_TYPE "DISABLED")
804 set(PULSE_FEATURE_TYPE "DISABLED")
805 set(CUPS_FEATURE_TYPE "DISABLED")
806 set(PCSC_FEATURE_TYPE "DISABLED")
807 set(FFMPEG_FEATURE_TYPE "DISABLED")
808 set(VAAPI_FEATURE_TYPE "DISABLED")
809 set(OPENSLES_FEATURE_TYPE "REQUIRED")
812 find_feature(X11 ${X11_FEATURE_TYPE} ${X11_FEATURE_PURPOSE} ${X11_FEATURE_DESCRIPTION})
813 find_feature(Wayland ${WAYLAND_FEATURE_TYPE} ${WAYLAND_FEATURE_PURPOSE} ${WAYLAND_FEATURE_DESCRIPTION})
815 find_feature(ZLIB ${ZLIB_FEATURE_TYPE} ${ZLIB_FEATURE_PURPOSE} ${ZLIB_FEATURE_DESCRIPTION})
816 find_feature(OpenSSL ${OPENSSL_FEATURE_TYPE} ${OPENSSL_FEATURE_PURPOSE} ${OPENSSL_FEATURE_DESCRIPTION})
817 find_feature(MbedTLS ${MBEDTLS_FEATURE_TYPE} ${MBEDTLS_FEATURE_PURPOSE} ${MBEDTLS_FEATURE_DESCRIPTION})
818 find_feature(OpenSLES ${OPENSLES_FEATURE_TYPE} ${OPENSLES_FEATURE_PURPOSE} ${OPENSLES_FEATURE_DESCRIPTION})
820 find_feature(OSS ${OSS_FEATURE_TYPE} ${OSS_FEATURE_PURPOSE} ${OSS_FEATURE_DESCRIPTION})
821 find_feature(ALSA ${ALSA_FEATURE_TYPE} ${ALSA_FEATURE_PURPOSE} ${ALSA_FEATURE_DESCRIPTION})
822 find_feature(Pulse ${PULSE_FEATURE_TYPE} ${PULSE_FEATURE_PURPOSE} ${PULSE_FEATURE_DESCRIPTION})
824 find_feature(Cups ${CUPS_FEATURE_TYPE} ${CUPS_FEATURE_PURPOSE} ${CUPS_FEATURE_DESCRIPTION})
825 find_feature(PCSC ${PCSC_FEATURE_TYPE} ${PCSC_FEATURE_PURPOSE} ${PCSC_FEATURE_DESCRIPTION})
827 find_feature(FFmpeg ${FFMPEG_FEATURE_TYPE} ${FFMPEG_FEATURE_PURPOSE} ${FFMPEG_FEATURE_DESCRIPTION})
829 find_feature(JPEG ${JPEG_FEATURE_TYPE} ${JPEG_FEATURE_PURPOSE} ${JPEG_FEATURE_DESCRIPTION})
830 find_feature(x264 ${X264_FEATURE_TYPE} ${X264_FEATURE_PURPOSE} ${X264_FEATURE_DESCRIPTION})
831 find_feature(OpenH264 ${OPENH264_FEATURE_TYPE} ${OPENH264_FEATURE_PURPOSE} ${OPENH264_FEATURE_DESCRIPTION})
832 find_feature(OpenCL ${OPENCL_FEATURE_TYPE} ${OPENCL_FEATURE_PURPOSE} ${OPENCL_FEATURE_DESCRIPTION})
833 find_feature(GSM ${GSM_FEATURE_TYPE} ${GSM_FEATURE_PURPOSE} ${GSM_FEATURE_DESCRIPTION})
834 find_feature(LAME ${LAME_FEATURE_TYPE} ${LAME_FEATURE_PURPOSE} ${LAME_FEATURE_DESCRIPTION})
835 find_feature(FAAD2 ${FAAD2_FEATURE_TYPE} ${FAAD2_FEATURE_PURPOSE} ${FAAD2_FEATURE_DESCRIPTION})
836 find_feature(FAAC ${FAAC_FEATURE_TYPE} ${FAAC_FEATURE_PURPOSE} ${FAAC_FEATURE_DESCRIPTION})
837 find_feature(soxr ${SOXR_FEATURE_TYPE} ${SOXR_FEATURE_PURPOSE} ${SOXR_FEATURE_DESCRIPTION})
839 find_feature(GSSAPI ${GSSAPI_FEATURE_TYPE} ${GSSAPI_FEATURE_PURPOSE} ${GSSAPI_FEATURE_DESCRIPTION})
841 if (WITH_OPENH264 AND NOT WITH_OPENH264_LOADING)
842 option(WITH_OPENH264_LOADING "Use LoadLibrary to load openh264 at runtime" OFF)
843 endif (WITH_OPENH264 AND NOT WITH_OPENH264_LOADING)
845 if ((WITH_FFMPEG OR WITH_DSP_FFMPEG) AND NOT FFMPEG_FOUND)
846 message(FATAL_ERROR "FFMPEG support requested but not detected")
848 set(WITH_FFMPEG ${FFMPEG_FOUND})
850 # Version check, if we have detected FFMPEG but the version is too old
851 # deactivate it as sound backend.
853 # Deactivate FFmpeg backend for sound, if the version is too old.
854 # See libfreerdp/codec/dsp_ffmpeg.h
855 file(STRINGS "${AVCODEC_INCLUDE_DIR}/libavcodec/version.h" AV_VERSION_FILE REGEX "LIBAVCODEC_VERSION_M[A-Z]+[\t ]*[0-9]+")
856 FOREACH(item ${AV_VERSION_FILE})
857 STRING(REGEX MATCH "LIBAVCODEC_VERSION_M[A-Z]+[\t ]*[0-9]+" litem ${item})
859 string(REGEX REPLACE "[ \t]+" ";" VSPLIT_LINE ${litem})
860 list(LENGTH VSPLIT_LINE VSPLIT_LINE_LEN)
861 if (NOT "${VSPLIT_LINE_LEN}" EQUAL "2")
862 message(ERROR "invalid entry in libavcodec version header ${item}")
863 endif(NOT "${VSPLIT_LINE_LEN}" EQUAL "2")
864 list(GET VSPLIT_LINE 0 VNAME)
865 list(GET VSPLIT_LINE 1 VVALUE)
866 set(${VNAME} ${VVALUE})
868 ENDFOREACH(item ${AV_VERSION_FILE})
870 set(AVCODEC_VERSION "${LIBAVCODEC_VERSION_MAJOR}.${LIBAVCODEC_VERSION_MINOR}.${LIBAVCODEC_VERSION_MICRO}")
871 if (AVCODEC_VERSION VERSION_LESS "57.48.101")
872 message(WARNING "FFmpeg version detected (${AVCODEC_VERSION}) is too old. (Require at least 57.48.101 for sound). Deactivating")
873 set(WITH_DSP_FFMPEG OFF)
875 endif (WITH_DSP_FFMPEG)
877 if (WITH_OPENH264 AND NOT OPENH264_FOUND)
878 message(FATAL_ERROR "OpenH264 support requested but not detected")
880 set(WITH_OPENH264 ${OPENH264_FOUND})
882 if ( (WITH_GSSAPI) AND (NOT GSS_FOUND))
883 message(WARNING "-DWITH_GSSAPI=ON is set, but not GSSAPI implementation was found, disabling")
885 if(GSS_FLAVOUR STREQUAL "MIT")
886 add_definitions("-DWITH_GSSAPI -DWITH_GSSAPI_MIT")
888 add_definitions("-DHAVE_AT_LEAST_KRB_V1_13")
890 include_directories(${_GSS_INCLUDE_DIR})
891 elseif(GSS_FLAVOUR STREQUAL "Heimdal")
892 add_definitions("-DWITH_GSSAPI -DWITH_GSSAPI_HEIMDAL")
893 include_directories(${_GSS_INCLUDE_DIR})
895 message(WARNING "Kerberos version not detected")
899 if(TARGET_ARCH MATCHES "x86|x64")
901 # Intel Performance Primitives
902 find_feature(IPP ${IPP_FEATURE_TYPE} ${IPP_FEATURE_PURPOSE} ${IPP_FEATURE_DESCRIPTION})
907 add_definitions("-DWITH_OPENSSL")
908 message(STATUS "Using OpenSSL Version: ${OPENSSL_VERSION}")
909 include_directories(${OPENSSL_INCLUDE_DIR})
913 add_definitions("-DWITH_MBEDTLS")
916 if (WITH_X264 OR WITH_OPENH264 OR WITH_MEDIA_FOUNDATION OR WITH_FFMPEG)
917 set(WITH_GFX_H264 ON)
919 set(WITH_GFX_H264 OFF)
922 # Android expects all libraries to be loadable
924 if (ANDROID OR WIN32 OR MAC_BUNDLE)
925 set(FREERDP_DATA_PATH "share")
926 if (NOT FREERDP_INSTALL_PREFIX)
927 set(FREERDP_INSTALL_PREFIX ".")
929 set(FREERDP_LIBRARY_PATH ".")
930 set(FREERDP_PLUGIN_PATH ".")
932 set(FREERDP_DATA_PATH "${CMAKE_INSTALL_PREFIX}/share/freerdp${FREERDP_VERSION_MAJOR}")
933 if (NOT FREERDP_INSTALL_PREFIX)
934 set(FREERDP_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
936 set(FREERDP_LIBRARY_PATH "${CMAKE_INSTALL_LIBDIR}")
937 set(FREERDP_PLUGIN_PATH "${CMAKE_INSTALL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}")
939 set(FREERDP_ADDIN_PATH "${FREERDP_PLUGIN_PATH}")
941 # Path to put extensions
942 set(FREERDP_EXTENSION_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}/extensions")
945 if(NOT DEFINED PROXY_PLUGINDIR)
946 message("using default plugins location")
947 set(FREERDP_PROXY_PLUGINDIR "${CMAKE_BINARY_DIR}/server/proxy/plugins")
949 set(FREERDP_PROXY_PLUGINDIR "${PROXY_PLUGINDIR}")
952 # Declare we have config.h, generated later on.
953 add_definitions("-DHAVE_CONFIG_H")
955 # Include directories
956 include_directories(${CMAKE_CURRENT_BINARY_DIR})
957 include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
958 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
960 # RPATH configuration
961 set(CMAKE_SKIP_BUILD_RPATH FALSE)
962 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
964 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)
965 set(CMAKE_INSTALL_RPATH "@loader_path/../Frameworks")
967 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
969 set(CMAKE_INSTALL_RPATH "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}:\$ORIGIN/..")
973 if (BUILD_SHARED_LIBS)
974 set(CMAKE_MACOSX_RPATH ON)
980 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
981 set(PROFILER_LIBRARIES
982 "${FREERDP_EXTERNAL_PROFILER_PATH}/obj/local/${ANDROID_ABI}/libandroid-ndk-profiler.a")
983 include_directories("${FREERDP_EXTERNAL_PROFILER_PATH}")
995 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
997 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Testing")
1002 include_directories("${CMAKE_SOURCE_DIR}/winpr/include")
1003 include_directories("${CMAKE_BINARY_DIR}/winpr/include")
1005 if (${CMAKE_VERSION} VERSION_LESS 2.8.12)
1006 set(PUBLIC_KEYWORD "")
1007 set(PRIVATE_KEYWORD "")
1009 set(PUBLIC_KEYWORD "PUBLIC")
1010 set(PRIVATE_KEYWORD "PRIVATE")
1013 if(BUILD_SHARED_LIBS)
1014 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINPR_DLL")
1017 add_subdirectory(winpr)
1021 if(WITH_THIRD_PARTY)
1022 add_subdirectory(third-party)
1023 if (NOT "${THIRD_PARTY_INCLUDES}" STREQUAL "")
1024 include_directories(${THIRD_PARTY_INCLUDES})
1028 add_subdirectory(include)
1030 add_subdirectory(libfreerdp)
1033 set(CMAKE_OSX_DEPLOYMENT_TARGET "10.0")
1034 if (IOS_PLATFORM MATCHES "SIMULATOR")
1035 set(CMAKE_OSX_SYSROOT "iphonesimulator")
1037 set(CMAKE_OSX_SYSROOT "iphoneos")
1042 include_directories("${CMAKE_SOURCE_DIR}/rdtk/include")
1043 include_directories("${CMAKE_BINARY_DIR}/rdtk/include")
1045 add_subdirectory(rdtk)
1048 add_subdirectory(uwac)
1052 if(IS_DIRECTORY /usr/local/include)
1053 include_directories(/usr/local/include)
1054 link_directories(/usr/local/lib)
1057 if(IS_DIRECTORY /usr/X11R6/include)
1058 include_directories(/usr/X11R6/include)
1064 add_subdirectory(channels)
1067 if(WITH_CLIENT_COMMON OR WITH_CLIENT)
1068 add_subdirectory(client)
1072 add_subdirectory(server)
1075 # Configure files - Add last so all symbols are defined
1076 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
1080 set(CMAKE_CPACK_INCLUDE_FILE "CMakeCPack.cmake")
1082 if(NOT (VENDOR MATCHES "FreeRDP"))
1083 if(DEFINED CLIENT_VENDOR_PATH)
1084 if(EXISTS "${CMAKE_SOURCE_DIR}/${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
1085 set(CMAKE_CPACK_INCLUDE_FILE "${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
1090 #message("VENDOR: ${VENDOR} CLIENT_VENDOR_PATH: ${CLIENT_VENDOR_PATH} CMAKE_CPACK_INCLUDE_FILE: ${CMAKE_CPACK_INCLUDE_FILE}")
1092 include(${CMAKE_CPACK_INCLUDE_FILE})
1094 set(FREERDP_BUILD_CONFIG_LIST "")
1095 GET_CMAKE_PROPERTY(res VARIABLES)
1097 IF (var MATCHES "^WITH_*|^BUILD_TESTING|^BUILTIN_CHANNELS|^HAVE_*")
1098 LIST(APPEND FREERDP_BUILD_CONFIG_LIST "${var}=${${var}}")
1101 string(REPLACE ";" " " FREERDP_BUILD_CONFIG "${FREERDP_BUILD_CONFIG_LIST}")
1102 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/buildflags.h.in ${CMAKE_CURRENT_BINARY_DIR}/buildflags.h)