Use CMake to detect availability of getlogin_r
[platform/upstream/freerdp.git] / CMakeLists.txt
1 # FreeRDP: A Remote Desktop Protocol Implementation
2 # FreeRDP cmake build script
3 #
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
8 #
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
12 #
13 #     http://www.apache.org/licenses/LICENSE-2.0
14 #
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.
20
21 cmake_minimum_required(VERSION 2.8)
22
23 project(FreeRDP C CXX)
24
25 if(NOT DEFINED VENDOR)
26         set(VENDOR "FreeRDP" CACHE STRING "FreeRDP package vendor")
27 endif()
28
29 if(NOT DEFINED PRODUCT)
30         set(PRODUCT "FreeRDP" CACHE STRING "FreeRDP package name")
31 endif()
32
33 if(NOT DEFINED FREERDP_VENDOR)
34         set(FREERDP_VENDOR 1)
35 endif()
36
37 set(CMAKE_COLOR_MAKEFILE ON)
38
39 set(CMAKE_POSITION_INDEPENDENT_CODE ON)
40
41 # Include our extra modules
42 set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/)
43
44 if((CMAKE_SYSTEM_NAME MATCHES "WindowsStore") AND (CMAKE_SYSTEM_VERSION MATCHES "10.0"))
45         set(UWP 1)
46         add_definitions("-D_UWP")
47         set(CMAKE_WINDOWS_VERSION "WIN10")
48 endif()
49
50 # Check for cmake compatibility (enable/disable features)
51 include(CheckCmakeCompat)
52
53 # Include cmake modules
54 if(WITH_CLANG_FORMAT)
55         include(ClangFormat)
56 endif()
57
58 include(CheckIncludeFiles)
59 include(CheckLibraryExists)
60 include(CheckSymbolExists)
61 include(CheckStructHasMember)
62 include(FindPkgConfig)
63 include(TestBigEndian)
64
65 include(FindFeature)
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)
76
77 # Soname versioning
78 set(BUILD_NUMBER 0)
79 if ($ENV{BUILD_NUMBER})
80         set(BUILD_NUMBER $ENV{BUILD_NUMBER})
81 endif()
82 set(WITH_LIBRARY_VERSIONING "ON")
83
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})
91         endif()
92 endif()
93 string(STRIP ${RAW_VERSION_STRING} RAW_VERSION_STRING)
94
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}")
100
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}")
105 else()
106         set(FREERDP_VERSION_FULL "${FREERDP_VERSION}")
107 endif()
108 message("FREERDP_VERSION=${FREERDP_VERSION_FULL}")
109
110 set(FREERDP_INCLUDE_DIR "include/freerdp${FREERDP_VERSION_MAJOR}/")
111
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)
116 endif()
117
118 # Make paths absolute
119 if (CMAKE_INSTALL_PREFIX)
120         get_filename_component(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" ABSOLUTE)
121 endif()
122 if (FREERDP_EXTERNAL_PATH)
123         get_filename_component (FREERDP_EXTERNAL_PATH "${FREERDP_EXTERNAL_PATH}" ABSOLUTE)
124 endif()
125
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)
130
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)
140         else()
141                 set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE})
142                 set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE})
143         endif()
144 endif(CCACHE AND WITH_CCACHE)
145
146 if(EXISTS "${CMAKE_SOURCE_DIR}/.source_version" )
147         file(READ ${CMAKE_SOURCE_DIR}/.source_version GIT_REVISION)
148
149   string(STRIP ${GIT_REVISION} GIT_REVISION)
150 else()
151         git_get_exact_tag(GIT_REVISION --tags --always)
152
153         if (${GIT_REVISION} STREQUAL "n/a")
154                 git_rev_parse (GIT_REVISION --short)
155         endif()
156 endif()
157
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
162
163 message(STATUS "Git Revision ${GIT_REVISION}")
164
165 # Turn on solution folders (2.8.4+)
166 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
167
168 # Default to release build type
169 if(NOT CMAKE_BUILD_TYPE)
170         set(CMAKE_BUILD_TYPE "Release")
171 endif()
172
173 if(NOT DEFINED BUILD_SHARED_LIBS)
174         if(IOS)
175                 set(BUILD_SHARED_LIBS OFF)
176         else()
177                 set(BUILD_SHARED_LIBS ON)
178         endif()
179 endif()
180
181 if(BUILD_TESTING)
182         set(EXPORT_ALL_SYMBOLS TRUE)
183 elseif(NOT DEFINED EXPORT_ALL_SYMBOLS)
184         set(EXPORT_ALL_SYMBOLS FALSE)
185 endif()
186
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)
191
192 # BSD
193 if(${CMAKE_SYSTEM_NAME} MATCHES "BSD")
194         set(BSD TRUE)
195         if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
196                 set(FREEBSD TRUE)
197         endif()
198         if(${CMAKE_SYSTEM_NAME} MATCHES "kFreeBSD")
199                 set(KFREEBSD TRUE)
200         endif()
201         if(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
202                 set(OPENBSD TRUE)
203         endif()
204 endif()
205
206 if(${CMAKE_SYSTEM_NAME} MATCHES "DragonFly")
207         set(BSD TRUE)
208         set(FREEBSD TRUE)
209 endif()
210
211 if(FREEBSD)
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)
214 endif()
215
216 # Configure MSVC Runtime
217 if(MSVC)
218         include(MSVCRuntime)
219         if(NOT DEFINED MSVC_RUNTIME)
220                 set(MSVC_RUNTIME "dynamic")
221         endif()
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")
225                 endif()
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")
229         endif()
230         configure_msvc_runtime()
231
232         if(NOT DEFINED CMAKE_SUPPRESS_REGENERATION)
233                 set(CMAKE_SUPPRESS_REGENERATION ON)
234         endif()
235 endif()
236
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")
240 endif()
241
242 # Use Standard conforming getpwnam_r() on Solaris.
243 if("${CMAKE_SYSTEM_NAME}" MATCHES "SunOS")
244         add_definitions("-D_POSIX_PTHREAD_SEMANTICS")
245 endif()
246
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)
251                 if(IS_X86_64)
252                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
253                 else()
254                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686")
255                 endif()
256         else()
257                 if(CMAKE_POSITION_INDEPENDENT_CODE)
258                         if(${CMAKE_VERSION} VERSION_LESS 2.8.9)
259                                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
260                         endif()
261                 endif()
262         endif()
263
264         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
265
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")
269         endif()
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")
273         endif()
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")
277         endif()
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")
281         endif()
282
283         if(NOT EXPORT_ALL_SYMBOLS)
284                 message(STATUS "GCC default symbol visibility: hidden")
285                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
286         endif()
287         if(BUILD_TESTING)
288                 CHECK_C_COMPILER_FLAG(-Wno-format Wno-format)
289                 if(Wno-format)
290                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format")
291                 endif()
292         endif()
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")
296         endif()
297
298         if (NOT OPENBSD)
299                 CHECK_C_COMPILER_FLAG (-Wredundant-decls Wredundant-decls)
300                 if(Wredundant-decls)
301                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
302                 endif()
303         endif()
304         if(CMAKE_BUILD_TYPE STREQUAL "Release")
305                 add_definitions(-DNDEBUG)
306         else()
307                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
308                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
309         endif()
310 endif()
311
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 $<)))\"'")
320                 endif()
321
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 $<)))\"'")
325                 endif()
326         endif()
327 endif()
328
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")
337         endif()
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")
341         endif()
342 endif()
343
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})
347
348         CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
349
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)
357
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")
362
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)
366
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)
370
371                 else(fsanitize-address)
372                         message(WARNING "Missing support for address sanitizer!")
373                 endif(fsanitize-address)
374
375                 if(fno-omit-frame-pointer)
376                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
377                 endif()
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)
385
386                 if(fsanitize-memory)
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")
390
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)
394
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)
398
399                         if (fsanitize-memory-track-origins)
400                                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-memory-track-origins")
401                         endif(fsanitize-memory-track-origins)
402
403                 else(fsanitize-memory)
404                         message(WARNING "Missing support for memory sanitizer!")
405                 endif(fsanitize-memory)
406
407                 if(fno-omit-frame-pointer)
408                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
409                 endif()
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)
414                 if(fsanitize-thread)
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)
425
426                 if(fno-omit-frame-pointer)
427                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
428                 endif()
429         endif()
430
431         file(REMOVE ${CMAKE_BINARY_DIR}/foo.txt)
432
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)
437
438                 if(no-undefined)
439                         SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined" )
440                 endif()
441         endif()
442
443         set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVED})
444 endif()
445
446 if(MSVC)
447         # Remove previous warning definitions,
448         # NMake is otherwise complaining.
449         foreach (flags_var_to_scrub
450                 CMAKE_C_FLAGS
451                 CMAKE_CXX_FLAGS
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}}")
460         endforeach()
461
462         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gd")
463         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
464
465         if(CMAKE_SIZEOF_VOID_P EQUAL 8)
466                 add_definitions(-D_AMD64_)
467         else()
468                 add_definitions(-D_X86_)
469         endif()
470
471         set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
472         set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})
473
474         if(CMAKE_BUILD_TYPE STREQUAL "Release")
475         else()
476                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Zi")
477                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi")
478         endif()
479
480 endif()
481
482 if(WIN32)
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)
487
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}")
493         else()
494                 message(FATAL_ERROR "Unknown generator ${CMAKE_GENERATOR}")
495         endif()
496
497         string(TIMESTAMP RC_VERSION_YEAR "%Y")
498
499         if(NOT DEFINED CMAKE_WINDOWS_VERSION)
500                 set(CMAKE_WINDOWS_VERSION "WIN7")
501         endif()
502
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)
511         endif()
512
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}")
518
519         if (FREERDP_EXTERNAL_SSL_PATH)
520                 set(OPENSSL_ROOT_DIR ${FREERDP_EXTERNAL_SSL_PATH})
521         endif()
522 endif()
523
524 if(IOS)
525         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_IOS_SDK_ROOT} -g")
526 endif()
527
528 add_definitions(-DWINPR_EXPORTS -DFREERDP_EXPORTS)
529
530 # Include files
531 if(NOT IOS)
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)
542 else()
543         set(HAVE_FCNTL_H 1)
544         set(HAVE_UNISTD_H 1)
545         set(HAVE_INTTYPES_H 1)
546         set(HAVE_SYS_FILIO_H 1)
547 endif()
548
549 if(NOT IOS)
550         check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
551 else()
552         set(HAVE_TM_GMTOFF 1)
553 endif()
554
555 # Mac OS X
556 if(APPLE)
557         if(IOS)
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")
560                 endif()
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)
563         else(IOS)
564                 if(NOT DEFINED CMAKE_OSX_ARCHITECTURES)
565                         set(CMAKE_OSX_ARCHITECTURES i386 x86_64)
566                 endif()
567         endif(IOS)
568
569 # Temporarily disabled, causes the cmake script to be reexecuted, causing the compilation to fail.
570 # Workaround: specify the parameter in the command-line
571 #       if(WITH_CLANG)
572 #               set(CMAKE_C_COMPILER "clang")
573 #       endif()
574
575         if (WITH_VERBOSE)
576                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -v")
577                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v")
578         endif()
579 endif(APPLE)
580
581 # OpenBSD
582 if(OPENBSD)
583         set(WITH_MANPAGES "ON")
584         set(WITH_ALSA "OFF")
585         set(WITH_PULSE "OFF")
586         set(WITH_OSS "ON")
587         set(WITH_WAYLAND "OFF")
588 endif()
589
590 # Android
591 if(ANDROID)
592         set(WITH_LIBRARY_VERSIONING "OFF")
593
594         set_property( GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ${ANDROID_LIBRARY_USE_LIB64_PATHS} )
595
596         if (${ANDROID_ABI} STREQUAL "armeabi")
597                 set (WITH_NEON OFF)
598         endif()
599
600         if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
601                 add_definitions(-DNDK_DEBUG=1)
602
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")
607         endif()
608         set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -llog")
609
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/")
613                 else()
614                         message(STATUS "FREERDP_EXTERNAL_PATH not set!")
615                 endif()
616         endif()
617
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 )
622
623         if (WITH_GPROF)
624                 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/gprof_generate.sh.cmake
625                         ${CMAKE_BINARY_DIR}/scripts/gprof_generate.sh @ONLY)
626         endif(WITH_GPROF)
627 endif()
628
629 set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
630
631 if(NOT IOS)
632         find_package(Threads REQUIRED)
633 endif()
634
635 if(NOT WIN32)
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)
643
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)
647 endif()
648
649 if(WITH_VALGRIND_MEMCHECK)
650         check_include_files(valgrind/memcheck.h HAVE_VALGRIND_MEMCHECK_H)
651 else()
652         unset(HAVE_VALGRIND_MEMCHECK_H CACHE)
653 endif()
654
655 if(UNIX OR CYGWIN)
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)
660         endif()
661         if (FREEBSD)
662                 list(APPEND CMAKE_REQUIRED_INCLUDES ${EPOLLSHIM_INCLUDE_DIR})
663         endif()
664         check_include_files(sys/timerfd.h HAVE_SYS_TIMERFD_H)
665         if (FREEBSD)
666                 list(REMOVE_ITEM CMAKE_REQUIRED_INCLUDES ${EPOLLSHIM_INCLUDE_DIR})
667         endif()
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")
674
675     include(CheckFunctionExists)
676
677     check_function_exists(getlogin_r HAVE_GETLOGIN_R)
678 else()
679         set(X11_FEATURE_TYPE "DISABLED")
680         set(WAYLAND_FEATURE_TYPE "DISABLED")
681 endif()
682
683 if(WITH_PCSC_WINPR)
684         find_package(PCSCWinPR)
685 endif()
686
687 set(X11_FEATURE_PURPOSE "X11")
688 set(X11_FEATURE_DESCRIPTION "X11 client and server")
689
690 set(WAYLAND_FEATURE_PURPOSE "Wayland")
691 set(WAYLAND_FEATURE_DESCRIPTION "Wayland client")
692
693 set(ZLIB_FEATURE_TYPE "REQUIRED")
694 set(ZLIB_FEATURE_PURPOSE "compression")
695 set(ZLIB_FEATURE_DESCRIPTION "data compression")
696
697 set(OPENSSL_FEATURE_TYPE "REQUIRED")
698 set(OPENSSL_FEATURE_PURPOSE "cryptography")
699 set(OPENSSL_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
700
701 set(MBEDTLS_FEATURE_TYPE "OPTIONAL")
702 set(MBEDTLS_FEATURE_PURPOSE "cryptography")
703 set(MBEDTLS_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
704
705 set(OPENSLES_FEATURE_TYPE "OPTIONAL")
706 set(OPENSLES_FEATURE_PURPOSE "multimedia")
707 set(OPENSLES_FEATURE_DESCRIPTION "OpenSLES audio / video")
708
709 set(OSS_FEATURE_TYPE "RECOMMENDED")
710 set(OSS_FEATURE_PURPOSE "sound")
711 set(OSS_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
712
713 set(ALSA_FEATURE_TYPE "RECOMMENDED")
714 set(ALSA_FEATURE_PURPOSE "sound")
715 set(ALSA_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
716
717 set(PULSE_FEATURE_TYPE "RECOMMENDED")
718 set(PULSE_FEATURE_PURPOSE "sound")
719 set(PULSE_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
720
721 set(CUPS_FEATURE_TYPE "RECOMMENDED")
722 set(CUPS_FEATURE_PURPOSE "printing")
723 set(CUPS_FEATURE_DESCRIPTION "printer device redirection")
724
725 set(PCSC_FEATURE_TYPE "RECOMMENDED")
726 set(PCSC_FEATURE_PURPOSE "smart card")
727 set(PCSC_FEATURE_DESCRIPTION "smart card device redirection")
728
729 set(FFMPEG_FEATURE_TYPE "RECOMMENDED")
730 set(FFMPEG_FEATURE_PURPOSE "multimedia")
731 set(FFMPEG_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
732
733 set(VAAPI_FEATURE_TYPE "OPTIONAL")
734 set(VAAPI_FEATURE_PURPOSE "multimedia")
735 set(VAAPI_FEATURE_DESCRIPTION "VA-API hardware acceleration for video playback")
736
737 set(IPP_FEATURE_TYPE "OPTIONAL")
738 set(IPP_FEATURE_PURPOSE "performance")
739 set(IPP_FEATURE_DESCRIPTION "Intel Integrated Performance Primitives library")
740
741 set(JPEG_FEATURE_TYPE "OPTIONAL")
742 set(JPEG_FEATURE_PURPOSE "codec")
743 set(JPEG_FEATURE_DESCRIPTION "use JPEG library")
744
745 set(X264_FEATURE_TYPE "OPTIONAL")
746 set(X264_FEATURE_PURPOSE "codec")
747 set(X264_FEATURE_DESCRIPTION "use x264 library")
748
749 set(OPENH264_FEATURE_TYPE "OPTIONAL")
750 set(OPENH264_FEATURE_PURPOSE "codec")
751 set(OPENH264_FEATURE_DESCRIPTION "use OpenH264 library")
752
753 set(OPENCL_FEATURE_TYPE "OPTIONAL")
754 set(OPENCL_FEATURE_PURPOSE "codec")
755 set(OPENCL_FEATURE_DESCRIPTION "use OpenCL library")
756
757 set(GSM_FEATURE_TYPE "OPTIONAL")
758 set(GSM_FEATURE_PURPOSE "codec")
759 set(GSM_FEATURE_DESCRIPTION "GSM audio codec library")
760
761 set(LAME_FEATURE_TYPE "OPTIONAL")
762 set(LAME_FEATURE_PURPOSE "codec")
763 set(LAME_FEATURE_DESCRIPTION "lame MP3 audio codec library")
764
765 set(FAAD2_FEATURE_TYPE "OPTIONAL")
766 set(FAAD2_FEATURE_PURPOSE "codec")
767 set(FAAD2_FEATURE_DESCRIPTION "FAAD2 AAC audio codec library")
768
769 set(FAAC_FEATURE_TYPE "OPTIONAL")
770 set(FAAC_FEATURE_PURPOSE "codec")
771 set(FAAC_FEATURE_DESCRIPTION "FAAC AAC audio codec library")
772
773 set(SOXR_FEATURE_TYPE "OPTIONAL")
774 set(SOXR_FEATURE_PURPOSE "codec")
775 set(SOXR_FEATURE_DESCRIPTION "SOX audio resample library")
776
777 set(GSSAPI_FEATURE_TYPE "OPTIONAL")
778 set(GSSAPI_FEATURE_PURPOSE "auth")
779 set(GSSAPI_FEATURE_DESCRIPTION "add kerberos support")
780
781 if(WIN32)
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")
793 endif()
794
795 if(APPLE)
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")
802         if(IOS)
803                 set(X11_FEATURE_TYPE "DISABLED")
804                 set(PULSE_FEATURE_TYPE "DISABLED")
805                 set(CUPS_FEATURE_TYPE "DISABLED")
806                 set(PCSC_FEATURE_TYPE "DISABLED")
807         endif()
808         set(OPENSLES_FEATURE_TYPE "DISABLED")
809 endif()
810
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")
815
816         #include(Findlibsystemd)
817         find_feature(libsystemd ${WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION})
818
819         if(LIBSYSTEMD_FOUND)
820                 set(HAVE_JOURNALD_H TRUE)
821         else()
822                 unset(HAVE_JOURNALD_H)
823         endif()
824 endif(UNIX AND NOT ANDROID)
825
826 if(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")
837 endif()
838
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})
841
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})
846
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})
850
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})
853
854 find_feature(FFmpeg ${FFMPEG_FEATURE_TYPE} ${FFMPEG_FEATURE_PURPOSE} ${FFMPEG_FEATURE_DESCRIPTION})
855
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})
865
866 find_feature(GSSAPI ${GSSAPI_FEATURE_TYPE} ${GSSAPI_FEATURE_PURPOSE} ${GSSAPI_FEATURE_DESCRIPTION})
867
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)
871
872 if ((WITH_FFMPEG OR WITH_DSP_FFMPEG) AND NOT FFMPEG_FOUND)
873         message(FATAL_ERROR "FFMPEG support requested but not detected")
874 endif()
875 set(WITH_FFMPEG ${FFMPEG_FOUND})
876
877 # Version check, if we have detected FFMPEG but the version is too old
878 # deactivate it as sound backend.
879 if (WITH_DSP_FFMPEG)
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})
885         IF(litem)
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})
894         ENDIF(litem)
895         ENDFOREACH(item ${AV_VERSION_FILE})
896
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)
901         endif()
902 endif (WITH_DSP_FFMPEG)
903
904 if (WITH_OPENH264 AND NOT OPENH264_FOUND)
905         message(FATAL_ERROR "OpenH264 support requested but not detected")
906 endif()
907 set(WITH_OPENH264 ${OPENH264_FOUND})
908
909 if ( (WITH_GSSAPI) AND (NOT GSS_FOUND))
910         message(WARNING "-DWITH_GSSAPI=ON is set, but not GSSAPI implementation was found, disabling")
911 elseif(WITH_GSSAPI)
912         if(GSS_FLAVOUR STREQUAL "MIT")
913                 add_definitions("-DWITH_GSSAPI -DWITH_GSSAPI_MIT")
914                 if(GSS_VERSION_1_13)
915                         add_definitions("-DHAVE_AT_LEAST_KRB_V1_13")
916                 endif()
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})
921         else()
922                 message(WARNING "Kerberos version not detected")
923         endif()
924 endif()
925
926 if(TARGET_ARCH MATCHES "x86|x64")
927         if (NOT APPLE)
928                 # Intel Performance Primitives
929                 find_feature(IPP ${IPP_FEATURE_TYPE} ${IPP_FEATURE_PURPOSE} ${IPP_FEATURE_DESCRIPTION})
930         endif()
931 endif()
932
933 if(OPENSSL_FOUND)
934         add_definitions("-DWITH_OPENSSL")
935         message(STATUS "Using OpenSSL Version: ${OPENSSL_VERSION}")
936         include_directories(${OPENSSL_INCLUDE_DIR})
937 endif()
938
939 if(MBEDTLS_FOUND)
940         add_definitions("-DWITH_MBEDTLS")
941 endif()
942
943 if (WITH_X264 OR WITH_OPENH264 OR WITH_MEDIA_FOUNDATION OR WITH_FFMPEG)
944         set(WITH_GFX_H264 ON)
945 else()
946         set(WITH_GFX_H264 OFF)
947 endif()
948
949 # Android expects all libraries to be loadable
950 # without paths.
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 ".")
955   endif()
956   set(FREERDP_LIBRARY_PATH ".")
957   set(FREERDP_PLUGIN_PATH ".")
958 else()
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}")
962         endif()
963         set(FREERDP_LIBRARY_PATH "${CMAKE_INSTALL_LIBDIR}")
964         set(FREERDP_PLUGIN_PATH "${CMAKE_INSTALL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}")
965 endif()
966 set(FREERDP_ADDIN_PATH "${FREERDP_PLUGIN_PATH}")
967
968 # Path to put extensions
969 set(FREERDP_EXTENSION_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}/extensions")
970
971 # Proxy plugins path
972 if(NOT DEFINED PROXY_PLUGINDIR)
973         message("using default plugins location")
974         set(FREERDP_PROXY_PLUGINDIR "${CMAKE_BINARY_DIR}/server/proxy/plugins")
975 else()
976         set(FREERDP_PROXY_PLUGINDIR "${PROXY_PLUGINDIR}")
977 endif()
978
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)
983
984 # Configure files
985 add_definitions("-DHAVE_CONFIG_H")
986 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
987
988 # RPATH configuration
989 set(CMAKE_SKIP_BUILD_RPATH FALSE)
990 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
991 if (APPLE)
992         set(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)
993         set(CMAKE_INSTALL_RPATH "@loader_path/../Frameworks")
994 else (APPLE)
995         set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
996         if (NOT FREEBSD)
997                 set(CMAKE_INSTALL_RPATH "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}:\$ORIGIN/..")
998         endif()
999 endif(APPLE)
1000
1001 if (BUILD_SHARED_LIBS)
1002         set(CMAKE_MACOSX_RPATH ON)
1003 endif()
1004
1005 # Android profiling
1006 if(ANDROID)
1007         if(WITH_GPROF)
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}")
1012         endif()
1013 endif()
1014
1015 # Unit Tests
1016
1017 include(CTest)
1018
1019 if(BUILD_TESTING)
1020         enable_testing()
1021
1022         if(MSVC)
1023                 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
1024         else()
1025                 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Testing")
1026         endif()
1027 endif()
1028
1029 # WinPR
1030 include_directories("${CMAKE_SOURCE_DIR}/winpr/include")
1031 include_directories("${CMAKE_BINARY_DIR}/winpr/include")
1032
1033 if (${CMAKE_VERSION} VERSION_LESS 2.8.12)
1034         set(PUBLIC_KEYWORD "")
1035         set(PRIVATE_KEYWORD "")
1036 else()
1037         set(PUBLIC_KEYWORD "PUBLIC")
1038         set(PRIVATE_KEYWORD "PRIVATE")
1039 endif()
1040
1041 if(BUILD_SHARED_LIBS)
1042         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINPR_DLL")
1043 endif()
1044
1045 add_subdirectory(winpr)
1046
1047 # Sub-directories
1048
1049 if(WITH_THIRD_PARTY)
1050         add_subdirectory(third-party)
1051         if (NOT "${THIRD_PARTY_INCLUDES}" STREQUAL "")
1052                 include_directories(${THIRD_PARTY_INCLUDES})
1053         endif()
1054 endif()
1055
1056 add_subdirectory(include)
1057
1058 add_subdirectory(libfreerdp)
1059
1060 if (IOS)
1061         set(CMAKE_OSX_DEPLOYMENT_TARGET "10.0")
1062         if (IOS_PLATFORM MATCHES "SIMULATOR")
1063                 set(CMAKE_OSX_SYSROOT "iphonesimulator")
1064         else()
1065                 set(CMAKE_OSX_SYSROOT "iphoneos")
1066         endif()
1067 endif()
1068
1069 # RdTk
1070 include_directories("${CMAKE_SOURCE_DIR}/rdtk/include")
1071 include_directories("${CMAKE_BINARY_DIR}/rdtk/include")
1072
1073 add_subdirectory(rdtk)
1074
1075 if(WAYLAND_FOUND)
1076         add_subdirectory(uwac)
1077 endif()
1078
1079 if(BSD)
1080         if(IS_DIRECTORY /usr/local/include)
1081                 include_directories(/usr/local/include)
1082                 link_directories(/usr/local/lib)
1083         endif()
1084         if(OPENBSD)
1085                 if(IS_DIRECTORY /usr/X11R6/include)
1086                         include_directories(/usr/X11R6/include)
1087                 endif()
1088         endif()
1089 endif()
1090
1091 if(WITH_CHANNELS)
1092         add_subdirectory(channels)
1093 endif()
1094
1095 if(WITH_CLIENT_COMMON OR WITH_CLIENT)
1096 add_subdirectory(client)
1097 endif()
1098
1099 if(WITH_SERVER)
1100         add_subdirectory(server)
1101 endif()
1102
1103 # Packaging
1104
1105 set(CMAKE_CPACK_INCLUDE_FILE "CMakeCPack.cmake")
1106
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")
1111                 endif()
1112         endif()
1113 endif()
1114
1115 #message("VENDOR: ${VENDOR} CLIENT_VENDOR_PATH: ${CLIENT_VENDOR_PATH} CMAKE_CPACK_INCLUDE_FILE: ${CMAKE_CPACK_INCLUDE_FILE}")
1116
1117 include(${CMAKE_CPACK_INCLUDE_FILE})
1118
1119 set(FREERDP_BUILD_CONFIG_LIST "")
1120 GET_CMAKE_PROPERTY(res VARIABLES)
1121 FOREACH(var ${res})
1122         IF (var MATCHES "^WITH_*|^BUILD_TESTING|^BUILTIN_CHANNELS|^HAVE_*")
1123                 LIST(APPEND FREERDP_BUILD_CONFIG_LIST "${var}=${${var}}")
1124         ENDIF()
1125 ENDFOREACH()
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)