Merge pull request #3263 from akallabeth/tofu
[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 # Check for cmake compatibility (enable/disable features)
45 include(CheckCmakeCompat)
46
47 # Include cmake modules
48 include(CheckIncludeFiles)
49 include(CheckLibraryExists)
50 include(CheckSymbolExists)
51 include(CheckStructHasMember)
52 include(FindPkgConfig)
53 include(TestBigEndian)
54
55 include(FindFeature)
56 include(AutoVersioning)
57 include(ConfigOptions)
58 include(ComplexLibrary)
59 include(FeatureSummary)
60 include(CheckCCompilerFlag)
61 include(CheckCXXCompilerFlag)
62 include(GNUInstallDirsWrapper)
63 include(CMakePackageConfigHelpers)
64
65 # Soname versioning
66 set(BUILD_NUMBER 0)
67 if ($ENV{BUILD_NUMBER})
68   set(BUILD_NUMBER $ENV{BUILD_NUMBER})
69 endif()
70 set(WITH_LIBRARY_VERSIONING "ON")
71 set(FREERDP_VERSION_MAJOR "2")
72 set(FREERDP_VERSION_MINOR "0")
73 set(FREERDP_VERSION_REVISION "0")
74 set(FREERDP_VERSION_SUFFIX "dev")
75 set(FREERDP_API_VERSION "${FREERDP_VERSION_MAJOR}")
76 set(FREERDP_VERSION "${FREERDP_VERSION_MAJOR}.${FREERDP_VERSION_MINOR}.${FREERDP_VERSION_REVISION}")
77 if (FREERDP_VERSION_SUFFIX)
78         set(FREERDP_VERSION_FULL "${FREERDP_VERSION}-${FREERDP_VERSION_SUFFIX}")
79 else()
80         set(FREERDP_VERSION_FULL "${FREERDP_VERSION}")
81 endif()
82 set(FREERDP_INCLUDE_DIR "include/freerdp${FREERDP_VERSION_MAJOR}/")
83
84 # Make paths absolute
85 if (CMAKE_INSTALL_PREFIX)
86         get_filename_component(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" ABSOLUTE)
87 endif()
88 if (FREERDP_EXTERNAL_PATH)
89         get_filename_component (FREERDP_EXTERNAL_PATH "${FREERDP_EXTERNAL_PATH}" ABSOLUTE)
90 endif()
91
92 # Allow to search the host machine for git
93 if(ANDROID OR IOS)
94         SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
95 endif(ANDROID OR IOS)
96
97 include(GetGitRevisionDescription)
98 git_get_exact_tag(GIT_REVISION --tags --always)
99
100 if (${GIT_REVISION} STREQUAL "n/a")
101         git_rev_parse (GIT_REVISION --short)
102 endif()
103 if(ANDROID OR IOS)
104         SET (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
105 endif(ANDROID OR IOS)
106
107 message(STATUS "Git Revision ${GIT_REVISION}")
108
109 # Turn on solution folders (2.8.4+)
110 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
111
112 # Default to release build type
113 if(NOT CMAKE_BUILD_TYPE)
114         set(CMAKE_BUILD_TYPE "Release")
115 endif()
116
117 if(NOT DEFINED BUILD_SHARED_LIBS)
118         if(IOS OR APPLE)
119                 set(BUILD_SHARED_LIBS OFF)
120         else()
121                 set(BUILD_SHARED_LIBS ON)
122         endif()
123 endif()
124
125 if(BUILD_TESTING)
126     set(EXPORT_ALL_SYMBOLS TRUE)
127 elseif(NOT DEFINED EXPORT_ALL_SYMBOLS)
128     set(EXPORT_ALL_SYMBOLS FALSE)
129 endif()
130
131 # BSD
132 if(${CMAKE_SYSTEM_NAME} MATCHES "BSD")
133         set(BSD TRUE)
134         if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
135                 set(FREEBSD TRUE)
136         endif()
137         if(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
138                 set(OPENBSD TRUE)
139         endif()
140 endif()
141
142 # Configure MSVC Runtime
143 if(MSVC)
144         include(MSVCRuntime)
145         if(NOT DEFINED MSVC_RUNTIME)
146                 set(MSVC_RUNTIME "dynamic")
147         endif()
148         if(${MSVC_RUNTIME} STREQUAL "static")
149                 message(STATUS "Use the MSVC static runtime option carefully!")
150                 message(STATUS "OpenSSL uses /MD by default, and is very picky")
151                 message(STATUS "Random freeing errors are a common sign of runtime issues")
152         endif()
153         configure_msvc_runtime()
154
155         if(NOT DEFINED CMAKE_SUPPRESS_REGENERATION)
156                 set(CMAKE_SUPPRESS_REGENERATION ON)
157         endif()
158 endif()
159
160 # Compiler-specific flags
161 if(CMAKE_COMPILER_IS_GNUCC)
162         if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "i686")
163                 CHECK_SYMBOL_EXISTS(__x86_64__ "" IS_X86_64)
164                 if(IS_X86_64)
165                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
166                 else()
167                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686")
168                 endif()
169         else()
170                 if(CMAKE_POSITION_INDEPENDENT_CODE)
171                         if(${CMAKE_VERSION} VERSION_LESS 2.8.9)
172                                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
173                         endif()
174                 endif()
175         endif()
176
177         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
178
179         CHECK_C_COMPILER_FLAG (-Wno-unused-result Wno-unused-result)
180         if(Wno-unused-result)
181                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-result")
182         endif()
183         CHECK_C_COMPILER_FLAG (-Wno-unused-but-set-variable Wno-unused-but-set-variable)
184         if(Wno-unused-but-set-variable)
185                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-but-set-variable")
186         endif()
187         CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
188         if(Wno-deprecated-declarations)
189                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
190         endif()
191         CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
192         if(Wno-deprecated-declarationsCXX)
193                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
194         endif()
195
196         if(NOT EXPORT_ALL_SYMBOLS)
197                 message(STATUS "GCC default symbol visibility: hidden")
198                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
199         endif()
200         if(BUILD_TESTING)
201                 CHECK_C_COMPILER_FLAG(-Wno-format Wno-format)
202                 if(Wno-format)
203                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format")
204                 endif()
205         endif()
206         CHECK_C_COMPILER_FLAG (-Wimplicit-function-declaration Wimplicit-function-declaration)
207         if(Wimplicit-function-declaration)
208                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wimplicit-function-declaration")
209         endif()
210
211         if (NOT OPENBSD)
212                 CHECK_C_COMPILER_FLAG (-Wredundant-decls Wredundant-decls)
213                 if(Wredundant-decls)
214                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
215                 endif()
216         endif()
217         if(CMAKE_BUILD_TYPE STREQUAL "Release")
218                 set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG")
219                 set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG")
220
221                 CHECK_C_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefined)
222                 if(Wno-builtin-macro-redefined)
223                         set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Wno-builtin-macro-redefined")
224                         set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -D__FILE__='\"$(subst ${CMAKE_BINARY_DIR}/,,$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<)))\"'")
225                 endif()
226
227                 CHECK_CXX_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefinedCXX)
228                 if(Wno-builtin-macro-redefinedCXX)
229                         set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wno-builtin-macro-redefined")
230                         set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -D__FILE__='\"$(subst ${CMAKE_BINARY_DIR}/,,$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<)))\"'")
231                 endif()
232         else()
233                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
234                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
235         endif()
236         if(WITH_SSE2)
237                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2")
238         endif()
239 endif()
240
241 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
242         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
243         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-macros -Wno-padded")
244         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-c11-extensions -Wno-gnu")
245         if(WITH_SSE2)
246                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mssse3")
247         endif()
248         CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
249         if(Wno-deprecated-declarations)
250                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
251         endif()
252         CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
253         if(Wno-deprecated-declarationsCXX)
254                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
255         endif()
256 endif()
257
258 # Enable address sanitizer, where supported and when required
259 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCC)
260         if(WITH_SANITIZE_ADDRESS)
261                 if (DEFINED CMAKE_REQUIRED_FLAGS)
262                         set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
263                 endif()
264                 set(CMAKE_REQUIRED_FLAGS "-fsanitize=address")
265                 CHECK_C_COMPILER_FLAG ("-fsanitize=address" fsanitize-address)
266                 if(fsanitize-address)
267                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
268                 endif()
269                 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
270                         set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
271                 else()
272                         unset(CMAKE_REQUIRED_FLAGS)
273                 endif()
274
275                 CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
276                 if(fno-omit-frame-pointer)
277                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
278                 endif()
279         endif()
280         if (WITH_NO_UNDEFINED)
281                 if (DEFINED CMAKE_REQUIRED_FLAGS)
282                         set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
283                 endif()
284                 set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
285                 CHECK_C_COMPILER_FLAG (-Wl,--no-undefined no-undefined)
286                 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
287                         set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
288                         unset(SAVE_CMAKE_REQUIRED_FLAGS)
289                 else()
290                         unset(CMAKE_REQUIRED_FLAGS)
291                 endif()
292                 if(no-undefined)
293                         SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined" )
294                 endif()
295         endif()
296 endif()
297
298 if(MSVC)
299         # Remove previous warning definitions,
300         # NMake is otherwise complaining.
301         foreach (flags_var_to_scrub
302                 CMAKE_C_FLAGS
303                 CMAKE_CXX_FLAGS
304                 CMAKE_CXX_FLAGS_RELEASE
305                 CMAKE_CXX_FLAGS_RELWITHDEBINFO
306                 CMAKE_CXX_FLAGS_MINSIZEREL
307                 CMAKE_C_FLAGS_RELEASE
308                 CMAKE_C_FLAGS_RELWITHDEBINFO
309                 CMAKE_C_FLAGS_MINSIZEREL)
310                 string (REGEX REPLACE "(^| )[/-]W[ ]*[1-9]" " "
311                 "${flags_var_to_scrub}" "${${flags_var_to_scrub}}")
312         endforeach()
313
314         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gd")
315         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
316
317         if(CMAKE_SIZEOF_VOID_P EQUAL 8)
318                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_AMD64_")
319         else()
320                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_X86_")
321         endif()
322
323         set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
324         set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})
325
326         if(CMAKE_BUILD_TYPE STREQUAL "Release")
327         else()
328                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Zi")
329                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi")
330         endif()
331
332 endif()
333
334 if(WIN32)
335         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUNICODE -D_UNICODE")
336         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_SECURE_NO_WARNINGS")
337         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWIN32_LEAN_AND_MEAN")
338
339         set(CMAKE_USE_RELATIVE_PATH ON)
340         if (${CMAKE_GENERATOR} MATCHES "NMake Makefile*")
341                 set(CMAKE_PDB_BINARY_DIR ${CMAKE_BINARY_DIR})
342         elseif (${CMAKE_GENERATOR} MATCHES "Visual Studio*")
343                 set(CMAKE_PDB_BINARY_DIR "${CMAKE_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
344         else()
345                 message(FATAL "Unknown generator ${CMAKE_GENERATOR}")
346         endif()
347
348         # Set product and vendor for dll and exe version information.
349         set(RC_VERSION_VENDOR ${VENDOR})
350         set(RC_VERSION_PRODUCT ${PRODUCT})
351         set(RC_VERSION_PATCH ${BUILD_NUMBER})
352         set(RC_VERSION_DESCRIPTION ${GIT_REVISION})
353
354         string(TIMESTAMP RC_VERSION_YEAR "%Y")
355
356         if(NOT DEFINED CMAKE_WINDOWS_VERSION)
357                 set(CMAKE_WINDOWS_VERSION "WINXP")
358         endif()
359
360         if(CMAKE_WINDOWS_VERSION STREQUAL "WINXP")
361                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0501 -DWIN32_WINNT=0x0501")
362                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0501 -DWIN32_WINNT=0x0501")
363         elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN7")
364                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0601 -DWIN32_WINNT=0x0601")
365                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0601 -DWIN32_WINNT=0x0601")
366         elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN8")
367                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0602 -DWIN32_WINNT=0x0602")
368                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0602 -DWIN32_WINNT=0x0602")
369         endif()
370
371         if (FREERDP_EXTERNAL_SSL_PATH)
372                 set(OPENSSL_ROOT_DIR ${FREERDP_EXTERNAL_SSL_PATH})
373         endif()
374 endif()
375
376 if(IOS)
377         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_IOS_SDK_ROOT} -g")
378 endif()
379
380 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINPR_EXPORTS -DFREERDP_EXPORTS")
381 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINPR_EXPORTS -DFREERDP_EXPORTS")
382
383 # Include files
384 if(NOT IOS)
385         check_include_files(fcntl.h HAVE_FCNTL_H)
386         check_include_files(unistd.h HAVE_UNISTD_H)
387         check_include_files(execinfo.h HAVE_EXECINFO_H)
388         check_include_files(inttypes.h HAVE_INTTYPES_H)
389         check_include_files(sys/modem.h HAVE_SYS_MODEM_H)
390         check_include_files(sys/filio.h HAVE_SYS_FILIO_H)
391         check_include_files(sys/sockio.h HAVE_SYS_SOCKIO_H)
392         check_include_files(sys/strtio.h HAVE_SYS_STRTIO_H)
393         check_include_files(sys/select.h HAVE_SYS_SELECT_H)
394         check_include_files(syslog.h HAVE_SYSLOG_H)
395 else()
396         set(HAVE_FCNTL_H 1)
397         set(HAVE_UNISTD_H 1)
398         set(HAVE_INTTYPES_H 1)
399         set(HAVE_SYS_FILIO_H 1)
400 endif()
401
402 if(NOT IOS)
403         check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
404 else()
405         set(HAVE_TM_GMTOFF 1)
406 endif()
407
408 # Mac OS X
409 if(APPLE)
410         if(IOS)
411                 if (NOT FREERDP_IOS_EXTERNAL_SSL_PATH)
412                         message(STATUS "FREERDP_IOS_EXTERNAL_SSL_PATH not set! Required if openssl is not found in the iOS SDK (which usually isn't")
413                 endif()
414                 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_IOS_EXTERNAL_SSL_PATH})
415                 set_property(GLOBAL PROPERTY XCODE_ATTRIBUTE_SKIP_INSTALL YES)
416         else(IOS)
417                 if(NOT DEFINED CMAKE_OSX_ARCHITECTURES)
418                         set(CMAKE_OSX_ARCHITECTURES i386 x86_64)
419                 endif()
420
421                 if(IS_DIRECTORY /opt/local/include)
422                         include_directories(/opt/local/include)
423                         link_directories(/opt/local/lib)
424                 endif()
425         endif(IOS)
426
427 # Temporarily disabled, causes the cmake script to be reexecuted, causing the compilation to fail.
428 # Workaround: specify the parameter in the command-line
429 #       if(WITH_CLANG)
430 #               set(CMAKE_C_COMPILER "clang")
431 #       endif()
432
433         if (WITH_VERBOSE)
434                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -v")
435                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v")
436         endif()
437 endif(APPLE)
438
439 # OpenBSD
440 if(OPENBSD)
441         set(WITH_MANPAGES "ON")
442         set(WITH_ALSA "OFF")
443         set(WITH_PULSE "OFF")
444         set(WITH_OSS "ON")
445         set(WITH_WAYLAND "OFF")
446 endif()
447
448 # Android
449 if(ANDROID)
450         set(WITH_LIBRARY_VERSIONING "OFF")
451
452         if (${ANDROID_ABI} STREQUAL "armeabi")
453                 set (WITH_NEON OFF)
454         endif()
455
456         if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
457                 add_definitions(-DNDK_DEBUG=1)
458
459                 # NOTE: Manually add -gdwarf-3, as newer toolchains default to -gdwarf-4,
460                 #       which is not supported by the gdbserver binary shipped with
461                 #       the android NDK (tested with r9b)
462                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG} -gdwarf-3")
463         endif()
464         set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -llog")
465
466         if (NOT FREERDP_EXTERNAL_PATH)
467                 if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/")
468                         set (FREERDP_EXTERNAL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/")
469                 else()
470                         message(STATUS "FREERDP_EXTERNAL_PATH not set!")
471                 endif()
472         endif()
473
474         list (APPEND CMAKE_INCLUDE_PATH ${FREERDP_EXTERNAL_PATH}/include)
475         list (APPEND CMAKE_LIBRARY_PATH ${FREERDP_EXTERNAL_PATH}/${ANDROID_ABI}/ )
476         set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH )
477         set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH )
478
479         if (WITH_GPROF)
480                 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/gprof_generate.sh.cmake
481                         ${CMAKE_BINARY_DIR}/scripts/gprof_generate.sh @ONLY)
482         endif(WITH_GPROF)
483 endif()
484
485 set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
486
487 if(NOT IOS AND NOT ANDROID)
488         find_package(Threads REQUIRED)
489 endif()
490
491 if(NOT WIN32)
492         check_library_exists(pthread pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK)
493 endif()
494
495 if(WITH_VALGRIND_MEMCHECK)
496         check_include_files(valgrind/memcheck.h HAVE_VALGRIND_MEMCHECK_H)
497 else()
498         unset(HAVE_VALGRIND_MEMCHECK_H CACHE)
499 endif()
500
501 if(UNIX OR CYGWIN)
502         check_include_files(sys/eventfd.h HAVE_AIO_H)
503         check_include_files(sys/eventfd.h HAVE_EVENTFD_H)
504         if (HAVE_EVENTFD_H)
505                 check_symbol_exists(eventfd_read sys/eventfd.h WITH_EVENTFD_READ_WRITE)
506         endif()
507         check_include_files(sys/timerfd.h HAVE_TIMERFD_H)
508         check_include_files(poll.h HAVE_POLL_H)
509         list(APPEND CMAKE_REQUIRED_LIBRARIES m)
510         check_symbol_exists(ceill math.h HAVE_MATH_C99_LONG_DOUBLE)
511         list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES m)
512         set(X11_FEATURE_TYPE "RECOMMENDED")
513         set(WAYLAND_FEATURE_TYPE "RECOMMENDED")
514 else()
515         set(X11_FEATURE_TYPE "DISABLED")
516         set(WAYLAND_FEATURE_TYPE "DISABLED")
517 endif()
518
519 if(WITH_PCSC_WINPR)
520         find_package(PCSCWinPR)
521 endif()
522
523 set(X11_FEATURE_PURPOSE "X11")
524 set(X11_FEATURE_DESCRIPTION "X11 client and server")
525
526 set(WAYLAND_FEATURE_PURPOSE "Wayland")
527 set(WAYLAND_FEATURE_DESCRIPTION "Wayland client")
528
529 set(DIRECTFB_FEATURE_TYPE "OPTIONAL")
530 set(DIRECTFB_FEATURE_PURPOSE "DirectFB")
531 set(DIRECTFB_FEATURE_DESCRIPTION "DirectFB client")
532
533 set(ZLIB_FEATURE_TYPE "REQUIRED")
534 set(ZLIB_FEATURE_PURPOSE "compression")
535 set(ZLIB_FEATURE_DESCRIPTION "data compression")
536
537 set(OPENSSL_FEATURE_TYPE "REQUIRED")
538 set(OPENSSL_FEATURE_PURPOSE "cryptography")
539 set(OPENSSL_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
540
541 set(MBEDTLS_FEATURE_TYPE "OPTIONAL")
542 set(MBEDTLS_FEATURE_PURPOSE "cryptography")
543 set(MBEDTLS_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
544
545 set(OPENSLES_FEATURE_TYPE "OPTIONAL")
546 set(OPENSLES_FEATURE_PURPOSE "multimedia")
547 set(OPENSLES_FEATURE_DESCRIPTION "OpenSLES audio / video")
548
549 set(OSS_FEATURE_TYPE "RECOMMENDED")
550 set(OSS_FEATURE_PURPOSE "sound")
551 set(OSS_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
552
553 set(ALSA_FEATURE_TYPE "RECOMMENDED")
554 set(ALSA_FEATURE_PURPOSE "sound")
555 set(ALSA_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
556
557 set(PULSE_FEATURE_TYPE "OPTIONAL")
558 set(PULSE_FEATURE_PURPOSE "sound")
559 set(PULSE_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
560
561 set(CUPS_FEATURE_TYPE "OPTIONAL")
562 set(CUPS_FEATURE_PURPOSE "printing")
563 set(CUPS_FEATURE_DESCRIPTION "printer device redirection")
564
565 set(PCSC_FEATURE_TYPE "OPTIONAL")
566 set(PCSC_FEATURE_PURPOSE "smart card")
567 set(PCSC_FEATURE_DESCRIPTION "smart card device redirection")
568
569 set(FFMPEG_FEATURE_TYPE "RECOMMENDED")
570 set(FFMPEG_FEATURE_PURPOSE "multimedia")
571 set(FFMPEG_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
572
573 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
574 set(GSTREAMER_0_10_FEATURE_PURPOSE "multimedia")
575 set(GSTREAMER_0_10_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback, gstreamer 0.10 version")
576
577 set(GSTREAMER_1_0_FEATURE_TYPE "RECOMMENDED")
578 set(GSTREAMER_1_0_FEATURE_PURPOSE "multimedia")
579 set(GSTREAMER_1_0_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
580
581 set(IPP_FEATURE_TYPE "OPTIONAL")
582 set(IPP_FEATURE_PURPOSE "performance")
583 set(IPP_FEATURE_DESCRIPTION "Intel Integrated Performance Primitives library")
584
585 set(JPEG_FEATURE_TYPE "OPTIONAL")
586 set(JPEG_FEATURE_PURPOSE "codec")
587 set(JPEG_FEATURE_DESCRIPTION "use JPEG library")
588
589 set(X264_FEATURE_TYPE "OPTIONAL")
590 set(X264_FEATURE_PURPOSE "codec")
591 set(X264_FEATURE_DESCRIPTION "use x264 library")
592
593 set(OPENH264_FEATURE_TYPE "OPTIONAL")
594 set(OPENH264_FEATURE_PURPOSE "codec")
595 set(OPENH264_FEATURE_DESCRIPTION "use OpenH264 library")
596
597 set(GSM_FEATURE_TYPE "OPTIONAL")
598 set(GSM_FEATURE_PURPOSE "codec")
599 set(GSM_FEATURE_DESCRIPTION "GSM audio codec library")
600
601 if(WIN32)
602         set(X11_FEATURE_TYPE "DISABLED")
603         set(WAYLAND_FEATURE_TYPE "DISABLED")
604         set(ZLIB_FEATURE_TYPE "DISABLED")
605         set(DIRECTFB_FEATURE_TYPE "DISABLED")
606         set(OSS_FEATURE_TYPE "DISABLED")
607         set(ALSA_FEATURE_TYPE "DISABLED")
608         set(PULSE_FEATURE_TYPE "DISABLED")
609         set(CUPS_FEATURE_TYPE "DISABLED")
610         set(PCSC_FEATURE_TYPE "DISABLED")
611         set(FFMPEG_FEATURE_TYPE "DISABLED")
612         set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
613         set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
614         set(OPENSLES_FEATURE_TYPE "DISABLED")
615 endif()
616
617 if(APPLE)
618         set(DIRECTFB_FEATURE_TYPE "DISABLED")
619         set(FFMPEG_FEATURE_TYPE "OPTIONAL")
620         set(GSTREAMER_1_0_FEATURE_TYPE "OPTIONAL")
621         set(X11_FEATURE_TYPE "OPTIONAL")
622         set(WAYLAND_FEATURE_TYPE "DISABLED")
623         set(OSS_FEATURE_TYPE "DISABLED")
624         set(ALSA_FEATURE_TYPE "DISABLED")
625         if(IOS)
626                 set(X11_FEATURE_TYPE "DISABLED")
627                 set(PULSE_FEATURE_TYPE "DISABLED")
628                 set(CUPS_FEATURE_TYPE "DISABLED")
629                 set(PCSC_FEATURE_TYPE "DISABLED")
630                 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
631                 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
632         endif()
633         set(OPENSLES_FEATURE_TYPE "DISABLED")
634 endif()
635
636 if(UNIX AND NOT ANDROID)
637         set(WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE "RECOMMENDED")
638         set(WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE "systemd journal appender")
639         set(WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION "allows to export wLog to systemd journal")
640
641         #include(Findlibsystemd)
642         find_feature(libsystemd ${WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION})
643
644         if(LIBSYSTEMD_FOUND)
645                 set(HAVE_JOURNALD_H TRUE)
646         else()
647                 unset(HAVE_JOURNALD_H)
648         endif()
649 endif(UNIX AND NOT ANDROID)
650
651 if(ANDROID)
652         set(X11_FEATURE_TYPE "DISABLED")
653         set(WAYLAND_FEATURE_TYPE "DISABLED")
654         set(DIRECTFB_FEATURE_TYPE "DISABLED")
655         set(OSS_FEATURE_TYPE "DISABLED")
656         set(ALSA_FEATURE_TYPE "DISABLED")
657         set(PULSE_FEATURE_TYPE "DISABLED")
658         set(CUPS_FEATURE_TYPE "DISABLED")
659         set(PCSC_FEATURE_TYPE "DISABLED")
660         set(FFMPEG_FEATURE_TYPE "DISABLED")
661         set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
662         set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
663         set(OPENSLES_FEATURE_TYPE "REQUIRED")
664 endif()
665
666 find_feature(X11 ${X11_FEATURE_TYPE} ${X11_FEATURE_PURPOSE} ${X11_FEATURE_DESCRIPTION})
667 find_feature(Wayland ${WAYLAND_FEATURE_TYPE} ${WAYLAND_FEATURE_PURPOSE} ${WAYLAND_FEATURE_DESCRIPTION})
668 find_feature(DirectFB ${DIRECTFB_FEATURE_TYPE} ${DIRECTFB_FEATURE_PURPOSE} ${DIRECTFB_FEATURE_DESCRIPTION})
669 if (${WITH_DIRECTFB})
670         message(WARNING "DIRECTFB is orphaned and not maintained see docs/README.directfb for details")
671 endif()
672
673 find_feature(ZLIB ${ZLIB_FEATURE_TYPE} ${ZLIB_FEATURE_PURPOSE} ${ZLIB_FEATURE_DESCRIPTION})
674 find_feature(OpenSSL ${OPENSSL_FEATURE_TYPE} ${OPENSSL_FEATURE_PURPOSE} ${OPENSSL_FEATURE_DESCRIPTION})
675 find_feature(MbedTLS ${MBEDTLS_FEATURE_TYPE} ${MBEDTLS_FEATURE_PURPOSE} ${MBEDTLS_FEATURE_DESCRIPTION})
676 find_feature(OpenSLES ${OPENSLES_FEATURE_TYPE} ${OPENSLES_FEATURE_PURPOSE} ${OPENSLES_FEATURE_DESCRIPTION})
677
678 find_feature(OSS ${OSS_FEATURE_TYPE} ${OSS_FEATURE_PURPOSE} ${OSS_FEATURE_DESCRIPTION})
679 find_feature(ALSA ${ALSA_FEATURE_TYPE} ${ALSA_FEATURE_PURPOSE} ${ALSA_FEATURE_DESCRIPTION})
680 find_feature(Pulse ${PULSE_FEATURE_TYPE} ${PULSE_FEATURE_PURPOSE} ${PULSE_FEATURE_DESCRIPTION})
681
682 find_feature(Cups ${CUPS_FEATURE_TYPE} ${CUPS_FEATURE_PURPOSE} ${CUPS_FEATURE_DESCRIPTION})
683 find_feature(PCSC ${PCSC_FEATURE_TYPE} ${PCSC_FEATURE_PURPOSE} ${PCSC_FEATURE_DESCRIPTION})
684
685 find_feature(FFmpeg ${FFMPEG_FEATURE_TYPE} ${FFMPEG_FEATURE_PURPOSE} ${FFMPEG_FEATURE_DESCRIPTION})
686
687 find_feature(GStreamer_0_10 ${GSTREAMER_0_10_FEATURE_TYPE} ${GSTREAMER_0_10_FEATURE_PURPOSE} ${GSTREAMER_0_10_FEATURE_DESCRIPTION})
688 find_feature(GStreamer_1_0 ${GSTREAMER_1_0_FEATURE_TYPE} ${GSTREAMER_1_0_FEATURE_PURPOSE} ${GSTREAMER_1_0_FEATURE_DESCRIPTION})
689
690 find_feature(JPEG ${JPEG_FEATURE_TYPE} ${JPEG_FEATURE_PURPOSE} ${JPEG_FEATURE_DESCRIPTION})
691 find_feature(x264 ${X264_FEATURE_TYPE} ${X264_FEATURE_PURPOSE} ${X264_FEATURE_DESCRIPTION})
692 find_feature(OpenH264 ${OPENH264_FEATURE_TYPE} ${OPENH264_FEATURE_PURPOSE} ${OPENH264_FEATURE_DESCRIPTION})
693 find_feature(GSM ${GSM_FEATURE_TYPE} ${GSM_FEATURE_PURPOSE} ${GSM_FEATURE_DESCRIPTION})
694
695 if(TARGET_ARCH MATCHES "x86|x64")
696         if (NOT APPLE)
697                 # Intel Performance Primitives
698                 find_feature(IPP ${IPP_FEATURE_TYPE} ${IPP_FEATURE_PURPOSE} ${IPP_FEATURE_DESCRIPTION})
699         endif()
700 endif()
701
702 if(OPENSSL_FOUND)
703         add_definitions("-DWITH_OPENSSL")
704 endif()
705
706 if(MBEDTLS_FOUND)
707         add_definitions("-DWITH_MBEDTLS")
708 endif()
709
710 if (TARGET_ARCH MATCHES "sparc")
711         set(HAVE_ALIGNED_REQUIRED 1)
712 endif()
713
714 # Path to put FreeRDP data
715 set(FREERDP_DATA_PATH "${CMAKE_INSTALL_PREFIX}/share/freerdp${FREERDP_VERSION_MAJOR}")
716
717 # Path to put plugins
718
719 set(FREERDP_LIBRARY_PATH "${CMAKE_INSTALL_LIBDIR}")
720
721 set(FREERDP_PLUGIN_PATH "${CMAKE_INSTALL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}")
722 set(FREERDP_ADDIN_PATH "${FREERDP_PLUGIN_PATH}")
723
724 # Path to put extensions
725 set(FREERDP_EXTENSION_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}/extensions")
726
727 # Include directories
728 include_directories(${CMAKE_CURRENT_BINARY_DIR})
729 include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
730 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
731
732 # Configure files
733 add_definitions("-DHAVE_CONFIG_H")
734 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
735
736 # RPATH configuration
737 if(CMAKE_SKIP_RPATH)
738         set(CMAKE_SKIP_RPATH FALSE)
739         set(CMAKE_SKIP_INSTALL_RPATH TRUE)
740 endif()
741 set(CMAKE_SKIP_BUILD_RPATH FALSE)
742 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
743 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
744 set(CMAKE_INSTALL_RPATH "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}:\$ORIGIN/..")
745
746 # Android profiling
747 if(ANDROID)
748         if(WITH_GPROF)
749                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
750                 set(PROFILER_LIBRARIES
751                         "${FREERDP_EXTERNAL_PROFILER_PATH}/obj/local/${ANDROID_ABI}/libandroid-ndk-profiler.a")
752                 include_directories("${FREERDP_EXTERNAL_PROFILER_PATH}")
753         endif()
754 endif()
755
756 # Unit Tests
757
758 include(CTest)
759
760 if(BUILD_TESTING)
761         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFREERDP_TEST_EXPORTS")
762
763         enable_testing()
764
765         if(MSVC)
766                 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
767         else()
768                 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Testing")
769         endif()
770 endif()
771
772 # WinPR
773 include_directories("${CMAKE_SOURCE_DIR}/winpr/include")
774 include_directories("${CMAKE_BINARY_DIR}/winpr/include")
775
776 if (${CMAKE_VERSION} VERSION_LESS 2.8.12)
777         set(PUBLIC_KEYWORD "")
778         set(PRIVATE_KEYWORD "")
779 else()
780         set(PUBLIC_KEYWORD "PUBLIC")
781         set(PRIVATE_KEYWORD "PRIVATE")
782 endif()
783
784 add_subdirectory(winpr)
785
786 # Sub-directories
787
788 if(WITH_THIRD_PARTY)
789         add_subdirectory(third-party)
790         if (NOT "${THIRD_PARTY_INCLUDES}" STREQUAL "")
791                 include_directories(${THIRD_PARTY_INCLUDES})
792         endif()
793 endif()
794
795 add_subdirectory(include)
796
797 add_subdirectory(libfreerdp)
798
799 if (IOS)
800         set(CMAKE_OSX_DEPLOYMENT_TARGET "")
801         if (IOS_PLATFORM MATCHES "SIMULATOR")
802                 set(CMAKE_OSX_SYSROOT "iphonesimulator")
803         else()
804                 set(CMAKE_OSX_SYSROOT "iphoneos")
805         endif()
806 endif()
807
808 # RdTk
809 include_directories("${CMAKE_SOURCE_DIR}/rdtk/include")
810 include_directories("${CMAKE_BINARY_DIR}/rdtk/include")
811
812 add_subdirectory(rdtk)
813
814 if(WAYLAND_FOUND)
815     add_subdirectory(uwac)
816 endif()
817
818 if(BSD)
819         if(IS_DIRECTORY /usr/local/include)
820                 include_directories(/usr/local/include)
821                 link_directories(/usr/local/lib)
822         endif()
823         if(OPENBSD)
824                 if(IS_DIRECTORY /usr/X11R6/include)
825                         include_directories(/usr/X11R6/include)
826                 endif()
827         endif()
828 endif()
829
830 if(WITH_CHANNELS)
831         add_subdirectory(channels)
832 endif()
833
834 if(WITH_CLIENT_COMMON OR WITH_CLIENT)
835 add_subdirectory(client)
836 endif()
837
838 if(WITH_SERVER)
839         add_subdirectory(server)
840 endif()
841
842 # Packaging
843
844 set(CMAKE_CPACK_INCLUDE_FILE "CMakeCPack.cmake")
845
846 if(NOT (VENDOR MATCHES "FreeRDP"))
847         if(DEFINED CLIENT_VENDOR_PATH)
848                 if(EXISTS "${CMAKE_SOURCE_DIR}/${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
849                         set(CMAKE_CPACK_INCLUDE_FILE "${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
850                 endif()
851         endif()
852 endif()
853
854 #message("VENDOR: ${VENDOR} CLIENT_VENDOR_PATH: ${CLIENT_VENDOR_PATH} CMAKE_CPACK_INCLUDE_FILE: ${CMAKE_CPACK_INCLUDE_FILE}")
855
856 include(${CMAKE_CPACK_INCLUDE_FILE})
857
858 set(FREERDP_BUILD_CONFIG_LIST "")
859 GET_CMAKE_PROPERTY(res VARIABLES)
860 FOREACH(var ${res})
861  IF (var MATCHES "^WITH_*|^BUILD_TESTING|^STATIC_CHANNELS|^HAVE_*")
862         LIST(APPEND FREERDP_BUILD_CONFIG_LIST "${var}=${${var}}")
863  ENDIF()
864 ENDFOREACH()
865 string(REPLACE ";" " " FREERDP_BUILD_CONFIG "${FREERDP_BUILD_CONFIG_LIST}")
866 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/buildflags.h.in ${CMAKE_CURRENT_BINARY_DIR}/buildflags.h)