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