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)
77 if (DEFINE_NO_DEPRECATED)
78 add_definitions(-DDEFINE_NO_DEPRECATED)
83 if ($ENV{BUILD_NUMBER})
84 set(BUILD_NUMBER $ENV{BUILD_NUMBER})
86 set(WITH_LIBRARY_VERSIONING "ON")
88 set(RAW_VERSION_STRING "2.3.1")
89 if(EXISTS "${CMAKE_SOURCE_DIR}/.source_tag")
90 file(READ ${CMAKE_SOURCE_DIR}/.source_tag RAW_VERSION_STRING)
91 elseif(USE_VERSION_FROM_GIT_TAG)
92 git_get_exact_tag(_GIT_TAG --tags --always)
93 if (NOT ${_GIT_TAG} STREQUAL "n/a")
94 set(RAW_VERSION_STRING ${_GIT_TAG})
97 string(STRIP ${RAW_VERSION_STRING} RAW_VERSION_STRING)
99 set(VERSION_REGEX "^.?([0-9]+)\\.([0-9]+)\\.([0-9]+)-?(.*)")
100 string(REGEX REPLACE "${VERSION_REGEX}" "\\1" FREERDP_VERSION_MAJOR "${RAW_VERSION_STRING}")
101 string(REGEX REPLACE "${VERSION_REGEX}" "\\2" FREERDP_VERSION_MINOR "${RAW_VERSION_STRING}")
102 string(REGEX REPLACE "${VERSION_REGEX}" "\\3" FREERDP_VERSION_REVISION "${RAW_VERSION_STRING}")
103 string(REGEX REPLACE "${VERSION_REGEX}" "\\4" FREERDP_VERSION_SUFFIX "${RAW_VERSION_STRING}")
105 set(FREERDP_API_VERSION "${FREERDP_VERSION_MAJOR}")
106 set(FREERDP_VERSION "${FREERDP_VERSION_MAJOR}.${FREERDP_VERSION_MINOR}.${FREERDP_VERSION_REVISION}")
107 if (FREERDP_VERSION_SUFFIX)
108 set(FREERDP_VERSION_FULL "${FREERDP_VERSION}-${FREERDP_VERSION_SUFFIX}")
110 set(FREERDP_VERSION_FULL "${FREERDP_VERSION}")
112 message("FREERDP_VERSION=${FREERDP_VERSION_FULL}")
114 set(FREERDP_INCLUDE_DIR "include/freerdp${FREERDP_VERSION_MAJOR}/")
116 # Compatibility options
117 if(DEFINED STATIC_CHANNELS)
118 message(WARNING "STATIC_CHANNELS is obsolete, please use BUILTIN_CHANNELS instead")
119 set(BUILTIN_CHANNELS ${STATIC_CHANNELS} CACHE BOOL "" FORCE)
122 # Make paths absolute
123 if (CMAKE_INSTALL_PREFIX)
124 get_filename_component(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" ABSOLUTE)
126 if (FREERDP_EXTERNAL_PATH)
127 get_filename_component (FREERDP_EXTERNAL_PATH "${FREERDP_EXTERNAL_PATH}" ABSOLUTE)
130 # Allow to search the host machine for git/ccache
131 if(CMAKE_CROSSCOMPILING)
132 SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
133 endif(CMAKE_CROSSCOMPILING)
135 find_program(CCACHE ccache)
136 if(CCACHE AND WITH_CCACHE)
137 if(CMAKE_VERSION VERSION_GREATER 3.3.2)
138 if(NOT DEFINED CMAKE_C_COMPILER_LAUNCHER)
139 SET(CMAKE_C_COMPILER_LAUNCHER ${CCACHE})
140 endif(NOT DEFINED CMAKE_C_COMPILER_LAUNCHER)
141 if(NOT DEFINED CMAKE_CXX_COMPILER_LAUNCHER)
142 SET(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE})
143 endif(NOT DEFINED CMAKE_CXX_COMPILER_LAUNCHER)
145 set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE})
146 set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE})
148 endif(CCACHE AND WITH_CCACHE)
150 if(EXISTS "${CMAKE_SOURCE_DIR}/.source_version" )
151 file(READ ${CMAKE_SOURCE_DIR}/.source_version GIT_REVISION)
153 string(STRIP ${GIT_REVISION} GIT_REVISION)
155 git_get_exact_tag(GIT_REVISION --tags --always)
157 if (${GIT_REVISION} STREQUAL "n/a")
158 git_rev_parse (GIT_REVISION --short)
162 if(CMAKE_CROSSCOMPILING)
163 SET (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
164 endif(CMAKE_CROSSCOMPILING)
165 # /Allow to search the host machine for git/ccache
167 message(STATUS "Git Revision ${GIT_REVISION}")
169 # Turn on solution folders (2.8.4+)
170 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
172 # Default to release build type
173 if(NOT CMAKE_BUILD_TYPE)
174 set(CMAKE_BUILD_TYPE "Release")
177 if(NOT DEFINED BUILD_SHARED_LIBS)
179 set(BUILD_SHARED_LIBS OFF)
181 set(BUILD_SHARED_LIBS ON)
186 set(EXPORT_ALL_SYMBOLS TRUE)
187 elseif(NOT DEFINED EXPORT_ALL_SYMBOLS)
188 set(EXPORT_ALL_SYMBOLS FALSE)
191 if (EXPORT_ALL_SYMBOLS)
192 # set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
193 add_definitions(-DFREERDP_TEST_EXPORTS -DBUILD_TESTING)
194 endif(EXPORT_ALL_SYMBOLS)
197 if(${CMAKE_SYSTEM_NAME} MATCHES "BSD")
199 if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
202 if(${CMAKE_SYSTEM_NAME} MATCHES "kFreeBSD")
205 if(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
210 if(${CMAKE_SYSTEM_NAME} MATCHES "DragonFly")
216 find_path(EPOLLSHIM_INCLUDE_DIR NAMES sys/epoll.h sys/timerfd.h HINTS /usr/local/include/libepoll-shim)
217 find_library(EPOLLSHIM_LIBS NAMES epoll-shim libepoll-shim HINTS /usr/local/lib)
220 # Configure MSVC Runtime
223 if(NOT DEFINED MSVC_RUNTIME)
224 set(MSVC_RUNTIME "dynamic")
226 if(MSVC_RUNTIME STREQUAL "static")
227 if(BUILD_SHARED_LIBS)
228 message(FATAL_ERROR "Static CRT is only supported in a fully static build")
230 message(STATUS "Use the MSVC static runtime option carefully!")
231 message(STATUS "OpenSSL uses /MD by default, and is very picky")
232 message(STATUS "Random freeing errors are a common sign of runtime issues")
234 configure_msvc_runtime()
236 if(NOT DEFINED CMAKE_SUPPRESS_REGENERATION)
237 set(CMAKE_SUPPRESS_REGENERATION ON)
241 # Enable 64bit file support on linux and FreeBSD.
242 if("${CMAKE_SYSTEM_NAME}" MATCHES "Linux" OR FREEBSD)
243 add_definitions("-D_FILE_OFFSET_BITS=64")
246 # Use Standard conforming getpwnam_r() on Solaris.
247 if("${CMAKE_SYSTEM_NAME}" MATCHES "SunOS")
248 add_definitions("-D_POSIX_PTHREAD_SEMANTICS")
251 # Compiler-specific flags
252 if(CMAKE_COMPILER_IS_GNUCC)
253 if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "i686")
254 CHECK_SYMBOL_EXISTS(__x86_64__ "" IS_X86_64)
256 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
258 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686")
261 if(CMAKE_POSITION_INDEPENDENT_CODE)
262 if(${CMAKE_VERSION} VERSION_LESS 2.8.9)
263 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
268 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
270 CHECK_C_COMPILER_FLAG (-Wno-unused-result Wno-unused-result)
271 if(Wno-unused-result)
272 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-result")
274 CHECK_C_COMPILER_FLAG (-Wno-unused-but-set-variable Wno-unused-but-set-variable)
275 if(Wno-unused-but-set-variable)
276 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-but-set-variable")
278 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
279 if(Wno-deprecated-declarations)
280 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
282 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
283 if(Wno-deprecated-declarationsCXX)
284 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
287 if(NOT EXPORT_ALL_SYMBOLS)
288 message(STATUS "GCC default symbol visibility: hidden")
289 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
292 CHECK_C_COMPILER_FLAG(-Wno-format Wno-format)
294 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format")
297 CHECK_C_COMPILER_FLAG (-Wimplicit-function-declaration Wimplicit-function-declaration)
298 if(Wimplicit-function-declaration)
299 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wimplicit-function-declaration")
303 CHECK_C_COMPILER_FLAG (-Wredundant-decls Wredundant-decls)
305 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
308 if(CMAKE_BUILD_TYPE STREQUAL "Release")
309 add_definitions(-DNDEBUG)
311 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
312 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
316 # When building with Unix Makefiles and doing any release builds
317 # try to set __FILE__ to relative paths via a make specific macro
318 if (CMAKE_GENERATOR MATCHES "Unix Makefile*")
319 if(CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
320 string(TOUPPER ${CMAKE_BUILD_TYPE} UPPER_BUILD_TYPE)
321 CHECK_C_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefined)
322 if(Wno-builtin-macro-redefined)
323 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 $<)))\"'")
326 CHECK_CXX_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefinedCXX)
327 if(Wno-builtin-macro-redefinedCXX)
328 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 $<)))\"'")
333 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
334 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
335 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-macros -Wno-padded")
336 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-c11-extensions -Wno-gnu")
337 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-command-line-argument")
338 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
339 if(Wno-deprecated-declarations)
340 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
342 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
343 if(Wno-deprecated-declarationsCXX)
344 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
348 set(THREAD_PREFER_PTHREAD_FLAG TRUE)
351 find_package(Threads REQUIRED)
355 CHECK_SYMBOL_EXISTS(pthread_mutex_timedlock pthread.h HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
356 if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
357 CHECK_LIBRARY_EXISTS(pthread pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
358 endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
359 if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
360 CHECK_LIBRARY_EXISTS(pthreads pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
361 endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
363 if (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
364 set(HAVE_PTHREAD_MUTEX_TIMEDLOCK ON)
365 endif (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
368 # Enable address sanitizer, where supported and when required
369 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCC)
370 CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
372 if (fno-omit-frame-pointer)
373 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
376 set(CMAKE_REQUIRED_LINK_OPTIONS_SAVED ${CMAKE_REQUIRED_LINK_OPTIONS})
377 file(WRITE ${CMAKE_BINARY_DIR}/foo.txt "")
378 if(WITH_SANITIZE_ADDRESS)
379 list(APPEND CMAKE_REQUIRED_LINK_OPTIONS "-fsanitize=address")
380 CHECK_C_COMPILER_FLAG ("-fsanitize=address" fsanitize-address)
381 CHECK_C_COMPILER_FLAG ("-fsanitize-blacklist=${CMAKE_BINARY_DIR}/foo.txt" fsanitize-blacklist)
382 CHECK_C_COMPILER_FLAG ("-fsanitize-address-use-after-scope" fsanitize-address-use-after-scope)
384 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
385 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=address")
386 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
388 if(fsanitize-blacklist)
389 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/scripts/blacklist-address-sanitizer.txt")
390 endif(fsanitize-blacklist)
392 if(fsanitize-address-use-after-scope)
393 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-address-use-after-scope")
394 endif(fsanitize-address-use-after-scope)
395 elseif(WITH_SANITIZE_MEMORY)
396 list(APPEND CMAKE_REQUIRED_LINK_OPTIONS "-fsanitize=memory")
397 CHECK_C_COMPILER_FLAG ("-fsanitize=memory" fsanitize-memory)
398 CHECK_C_COMPILER_FLAG ("-fsanitize-blacklist=${CMAKE_BINARY_DIR}/foo.txt" fsanitize-blacklist)
399 CHECK_C_COMPILER_FLAG ("-fsanitize-memory-use-after-dtor" fsanitize-memory-use-after-dtor)
400 CHECK_C_COMPILER_FLAG ("-fsanitize-memory-track-origins" fsanitize-memory-track-origins)
402 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=memory")
403 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=memory")
404 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=memory")
406 if(fsanitize-blacklist)
407 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/scripts/blacklist-memory-sanitizer.txt")
408 endif(fsanitize-blacklist)
410 if (fsanitize-memory-use-after-dtor)
411 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-memory-use-after-dtor")
412 endif(fsanitize-memory-use-after-dtor)
414 if (fsanitize-memory-track-origins)
415 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-memory-track-origins")
416 endif(fsanitize-memory-track-origins)
417 elseif(WITH_SANITIZE_THREAD)
418 list(APPEND CMAKE_REQUIRED_LINK_OPTIONS "-fsanitize=thread")
419 CHECK_C_COMPILER_FLAG ("-fsanitize=thread" fsanitize-thread)
420 CHECK_C_COMPILER_FLAG ("-fsanitize-blacklist=${CMAKE_BINARY_DIR}/foo.txt" fsanitize-blacklist)
422 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=thread")
423 if(fsanitize-blacklist)
424 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/scripts/blacklist-thread-sanitizer.txt")
425 endif(fsanitize-blacklist)
426 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=thread")
427 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=thread")
430 file(REMOVE ${CMAKE_BINARY_DIR}/foo.txt)
431 set(CMAKE_REQUIRED_LINK_OPTIONS ${CMAKE_REQUIRED_LINK_OPTIONS_SAVED})
433 if (WITH_NO_UNDEFINED)
434 CHECK_C_COMPILER_FLAG (-Wl,--no-undefined no-undefined)
437 SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--no-undefined" )
438 SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined" )
444 # Remove previous warning definitions,
445 # NMake is otherwise complaining.
446 foreach (flags_var_to_scrub
449 CMAKE_CXX_FLAGS_RELEASE
450 CMAKE_CXX_FLAGS_RELWITHDEBINFO
451 CMAKE_CXX_FLAGS_MINSIZEREL
452 CMAKE_C_FLAGS_RELEASE
453 CMAKE_C_FLAGS_RELWITHDEBINFO
454 CMAKE_C_FLAGS_MINSIZEREL)
455 string (REGEX REPLACE "(^| )[/-]W[ ]*[1-9]" " "
456 "${flags_var_to_scrub}" "${${flags_var_to_scrub}}")
459 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gd")
460 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
462 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
463 add_definitions(-D_AMD64_)
465 add_definitions(-D_X86_)
468 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
469 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})
471 if(CMAKE_BUILD_TYPE STREQUAL "Release")
473 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Zi")
474 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi")
480 add_definitions(-DUNICODE -D_UNICODE)
481 add_definitions(-D_CRT_SECURE_NO_WARNINGS)
482 add_definitions(-DWIN32_LEAN_AND_MEAN)
483 add_definitions(-D_WINSOCK_DEPRECATED_NO_WARNINGS)
485 set(CMAKE_USE_RELATIVE_PATH ON)
486 if (${CMAKE_GENERATOR} MATCHES "NMake Makefile*" OR ${CMAKE_GENERATOR} MATCHES "Ninja*" OR ${CMAKE_GENERATOR} MATCHES "Unix Makefiles")
487 set(CMAKE_PDB_BINARY_DIR ${CMAKE_BINARY_DIR})
488 elseif (${CMAKE_GENERATOR} MATCHES "Visual Studio*")
489 set(CMAKE_PDB_BINARY_DIR "${CMAKE_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
491 message(FATAL_ERROR "Unknown generator ${CMAKE_GENERATOR}")
494 string(TIMESTAMP RC_VERSION_YEAR "%Y")
496 if(NOT DEFINED CMAKE_WINDOWS_VERSION)
497 set(CMAKE_WINDOWS_VERSION "WIN7")
500 if(CMAKE_WINDOWS_VERSION STREQUAL "WINXP")
501 add_definitions(-DWINVER=0x0501 -D_WIN32_WINNT=0x0501)
502 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN7")
503 add_definitions(-DWINVER=0x0601 -D_WIN32_WINNT=0x0601)
504 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN8")
505 add_definitions(-DWINVER=0x0602 -D_WIN32_WINNT=0x0602)
506 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN10")
507 add_definitions(-DWINVER=0x0A00 -D_WIN32_WINNT=0x0A00)
510 # Set product and vendor for dll and exe version information.
511 set(RC_VERSION_VENDOR ${VENDOR})
512 set(RC_VERSION_PRODUCT ${PRODUCT})
513 set(RC_VERSION_PATCH ${BUILD_NUMBER})
514 set(RC_VERSION_DESCRIPTION "${FREERDP_VERSION_FULL} ${GIT_REVISION} ${CMAKE_WINDOWS_VERSION} ${CMAKE_SYSTEM_PROCESSOR}")
516 if (FREERDP_EXTERNAL_SSL_PATH)
517 set(OPENSSL_ROOT_DIR ${FREERDP_EXTERNAL_SSL_PATH})
522 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_IOS_SDK_ROOT} -g")
525 add_definitions(-DWINPR_EXPORTS -DFREERDP_EXPORTS)
529 check_include_files(fcntl.h HAVE_FCNTL_H)
530 check_include_files(unistd.h HAVE_UNISTD_H)
531 check_include_files(execinfo.h HAVE_EXECINFO_H)
532 check_include_files(inttypes.h HAVE_INTTYPES_H)
533 check_include_files(sys/modem.h HAVE_SYS_MODEM_H)
534 check_include_files(sys/filio.h HAVE_SYS_FILIO_H)
535 check_include_files(sys/sockio.h HAVE_SYS_SOCKIO_H)
536 check_include_files(sys/strtio.h HAVE_SYS_STRTIO_H)
537 check_include_files(sys/select.h HAVE_SYS_SELECT_H)
538 check_include_files(syslog.h HAVE_SYSLOG_H)
542 set(HAVE_INTTYPES_H 1)
543 set(HAVE_SYS_FILIO_H 1)
547 check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
549 set(HAVE_TM_GMTOFF 1)
555 if (NOT FREERDP_IOS_EXTERNAL_SSL_PATH)
556 message(STATUS "FREERDP_IOS_EXTERNAL_SSL_PATH not set! Required if openssl is not found in the iOS SDK (which usually isn't")
558 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_IOS_EXTERNAL_SSL_PATH})
559 set_property(GLOBAL PROPERTY XCODE_ATTRIBUTE_SKIP_INSTALL YES)
561 if(NOT DEFINED CMAKE_OSX_ARCHITECTURES)
562 set(CMAKE_OSX_ARCHITECTURES i386 x86_64)
566 # Temporarily disabled, causes the cmake script to be reexecuted, causing the compilation to fail.
567 # Workaround: specify the parameter in the command-line
569 # set(CMAKE_C_COMPILER "clang")
573 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -v")
574 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v")
580 set(WITH_MANPAGES "ON")
582 set(WITH_PULSE "OFF")
584 set(WITH_WAYLAND "OFF")
589 set(WITH_LIBRARY_VERSIONING "OFF")
591 set_property( GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ${ANDROID_LIBRARY_USE_LIB64_PATHS} )
593 if (${ANDROID_ABI} STREQUAL "armeabi")
597 if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
598 add_definitions(-DNDK_DEBUG=1)
600 # NOTE: Manually add -gdwarf-3, as newer toolchains default to -gdwarf-4,
601 # which is not supported by the gdbserver binary shipped with
602 # the android NDK (tested with r9b)
603 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG} -gdwarf-3")
605 set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -llog")
607 if (NOT FREERDP_EXTERNAL_PATH)
608 if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/")
609 set (FREERDP_EXTERNAL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/")
611 message(STATUS "FREERDP_EXTERNAL_PATH not set!")
615 list (APPEND CMAKE_INCLUDE_PATH ${FREERDP_EXTERNAL_PATH}/${ANDROID_ABI}/include)
616 list (APPEND CMAKE_LIBRARY_PATH ${FREERDP_EXTERNAL_PATH}/${ANDROID_ABI}/ )
617 set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH )
618 set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH )
621 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/gprof_generate.sh.cmake
622 ${CMAKE_BINARY_DIR}/scripts/gprof_generate.sh @ONLY)
626 if(WITH_VALGRIND_MEMCHECK)
627 check_include_files(valgrind/memcheck.h HAVE_VALGRIND_MEMCHECK_H)
629 unset(HAVE_VALGRIND_MEMCHECK_H CACHE)
633 check_include_files(aio.h HAVE_AIO_H)
634 check_include_files(sys/eventfd.h HAVE_SYS_EVENTFD_H)
635 if (HAVE_SYS_EVENTFD_H)
636 check_symbol_exists(eventfd_read sys/eventfd.h WITH_EVENTFD_READ_WRITE)
639 list(APPEND CMAKE_REQUIRED_INCLUDES ${EPOLLSHIM_INCLUDE_DIR})
641 check_include_files(sys/timerfd.h HAVE_SYS_TIMERFD_H)
643 list(REMOVE_ITEM CMAKE_REQUIRED_INCLUDES ${EPOLLSHIM_INCLUDE_DIR})
645 check_include_files(poll.h HAVE_POLL_H)
646 list(APPEND CMAKE_REQUIRED_LIBRARIES m)
647 check_symbol_exists(ceill math.h HAVE_MATH_C99_LONG_DOUBLE)
648 list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES m)
649 set(X11_FEATURE_TYPE "RECOMMENDED")
650 set(WAYLAND_FEATURE_TYPE "RECOMMENDED")
652 include(CheckFunctionExists)
654 check_function_exists(getlogin_r HAVE_GETLOGIN_R)
656 set(X11_FEATURE_TYPE "DISABLED")
657 set(WAYLAND_FEATURE_TYPE "DISABLED")
661 find_package(PCSCWinPR)
664 set(X11_FEATURE_PURPOSE "X11")
665 set(X11_FEATURE_DESCRIPTION "X11 client and server")
667 set(WAYLAND_FEATURE_PURPOSE "Wayland")
668 set(WAYLAND_FEATURE_DESCRIPTION "Wayland client")
670 set(ZLIB_FEATURE_TYPE "REQUIRED")
671 set(ZLIB_FEATURE_PURPOSE "compression")
672 set(ZLIB_FEATURE_DESCRIPTION "data compression")
674 set(OPENSSL_FEATURE_TYPE "REQUIRED")
675 set(OPENSSL_FEATURE_PURPOSE "cryptography")
676 set(OPENSSL_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
678 set(MBEDTLS_FEATURE_TYPE "OPTIONAL")
679 set(MBEDTLS_FEATURE_PURPOSE "cryptography")
680 set(MBEDTLS_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
682 set(OPENSLES_FEATURE_TYPE "OPTIONAL")
683 set(OPENSLES_FEATURE_PURPOSE "multimedia")
684 set(OPENSLES_FEATURE_DESCRIPTION "OpenSLES audio / video")
686 set(OSS_FEATURE_TYPE "RECOMMENDED")
687 set(OSS_FEATURE_PURPOSE "sound")
688 set(OSS_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
690 set(ALSA_FEATURE_TYPE "RECOMMENDED")
691 set(ALSA_FEATURE_PURPOSE "sound")
692 set(ALSA_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
694 set(PULSE_FEATURE_TYPE "RECOMMENDED")
695 set(PULSE_FEATURE_PURPOSE "sound")
696 set(PULSE_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
698 set(CUPS_FEATURE_TYPE "RECOMMENDED")
699 set(CUPS_FEATURE_PURPOSE "printing")
700 set(CUPS_FEATURE_DESCRIPTION "printer device redirection")
702 set(PCSC_FEATURE_TYPE "RECOMMENDED")
703 set(PCSC_FEATURE_PURPOSE "smart card")
704 set(PCSC_FEATURE_DESCRIPTION "smart card device redirection")
706 set(FFMPEG_FEATURE_TYPE "RECOMMENDED")
707 set(FFMPEG_FEATURE_PURPOSE "multimedia")
708 set(FFMPEG_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
710 set(VAAPI_FEATURE_TYPE "OPTIONAL")
711 set(VAAPI_FEATURE_PURPOSE "multimedia")
712 set(VAAPI_FEATURE_DESCRIPTION "[experimental] VA-API hardware acceleration for video playback")
714 set(IPP_FEATURE_TYPE "OPTIONAL")
715 set(IPP_FEATURE_PURPOSE "performance")
716 set(IPP_FEATURE_DESCRIPTION "Intel Integrated Performance Primitives library")
718 set(JPEG_FEATURE_TYPE "OPTIONAL")
719 set(JPEG_FEATURE_PURPOSE "codec")
720 set(JPEG_FEATURE_DESCRIPTION "use JPEG library")
722 set(X264_FEATURE_TYPE "OPTIONAL")
723 set(X264_FEATURE_PURPOSE "codec")
724 set(X264_FEATURE_DESCRIPTION "use x264 library")
726 set(OPENH264_FEATURE_TYPE "OPTIONAL")
727 set(OPENH264_FEATURE_PURPOSE "codec")
728 set(OPENH264_FEATURE_DESCRIPTION "use OpenH264 library")
730 set(OPENCL_FEATURE_TYPE "OPTIONAL")
731 set(OPENCL_FEATURE_PURPOSE "codec")
732 set(OPENCL_FEATURE_DESCRIPTION "[experimental] use OpenCL library")
734 set(GSM_FEATURE_TYPE "OPTIONAL")
735 set(GSM_FEATURE_PURPOSE "codec")
736 set(GSM_FEATURE_DESCRIPTION "GSM audio codec library")
738 set(LAME_FEATURE_TYPE "OPTIONAL")
739 set(LAME_FEATURE_PURPOSE "codec")
740 set(LAME_FEATURE_DESCRIPTION "lame MP3 audio codec library")
742 set(FAAD2_FEATURE_TYPE "OPTIONAL")
743 set(FAAD2_FEATURE_PURPOSE "codec")
744 set(FAAD2_FEATURE_DESCRIPTION "FAAD2 AAC audio codec library")
746 set(FAAC_FEATURE_TYPE "OPTIONAL")
747 set(FAAC_FEATURE_PURPOSE "codec")
748 set(FAAC_FEATURE_DESCRIPTION "[experimental] FAAC AAC audio codec library")
750 set(SOXR_FEATURE_TYPE "OPTIONAL")
751 set(SOXR_FEATURE_PURPOSE "codec")
752 set(SOXR_FEATURE_DESCRIPTION "SOX audio resample library")
754 set(GSSAPI_FEATURE_TYPE "OPTIONAL")
755 set(GSSAPI_FEATURE_PURPOSE "auth")
756 set(GSSAPI_FEATURE_DESCRIPTION "[experimental] add kerberos support")
759 set(X11_FEATURE_TYPE "DISABLED")
760 set(WAYLAND_FEATURE_TYPE "DISABLED")
761 set(ZLIB_FEATURE_TYPE "DISABLED")
762 set(OSS_FEATURE_TYPE "DISABLED")
763 set(ALSA_FEATURE_TYPE "DISABLED")
764 set(PULSE_FEATURE_TYPE "DISABLED")
765 set(CUPS_FEATURE_TYPE "DISABLED")
766 set(PCSC_FEATURE_TYPE "DISABLED")
767 set(FFMPEG_FEATURE_TYPE "DISABLED")
768 set(VAAPI_FEATURE_TYPE "DISABLED")
769 set(OPENSLES_FEATURE_TYPE "DISABLED")
773 set(FFMPEG_FEATURE_TYPE "OPTIONAL")
774 set(VAAPI_FEATURE_TYPE "DISABLED")
775 set(X11_FEATURE_TYPE "OPTIONAL")
776 set(WAYLAND_FEATURE_TYPE "DISABLED")
777 set(OSS_FEATURE_TYPE "DISABLED")
778 set(ALSA_FEATURE_TYPE "DISABLED")
780 set(X11_FEATURE_TYPE "DISABLED")
781 set(PULSE_FEATURE_TYPE "DISABLED")
782 set(CUPS_FEATURE_TYPE "DISABLED")
783 set(PCSC_FEATURE_TYPE "DISABLED")
785 set(OPENSLES_FEATURE_TYPE "DISABLED")
788 if(UNIX AND NOT ANDROID)
789 set(WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE "RECOMMENDED")
790 set(WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE "systemd journal appender")
791 set(WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION "allows to export wLog to systemd journal")
793 #include(Findlibsystemd)
794 find_feature(libsystemd ${WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION})
797 set(HAVE_JOURNALD_H TRUE)
799 unset(HAVE_JOURNALD_H)
801 endif(UNIX AND NOT ANDROID)
804 set(X11_FEATURE_TYPE "DISABLED")
805 set(WAYLAND_FEATURE_TYPE "DISABLED")
806 set(OSS_FEATURE_TYPE "DISABLED")
807 set(ALSA_FEATURE_TYPE "DISABLED")
808 set(PULSE_FEATURE_TYPE "DISABLED")
809 set(CUPS_FEATURE_TYPE "DISABLED")
810 set(PCSC_FEATURE_TYPE "DISABLED")
811 set(FFMPEG_FEATURE_TYPE "DISABLED")
812 set(VAAPI_FEATURE_TYPE "DISABLED")
813 set(OPENSLES_FEATURE_TYPE "REQUIRED")
816 find_feature(X11 ${X11_FEATURE_TYPE} ${X11_FEATURE_PURPOSE} ${X11_FEATURE_DESCRIPTION})
817 find_feature(Wayland ${WAYLAND_FEATURE_TYPE} ${WAYLAND_FEATURE_PURPOSE} ${WAYLAND_FEATURE_DESCRIPTION})
819 find_feature(ZLIB ${ZLIB_FEATURE_TYPE} ${ZLIB_FEATURE_PURPOSE} ${ZLIB_FEATURE_DESCRIPTION})
820 find_feature(OpenSSL ${OPENSSL_FEATURE_TYPE} ${OPENSSL_FEATURE_PURPOSE} ${OPENSSL_FEATURE_DESCRIPTION})
821 find_feature(MbedTLS ${MBEDTLS_FEATURE_TYPE} ${MBEDTLS_FEATURE_PURPOSE} ${MBEDTLS_FEATURE_DESCRIPTION})
822 find_feature(OpenSLES ${OPENSLES_FEATURE_TYPE} ${OPENSLES_FEATURE_PURPOSE} ${OPENSLES_FEATURE_DESCRIPTION})
824 find_feature(OSS ${OSS_FEATURE_TYPE} ${OSS_FEATURE_PURPOSE} ${OSS_FEATURE_DESCRIPTION})
825 find_feature(ALSA ${ALSA_FEATURE_TYPE} ${ALSA_FEATURE_PURPOSE} ${ALSA_FEATURE_DESCRIPTION})
826 find_feature(Pulse ${PULSE_FEATURE_TYPE} ${PULSE_FEATURE_PURPOSE} ${PULSE_FEATURE_DESCRIPTION})
828 find_feature(Cups ${CUPS_FEATURE_TYPE} ${CUPS_FEATURE_PURPOSE} ${CUPS_FEATURE_DESCRIPTION})
829 find_feature(PCSC ${PCSC_FEATURE_TYPE} ${PCSC_FEATURE_PURPOSE} ${PCSC_FEATURE_DESCRIPTION})
831 find_feature(FFmpeg ${FFMPEG_FEATURE_TYPE} ${FFMPEG_FEATURE_PURPOSE} ${FFMPEG_FEATURE_DESCRIPTION})
833 find_feature(JPEG ${JPEG_FEATURE_TYPE} ${JPEG_FEATURE_PURPOSE} ${JPEG_FEATURE_DESCRIPTION})
834 find_feature(x264 ${X264_FEATURE_TYPE} ${X264_FEATURE_PURPOSE} ${X264_FEATURE_DESCRIPTION})
835 find_feature(OpenH264 ${OPENH264_FEATURE_TYPE} ${OPENH264_FEATURE_PURPOSE} ${OPENH264_FEATURE_DESCRIPTION})
836 find_feature(OpenCL ${OPENCL_FEATURE_TYPE} ${OPENCL_FEATURE_PURPOSE} ${OPENCL_FEATURE_DESCRIPTION})
837 find_feature(GSM ${GSM_FEATURE_TYPE} ${GSM_FEATURE_PURPOSE} ${GSM_FEATURE_DESCRIPTION})
838 find_feature(LAME ${LAME_FEATURE_TYPE} ${LAME_FEATURE_PURPOSE} ${LAME_FEATURE_DESCRIPTION})
839 find_feature(FAAD2 ${FAAD2_FEATURE_TYPE} ${FAAD2_FEATURE_PURPOSE} ${FAAD2_FEATURE_DESCRIPTION})
840 find_feature(FAAC ${FAAC_FEATURE_TYPE} ${FAAC_FEATURE_PURPOSE} ${FAAC_FEATURE_DESCRIPTION})
841 find_feature(soxr ${SOXR_FEATURE_TYPE} ${SOXR_FEATURE_PURPOSE} ${SOXR_FEATURE_DESCRIPTION})
843 find_feature(GSSAPI ${GSSAPI_FEATURE_TYPE} ${GSSAPI_FEATURE_PURPOSE} ${GSSAPI_FEATURE_DESCRIPTION})
845 if (WITH_OPENH264 AND NOT WITH_OPENH264_LOADING)
846 option(WITH_OPENH264_LOADING "Use LoadLibrary to load openh264 at runtime" OFF)
847 endif (WITH_OPENH264 AND NOT WITH_OPENH264_LOADING)
849 if ((WITH_FFMPEG OR WITH_DSP_FFMPEG) AND NOT FFMPEG_FOUND)
850 message(FATAL_ERROR "FFMPEG support requested but not detected")
852 set(WITH_FFMPEG ${FFMPEG_FOUND})
854 # Version check, if we have detected FFMPEG but the version is too old
855 # deactivate it as sound backend.
857 # Deactivate FFmpeg backend for sound, if the version is too old.
858 # See libfreerdp/codec/dsp_ffmpeg.h
859 file(STRINGS "${AVCODEC_INCLUDE_DIR}/libavcodec/version.h" AV_VERSION_FILE REGEX "LIBAVCODEC_VERSION_M[A-Z]+[\t ]*[0-9]+")
860 FOREACH(item ${AV_VERSION_FILE})
861 STRING(REGEX MATCH "LIBAVCODEC_VERSION_M[A-Z]+[\t ]*[0-9]+" litem ${item})
863 string(REGEX REPLACE "[ \t]+" ";" VSPLIT_LINE ${litem})
864 list(LENGTH VSPLIT_LINE VSPLIT_LINE_LEN)
865 if (NOT "${VSPLIT_LINE_LEN}" EQUAL "2")
866 message(ERROR "invalid entry in libavcodec version header ${item}")
867 endif(NOT "${VSPLIT_LINE_LEN}" EQUAL "2")
868 list(GET VSPLIT_LINE 0 VNAME)
869 list(GET VSPLIT_LINE 1 VVALUE)
870 set(${VNAME} ${VVALUE})
872 ENDFOREACH(item ${AV_VERSION_FILE})
874 set(AVCODEC_VERSION "${LIBAVCODEC_VERSION_MAJOR}.${LIBAVCODEC_VERSION_MINOR}.${LIBAVCODEC_VERSION_MICRO}")
875 if (AVCODEC_VERSION VERSION_LESS "57.48.101")
876 message(WARNING "FFmpeg version detected (${AVCODEC_VERSION}) is too old. (Require at least 57.48.101 for sound). Deactivating")
877 set(WITH_DSP_FFMPEG OFF)
879 endif (WITH_DSP_FFMPEG)
881 if (WITH_OPENH264 AND NOT OPENH264_FOUND)
882 message(FATAL_ERROR "OpenH264 support requested but not detected")
884 set(WITH_OPENH264 ${OPENH264_FOUND})
886 if ( (WITH_GSSAPI) AND (NOT GSS_FOUND))
887 message(WARNING "-DWITH_GSSAPI=ON is set, but not GSSAPI implementation was found, disabling")
889 if(GSS_FLAVOUR STREQUAL "MIT")
890 add_definitions("-DWITH_GSSAPI -DWITH_GSSAPI_MIT")
892 add_definitions("-DHAVE_AT_LEAST_KRB_V1_13")
894 include_directories(${_GSS_INCLUDE_DIR})
895 elseif(GSS_FLAVOUR STREQUAL "Heimdal")
896 add_definitions("-DWITH_GSSAPI -DWITH_GSSAPI_HEIMDAL")
897 include_directories(${_GSS_INCLUDE_DIR})
899 message(WARNING "Kerberos version not detected")
903 if(TARGET_ARCH MATCHES "x86|x64")
905 # Intel Performance Primitives
906 find_feature(IPP ${IPP_FEATURE_TYPE} ${IPP_FEATURE_PURPOSE} ${IPP_FEATURE_DESCRIPTION})
911 add_definitions("-DWITH_OPENSSL")
912 message(STATUS "Using OpenSSL Version: ${OPENSSL_VERSION}")
913 include_directories(${OPENSSL_INCLUDE_DIR})
917 add_definitions("-DWITH_MBEDTLS")
920 if (WITH_X264 OR WITH_OPENH264 OR WITH_MEDIA_FOUNDATION OR WITH_FFMPEG)
921 set(WITH_GFX_H264 ON)
923 set(WITH_GFX_H264 OFF)
926 # Android expects all libraries to be loadable
928 if (ANDROID OR WIN32 OR MAC_BUNDLE)
929 set(FREERDP_DATA_PATH "share")
930 if (NOT FREERDP_INSTALL_PREFIX)
931 set(FREERDP_INSTALL_PREFIX ".")
933 set(FREERDP_LIBRARY_PATH ".")
934 set(FREERDP_PLUGIN_PATH ".")
936 set(FREERDP_DATA_PATH "${CMAKE_INSTALL_PREFIX}/share/freerdp${FREERDP_VERSION_MAJOR}")
937 if (NOT FREERDP_INSTALL_PREFIX)
938 set(FREERDP_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
940 set(FREERDP_LIBRARY_PATH "${CMAKE_INSTALL_LIBDIR}")
941 set(FREERDP_PLUGIN_PATH "${CMAKE_INSTALL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}")
943 set(FREERDP_ADDIN_PATH "${FREERDP_PLUGIN_PATH}")
945 # Path to put extensions
946 set(FREERDP_EXTENSION_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}/extensions")
949 if(NOT DEFINED PROXY_PLUGINDIR)
950 message("using default plugins location")
951 set(FREERDP_PROXY_PLUGINDIR "${CMAKE_BINARY_DIR}/server/proxy/plugins")
953 set(FREERDP_PROXY_PLUGINDIR "${PROXY_PLUGINDIR}")
956 # Declare we have config.h, generated later on.
957 add_definitions("-DHAVE_CONFIG_H")
959 # Include directories
960 include_directories(${CMAKE_CURRENT_BINARY_DIR})
961 include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
962 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
964 # RPATH configuration
965 set(CMAKE_SKIP_BUILD_RPATH FALSE)
966 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
968 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)
969 set(CMAKE_INSTALL_RPATH "@loader_path/../Frameworks")
971 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
973 set(CMAKE_INSTALL_RPATH "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}:\$ORIGIN/..")
977 if (BUILD_SHARED_LIBS)
978 set(CMAKE_MACOSX_RPATH ON)
984 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
985 set(PROFILER_LIBRARIES
986 "${FREERDP_EXTERNAL_PROFILER_PATH}/obj/local/${ANDROID_ABI}/libandroid-ndk-profiler.a")
987 include_directories("${FREERDP_EXTERNAL_PROFILER_PATH}")
999 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
1001 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Testing")
1006 include_directories("${CMAKE_SOURCE_DIR}/winpr/include")
1007 include_directories("${CMAKE_BINARY_DIR}/winpr/include")
1009 if (${CMAKE_VERSION} VERSION_LESS 2.8.12)
1010 set(PUBLIC_KEYWORD "")
1011 set(PRIVATE_KEYWORD "")
1013 set(PUBLIC_KEYWORD "PUBLIC")
1014 set(PRIVATE_KEYWORD "PRIVATE")
1017 if(BUILD_SHARED_LIBS)
1018 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINPR_DLL")
1021 add_subdirectory(winpr)
1025 if(WITH_THIRD_PARTY)
1026 add_subdirectory(third-party)
1027 if (NOT "${THIRD_PARTY_INCLUDES}" STREQUAL "")
1028 include_directories(${THIRD_PARTY_INCLUDES})
1032 add_subdirectory(include)
1034 add_subdirectory(libfreerdp)
1037 set(CMAKE_OSX_DEPLOYMENT_TARGET "10.0")
1038 if (IOS_PLATFORM MATCHES "SIMULATOR")
1039 set(CMAKE_OSX_SYSROOT "iphonesimulator")
1041 set(CMAKE_OSX_SYSROOT "iphoneos")
1046 include_directories("${CMAKE_SOURCE_DIR}/rdtk/include")
1047 include_directories("${CMAKE_BINARY_DIR}/rdtk/include")
1049 add_subdirectory(rdtk)
1052 add_subdirectory(uwac)
1056 if(IS_DIRECTORY /usr/local/include)
1057 include_directories(/usr/local/include)
1058 link_directories(/usr/local/lib)
1061 if(IS_DIRECTORY /usr/X11R6/include)
1062 include_directories(/usr/X11R6/include)
1068 add_subdirectory(channels)
1071 if(WITH_CLIENT_COMMON OR WITH_CLIENT)
1072 add_subdirectory(client)
1076 add_subdirectory(server)
1079 # Configure files - Add last so all symbols are defined
1080 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
1084 set(CMAKE_CPACK_INCLUDE_FILE "CMakeCPack.cmake")
1086 if(NOT (VENDOR MATCHES "FreeRDP"))
1087 if(DEFINED CLIENT_VENDOR_PATH)
1088 if(EXISTS "${CMAKE_SOURCE_DIR}/${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
1089 set(CMAKE_CPACK_INCLUDE_FILE "${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
1094 #message("VENDOR: ${VENDOR} CLIENT_VENDOR_PATH: ${CLIENT_VENDOR_PATH} CMAKE_CPACK_INCLUDE_FILE: ${CMAKE_CPACK_INCLUDE_FILE}")
1096 include(${CMAKE_CPACK_INCLUDE_FILE})
1098 set(FREERDP_BUILD_CONFIG_LIST "")
1099 GET_CMAKE_PROPERTY(res VARIABLES)
1101 IF (var MATCHES "^WITH_*|^BUILD_TESTING|^BUILTIN_CHANNELS|^HAVE_*")
1102 LIST(APPEND FREERDP_BUILD_CONFIG_LIST "${var}=${${var}}")
1105 string(REPLACE ";" " " FREERDP_BUILD_CONFIG "${FREERDP_BUILD_CONFIG_LIST}")
1106 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/buildflags.h.in ${CMAKE_CURRENT_BINARY_DIR}/buildflags.h)