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