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