329 строки
12 KiB
CMake
329 строки
12 KiB
CMake
cmake_minimum_required(VERSION 3.1.0)
|
|
project(MSTelemetry)
|
|
|
|
set(INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation directory for executables")
|
|
set(INSTALL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation directory for libraries")
|
|
set(INSTALL_INC_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "Installation directory for headers")
|
|
|
|
# Begin Uncomment for i386 build
|
|
#set(CMAKE_SYSTEM_PROCESSOR i386)
|
|
#set(CMAKE_C_FLAGS -m32)
|
|
#set(CMAKE_CXX_FLAGS -m32)
|
|
# End of i386 build
|
|
|
|
# We ask for 14, but we may get C++11 on older gcc-4.x and gcc-5.x
|
|
set(CMAKE_CXX_STANDARD 14)
|
|
|
|
if (NOT TARGET_ARCH)
|
|
set(TARGET_ARCH ${CMAKE_SYSTEM_PROCESSOR})
|
|
endif()
|
|
|
|
# Enable ARC for obj-c on Apple
|
|
if(APPLE)
|
|
message("-- BUILD_IOS: ${BUILD_IOS}")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fobjc-arc")
|
|
|
|
# iOS build options
|
|
option(BUILD_IOS "Build for iOS" NO)
|
|
option(FORCE_RESET_OSX_DEPLOYMENT_TARGET "Clear the OSX Deployment Target Set" YES)
|
|
if (DEFINED FORCE_RESET_DEPLOYMENT_TARGET)
|
|
set(FORCE_RESET_OSX_DEPLOYMENT_TARGET ${FORCE_RESET_DEPLOYMENT_TARGET})
|
|
endif()
|
|
|
|
if(BUILD_IOS)
|
|
set(TARGET_ARCH "APPLE")
|
|
set(IOS True)
|
|
set(APPLE True)
|
|
|
|
if(FORCE_RESET_OSX_DEPLOYMENT_TARGET)
|
|
set(CMAKE_OSX_DEPLOYMENT_TARGET "" CACHE STRING "Force unset of the deployment target for iOS" FORCE)
|
|
if((${IOS_PLAT} STREQUAL "iphonesimulator") AND ((${IOS_ARCH} STREQUAL "arm64") OR (${IOS_ARCH} STREQUAL "arm64e")))
|
|
# iOS arm64 simulator is supported starting BigSur
|
|
# Unfortunately, CMAKE produces a device binary (not simulator) when providing -miphoneos-version-min flag when building iOS arm64 simulator
|
|
else()
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -miphoneos-version-min=${IOS_DEPLOYMENT_TARGET}")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -miphoneos-version-min=${IOS_DEPLOYMENT_TARGET}")
|
|
endif()
|
|
endif()
|
|
|
|
if((${IOS_PLAT} STREQUAL "iphoneos") OR (${IOS_PLAT} STREQUAL "iphonesimulator"))
|
|
set(IOS_PLATFORM "${IOS_PLAT}")
|
|
else()
|
|
message(FATAL_ERROR "Unrecognized iOS platform '${IOS_PLAT}'")
|
|
endif()
|
|
|
|
if(${IOS_ARCH} STREQUAL "x86_64")
|
|
set(IOS_PLATFORM "iphonesimulator")
|
|
set(CMAKE_SYSTEM_PROCESSOR x86_64)
|
|
elseif(${IOS_ARCH} STREQUAL "arm64")
|
|
set(IOS_PLATFORM ${IOS_PLAT})
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -arch arm64")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -arch arm64")
|
|
set(CMAKE_SYSTEM_PROCESSOR arm64)
|
|
elseif(${IOS_ARCH} STREQUAL "arm64e")
|
|
set(IOS_PLATFORM ${IOS_PLAT})
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -arch arm64e")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -arch arm64e")
|
|
set(CMAKE_SYSTEM_PROCESSOR arm64e)
|
|
else()
|
|
message(FATAL_ERROR "Unrecognized iOS architecture '${IOS_ARCH}'")
|
|
endif()
|
|
|
|
execute_process(COMMAND xcodebuild -version -sdk ${IOS_PLATFORM} ONLY_ACTIVE_ARCH=NO Path
|
|
OUTPUT_VARIABLE CMAKE_OSX_SYSROOT
|
|
ERROR_QUIET
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
message("-- CMAKE_OSX_SYSROOT ${CMAKE_OSX_SYSROOT}")
|
|
message("-- ARCHITECTURE: ${CMAKE_SYSTEM_PROCESSOR}")
|
|
message("-- PLATFORM: ${IOS_PLATFORM}")
|
|
else()
|
|
if(${MAC_ARCH} STREQUAL "x86_64")
|
|
set(CMAKE_SYSTEM_PROCESSOR x86_64)
|
|
elseif(${MAC_ARCH} STREQUAL "arm64")
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -arch arm64")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -arch arm64")
|
|
set(CMAKE_SYSTEM_PROCESSOR arm64)
|
|
set(APPLE True)
|
|
else()
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -arch x86_64 -arch arm64")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -arch x86_64 -arch arm64")
|
|
endif()
|
|
message("-- MAC_ARCH: ${MAC_ARCH}")
|
|
endif()
|
|
endif()
|
|
|
|
message("-- CMAKE_SYSTEM_INFO_FILE: ${CMAKE_SYSTEM_INFO_FILE}")
|
|
message("-- CMAKE_SYSTEM_NAME: ${CMAKE_SYSTEM_NAME}")
|
|
message("-- CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}")
|
|
message("-- CMAKE_SYSTEM: ${CMAKE_SYSTEM}")
|
|
message("-- CMAKE_SYSTEM_VERSION: ${CMAKE_SYSTEM_VERSION}")
|
|
message("-- CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
|
|
message("-- TARGET_ARCH: ${TARGET_ARCH}")
|
|
message("-- CMAKE_CXX_COMPILER_ID: ${CMAKE_CXX_COMPILER_ID}")
|
|
|
|
include(tools/ParseOsRelease.cmake)
|
|
|
|
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
|
|
set(WARN_FLAGS "/W4 /WX")
|
|
else()
|
|
# No -pedantic -Wno-extra-semi -Wno-gnu-zero-variadic-macro-arguments
|
|
set(WARN_FLAGS "-Wall -Werror -Wextra -Wno-unused-parameter")
|
|
endif()
|
|
|
|
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
|
# Using GCC with -s and -Wl linker flags
|
|
set(REL_FLAGS "-s -Wl,--gc-sections -Os ${WARN_FLAGS} -ffunction-sections -fdata-sections -fmerge-all-constants -ffast-math")
|
|
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
|
|
set(REL_FLAGS "${WARN_FLAGS}")
|
|
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang")
|
|
# AppleClang does not support -ffunction-sections and -fdata-sections with the -fembed-bitcode and -fembed-bitcode-marker
|
|
set(REL_FLAGS "-Os ${WARN_FLAGS} -fmerge-all-constants -ffast-math")
|
|
else()
|
|
# Using clang - strip unsupported GCC options
|
|
set(REL_FLAGS "-Os ${WARN_FLAGS} -ffunction-sections -fmerge-all-constants -ffast-math")
|
|
endif()
|
|
|
|
## Uncomment this to reduce the volume of note warnings on RPi4 w/gcc-8 Ref. https://gcc.gnu.org/ml/gcc/2017-05/msg00073.html
|
|
#if (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l")
|
|
# set(WARN_FLAGS "${WARN_FLAGS} -Wno-psabi"
|
|
#endif()
|
|
|
|
# Use libtcmalloc for Debug builds memory leaks detection
|
|
set(DBG_FLAGS "-ggdb -gdwarf-2 -O0 ${WARN_FLAGS} -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free")
|
|
|
|
if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
|
|
#TODO: -fno-rtti
|
|
message("Building Release ...")
|
|
set(CMAKE_C_FLAGS "$ENV{CFLAGS} ${CMAKE_C_FLAGS} -std=c11 ${REL_FLAGS}")
|
|
set(CMAKE_CXX_FLAGS "$ENV{CXXFLAGS} ${CMAKE_CXX_FLAGS} -std=c++11 ${REL_FLAGS}")
|
|
else()
|
|
set(USE_TCMALLOC 1)
|
|
message("Building Debug ...")
|
|
include(tools/FindTcmalloc.cmake)
|
|
set(CMAKE_C_FLAGS "$ENV{CFLAGS} ${CMAKE_C_FLAGS} -std=c11 ${DBG_FLAGS}")
|
|
set(CMAKE_CXX_FLAGS "$ENV{CXXFLAGS} ${CMAKE_CXX_FLAGS} -std=c++11 ${DBG_FLAGS}")
|
|
endif()
|
|
|
|
#Remove /Zi for Win32 debug compiler issue
|
|
if(MSVC)
|
|
string( TOLOWER "${CMAKE_VS_PLATFORM_NAME}" PLATFORM_NAME_LOWER )
|
|
if (PLATFORM_NAME_LOWER STREQUAL "win32")
|
|
string(REGEX REPLACE "/Z[iI7]" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
|
|
string(REGEX REPLACE "/Z[iI7]" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
|
|
endif()
|
|
endif()
|
|
|
|
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
|
|
# using Clang
|
|
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
|
# using GCC
|
|
# Prefer to generate position-independent code
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
|
|
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
|
|
# using Intel C++
|
|
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
|
|
# using Visual Studio C++
|
|
endif()
|
|
|
|
include(tools/Utils.cmake)
|
|
|
|
if (NOT DEFAULT_PAL_IMPLEMENTATION)
|
|
if(MSVC)
|
|
set(DEFAULT_PAL_IMPLEMENTATION WIN32)
|
|
else()
|
|
# Linux, Mac OS X, MinGW, etc.
|
|
set(DEFAULT_PAL_IMPLEMENTATION CPP11)
|
|
endif()
|
|
endif()
|
|
|
|
set(PAL_IMPLEMENTATION ${DEFAULT_PAL_IMPLEMENTATION})
|
|
|
|
message(STATUS "-- PAL implementation: ${PAL_IMPLEMENTATION}")
|
|
string(TOUPPER ${PAL_IMPLEMENTATION} PAL_IMPLEMENTATION_UPPER)
|
|
add_definitions(-DMATSDK_PAL_${PAL_IMPLEMENTATION_UPPER}=1)
|
|
|
|
option(GCC5_CXX11_ABI_WORKAROUND "Workaround: Use legacy C++11 ABI (for GCC 5 compatibility)" OFF)
|
|
if(GCC5_CXX11_ABI_WORKAROUND)
|
|
add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)
|
|
endif()
|
|
|
|
option(USE_ONEDS_BOUNDCHECK_METHODS "Use bound check methods for C99 functions" OFF)
|
|
if (USE_ONEDS_BOUNDCHECK_METHODS)
|
|
add_definitions(-DHAVE_ONEDS_BOUNDCHECK_METHODS)
|
|
endif()
|
|
|
|
if(PAL_IMPLEMENTATION STREQUAL "WIN32")
|
|
add_definitions(-DZLIB_WINAPI)
|
|
endif()
|
|
|
|
add_definitions(-DNOMINMAX)
|
|
|
|
################################################################################################
|
|
# Build prefix and version
|
|
################################################################################################
|
|
|
|
set(SDK_VERSION_PREFIX "EVT")
|
|
add_definitions("-DMATSDK_VERSION_PREFIX=\"${SDK_VERSION_PREFIX}\"")
|
|
|
|
set(MATSDK_API_VERSION "3.4")
|
|
string(TIMESTAMP DAYNUMBER "%j")
|
|
string(REGEX REPLACE "^00" "" DAYNUMBER ${DAYNUMBER})
|
|
string(REGEX REPLACE "^0" "" DAYNUMBER ${DAYNUMBER})
|
|
|
|
if(DEFINED BUILD_VERSION AND NOT BUILD_VERSION STREQUAL "0.0.0.0")
|
|
message(STATUS "Using externally set build version: ${BUILD_VERSION}")
|
|
string(REPLACE "." "\\." MATSDK_API_VERSION_ESCAPED ${MATSDK_API_VERSION})
|
|
if(NOT BUILD_VERSION MATCHES "^${MATSDK_API_VERSION_ESCAPED}\\.")
|
|
message(WARNING "BUILD_VERSION (${BUILD_VERSION}) does not start with the current API version prefix (${MATSDK_API_VERSION}).")
|
|
endif()
|
|
set(MATSDK_BUILD_VERSION ${BUILD_VERSION})
|
|
else()
|
|
set(MATSDK_BUILD_VERSION ${MATSDK_API_VERSION}.${DAYNUMBER}.0)
|
|
endif()
|
|
|
|
message(STATUS "-- SDK version: ${SDK_VERSION_PREFIX}-${MATSDK_BUILD_VERSION}")
|
|
|
|
################################################################################################
|
|
# HTTP stack section
|
|
################################################################################################
|
|
|
|
# Only use custom curl if compiling with CPP11 PAL
|
|
if (PAL_IMPLEMENTATION STREQUAL "CPP11")
|
|
|
|
if(NOT BUILD_IOS)
|
|
include(FindCURL)
|
|
find_package(CURL REQUIRED)
|
|
if (NOT CURL_FOUND)
|
|
message (FATAL_ERROR "libcurl not found! Have you installed deps?")
|
|
endif (NOT CURL_FOUND)
|
|
include_directories(CURL_INCLUDE_DIRS)
|
|
set(CMAKE_REQUIRED_LIBRARIES "${CURL_LIBRARIES}")
|
|
list(APPEND LIBS "${CURL_LIBRARIES}")
|
|
endif()
|
|
endif()
|
|
|
|
################################################################################################
|
|
# User options
|
|
################################################################################################
|
|
option(BUILD_HEADERS "Build API headers" YES)
|
|
option(BUILD_LIBRARY "Build library" YES)
|
|
option(BUILD_TEST_TOOL "Build console test tool" YES)
|
|
option(BUILD_UNIT_TESTS "Build unit tests" YES)
|
|
option(BUILD_FUNC_TESTS "Build functional tests" YES)
|
|
option(BUILD_JNI_WRAPPER "Build JNI wrapper" NO)
|
|
option(BUILD_OBJC_WRAPPER "Build Obj-C wrapper" YES)
|
|
option(BUILD_SWIFT_WRAPPER "Build Swift Wrappers" YES)
|
|
option(BUILD_PACKAGE "Build package" YES)
|
|
option(BUILD_PRIVACYGUARD "Build Privacy Guard" YES)
|
|
option(BUILD_CDS "Build CDS - Common Diagnostic Stack" YES)
|
|
option(BUILD_LIVEEVENTINSPECTOR "Build Live Event Inspector" YES)
|
|
option(BUILD_SIGNALS "Build Signals" YES)
|
|
option(LINK_STATIC_DEPENDS "Link dependencies for static build" YES)
|
|
|
|
# Enable Azure Monitor / Application Insights end-point support
|
|
option(BUILD_AZMON "Build for Azure Monitor" YES)
|
|
|
|
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
|
option(BUILD_APPLE_HTTP "Build Apple HTTP client" YES)
|
|
endif()
|
|
|
|
if(BUILD_UNIT_TESTS OR BUILD_FUNC_TESTS)
|
|
message("Adding gtest")
|
|
add_library(gtest STATIC IMPORTED GLOBAL)
|
|
message("Adding gmock")
|
|
add_library(gmock STATIC IMPORTED GLOBAL)
|
|
endif()
|
|
|
|
if(BUILD_APPLE_HTTP)
|
|
add_definitions(-DAPPLE_HTTP=1)
|
|
endif()
|
|
|
|
# Bond Lite subdirectories
|
|
include_directories(bondlite/include)
|
|
|
|
include_directories(lib/pal)
|
|
|
|
#if(BUILD_UNIT_TESTS)
|
|
# message("Adding bondlite tests")
|
|
# enable_testing()
|
|
# add_subdirectory(bondlite/tests)
|
|
#endif()
|
|
|
|
if(BUILD_HEADERS)
|
|
add_subdirectory(lib/include)
|
|
endif()
|
|
include_directories(lib/include)
|
|
|
|
if(BUILD_LIBRARY)
|
|
add_subdirectory(lib)
|
|
endif()
|
|
|
|
if(BUILD_UNIT_TESTS OR BUILD_FUNC_TESTS)
|
|
message("Building tests")
|
|
enable_testing()
|
|
add_subdirectory(tests)
|
|
endif()
|
|
|
|
################################################################################################
|
|
# Packaging
|
|
################################################################################################
|
|
|
|
if (BUILD_PACKAGE)
|
|
if (${CMAKE_PACKAGE_TYPE} STREQUAL "deb")
|
|
# FIXME: hardcode it for 64-bit Linux for now
|
|
set(INSTALL_LIB_DIR ${CMAKE_INSTALL_PREFIX}/lib/${CPACK_DEBIAN_ARCHITECTURE}-linux-gnu)
|
|
include(tools/MakeDeb.cmake)
|
|
endif()
|
|
if (${CMAKE_PACKAGE_TYPE} STREQUAL "rpm")
|
|
# TODO: [MG] - fix path
|
|
set(INSTALL_LIB_DIR ${CMAKE_INSTALL_PREFIX}/lib/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu)
|
|
include(tools/MakeRpm.cmake)
|
|
endif()
|
|
if (${CMAKE_PACKAGE_TYPE} STREQUAL "tgz")
|
|
# TODO: [MG] - fix path... should we simply use /usr/local/lib without CPU?
|
|
# TODO: [MG] - Windows path is not ideal -- C:/Program Files (x86)/MSTelemetry/* - what should we use instead?
|
|
include(tools/MakeTgz.cmake)
|
|
endif()
|
|
endif()
|