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