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