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