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.1.2")
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 # Enable address sanitizer, where supported and when required
345 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCC)
346 set(CMAKE_REQUIRED_FLAGS_SAVED ${CMAKE_REQUIRED_FLAGS})
348 CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
350 file(WRITE ${CMAKE_BINARY_DIR}/foo.txt "")
351 if(WITH_SANITIZE_ADDRESS)
352 set(CMAKE_REQUIRED_FLAGS "-fsanitize=address")
353 CHECK_C_COMPILER_FLAG ("-fsanitize=address" fsanitize-address)
354 CHECK_C_COMPILER_FLAG ("-fsanitize-blacklist=${CMAKE_BINARY_DIR}/foo.txt" fsanitize-blacklist)
355 CHECK_C_COMPILER_FLAG ("-fsanitize-address-use-after-scope" fsanitize-address-use-after-scope)
356 unset(CMAKE_REQUIRED_FLAGS)
358 if(fsanitize-address)
359 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
360 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=address")
361 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
363 if(fsanitize-blacklist)
364 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/scripts/blacklist-address-sanitizer.txt")
365 endif(fsanitize-blacklist)
367 if(fsanitize-address-use-after-scope)
368 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-address-use-after-scope")
369 endif(fsanitize-address-use-after-scope)
371 else(fsanitize-address)
372 message(WARNING "Missing support for address sanitizer!")
373 endif(fsanitize-address)
375 if(fno-omit-frame-pointer)
376 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
378 elseif(WITH_SANITIZE_MEMORY)
379 set(CMAKE_REQUIRED_FLAGS "-fsanitize=memory")
380 CHECK_C_COMPILER_FLAG ("-fsanitize=memory" fsanitize-memory)
381 CHECK_C_COMPILER_FLAG ("-fsanitize-blacklist=${CMAKE_BINARY_DIR}/foo.txt" fsanitize-blacklist)
382 CHECK_C_COMPILER_FLAG ("-fsanitize-memory-use-after-dtor" fsanitize-memory-use-after-dtor)
383 CHECK_C_COMPILER_FLAG ("-fsanitize-memory-track-origins" fsanitize-memory-track-origins)
384 unset(CMAKE_REQUIRED_FLAGS)
387 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=memory")
388 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=memory")
389 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=memory")
391 if(fsanitize-blacklist)
392 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/scripts/blacklist-memory-sanitizer.txt")
393 endif(fsanitize-blacklist)
395 if (fsanitize-memory-use-after-dtor)
396 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-memory-use-after-dtor")
397 endif(fsanitize-memory-use-after-dtor)
399 if (fsanitize-memory-track-origins)
400 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-memory-track-origins")
401 endif(fsanitize-memory-track-origins)
403 else(fsanitize-memory)
404 message(WARNING "Missing support for memory sanitizer!")
405 endif(fsanitize-memory)
407 if(fno-omit-frame-pointer)
408 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
410 elseif(WITH_SANITIZE_THREAD)
411 CHECK_C_COMPILER_FLAG ("-fsanitize=thread" fsanitize-thread)
412 CHECK_C_COMPILER_FLAG ("-fsanitize-blacklist=${CMAKE_BINARY_DIR}/foo.txt" fsanitize-blacklist)
413 unset(CMAKE_REQUIRED_FLAGS)
415 set(CMAKE_REQUIRED_FLAGS "-Werror -fsanitize=thread")
416 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=thread")
417 if(fsanitize-blacklist)
418 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/scripts/blacklist-thread-sanitizer.txt")
419 endif(fsanitize-blacklist)
420 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=thread")
421 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=thread")
422 else(fsanitize-thread)
423 message(WARNING "Missing support for thread sanitizer!")
424 endif(fsanitize-thread)
426 if(fno-omit-frame-pointer)
427 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
431 file(REMOVE ${CMAKE_BINARY_DIR}/foo.txt)
433 if (WITH_NO_UNDEFINED)
434 set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
435 CHECK_C_COMPILER_FLAG (-Wl,--no-undefined no-undefined)
436 unset(CMAKE_REQUIRED_FLAGS)
439 SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined" )
443 set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVED})
447 # Remove previous warning definitions,
448 # NMake is otherwise complaining.
449 foreach (flags_var_to_scrub
452 CMAKE_CXX_FLAGS_RELEASE
453 CMAKE_CXX_FLAGS_RELWITHDEBINFO
454 CMAKE_CXX_FLAGS_MINSIZEREL
455 CMAKE_C_FLAGS_RELEASE
456 CMAKE_C_FLAGS_RELWITHDEBINFO
457 CMAKE_C_FLAGS_MINSIZEREL)
458 string (REGEX REPLACE "(^| )[/-]W[ ]*[1-9]" " "
459 "${flags_var_to_scrub}" "${${flags_var_to_scrub}}")
462 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gd")
463 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
465 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
466 add_definitions(-D_AMD64_)
468 add_definitions(-D_X86_)
471 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
472 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})
474 if(CMAKE_BUILD_TYPE STREQUAL "Release")
476 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Zi")
477 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi")
483 add_definitions(-DUNICODE -D_UNICODE)
484 add_definitions(-D_CRT_SECURE_NO_WARNINGS)
485 add_definitions(-DWIN32_LEAN_AND_MEAN)
486 add_definitions(-D_WINSOCK_DEPRECATED_NO_WARNINGS)
488 set(CMAKE_USE_RELATIVE_PATH ON)
489 if (${CMAKE_GENERATOR} MATCHES "NMake Makefile*" OR ${CMAKE_GENERATOR} MATCHES "Ninja*" OR ${CMAKE_GENERATOR} MATCHES "Unix Makefiles")
490 set(CMAKE_PDB_BINARY_DIR ${CMAKE_BINARY_DIR})
491 elseif (${CMAKE_GENERATOR} MATCHES "Visual Studio*")
492 set(CMAKE_PDB_BINARY_DIR "${CMAKE_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
494 message(FATAL_ERROR "Unknown generator ${CMAKE_GENERATOR}")
497 string(TIMESTAMP RC_VERSION_YEAR "%Y")
499 if(NOT DEFINED CMAKE_WINDOWS_VERSION)
500 set(CMAKE_WINDOWS_VERSION "WIN7")
503 if(CMAKE_WINDOWS_VERSION STREQUAL "WINXP")
504 add_definitions(-DWINVER=0x0501 -D_WIN32_WINNT=0x0501)
505 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN7")
506 add_definitions(-DWINVER=0x0601 -D_WIN32_WINNT=0x0601)
507 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN8")
508 add_definitions(-DWINVER=0x0602 -D_WIN32_WINNT=0x0602)
509 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN10")
510 add_definitions(-DWINVER=0x0A00 -D_WIN32_WINNT=0x0A00)
513 # Set product and vendor for dll and exe version information.
514 set(RC_VERSION_VENDOR ${VENDOR})
515 set(RC_VERSION_PRODUCT ${PRODUCT})
516 set(RC_VERSION_PATCH ${BUILD_NUMBER})
517 set(RC_VERSION_DESCRIPTION "${FREERDP_VERSION_FULL} ${GIT_REVISION} ${CMAKE_WINDOWS_VERSION} ${CMAKE_SYSTEM_PROCESSOR}")
519 if (FREERDP_EXTERNAL_SSL_PATH)
520 set(OPENSSL_ROOT_DIR ${FREERDP_EXTERNAL_SSL_PATH})
525 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_IOS_SDK_ROOT} -g")
528 add_definitions(-DWINPR_EXPORTS -DFREERDP_EXPORTS)
532 check_include_files(fcntl.h HAVE_FCNTL_H)
533 check_include_files(unistd.h HAVE_UNISTD_H)
534 check_include_files(execinfo.h HAVE_EXECINFO_H)
535 check_include_files(inttypes.h HAVE_INTTYPES_H)
536 check_include_files(sys/modem.h HAVE_SYS_MODEM_H)
537 check_include_files(sys/filio.h HAVE_SYS_FILIO_H)
538 check_include_files(sys/sockio.h HAVE_SYS_SOCKIO_H)
539 check_include_files(sys/strtio.h HAVE_SYS_STRTIO_H)
540 check_include_files(sys/select.h HAVE_SYS_SELECT_H)
541 check_include_files(syslog.h HAVE_SYSLOG_H)
545 set(HAVE_INTTYPES_H 1)
546 set(HAVE_SYS_FILIO_H 1)
550 check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
552 set(HAVE_TM_GMTOFF 1)
558 if (NOT FREERDP_IOS_EXTERNAL_SSL_PATH)
559 message(STATUS "FREERDP_IOS_EXTERNAL_SSL_PATH not set! Required if openssl is not found in the iOS SDK (which usually isn't")
561 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_IOS_EXTERNAL_SSL_PATH})
562 set_property(GLOBAL PROPERTY XCODE_ATTRIBUTE_SKIP_INSTALL YES)
564 if(NOT DEFINED CMAKE_OSX_ARCHITECTURES)
565 set(CMAKE_OSX_ARCHITECTURES i386 x86_64)
569 # Temporarily disabled, causes the cmake script to be reexecuted, causing the compilation to fail.
570 # Workaround: specify the parameter in the command-line
572 # set(CMAKE_C_COMPILER "clang")
576 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -v")
577 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v")
583 set(WITH_MANPAGES "ON")
585 set(WITH_PULSE "OFF")
587 set(WITH_WAYLAND "OFF")
592 set(WITH_LIBRARY_VERSIONING "OFF")
594 set_property( GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ${ANDROID_LIBRARY_USE_LIB64_PATHS} )
596 if (${ANDROID_ABI} STREQUAL "armeabi")
600 if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
601 add_definitions(-DNDK_DEBUG=1)
603 # NOTE: Manually add -gdwarf-3, as newer toolchains default to -gdwarf-4,
604 # which is not supported by the gdbserver binary shipped with
605 # the android NDK (tested with r9b)
606 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG} -gdwarf-3")
608 set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -llog")
610 if (NOT FREERDP_EXTERNAL_PATH)
611 if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/")
612 set (FREERDP_EXTERNAL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/")
614 message(STATUS "FREERDP_EXTERNAL_PATH not set!")
618 list (APPEND CMAKE_INCLUDE_PATH ${FREERDP_EXTERNAL_PATH}/${ANDROID_ABI}/include)
619 list (APPEND CMAKE_LIBRARY_PATH ${FREERDP_EXTERNAL_PATH}/${ANDROID_ABI}/ )
620 set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH )
621 set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH )
624 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/gprof_generate.sh.cmake
625 ${CMAKE_BINARY_DIR}/scripts/gprof_generate.sh @ONLY)
629 set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
632 find_package(Threads REQUIRED)
636 CHECK_SYMBOL_EXISTS(pthread_mutex_timedlock pthread.h HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
637 if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
638 CHECK_LIBRARY_EXISTS(pthread pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
639 endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
640 if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
641 CHECK_LIBRARY_EXISTS(pthreads pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
642 endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
644 if (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
645 set(HAVE_PTHREAD_MUTEX_TIMEDLOCK ON)
646 endif (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
649 if(WITH_VALGRIND_MEMCHECK)
650 check_include_files(valgrind/memcheck.h HAVE_VALGRIND_MEMCHECK_H)
652 unset(HAVE_VALGRIND_MEMCHECK_H CACHE)
656 check_include_files(aio.h HAVE_AIO_H)
657 check_include_files(sys/eventfd.h HAVE_SYS_EVENTFD_H)
658 if (HAVE_SYS_EVENTFD_H)
659 check_symbol_exists(eventfd_read sys/eventfd.h WITH_EVENTFD_READ_WRITE)
662 list(APPEND CMAKE_REQUIRED_INCLUDES ${EPOLLSHIM_INCLUDE_DIR})
664 check_include_files(sys/timerfd.h HAVE_SYS_TIMERFD_H)
666 list(REMOVE_ITEM CMAKE_REQUIRED_INCLUDES ${EPOLLSHIM_INCLUDE_DIR})
668 check_include_files(poll.h HAVE_POLL_H)
669 list(APPEND CMAKE_REQUIRED_LIBRARIES m)
670 check_symbol_exists(ceill math.h HAVE_MATH_C99_LONG_DOUBLE)
671 list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES m)
672 set(X11_FEATURE_TYPE "RECOMMENDED")
673 set(WAYLAND_FEATURE_TYPE "RECOMMENDED")
675 include(CheckFunctionExists)
677 check_function_exists(getlogin_r HAVE_GETLOGIN_R)
679 set(X11_FEATURE_TYPE "DISABLED")
680 set(WAYLAND_FEATURE_TYPE "DISABLED")
684 find_package(PCSCWinPR)
687 set(X11_FEATURE_PURPOSE "X11")
688 set(X11_FEATURE_DESCRIPTION "X11 client and server")
690 set(WAYLAND_FEATURE_PURPOSE "Wayland")
691 set(WAYLAND_FEATURE_DESCRIPTION "Wayland client")
693 set(ZLIB_FEATURE_TYPE "REQUIRED")
694 set(ZLIB_FEATURE_PURPOSE "compression")
695 set(ZLIB_FEATURE_DESCRIPTION "data compression")
697 set(OPENSSL_FEATURE_TYPE "REQUIRED")
698 set(OPENSSL_FEATURE_PURPOSE "cryptography")
699 set(OPENSSL_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
701 set(MBEDTLS_FEATURE_TYPE "OPTIONAL")
702 set(MBEDTLS_FEATURE_PURPOSE "cryptography")
703 set(MBEDTLS_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
705 set(OPENSLES_FEATURE_TYPE "OPTIONAL")
706 set(OPENSLES_FEATURE_PURPOSE "multimedia")
707 set(OPENSLES_FEATURE_DESCRIPTION "OpenSLES audio / video")
709 set(OSS_FEATURE_TYPE "RECOMMENDED")
710 set(OSS_FEATURE_PURPOSE "sound")
711 set(OSS_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
713 set(ALSA_FEATURE_TYPE "RECOMMENDED")
714 set(ALSA_FEATURE_PURPOSE "sound")
715 set(ALSA_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
717 set(PULSE_FEATURE_TYPE "RECOMMENDED")
718 set(PULSE_FEATURE_PURPOSE "sound")
719 set(PULSE_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
721 set(CUPS_FEATURE_TYPE "RECOMMENDED")
722 set(CUPS_FEATURE_PURPOSE "printing")
723 set(CUPS_FEATURE_DESCRIPTION "printer device redirection")
725 set(PCSC_FEATURE_TYPE "RECOMMENDED")
726 set(PCSC_FEATURE_PURPOSE "smart card")
727 set(PCSC_FEATURE_DESCRIPTION "smart card device redirection")
729 set(FFMPEG_FEATURE_TYPE "RECOMMENDED")
730 set(FFMPEG_FEATURE_PURPOSE "multimedia")
731 set(FFMPEG_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
733 set(VAAPI_FEATURE_TYPE "OPTIONAL")
734 set(VAAPI_FEATURE_PURPOSE "multimedia")
735 set(VAAPI_FEATURE_DESCRIPTION "VA-API hardware acceleration for video playback")
737 set(IPP_FEATURE_TYPE "OPTIONAL")
738 set(IPP_FEATURE_PURPOSE "performance")
739 set(IPP_FEATURE_DESCRIPTION "Intel Integrated Performance Primitives library")
741 set(JPEG_FEATURE_TYPE "OPTIONAL")
742 set(JPEG_FEATURE_PURPOSE "codec")
743 set(JPEG_FEATURE_DESCRIPTION "use JPEG library")
745 set(X264_FEATURE_TYPE "OPTIONAL")
746 set(X264_FEATURE_PURPOSE "codec")
747 set(X264_FEATURE_DESCRIPTION "use x264 library")
749 set(OPENH264_FEATURE_TYPE "OPTIONAL")
750 set(OPENH264_FEATURE_PURPOSE "codec")
751 set(OPENH264_FEATURE_DESCRIPTION "use OpenH264 library")
753 set(OPENCL_FEATURE_TYPE "OPTIONAL")
754 set(OPENCL_FEATURE_PURPOSE "codec")
755 set(OPENCL_FEATURE_DESCRIPTION "use OpenCL library")
757 set(GSM_FEATURE_TYPE "OPTIONAL")
758 set(GSM_FEATURE_PURPOSE "codec")
759 set(GSM_FEATURE_DESCRIPTION "GSM audio codec library")
761 set(LAME_FEATURE_TYPE "OPTIONAL")
762 set(LAME_FEATURE_PURPOSE "codec")
763 set(LAME_FEATURE_DESCRIPTION "lame MP3 audio codec library")
765 set(FAAD2_FEATURE_TYPE "OPTIONAL")
766 set(FAAD2_FEATURE_PURPOSE "codec")
767 set(FAAD2_FEATURE_DESCRIPTION "FAAD2 AAC audio codec library")
769 set(FAAC_FEATURE_TYPE "OPTIONAL")
770 set(FAAC_FEATURE_PURPOSE "codec")
771 set(FAAC_FEATURE_DESCRIPTION "FAAC AAC audio codec library")
773 set(SOXR_FEATURE_TYPE "OPTIONAL")
774 set(SOXR_FEATURE_PURPOSE "codec")
775 set(SOXR_FEATURE_DESCRIPTION "SOX audio resample library")
777 set(GSSAPI_FEATURE_TYPE "OPTIONAL")
778 set(GSSAPI_FEATURE_PURPOSE "auth")
779 set(GSSAPI_FEATURE_DESCRIPTION "add kerberos support")
782 set(X11_FEATURE_TYPE "DISABLED")
783 set(WAYLAND_FEATURE_TYPE "DISABLED")
784 set(ZLIB_FEATURE_TYPE "DISABLED")
785 set(OSS_FEATURE_TYPE "DISABLED")
786 set(ALSA_FEATURE_TYPE "DISABLED")
787 set(PULSE_FEATURE_TYPE "DISABLED")
788 set(CUPS_FEATURE_TYPE "DISABLED")
789 set(PCSC_FEATURE_TYPE "DISABLED")
790 set(FFMPEG_FEATURE_TYPE "DISABLED")
791 set(VAAPI_FEATURE_TYPE "DISABLED")
792 set(OPENSLES_FEATURE_TYPE "DISABLED")
796 set(FFMPEG_FEATURE_TYPE "OPTIONAL")
797 set(VAAPI_FEATURE_TYPE "DISABLED")
798 set(X11_FEATURE_TYPE "OPTIONAL")
799 set(WAYLAND_FEATURE_TYPE "DISABLED")
800 set(OSS_FEATURE_TYPE "DISABLED")
801 set(ALSA_FEATURE_TYPE "DISABLED")
803 set(X11_FEATURE_TYPE "DISABLED")
804 set(PULSE_FEATURE_TYPE "DISABLED")
805 set(CUPS_FEATURE_TYPE "DISABLED")
806 set(PCSC_FEATURE_TYPE "DISABLED")
808 set(OPENSLES_FEATURE_TYPE "DISABLED")
811 if(UNIX AND NOT ANDROID)
812 set(WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE "RECOMMENDED")
813 set(WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE "systemd journal appender")
814 set(WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION "allows to export wLog to systemd journal")
816 #include(Findlibsystemd)
817 find_feature(libsystemd ${WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION})
820 set(HAVE_JOURNALD_H TRUE)
822 unset(HAVE_JOURNALD_H)
824 endif(UNIX AND NOT ANDROID)
827 set(X11_FEATURE_TYPE "DISABLED")
828 set(WAYLAND_FEATURE_TYPE "DISABLED")
829 set(OSS_FEATURE_TYPE "DISABLED")
830 set(ALSA_FEATURE_TYPE "DISABLED")
831 set(PULSE_FEATURE_TYPE "DISABLED")
832 set(CUPS_FEATURE_TYPE "DISABLED")
833 set(PCSC_FEATURE_TYPE "DISABLED")
834 set(FFMPEG_FEATURE_TYPE "DISABLED")
835 set(VAAPI_FEATURE_TYPE "DISABLED")
836 set(OPENSLES_FEATURE_TYPE "REQUIRED")
839 find_feature(X11 ${X11_FEATURE_TYPE} ${X11_FEATURE_PURPOSE} ${X11_FEATURE_DESCRIPTION})
840 find_feature(Wayland ${WAYLAND_FEATURE_TYPE} ${WAYLAND_FEATURE_PURPOSE} ${WAYLAND_FEATURE_DESCRIPTION})
842 find_feature(ZLIB ${ZLIB_FEATURE_TYPE} ${ZLIB_FEATURE_PURPOSE} ${ZLIB_FEATURE_DESCRIPTION})
843 find_feature(OpenSSL ${OPENSSL_FEATURE_TYPE} ${OPENSSL_FEATURE_PURPOSE} ${OPENSSL_FEATURE_DESCRIPTION})
844 find_feature(MbedTLS ${MBEDTLS_FEATURE_TYPE} ${MBEDTLS_FEATURE_PURPOSE} ${MBEDTLS_FEATURE_DESCRIPTION})
845 find_feature(OpenSLES ${OPENSLES_FEATURE_TYPE} ${OPENSLES_FEATURE_PURPOSE} ${OPENSLES_FEATURE_DESCRIPTION})
847 find_feature(OSS ${OSS_FEATURE_TYPE} ${OSS_FEATURE_PURPOSE} ${OSS_FEATURE_DESCRIPTION})
848 find_feature(ALSA ${ALSA_FEATURE_TYPE} ${ALSA_FEATURE_PURPOSE} ${ALSA_FEATURE_DESCRIPTION})
849 find_feature(Pulse ${PULSE_FEATURE_TYPE} ${PULSE_FEATURE_PURPOSE} ${PULSE_FEATURE_DESCRIPTION})
851 find_feature(Cups ${CUPS_FEATURE_TYPE} ${CUPS_FEATURE_PURPOSE} ${CUPS_FEATURE_DESCRIPTION})
852 find_feature(PCSC ${PCSC_FEATURE_TYPE} ${PCSC_FEATURE_PURPOSE} ${PCSC_FEATURE_DESCRIPTION})
854 find_feature(FFmpeg ${FFMPEG_FEATURE_TYPE} ${FFMPEG_FEATURE_PURPOSE} ${FFMPEG_FEATURE_DESCRIPTION})
856 find_feature(JPEG ${JPEG_FEATURE_TYPE} ${JPEG_FEATURE_PURPOSE} ${JPEG_FEATURE_DESCRIPTION})
857 find_feature(x264 ${X264_FEATURE_TYPE} ${X264_FEATURE_PURPOSE} ${X264_FEATURE_DESCRIPTION})
858 find_feature(OpenH264 ${OPENH264_FEATURE_TYPE} ${OPENH264_FEATURE_PURPOSE} ${OPENH264_FEATURE_DESCRIPTION})
859 find_feature(OpenCL ${OPENCL_FEATURE_TYPE} ${OPENCL_FEATURE_PURPOSE} ${OPENCL_FEATURE_DESCRIPTION})
860 find_feature(GSM ${GSM_FEATURE_TYPE} ${GSM_FEATURE_PURPOSE} ${GSM_FEATURE_DESCRIPTION})
861 find_feature(LAME ${LAME_FEATURE_TYPE} ${LAME_FEATURE_PURPOSE} ${LAME_FEATURE_DESCRIPTION})
862 find_feature(FAAD2 ${FAAD2_FEATURE_TYPE} ${FAAD2_FEATURE_PURPOSE} ${FAAD2_FEATURE_DESCRIPTION})
863 find_feature(FAAC ${FAAC_FEATURE_TYPE} ${FAAC_FEATURE_PURPOSE} ${FAAC_FEATURE_DESCRIPTION})
864 find_feature(soxr ${SOXR_FEATURE_TYPE} ${SOXR_FEATURE_PURPOSE} ${SOXR_FEATURE_DESCRIPTION})
866 find_feature(GSSAPI ${GSSAPI_FEATURE_TYPE} ${GSSAPI_FEATURE_PURPOSE} ${GSSAPI_FEATURE_DESCRIPTION})
868 if (WITH_OPENH264 AND NOT WITH_OPENH264_LOADING)
869 option(WITH_OPENH264_LOADING "Use LoadLibrary to load openh264 at runtime" OFF)
870 endif (WITH_OPENH264 AND NOT WITH_OPENH264_LOADING)
872 if ((WITH_FFMPEG OR WITH_DSP_FFMPEG) AND NOT FFMPEG_FOUND)
873 message(FATAL_ERROR "FFMPEG support requested but not detected")
875 set(WITH_FFMPEG ${FFMPEG_FOUND})
877 # Version check, if we have detected FFMPEG but the version is too old
878 # deactivate it as sound backend.
880 # Deactivate FFmpeg backend for sound, if the version is too old.
881 # See libfreerdp/codec/dsp_ffmpeg.h
882 file(STRINGS "${AVCODEC_INCLUDE_DIR}/libavcodec/version.h" AV_VERSION_FILE REGEX "LIBAVCODEC_VERSION_M[A-Z]+[\t ]*[0-9]+")
883 FOREACH(item ${AV_VERSION_FILE})
884 STRING(REGEX MATCH "LIBAVCODEC_VERSION_M[A-Z]+[\t ]*[0-9]+" litem ${item})
886 string(REGEX REPLACE "[ \t]+" ";" VSPLIT_LINE ${litem})
887 list(LENGTH VSPLIT_LINE VSPLIT_LINE_LEN)
888 if (NOT "${VSPLIT_LINE_LEN}" EQUAL "2")
889 message(ERROR "invalid entry in libavcodec version header ${item}")
890 endif(NOT "${VSPLIT_LINE_LEN}" EQUAL "2")
891 list(GET VSPLIT_LINE 0 VNAME)
892 list(GET VSPLIT_LINE 1 VVALUE)
893 set(${VNAME} ${VVALUE})
895 ENDFOREACH(item ${AV_VERSION_FILE})
897 set(AVCODEC_VERSION "${LIBAVCODEC_VERSION_MAJOR}.${LIBAVCODEC_VERSION_MINOR}.${LIBAVCODEC_VERSION_MICRO}")
898 if (AVCODEC_VERSION VERSION_LESS "57.48.101")
899 message(WARNING "FFmpeg version detected (${AVCODEC_VERSION}) is too old. (Require at least 57.48.101 for sound). Deactivating")
900 set(WITH_DSP_FFMPEG OFF)
902 endif (WITH_DSP_FFMPEG)
904 if (WITH_OPENH264 AND NOT OPENH264_FOUND)
905 message(FATAL_ERROR "OpenH264 support requested but not detected")
907 set(WITH_OPENH264 ${OPENH264_FOUND})
909 if ( (WITH_GSSAPI) AND (NOT GSS_FOUND))
910 message(WARNING "-DWITH_GSSAPI=ON is set, but not GSSAPI implementation was found, disabling")
912 if(GSS_FLAVOUR STREQUAL "MIT")
913 add_definitions("-DWITH_GSSAPI -DWITH_GSSAPI_MIT")
915 add_definitions("-DHAVE_AT_LEAST_KRB_V1_13")
917 include_directories(${_GSS_INCLUDE_DIR})
918 elseif(GSS_FLAVOUR STREQUAL "Heimdal")
919 add_definitions("-DWITH_GSSAPI -DWITH_GSSAPI_HEIMDAL")
920 include_directories(${_GSS_INCLUDE_DIR})
922 message(WARNING "Kerberos version not detected")
926 if(TARGET_ARCH MATCHES "x86|x64")
928 # Intel Performance Primitives
929 find_feature(IPP ${IPP_FEATURE_TYPE} ${IPP_FEATURE_PURPOSE} ${IPP_FEATURE_DESCRIPTION})
934 add_definitions("-DWITH_OPENSSL")
935 message(STATUS "Using OpenSSL Version: ${OPENSSL_VERSION}")
936 include_directories(${OPENSSL_INCLUDE_DIR})
940 add_definitions("-DWITH_MBEDTLS")
943 if (WITH_X264 OR WITH_OPENH264 OR WITH_MEDIA_FOUNDATION OR WITH_FFMPEG)
944 set(WITH_GFX_H264 ON)
946 set(WITH_GFX_H264 OFF)
949 # Android expects all libraries to be loadable
951 if (ANDROID OR WIN32 OR MAC_BUNDLE)
952 set(FREERDP_DATA_PATH "share")
953 if (NOT FREERDP_INSTALL_PREFIX)
954 set(FREERDP_INSTALL_PREFIX ".")
956 set(FREERDP_LIBRARY_PATH ".")
957 set(FREERDP_PLUGIN_PATH ".")
959 set(FREERDP_DATA_PATH "${CMAKE_INSTALL_PREFIX}/share/freerdp${FREERDP_VERSION_MAJOR}")
960 if (NOT FREERDP_INSTALL_PREFIX)
961 set(FREERDP_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
963 set(FREERDP_LIBRARY_PATH "${CMAKE_INSTALL_LIBDIR}")
964 set(FREERDP_PLUGIN_PATH "${CMAKE_INSTALL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}")
966 set(FREERDP_ADDIN_PATH "${FREERDP_PLUGIN_PATH}")
968 # Path to put extensions
969 set(FREERDP_EXTENSION_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}/extensions")
972 if(NOT DEFINED PROXY_PLUGINDIR)
973 message("using default plugins location")
974 set(FREERDP_PROXY_PLUGINDIR "${CMAKE_BINARY_DIR}/server/proxy/plugins")
976 set(FREERDP_PROXY_PLUGINDIR "${PROXY_PLUGINDIR}")
979 # Include directories
980 include_directories(${CMAKE_CURRENT_BINARY_DIR})
981 include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
982 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
985 add_definitions("-DHAVE_CONFIG_H")
986 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
988 # RPATH configuration
989 set(CMAKE_SKIP_BUILD_RPATH FALSE)
990 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
992 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)
993 set(CMAKE_INSTALL_RPATH "@loader_path/../Frameworks")
995 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
997 set(CMAKE_INSTALL_RPATH "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}:\$ORIGIN/..")
1001 if (BUILD_SHARED_LIBS)
1002 set(CMAKE_MACOSX_RPATH ON)
1008 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
1009 set(PROFILER_LIBRARIES
1010 "${FREERDP_EXTERNAL_PROFILER_PATH}/obj/local/${ANDROID_ABI}/libandroid-ndk-profiler.a")
1011 include_directories("${FREERDP_EXTERNAL_PROFILER_PATH}")
1023 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
1025 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Testing")
1030 include_directories("${CMAKE_SOURCE_DIR}/winpr/include")
1031 include_directories("${CMAKE_BINARY_DIR}/winpr/include")
1033 if (${CMAKE_VERSION} VERSION_LESS 2.8.12)
1034 set(PUBLIC_KEYWORD "")
1035 set(PRIVATE_KEYWORD "")
1037 set(PUBLIC_KEYWORD "PUBLIC")
1038 set(PRIVATE_KEYWORD "PRIVATE")
1041 if(BUILD_SHARED_LIBS)
1042 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINPR_DLL")
1045 add_subdirectory(winpr)
1049 if(WITH_THIRD_PARTY)
1050 add_subdirectory(third-party)
1051 if (NOT "${THIRD_PARTY_INCLUDES}" STREQUAL "")
1052 include_directories(${THIRD_PARTY_INCLUDES})
1056 add_subdirectory(include)
1058 add_subdirectory(libfreerdp)
1061 set(CMAKE_OSX_DEPLOYMENT_TARGET "10.0")
1062 if (IOS_PLATFORM MATCHES "SIMULATOR")
1063 set(CMAKE_OSX_SYSROOT "iphonesimulator")
1065 set(CMAKE_OSX_SYSROOT "iphoneos")
1070 include_directories("${CMAKE_SOURCE_DIR}/rdtk/include")
1071 include_directories("${CMAKE_BINARY_DIR}/rdtk/include")
1073 add_subdirectory(rdtk)
1076 add_subdirectory(uwac)
1080 if(IS_DIRECTORY /usr/local/include)
1081 include_directories(/usr/local/include)
1082 link_directories(/usr/local/lib)
1085 if(IS_DIRECTORY /usr/X11R6/include)
1086 include_directories(/usr/X11R6/include)
1092 add_subdirectory(channels)
1095 if(WITH_CLIENT_COMMON OR WITH_CLIENT)
1096 add_subdirectory(client)
1100 add_subdirectory(server)
1105 set(CMAKE_CPACK_INCLUDE_FILE "CMakeCPack.cmake")
1107 if(NOT (VENDOR MATCHES "FreeRDP"))
1108 if(DEFINED CLIENT_VENDOR_PATH)
1109 if(EXISTS "${CMAKE_SOURCE_DIR}/${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
1110 set(CMAKE_CPACK_INCLUDE_FILE "${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
1115 #message("VENDOR: ${VENDOR} CLIENT_VENDOR_PATH: ${CLIENT_VENDOR_PATH} CMAKE_CPACK_INCLUDE_FILE: ${CMAKE_CPACK_INCLUDE_FILE}")
1117 include(${CMAKE_CPACK_INCLUDE_FILE})
1119 set(FREERDP_BUILD_CONFIG_LIST "")
1120 GET_CMAKE_PROPERTY(res VARIABLES)
1122 IF (var MATCHES "^WITH_*|^BUILD_TESTING|^BUILTIN_CHANNELS|^HAVE_*")
1123 LIST(APPEND FREERDP_BUILD_CONFIG_LIST "${var}=${${var}}")
1126 string(REPLACE ";" " " FREERDP_BUILD_CONFIG "${FREERDP_BUILD_CONFIG_LIST}")
1127 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/buildflags.h.in ${CMAKE_CURRENT_BINARY_DIR}/buildflags.h)