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