FreeRDP/winpr/CMakeLists.txt

262 lines
8.6 KiB
CMake
Raw Normal View History

2012-05-06 06:09:08 +04:00
# WinPR: Windows Portable Runtime
2012-05-21 04:54:22 +04:00
# winpr cmake build script
2012-05-06 06:09:08 +04:00
#
# Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
2012-05-06 06:09:08 +04:00
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
if (NOT FREERDP_UNIFIED_BUILD)
cmake_minimum_required(VERSION 3.4)
project(WinPR LANGUAGES C)
set(CMAKE_COLOR_MAKEFILE ON)
option(WITH_LIBRARY_VERSIONING "Use library version triplet" ON)
# Default to build shared libs
option(BUILD_SHARED_LIBS "Build shared libraries" ON)
option(EXPORT_ALL_SYMBOLS "Export all symbols form library" OFF)
if(CMAKE_COMPILER_IS_GNUCC)
if(NOT EXPORT_ALL_SYMBOLS)
message(STATUS "GCC default symbol visibility: hidden")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
endif()
endif()
endif()
2021-06-10 09:57:40 +03:00
option(WITH_VERBOSE_WINPR_ASSERT "Compile with verbose WINPR_ASSERT." ON)
option(WITH_WINPR_TOOLS "Build WinPR helper binaries" ON)
option(WITH_WINPR_DEPRECATED "Build WinPR deprecated symbols" OFF)
if (WITH_WINPR_DEPRECATED)
add_definitions(-DWITH_WINPR_DEPRECATED)
endif()
2021-06-10 09:57:40 +03:00
if (WITH_VERBOSE_WINPR_ASSERT)
add_definitions(-DWITH_VERBOSE_WINPR_ASSERT)
endif()
# Include cmake modules
include(CheckIncludeFiles)
include(CheckLibraryExists)
2015-10-06 17:56:24 +03:00
include(CheckSymbolExists)
include(CheckStructHasMember)
include(FindPkgConfig)
include(TestBigEndian)
# Include our extra modules
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../cmake/)
# Check for cmake compatibility (enable/disable features)
include(CheckCmakeCompat)
include(FindFeature)
2015-10-06 17:56:24 +03:00
include(ComplexLibrary)
include(FeatureSummary)
include(CheckCCompilerFlag)
include(GNUInstallDirsWrapper)
include(InstallFreeRDPMan)
include(SetFreeRDPCMakeInstallDir)
2014-02-03 07:37:54 +04:00
include(CMakePackageConfigHelpers)
if (NOT WIN32)
add_definitions(-DWINPR_CRITICAL_SECTION_DISABLE_SPINCOUNT)
endif()
# Soname versioning
2020-04-10 08:40:04 +03:00
set(RAW_VERSION_STRING "3.0.0-dev")
if(EXISTS "${PROJECT_SOURCE_DIR}/.source_tag")
file(READ ${PROJECT_SOURCE_DIR}/.source_tag RAW_VERSION_STRING)
elseif(USE_VERSION_FROM_GIT_TAG)
git_get_exact_tag(_GIT_TAG --tags --always)
if (NOT ${_GIT_TAG} STREQUAL "n/a")
set(RAW_VERSION_STRING ${_GIT_TAG})
endif()
endif()
string(STRIP ${RAW_VERSION_STRING} RAW_VERSION_STRING)
set(VERSION_REGEX "^.?([0-9]+)\\.([0-9]+)\\.([0-9]+)-?(.*)")
string(REGEX REPLACE "${VERSION_REGEX}" "\\1" WINPR_VERSION_MAJOR "${RAW_VERSION_STRING}")
string(REGEX REPLACE "${VERSION_REGEX}" "\\2" WINPR_VERSION_MINOR "${RAW_VERSION_STRING}")
string(REGEX REPLACE "${VERSION_REGEX}" "\\3" WINPR_VERSION_REVISION "${RAW_VERSION_STRING}")
string(REGEX REPLACE "${VERSION_REGEX}" "\\4" WINPR_VERSION_SUFFIX "${RAW_VERSION_STRING}")
cleanup cmake exports and pkg-config files With this commit the "exported" components (usable with pkg-config and cmake find module package) * winpr - winpr library and headers * freerdp - core library and headers * freerdp-client - client specific library * freerdp-server - server specific library * rdtk - rdtk headers and library To allow the installation of multiple different version (different major number) the include files were moved into the respective sub folder: freerdp -> freerdp{MAJOR}/freerdp (currently freerdp2/freerdp/) winpr -> winpr{MAJOR}/winpr (currently winrp1/winpr/) rdtk -> rdpk{MAJOR}/rdtk (currently rdtk0/rdtk/ The generated pkg-config and cmake find modules now also include the major version number. Currently the following pkg-config are generated and installed. * winpr1 * freerdp2 * freerdp-server2 * freerdp-client2 * rdtk0 As cmake is able to handle multiple versions out of the box the following can be used to find a specific module: find_package(WinPR) find_package(FreeRDP) find_package(FreeRDP-Server) find_package(FreeRDP-Client) find_package(RdTk) As cmake doesn't automatically resolve dependencies for packages it is necessary to manually include the requirements. For example if FreeRDP-Client is required WinPR and FreeRDP need to be included (find_package) as well. This commit also fixes the installation when STATIC_CHANNELS are built. WITH STATIC_CHANNELS all channels are linked into libfreerdp-client, for this all channels are generated as linker archive and linked together in the final step. Before the intermediate linker archives were, although not required and useful, installed. Same applies for server side channels.
2016-01-08 16:07:35 +03:00
set(WINPR_VERSION "${WINPR_VERSION_MAJOR}.${WINPR_VERSION_MINOR}.${WINPR_VERSION_REVISION}")
set(WINPR_API_VERSION "${WINPR_VERSION_MAJOR}")
if (WINPR_VERSION_SUFFIX)
set(WINPR_VERSION_FULL "${WINPR_VERSION}-${WINPR_VERSION_SUFFIX}")
else()
set(WINPR_VERSION_FULL "${WINPR_VERSION}")
endif()
2015-10-06 17:56:24 +03:00
if(NOT IOS)
check_include_files(stdint.h WINPR_HAVE_STDINT_H)
check_include_files(inttypes.h WINPR_HAVE_INTTYPES_H)
else(NOT IOS)
set(WINPR_HAVE_STDINT_H 1)
set(WINPR_HAVE_INTTYPES_H 1)
endif(NOT IOS)
if (NOT IOS)
check_include_files(stdbool.h WINPR_HAVE_STDBOOL_H)
if (NOT WINPR_HAVE_STDBOOL_H)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../compat/stdbool)
endif()
2015-10-06 17:56:24 +03:00
else()
set(WINPR_HAVE_STDBOOL_H 1)
endif()
2015-10-06 17:56:24 +03:00
set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
if(NOT IOS)
2015-10-06 17:56:24 +03:00
find_package(Threads REQUIRED)
endif()
# Include files
if(NOT IOS)
check_include_files(fcntl.h HAVE_FCNTL_H)
2021-06-28 10:27:21 +03:00
check_include_files(aio.h HAVE_AIO_H)
check_include_files(sys/timerfd.h HAVE_SYS_TIMERFD_H)
2015-10-06 17:56:24 +03:00
check_include_files(unistd.h HAVE_UNISTD_H)
check_include_files(inttypes.h HAVE_INTTYPES_H)
check_include_files(sys/filio.h HAVE_SYS_FILIO_H)
check_include_files(sys/sockio.h HAVE_SYS_SOCKIO_H)
check_include_files(sys/strtio.h HAVE_SYS_STRTIO_H)
2021-06-28 10:27:21 +03:00
check_include_files(syslog.h HAVE_SYSLOG_H)
2015-10-06 17:56:24 +03:00
check_include_files(sys/select.h HAVE_SYS_SELECT_H)
2021-06-28 10:27:21 +03:00
check_include_files(sys/eventfd.h HAVE_SYS_EVENTFD_H)
if (HAVE_SYS_EVENTFD_H)
check_symbol_exists(eventfd_read sys/eventfd.h WITH_EVENTFD_READ_WRITE)
endif()
2015-10-06 17:56:24 +03:00
else()
set(HAVE_FCNTL_H 1)
set(HAVE_UNISTD_H 1)
set(HAVE_INTTYPES_H 1)
set(HAVE_SYS_FILIO_H 1)
endif()
if(NOT IOS)
check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
else()
set(HAVE_TM_GMTOFF 1)
endif()
if(NOT WIN32)
2021-06-28 13:39:24 +03:00
list(APPEND CMAKE_REQUIRED_LIBRARIES pthread)
CHECK_SYMBOL_EXISTS(pthread_mutex_timedlock pthread.h HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
CHECK_LIBRARY_EXISTS(pthread pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
CHECK_LIBRARY_EXISTS(pthreads pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
if (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
set(HAVE_PTHREAD_MUTEX_TIMEDLOCK ON)
endif (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
2021-06-28 13:39:24 +03:00
list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES pthread)
2015-10-06 17:56:24 +03:00
endif()
set(OPENSSL_FEATURE_TYPE "RECOMMENDED")
2015-10-06 17:56:24 +03:00
set(OPENSSL_FEATURE_PURPOSE "cryptography")
set(OPENSSL_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
set(MBEDTLS_FEATURE_TYPE "OPTIONAL")
set(MBEDTLS_FEATURE_PURPOSE "cryptography")
set(MBEDTLS_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
find_feature(OpenSSL ${OPENSSL_FEATURE_TYPE} ${OPENSSL_FEATURE_PURPOSE} ${OPENSSL_FEATURE_DESCRIPTION})
find_feature(MbedTLS ${MBEDTLS_FEATURE_TYPE} ${MBEDTLS_FEATURE_PURPOSE} ${MBEDTLS_FEATURE_DESCRIPTION})
if(OPENSSL_FOUND)
add_definitions("-DWITH_OPENSSL")
endif()
if(MBEDTLS_FOUND)
add_definitions("-DWITH_MBEDTLS")
endif()
if (NOT OPENSSL_FOUND AND NOT MBEDTLS_FOUND)
message(FATAL_ERROR "OpenSSL or MBedTLS are required, none enabled/found")
endif()
2015-10-06 17:56:24 +03:00
# Include directories
include_directories(${CMAKE_CURRENT_BINARY_DIR})
# Configure files
add_definitions("-DHAVE_CONFIG_H")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
2015-10-06 17:56:24 +03:00
enable_testing()
if(MSVC)
set(TESTING_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")
2015-10-06 17:56:24 +03:00
else()
set(TESTING_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/Testing")
2015-10-06 17:56:24 +03:00
endif()
2012-09-21 04:45:56 +04:00
# Default to release build type
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release")
endif()
2017-02-15 22:50:24 +03:00
if(BUILD_SHARED_LIBS)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINPR_DLL")
endif()
2014-02-03 07:37:54 +04:00
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINPR_EXPORTS")
# Enable 64bit file support on linux and FreeBSD.
if("${CMAKE_SYSTEM_NAME}" MATCHES "Linux" OR FREEBSD)
add_definitions("-D_FILE_OFFSET_BITS=64")
endif()
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
2013-09-10 22:03:15 +04:00
add_subdirectory(include)
2012-08-15 03:55:48 +04:00
add_subdirectory(libwinpr)
2019-08-14 16:10:00 +03:00
if(NOT ANDROID AND NOT IOS AND NOT UWP AND WITH_WINPR_TOOLS)
add_subdirectory(tools)
endif()
if(BUILD_TESTING)
add_subdirectory(test)
endif()
install_freerdp_man(wlog.7 7)
# Exporting
export(PACKAGE winpr)
SetFreeRDPCMakeInstallDir(WINPR_CMAKE_INSTALL_DIR "WinPR${WINPR_VERSION_MAJOR}")
set(WINPR_INCLUDE_DIR "include/winpr${WINPR_VERSION_MAJOR}")
configure_package_config_file(WinPRConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/WinPRConfig.cmake
INSTALL_DESTINATION ${WINPR_CMAKE_INSTALL_DIR}
PATH_VARS WINPR_INCLUDE_DIR)
write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/WinPRConfigVersion.cmake
VERSION ${WINPR_VERSION} COMPATIBILITY SameMajorVersion)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/WinPRConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/WinPRConfigVersion.cmake
DESTINATION ${WINPR_CMAKE_INSTALL_DIR})
install(EXPORT WinPRTargets DESTINATION ${WINPR_CMAKE_INSTALL_DIR})
cleanup cmake exports and pkg-config files With this commit the "exported" components (usable with pkg-config and cmake find module package) * winpr - winpr library and headers * freerdp - core library and headers * freerdp-client - client specific library * freerdp-server - server specific library * rdtk - rdtk headers and library To allow the installation of multiple different version (different major number) the include files were moved into the respective sub folder: freerdp -> freerdp{MAJOR}/freerdp (currently freerdp2/freerdp/) winpr -> winpr{MAJOR}/winpr (currently winrp1/winpr/) rdtk -> rdpk{MAJOR}/rdtk (currently rdtk0/rdtk/ The generated pkg-config and cmake find modules now also include the major version number. Currently the following pkg-config are generated and installed. * winpr1 * freerdp2 * freerdp-server2 * freerdp-client2 * rdtk0 As cmake is able to handle multiple versions out of the box the following can be used to find a specific module: find_package(WinPR) find_package(FreeRDP) find_package(FreeRDP-Server) find_package(FreeRDP-Client) find_package(RdTk) As cmake doesn't automatically resolve dependencies for packages it is necessary to manually include the requirements. For example if FreeRDP-Client is required WinPR and FreeRDP need to be included (find_package) as well. This commit also fixes the installation when STATIC_CHANNELS are built. WITH STATIC_CHANNELS all channels are linked into libfreerdp-client, for this all channels are generated as linker archive and linked together in the final step. Before the intermediate linker archives were, although not required and useful, installed. Same applies for server side channels.
2016-01-08 16:07:35 +03:00
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/winpr.pc.in ${CMAKE_CURRENT_BINARY_DIR}/winpr${WINPR_VERSION_MAJOR}.pc @ONLY)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/winpr${WINPR_VERSION_MAJOR}.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/buildflags.h.in ${CMAKE_CURRENT_BINARY_DIR}/buildflags.h)