cmake_minimum_required(VERSION 3.7)
include(make/policies.cmake NO_POLICY_SCOPE)
if ("${CMAKE_GENERATOR}" MATCHES "Visual Studio")
set(CMAKE_SYSTEM_VERSION_TEMP $ENV{WindowsSDKVersion})
string(REGEX REPLACE "([0-9.]+).*" "\\1" CMAKE_SYSTEM_VERSION_TEMP "${CMAKE_SYSTEM_VERSION_TEMP}")
if (CMAKE_SYSTEM_VERSION_TEMP)
set(CMAKE_SYSTEM_VERSION ${CMAKE_SYSTEM_VERSION_TEMP} CACHE INTERNAL "")
endif()
if (DEBUG)
set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE)
else (DEBUG)
set(CMAKE_CONFIGURATION_TYPES "RelWithDebInfo" CACHE STRING "" FORCE)
endif (DEBUG)
string(TOUPPER "${CMAKE_CONFIGURATION_TYPES}" upper)
set(location_suffix "_${upper}")
else ("${CMAKE_GENERATOR}" MATCHES "Visual Studio")
set(location_suffix "")
endif ("${CMAKE_GENERATOR}" MATCHES "Visual Studio")
if (NOT DEFINED CMAKE_INSTALL_PREFIX)
set(install_override ON)
else (NOT DEFINED CMAKE_INSTALL_PREFIX)
set(install_override OFF)
endif (NOT DEFINED CMAKE_INSTALL_PREFIX)
if (NOT DEFINED ENV{CXXFLAGS})
set(ENV{CXXFLAGS} "$ENV{CFLAGS}")
endif (NOT DEFINED ENV{CXXFLAGS})
set(specified_build_type "${CMAKE_BUILD_TYPE}")
project(DynamoRIO NONE)
if (DEFINED GENERATE_PDBS AND NOT GENERATE_PDBS)
set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/make")
endif ()
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/make/modules")
enable_language(C)
enable_language(CXX)
if ("${CMAKE_GENERATOR}" MATCHES "Ninja")
set(CMAKE_BUILD_TYPE "${specified_build_type}" CACHE STRING
"Choose the type of build: Debug or Release" FORCE)
else ()
set(CMAKE_BUILD_TYPE "${specified_build_type}")
endif ()
include(CheckCCompilerFlag)
include(CheckCXXCompilerFlag)
include(CheckIncludeFile)
include(make/utils.cmake)
if (UNIX)
set(LIB_PFX "lib")
if (APPLE)
set(LIB_EXT ".dylib")
else ()
set(LIB_EXT ".so")
endif ()
else (UNIX)
set(LIB_PFX "")
set(LIB_EXT ".dll")
endif (UNIX)
option(BUILD_PACKAGE "build DynamoRIO for packaging purposes by performing glibc checks" OFF)
option(DRSTATS_DEMO "build DRstats without the no-longer-supported Run, etc. controls" ON)
if ("${CMAKE_BUILD_TYPE}" MATCHES "Debug")
set(DEBUG_DEFAULT ON)
else ()
set(DEBUG_DEFAULT OFF)
endif ()
set(DEBUG_DESCR "Build with asserts and logging enabled (also controlled by CMAKE_BUILD_TYPE=Debug)")
option(DEBUG ${DEBUG_DESCR} ${DEBUG_DEFAULT})
if ("${CMAKE_BUILD_TYPE}" MATCHES "Debug")
set(DEBUG ON CACHE BOOL ${DEBUG_DESCR} FORCE)
elseif (NOT "${CMAKE_BUILD_TYPE}" STREQUAL "")
set(DEBUG OFF CACHE BOOL ${DEBUG_DESCR} FORCE)
endif ()
if (DEBUG)
set(INTERNAL_DEFAULT ON)
else (DEBUG)
set(INTERNAL_DEFAULT OFF)
endif (DEBUG)
set(INTERNAL "" CACHE STRING "for developer use: ON or OFF overrides default")
if ("${INTERNAL}" STREQUAL "")
set(INTERNAL ${INTERNAL_DEFAULT})
endif()
if (APPLE)
set(MACOS 1)
set(OLDEST_OSX_SUPPPORTED "11.7")
elseif (UNIX)
set(LINUX 1)
endif (APPLE)
if (WIN32)
set(WINDOWS 1)
endif (WIN32)
if (CMAKE_SYSTEM_NAME MATCHES "^Android")
set(ANDROID 1)
set(DR_DEVICE_BASEDIR "/data/local/tmp" CACHE STRING "base dir for Android binaries")
option(DR_COPY_TO_DEVICE "copy cross-compiled binaries to DR_DEVICE_BASEDIR" OFF)
if (DR_COPY_TO_DEVICE)
find_program(ADB adb DOC "adb Android utility")
if (NOT ADB)
message(FATAL_ERROR "Unable to find adb for DR_COPY_TO_DEVICE")
else ()
execute_process(COMMAND ${ADB} get-state
RESULT_VARIABLE adb_result
ERROR_VARIABLE adb_err
OUTPUT_VARIABLE adb_out OUTPUT_STRIP_TRAILING_WHITESPACE)
if (adb_result OR NOT adb_out STREQUAL "device")
message(FATAL_ERROR "Android device not connected for DR_COPY_TO_DEVICE")
endif ()
endif ()
endif ()
endif ()
set(TARGET_ARCH "${CMAKE_SYSTEM_PROCESSOR}" CACHE STRING "Target architecture")
if (TARGET_ARCH MATCHES "^arm64" OR TARGET_ARCH MATCHES "^aarch64")
set(AARCH64 1)
set(X64 1)
message(STATUS "Building for AArch64")
elseif (TARGET_ARCH MATCHES "^arm")
set(ARM 1)
set(X64 OFF)
message(STATUS "Building for ARM")
elseif (TARGET_ARCH MATCHES "^riscv64")
set(RISCV64 1)
set(X64 1)
message(STATUS "Building for riscv64")
else ()
set(X86 1)
message(STATUS "Building for x86")
if (CMAKE_C_SIZEOF_DATA_PTR EQUAL 8)
set(X64 ON)
else ()
set(X64 OFF)
endif ()
endif ()
if (X86)
set(ARCH_NAME x86)
elseif (ARM)
set(ARCH_NAME arm)
elseif (AARCH64)
set(ARCH_NAME aarch64)
elseif (RISCV64)
set(ARCH_NAME riscv64)
else ()
message(FATAL_ERROR "Unknown architecture target")
endif ()
if (ARM OR AARCH64)
set(AARCHXX 1)
set(ARCH_NAME_SHARED aarchxx)
else ()
set(ARCH_NAME_SHARED ${ARCH_NAME})
endif ()
if (CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "^arm64")
set(DR_HOST_AARCH64 1)
set(DR_HOST_ARCH_NAME "aarch64")
set(DR_HOST_AARCHXX 1)
set(DR_HOST_ARCH_NAME_SHARED aarchxx)
set(DR_HOST_X64 1)
elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
set(DR_HOST_ARM 1)
set(DR_HOST_ARCH_NAME "arm")
set(DR_HOST_AARCHXX 1)
set(DR_HOST_ARCH_NAME_SHARED aarchxx)
elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "^riscv64")
set(DR_HOST_RISCV64 1)
set(DR_HOST_ARCH_NAME "riscv64")
set(DR_HOST_ARCH_NAME_SHARED ${DR_HOST_ARCH_NAME})
set(DR_HOST_X64 1)
elseif (CMAKE_C_SIZEOF_DATA_PTR EQUAL 8)
set(DR_HOST_X86 1)
set(DR_HOST_ARCH_NAME "x86")
set(DR_HOST_ARCH_NAME_SHARED ${DR_HOST_ARCH_NAME})
set(DR_HOST_X64 1)
else ()
set(DR_HOST_X86 1)
set(DR_HOST_ARCH_NAME "x86")
set(DR_HOST_ARCH_NAME_SHARED ${DR_HOST_ARCH_NAME})
endif ()
if (NOT "${TARGET_ARCH}" STREQUAL "${CMAKE_SYSTEM_PROCESSOR}")
set(DR_HOST_NOT_TARGET 1)
if (WIN32)
message(FATAL_ERROR "Host != target is not yet supported on Windows")
endif ()
if ((DR_HOST_X64 AND NOT X64) OR (NOT DR_HOST_X64 AND X64))
message(FATAL_ERROR "Different-bitwidth host-vs-target not supported: i#1345.")
endif ()
if (ARM)
message(FATAL_ERROR "Targeting ARM on i386 is not yet supported: i#1684.")
endif ()
if (RISCV64)
message(FATAL_ERROR "Targeting riscv64 on i386 is not yet supported.")
endif ()
endif ()
if (CMAKE_CROSSCOMPILING AND DEFINED CMAKE_FIND_ROOT_PATH)
find_program(QEMU_BINARY qemu-${CMAKE_SYSTEM_PROCESSOR} DOC "QEMU emulation tool")
if (NOT QEMU_BINARY)
message(STATUS "Did not find qemu-${CMAKE_SYSTEM_PROCESSOR}: tests will not run")
else ()
message(STATUS "Found qemu-${CMAKE_SYSTEM_PROCESSOR} for tests under emulation")
endif ()
endif ()
option(VMKERNEL "target VMkernel (not officially supported yet)")
set(APP_EXPORTS 1)
option(PROBE "enable not-yet-supported Probe API")
mark_as_advanced(PROBE)
if (PROBE)
set(HOT_PATCHING_INTERFACE 1)
endif (PROBE)
option(TEST_SUITE "we are running a series of builds for official purposes")
if (INTERNAL OR DEBUG)
set(KSTATS_DEFAULT ON)
else (INTERNAL OR DEBUG)
set(KSTATS_DEFAULT 0FF)
endif (INTERNAL OR DEBUG)
if (CALLPROF)
set(KSTATS_DEFAULT 0FF)
endif (CALLPROF)
set(KSTATS "" CACHE STRING "internal kstat profiling: ON or OFF overrides default")
if ("${KSTATS}" STREQUAL "")
set(KSTATS ${KSTATS_DEFAULT})
endif()
option(CALLPROF "internal caller profiling support")
option(PROFILE "profiling build: disables FPO and tweaks other flags" OFF)
if (UNIX)
option(RECORD_MEMQUERY "generate test cases for memquery_library_bounds_by_iterator")
endif ()
if (X86)
set(ANNOTATIONS_DEFAULT ON)
else ()
set(ANNOTATIONS_DEFAULT OFF)
endif ()
option(ANNOTATIONS "annotations" ${ANNOTATIONS_DEFAULT})
if (WIN32)
option(GENERATE_PDBS "generate Windows debug information" ON)
option(PARAMS_IN_REGISTRY "parameters from registry instead of config files")
endif (WIN32)
option(DISABLE_WARNINGS "disable warnings")
option(SET_PREFERRED_BASE "set a preferred library base address")
if (WIN32 AND DEBUG)
set(preferred_base "0x15000000" CACHE STRING "Preferred library base address")
elseif (APPLE AND X64)
set(preferred_base "0x171000000" CACHE STRING "Preferred library base address")
else ()
set(preferred_base "0x71000000" CACHE STRING "Preferred library base address")
endif ()
set(SET_PREFERRED_BASE 1)
if (VMKERNEL)
set(SET_PREFERRED_BASE 1)
set(preferred_base "0x00000000")
endif (VMKERNEL)
mark_as_advanced(
PROGRAM_SHEPHERDING
PROCESS_CONTROL
GBOP
VMKERNEL
KSTATS
CALLPROF
PROFILE
SET_PREFERRED_BASE
preferred_base
GENERATE_PDBS
DRSTATS_DEMO
)
if ("${CMAKE_BUILD_TYPE}" STREQUAL "")
if (DEBUG)
set(CMAKE_BUILD_TYPE "Debug")
else (DEBUG)
set(CMAKE_BUILD_TYPE "RelWithDebInfo")
endif (DEBUG)
endif ()
string(TOUPPER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_UPPER)
foreach (config ${CMAKE_BUILD_TYPE} ${CMAKE_CONFIGURATION_TYPES})
string(TOUPPER "${config}" config_upper)
foreach (var
CMAKE_C_FLAGS_${config_upper};
CMAKE_CXX_FLAGS_${config_upper};
CMAKE_EXE_LINKER_FLAGS_${config_upper};
CMAKE_MODULE_LINKER_FLAGS_${config_upper};
CMAKE_SHARED_LINKER_FLAGS_${config_upper})
set(${var} " ")
endforeach ()
endforeach ()
foreach (var CMAKE_C_FLAGS;CMAKE_CXX_FLAGS)
set(${var} " ")
endforeach ()
if (APPLE)
set(CMAKE_MACOSX_RPATH 1)
endif ()
set(VERSION_NUMBER_PATCHLEVEL 0)
if (EXISTS "${PROJECT_SOURCE_DIR}/.svn")
find_program(SVN svn DOC "subversion client")
if (SVN)
execute_process(COMMAND ${SVN} info
WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
RESULT_VARIABLE svn_result
ERROR_VARIABLE svn_err
OUTPUT_VARIABLE svn_out)
if (svn_result OR svn_err)
message(FATAL_ERROR "*** ${SVN} info failed: ***\n${svn_result} ${svn_err}")
endif (svn_result OR svn_err)
string(REGEX MATCH "Revision: [0-9]+" svn_ver "${svn_out}")
string(REGEX REPLACE "Revision: " "" svn_ver "${svn_ver}")
if ("${svn_ver}" STREQUAL "")
string(REGEX MATCH ": [0-9]+\r?\n" svn_ver "${svn_out}")
string(REGEX REPLACE ": ([0-9]+)\r?\n" "\\1" svn_ver "${svn_ver}")
endif ("${svn_ver}" STREQUAL "")
if ("${svn_ver}" STREQUAL "")
message(STATUS "WARNING: Unable to obtain actual revision number")
set(VERSION_NUMBER_PATCHLEVEL "42")
else ("${svn_ver}" STREQUAL "")
set(VERSION_NUMBER_PATCHLEVEL "${svn_ver}")
endif ("${svn_ver}" STREQUAL "")
endif (SVN)
else (EXISTS "${PROJECT_SOURCE_DIR}/.svn")
if (EXISTS "${PROJECT_SOURCE_DIR}/.git")
find_program(GIT git DOC "git client")
if (GIT)
execute_process(COMMAND ${GIT} log -n 1 --format=%ct
WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
RESULT_VARIABLE git_result
ERROR_VARIABLE git_err
OUTPUT_VARIABLE git_out)
if (git_result OR git_err)
message("*** ${GIT} log failed: ***\n${git_err}")
else (git_result OR git_err)
math(EXPR daycount "${git_out} / (60*60*24)")
endif (git_result OR git_err)
endif (GIT)
if (NOT daycount)
find_program(DATE date DOC "system date")
if (DATE)
execute_process(COMMAND ${DATE} +%s
RESULT_VARIABLE date_result
ERROR_VARIABLE date_err
OUTPUT_VARIABLE date_out)
if (date_result OR date_err)
message("*** ${DATE} failed: ***\n${date_err}")
else (date_result OR date_err)
math(EXPR daycount "${date_out} / (60*60*24)")
endif (date_result OR date_err)
endif (DATE)
endif (NOT daycount)
if (NOT daycount)
set(daycount 33333)
endif (NOT daycount)
set(VERSION_NUMBER_PATCHLEVEL "${daycount}")
endif (EXISTS "${PROJECT_SOURCE_DIR}/.git")
endif (EXISTS "${PROJECT_SOURCE_DIR}/.svn")
set(VERSION_NUMBER_DEFAULT "10.0.${VERSION_NUMBER_PATCHLEVEL}")
set(VERSION_NUMBER "" CACHE STRING "Version number: leave empty for default")
if ("${VERSION_NUMBER}" STREQUAL "")
set(VERSION_NUMBER ${VERSION_NUMBER_DEFAULT})
endif()
string(REGEX REPLACE "\\." "," VERSION_COMMA_DELIMITED "${VERSION_NUMBER}")
message(STATUS "Version number: ${VERSION_NUMBER}")
set(BUILD_NUMBER "0" CACHE STRING "Build number (must be <64K)")
set(UNIQUE_BUILD_NUMBER "0" CACHE STRING "Unique build number")
set(CUSTOM_PRODUCT_NAME "" CACHE STRING "Custom product name")
set(PACKAGE_PLATFORM "" CACHE STRING "Platform for package name (should have trailing -)")
set(PACKAGE_SUBSYS "" CACHE STRING
"Platform for sub-system name (should have leading -: e.g., -EABIHF")
mark_as_advanced(
VERSION_NUMBER
VERSION_COMMA_DELIMITED
BUILD_NUMBER
UNIQUE_BUILD_NUMBER
CUSTOM_PRODUCT_NAME
PACKAGE_PLATFORM
PACKAGE_SUBSYS
)
set(PRODUCT_NAME "DynamoRIO")
if (install_override)
set(CMAKE_INSTALL_PREFIX "${PROJECT_SOURCE_DIR}/exports"
CACHE PATH "install path" FORCE)
endif (install_override)
set(INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
set(proc_supports_avx OFF)
set(proc_supports_avx2 OFF)
set(proc_supports_avx512 OFF)
if (X86 AND UNIX)
set(CFLAGS_AVX "-mavx")
set(CFLAGS_AVX2 "-mavx2 -mbmi2")
set(CFLAGS_AVX512 "-mavx512f")
check_avx_processor_and_compiler_support(proc_supports_avx)
check_avx2_processor_and_compiler_support(proc_supports_avx2)
check_avx512_processor_and_compiler_support(proc_supports_avx512)
endif ()
set(proc_supports_sve OFF)
if (AARCH64 AND UNIX)
set(CFLAGS_SVE "-march=armv8-a+sve")
check_sve_processor_and_compiler_support(proc_supports_sve)
endif ()
if (NOT UNIX)
if (X64)
add_definitions(-D_AMD64_)
else (X64)
add_definitions(-D_X86_)
endif (X64)
endif (NOT UNIX)
if (UNIX)
add_definitions(-D_LARGEFILE64_SOURCE)
endif ()
if (NOT UNIX)
get_filename_component(cl_path ${CMAKE_C_COMPILER} PATH)
endif (NOT UNIX)
set(cpp2asm_newline_script_path "${PROJECT_SOURCE_DIR}/make/CMake_asm.cmake")
include(make/cpp2asm_support.cmake)
if (UNIX)
if (NOT CMAKE_ASM_SUPPORTS_INTEL_SYNTAX)
message(FATAL_ERROR
"${CMAKE_ASM_COMPILER} is too old and does not support -msyntax=intel")
endif (NOT CMAKE_ASM_SUPPORTS_INTEL_SYNTAX)
endif (UNIX)
if (UNIX)
identify_clang(CMAKE_COMPILER_IS_CLANG)
if (CMAKE_COMPILER_IS_CLANG)
set(CLANG 1)
endif (CMAKE_COMPILER_IS_CLANG)
if (CYGWIN)
message(FATAL_ERROR "building using gcc within cygwin is not supported")
endif (CYGWIN)
if (NOT CMAKE_COMPILER_IS_GNUCC)
message(FATAL_ERROR "gcc is required to build")
endif (NOT CMAKE_COMPILER_IS_GNUCC)
check_if_linker_is_gnu_gold(LINKER_IS_GNU_GOLD)
if (UNIX AND NOT X64 AND NOT DEBUG AND NOT CLANG AND
"${CMAKE_C_COMPILER_VERSION}" VERSION_GREATER "7.3")
message(STATUS "gcc 7.3+ non-debug 32-bit detected: disabling static C++ client "
"tests to work around i#2949")
set(DISABLE_FOR_BUG_2949 ON)
else ()
set(DISABLE_FOR_BUG_2949 OFF)
endif ()
else (UNIX)
if (NOT ${COMPILER_BASE_NAME} STREQUAL "cl")
message(FATAL_ERROR "cl (Microsoft C++ compiler) is required to build")
endif (NOT ${COMPILER_BASE_NAME} STREQUAL "cl")
if ("${CMAKE_GENERATOR}" MATCHES "Visual Studio")
get_filename_component(kits_dir "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots;KitsRoot10]" REALPATH)
if (EXISTS ${kits_dir})
if (X64)
set(sdk_bindir "${kits_dir}/bin/${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}/x64")
else (X64)
set(sdk_bindir "${kits_dir}/bin/${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}/x86")
endif (X64)
else (EXISTS ${kits_dir})
get_filename_component(sdk_dir "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows;CurrentInstallFolder]" REALPATH)
if (X64)
set(sdk_bindir "${sdk_dir}/bin/x64")
else (X64)
set(sdk_bindir "${sdk_dir}/bin")
endif (X64)
endif (EXISTS ${kits_dir})
endif ()
if (NOT ("${CMAKE_GENERATOR}" MATCHES "MSYS Makefiles"))
find_program(CMAKE_MC_COMPILER mc.exe HINTS "${sdk_bindir}"
DOC "path to message compiler")
if (NOT CMAKE_MC_COMPILER)
message(FATAL_ERROR "message compiler not found: required to build")
endif (NOT CMAKE_MC_COMPILER)
message(STATUS "Found message compiler: ${CMAKE_MC_COMPILER}")
mark_as_advanced(CMAKE_MC_COMPILER)
endif ()
endif (UNIX)
find_package(Perl)
if (NOT PERL_FOUND)
message(FATAL_ERROR "perl is required to build")
endif (NOT PERL_FOUND)
if (UNIX)
include(CheckTypeSize)
CHECK_TYPE_SIZE(uint DR_DO_NOT_DEFINE_uint)
CHECK_TYPE_SIZE(ushort DR_DO_NOT_DEFINE_ushort)
CHECK_TYPE_SIZE(bool DR_DO_NOT_DEFINE_bool)
CHECK_TYPE_SIZE(byte DR_DO_NOT_DEFINE_byte)
CHECK_TYPE_SIZE(sbyte DR_DO_NOT_DEFINE_sbyte)
CHECK_TYPE_SIZE(uint32 DR_DO_NOT_DEFINE_uint32)
CHECK_TYPE_SIZE(uint64 DR_DO_NOT_DEFINE_uint64)
CHECK_TYPE_SIZE(int32 DR_DO_NOT_DEFINE_int32)
CHECK_TYPE_SIZE(int64 DR_DO_NOT_DEFINE_int64)
if (DR_DO_NOT_DEFINE_bool)
if (NOT ${DR_DO_NOT_DEFINE_bool} EQUAL 1)
message(FATAL_ERROR "incompatible pre-defined \"bool\" type is larger than 1 byte")
endif (NOT ${DR_DO_NOT_DEFINE_bool} EQUAL 1)
endif (DR_DO_NOT_DEFINE_bool)
CHECK_TYPE_SIZE(_Bool DR__Bool_EXISTS)
if (DR__Bool_EXISTS)
if (NOT ${DR__Bool_EXISTS} EQUAL 1)
message(FATAL_ERROR "incompatible \"_Bool\" type is larger than 1 byte")
endif (NOT ${DR__Bool_EXISTS} EQUAL 1)
endif (DR__Bool_EXISTS)
endif (UNIX)
macro(add_static_lib_debug_info target dest_dir)
if (WIN32)
if ("${CMAKE_VERSION}" VERSION_EQUAL "3.1" OR
"${CMAKE_VERSION}" VERSION_GREATER "3.1")
append_property_string(TARGET ${target}
COMPILE_PDB_NAME${location_suffix} "${target}"
COMPILE_PDB_OUTPUT_DIRECTORY{location_suffix} "${dest_dir}")
else ()
endif ()
endif ()
endmacro()
set(BASE_CFLAGS "")
set(BASE_CONLY_FLAGS "")
set(BASE_CXXONLY_FLAGS "")
CHECK_CXX_COMPILER_FLAG("-std=c++17" cxx17_available)
if (UNIX)
set(BASE_CXXONLY_FLAGS "${BASE_CXXONLY_FLAGS} -std=c++11")
set(BASE_CONLY_FLAGS "${BASE_CONLY_FLAGS} -std=gnu99")
set(BASE_CFLAGS "${BASE_CFLAGS} -fno-strict-aliasing")
set(BASE_CFLAGS "${BASE_CFLAGS} -funsigned-char")
CHECK_C_COMPILER_FLAG("-fno-stack-protector" no_stack_protector_avail)
if (no_stack_protector_avail)
set(BASE_CFLAGS "${BASE_CFLAGS} -fno-stack-protector")
endif (no_stack_protector_avail)
CHECK_CXX_COMPILER_FLAG("-Wsuggest-override" suggest_override_avail)
if (suggest_override_avail)
set(BASE_CXXONLY_FLAGS "${BASE_CXXONLY_FLAGS} -Wsuggest-override")
endif ()
if (X86)
if (X64)
set(BASE_CFLAGS "-m64 ${BASE_CFLAGS}")
set(LD_FLAGS "-melf_x86_64")
else (X64)
set(BASE_CFLAGS "-m32 ${BASE_CFLAGS}")
set(LD_FLAGS "-melf_i386")
endif (X64)
elseif (ARM)
if (X64)
else (X64)
CHECK_C_COMPILER_FLAG("-march=armv7-a+fp" armv7_fp_available)
if (armv7_fp_available)
set(BASE_CFLAGS "-mthumb -march=armv7-a+fp ${BASE_CFLAGS}")
else ()
set(BASE_CFLAGS "-mthumb -march=armv7-a ${BASE_CFLAGS}")
endif ()
set(LD_FLAGS "-marmelf_linux_eabi")
if (ANDROID OR CMAKE_C_LIBRARY_ARCHITECTURE MATCHES "gnueabi$")
set(BASE_CFLAGS "-mfloat-abi=softfp ${BASE_CFLAGS}")
endif ()
endif (X64)
endif ()
if (APPLE AND CMAKE_COMPILER_IS_CLANG)
set(BASE_CFLAGS "${BASE_CFLAGS} -mmacosx-version-min=${OLDEST_OSX_SUPPPORTED}")
endif ()
if (APPLE)
set(ld_entry_flag "-e")
else ()
set(ld_entry_flag "--entry")
endif ()
set(WARN "-Wall -Werror -Wwrite-strings -Wvla")
if (NOT CMAKE_COMPILER_IS_CLANG)
CHECK_C_COMPILER_FLAG("-Wno-unused-but-set-variable" nounused_avail)
if (nounused_avail)
set(WARN "${WARN} -Wno-unused-but-set-variable")
endif (nounused_avail)
CHECK_C_COMPILER_FLAG("-Wstringop-truncation" stringop_truncation_avail)
if (stringop_truncation_avail)
set(WARN "${WARN} -Wno-stringop-truncation")
endif (stringop_truncation_avail)
CHECK_C_COMPILER_FLAG("-Wformat-truncation" format_truncation_avail)
if (format_truncation_avail)
set(WARN "${WARN} -Wno-format-truncation")
endif (format_truncation_avail)
CHECK_C_COMPILER_FLAG("-Wstringop-overflow" stringop_overflow_avail)
if (stringop_overflow_avail)
set(WARN "${WARN} -Wno-stringop-overflow")
endif (stringop_overflow_avail)
CHECK_C_COMPILER_FLAG("-Wtype-limits" HAVE_TYPELIMITS_CONTROL)
else (NOT CMAKE_COMPILER_IS_CLANG)
option(CLANG_COLOR_DIAGNOSTICS "force colored clang diagnostics" OFF)
set(clang_args "")
if (CLANG_COLOR_DIAGNOSTICS)
set(clang_args "-fcolor-diagnostics ${clang_args}")
endif (CLANG_COLOR_DIAGNOSTICS)
set(BASE_CFLAGS "${clang_args} ${BASE_CFLAGS}")
endif (NOT CMAKE_COMPILER_IS_CLANG)
set(DBG "-g3")
set(OPT "-O3 ${DBG}")
if (PROFILE)
set(OPT "${OPT} -fno-omit-frame-pointer")
endif ()
if (NOT DEBUG)
set(BASE_CONLY_FLAGS "${BASE_CONLY_FLAGS} -fno-unwind-tables")
endif ()
if (NOT APPLE AND NOT ANDROID)
foreach (config ${CMAKE_BUILD_TYPE} ${CMAKE_CONFIGURATION_TYPES})
string(TOUPPER "${config}" config_upper)
foreach (var
CMAKE_EXE_LINKER_FLAGS_${config_upper};
CMAKE_MODULE_LINKER_FLAGS_${config_upper};
CMAKE_SHARED_LINKER_FLAGS_${config_upper})
set(${var} "-Wl,--hash-style=both")
endforeach ()
endforeach ()
endif ()
set(DBG_OPT "-fno-omit-frame-pointer")
if (NOT CMAKE_COMPILER_IS_CLANG)
set(DBG_OPT "${DBG_OPT} -fno-builtin-strcmp")
endif ()
set(LINK_EXTRA_FLAGS "")
else (UNIX)
set(BASE_CFLAGS "${BASE_CFLAGS} /nologo")
set(BASE_CFLAGS "${BASE_CFLAGS} /MP")
set(BASE_CFLAGS "${BASE_CFLAGS} /GF")
if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 18.0)
set(BASE_CFLAGS "${BASE_CFLAGS} /FS")
endif()
set(BASE_CFLAGS "${BASE_CFLAGS} /GS-")
if (DEBUG)
set(BASE_CFLAGS "${BASE_CFLAGS} /MTd")
else ()
set(BASE_CFLAGS "${BASE_CFLAGS} /MT")
endif ()
set(WARN "/W4 /WX")
string(REGEX REPLACE "/W[0-9]" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
string(REGEX REPLACE "/W[0-9]" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
set(LINK_EXTRA_FLAGS "/opt:ref /opt:icf /pdbcompress")
if (GENERATE_PDBS)
set(DBG "/Zi")
set(LINK_EXTRA_FLAGS "${LINK_EXTRA_FLAGS} /debug")
else (GENERATE_PDBS)
set(DBG "")
set(LINK_EXTRA_FLAGS "")
string(REGEX REPLACE "/debug" "" CMAKE_EXE_LINKER_FLAGS
"${CMAKE_EXE_LINKER_FLAGS}")
string(REGEX REPLACE "/debug" "" CMAKE_MODULE_LINKER_FLAGS
"${CMAKE_MODULE_LINKER_FLAGS}")
string(REGEX REPLACE "/debug" "" CMAKE_SHARED_LINKER_FLAGS
"${CMAKE_SHARED_LINKER_FLAGS}")
endif (GENERATE_PDBS)
if (X64)
set(os_target "5.02")
else (X64)
if (CMAKE_C_COMPILER_VERSION VERSION_LESS 17.0)
set(os_target "5.00")
else ()
set(os_target "5.01")
endif ()
endif (X64)
foreach (lflags CMAKE_EXE_LINKER_FLAGS
CMAKE_MODULE_LINKER_FLAGS
CMAKE_SHARED_LINKER_FLAGS)
set(${lflags} "${${lflags}} /subsystem:console,${os_target}")
endforeach()
message(STATUS "Targeting subsystem ${os_target}")
set(OPT "/O2 ${DBG}")
set(DBG_OPT "/Od")
if (NOT "${CMAKE_GENERATOR}" MATCHES "Visual Studio")
if (CMAKE_RC_FLAGS)
set(CMAKE_RC_FLAGS "${CMAKE_RC_FLAGS} /nologo")
else ()
set(CMAKE_RC_FLAGS "/nologo")
endif ()
endif ()
endif (UNIX)
if (UNIX)
CHECK_C_COMPILER_FLAG("-fvisibility=internal" HAVE_FVISIBILITY_INTERNAL)
CHECK_C_COMPILER_FLAG("-fvisibility=hidden" HAVE_FVISIBILITY_HIDDEN)
if (HAVE_FVISIBILITY_INTERNAL AND NOT APPLE)
set(VISIBILITY "internal")
elseif (HAVE_FVISIBILITY_HIDDEN)
set(VISIBILITY "hidden")
else ()
message("${CMAKE_C_COMPILER} missing flag -fvisibility, using linker "
"script instead")
set(VISIBILITY " ")
endif ()
if (VISIBILITY)
set(BASE_CFLAGS "${BASE_CFLAGS} -fvisibility=${VISIBILITY}")
set(HAVE_FVISIBILITY ON)
endif (VISIBILITY)
CHECK_C_COMPILER_FLAG("-fno-sanitize=null" HAVE_FNOSANITIZE_NULL)
if (APPLE OR LINKER_IS_GNU_GOLD)
set(ld_script_option "")
else ()
execute_process(COMMAND
${CMAKE_LINKER} --help
RESULT_VARIABLE ld_result
ERROR_VARIABLE ld_error
OUTPUT_VARIABLE ld_out)
if (ld_result OR ld_error)
message(FATAL_ERROR "*** ${CMAKE_LINKER} failed: ***\n${ld_error}")
endif (ld_result OR ld_error)
string(REGEX MATCH "dT" flag_present "${ld_out}")
if (NOT flag_present)
message("${CMAKE_LINKER} missing flag -dT, using -T instead")
set(ld_script_option "-T")
else (NOT flag_present)
set(ld_script_option "-dT")
endif (NOT flag_present)
endif ()
option(SPLIT_SYMBOLS "whether to split debug symbols from binaries" ON)
mark_as_advanced(SPLIT_SYMBOLS)
if (SPLIT_SYMBOLS AND NOT DEFINED CMAKE_OBJCOPY)
find_package(BinUtils)
endif ()
if (SPLIT_SYMBOLS AND EXISTS ${CMAKE_OBJCOPY} AND EXISTS ${CMAKE_STRIP})
execute_process(COMMAND
${CMAKE_OBJCOPY} --help
RESULT_VARIABLE objcopy_result
ERROR_QUIET
OUTPUT_VARIABLE objcopy_out)
if (objcopy_result)
message(FATAL_ERROR "*** ${CMAKE_OBJCOPY} failed to run ***\n")
endif (objcopy_result)
set(strip_local "-x")
if (PROFILE)
set(strip_local "")
endif ()
string(REGEX MATCH "only-keep-debug" flag_present "${objcopy_out}")
if (NOT flag_present)
message("${CMAKE_OBJCOPY} missing flag --only-keep-debug: leaving debug info in .so files")
if (APPLE)
find_program(DSYMUTIL_PROGRAM dsymutil)
if (DSYMUTIL_PROGRAM)
set(CMAKE_C_LINK_EXECUTABLE
"${CMAKE_C_LINK_EXECUTABLE}"
"${DSYMUTIL_PROGRAM} <TARGET>")
set(CMAKE_C_CREATE_SHARED_LIBRARY
"${CMAKE_C_CREATE_SHARED_LIBRARY}"
"${DSYMUTIL_PROGRAM} <TARGET>")
set(CMAKE_CXX_LINK_EXECUTABLE
"${CMAKE_CXX_LINK_EXECUTABLE}"
"${DSYMUTIL_PROGRAM} <TARGET>")
set(CMAKE_CXX_CREATE_SHARED_LIBRARY
"${CMAKE_CXX_CREATE_SHARED_LIBRARY}"
"${DSYMUTIL_PROGRAM} <TARGET>")
endif ()
endif ()
if (ANDROID)
message(FATAL_ERROR "${CMAKE_OBJCOPY} required flag --only-keep-debug missing")
endif ()
else (NOT flag_present)
if (ANDROID)
set(exe_link_extra "-fPIE -pie")
else ()
set(exe_link_extra "")
endif ()
set(CMAKE_C_CREATE_SHARED_LIBRARY
"<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_C_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_C_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>"
"${CMAKE_OBJCOPY} --only-keep-debug <TARGET> <TARGET>.debug"
"${CMAKE_OBJCOPY} --add-gnu-debuglink=<TARGET>.debug <TARGET>"
"${CMAKE_STRIP} -g ${strip_local} <TARGET>"
)
SET(CMAKE_C_LINK_EXECUTABLE
"<CMAKE_C_COMPILER> <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> ${exe_link_extra} <OBJECTS> -o <TARGET> <LINK_LIBRARIES>"
"${CMAKE_OBJCOPY} --only-keep-debug <TARGET> <TARGET>.debug"
"${CMAKE_OBJCOPY} --add-gnu-debuglink=<TARGET>.debug <TARGET>"
"${CMAKE_STRIP} -g ${strip_local} <TARGET>"
)
set(CMAKE_CXX_CREATE_SHARED_LIBRARY
"<CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>"
"${CMAKE_OBJCOPY} --only-keep-debug <TARGET> <TARGET>.debug"
"${CMAKE_OBJCOPY} --add-gnu-debuglink=<TARGET>.debug <TARGET>"
"${CMAKE_STRIP} -g ${strip_local} <TARGET>"
)
SET(CMAKE_CXX_LINK_EXECUTABLE
"<CMAKE_CXX_COMPILER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> ${exe_link_extra} <OBJECTS> -o <TARGET> <LINK_LIBRARIES>"
"${CMAKE_OBJCOPY} --only-keep-debug <TARGET> <TARGET>.debug"
"${CMAKE_OBJCOPY} --add-gnu-debuglink=<TARGET>.debug <TARGET>"
"${CMAKE_STRIP} -g ${strip_local} <TARGET>"
)
endif (NOT flag_present)
else (SPLIT_SYMBOLS AND EXISTS ${CMAKE_OBJCOPY} AND EXISTS ${CMAKE_STRIP})
if (ANDROID)
message(FATAL_ERROR "SPLIT_SYMBOLS required for Android")
endif ()
endif (SPLIT_SYMBOLS AND EXISTS ${CMAKE_OBJCOPY} AND EXISTS ${CMAKE_STRIP})
endif (UNIX)
if (DEBUG)
set(CMAKE_C_FLAGS "${BASE_CFLAGS} ${BASE_CONLY_FLAGS} ${DBG} ${DBG_OPT} $ENV{CFLAGS}")
set(CMAKE_CXX_FLAGS "${BASE_CFLAGS} ${BASE_CXXONLY_FLAGS} ${DBG} ${DBG_OPT} $ENV{CXXFLAGS}")
else (DEBUG)
if (CALLPROF)
set (OPT "")
endif (CALLPROF)
set(CMAKE_C_FLAGS "${BASE_CFLAGS} ${BASE_CONLY_FLAGS} ${OPT} $ENV{CFLAGS}")
set(CMAKE_CXX_FLAGS "${BASE_CFLAGS} ${BASE_CXXONLY_FLAGS} ${OPT} $ENV{CXXFLAGS}")
endif (DEBUG)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LINK_EXTRA_FLAGS}")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${LINK_EXTRA_FLAGS}")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${LINK_EXTRA_FLAGS}")
if (NOT DISABLE_WARNINGS)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARN}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARN}")
endif (NOT DISABLE_WARNINGS)
if (LINUX)
CHECK_INCLUDE_FILE("linux/rseq.h" HAVE_RSEQ)
CHECK_INCLUDE_FILE("libunwind.h" HAVE_LIBUNWIND_H)
else ()
set(HAVE_RSEQ OFF)
set(HAVE_LIBUNWIND_H OFF)
endif ()
if (DR_HOST_AARCH64)
set(HAVE_HALF_FLOAT ON)
else ()
set(HAVE_HALF_FLOAT OFF)
endif ()
set(BUILD_PT_TRACER OFF)
set(BUILD_PT_POST_PROCESSOR OFF)
set(proc_supports_pt OFF)
if (LINUX AND X86 AND X64)
set(BUILD_PT_TRACER ON)
check_intel_pt_support(proc_supports_pt)
if (EXISTS "${PROJECT_SOURCE_DIR}/third_party/libipt/.git" )
set(BUILD_PT_POST_PROCESSOR ON)
else ()
message(STATUS "libipt submodule is not initialized. libdrpt2ir and drpt2trace will not be built.")
endif ()
else (LINUX AND X86 AND X64)
message(STATUS "PT related libraries only supported on Linux x86_64")
endif (LINUX AND X86 AND X64)
set(INSTALL_LIB_X64 lib64)
set(INSTALL_LIB_X86 lib32)
if (X64)
set(INSTALL_LIB_BASE ${INSTALL_LIB_X64})
set(INSTALL_BIN bin64)
else (X64)
set(INSTALL_LIB_BASE ${INSTALL_LIB_X86})
set(INSTALL_BIN bin32)
endif (X64)
if (DEBUG)
set(INSTALL_LIB ${INSTALL_LIB_BASE}/debug)
else (DEBUG)
set(INSTALL_LIB ${INSTALL_LIB_BASE}/release)
endif (DEBUG)
set(INSTALL_INCLUDE include)
set(INSTALL_DOCS docs)
set(INSTALL_DOCS_EMBED docs_embed)
set(INSTALL_CMAKE cmake)
set(BUILD_INCLUDE "${PROJECT_BINARY_DIR}/${INSTALL_INCLUDE}")
set(BUILD_CMAKE "${PROJECT_BINARY_DIR}/${INSTALL_CMAKE}")
if (NOT DEFINED DO_DR_INSTALL)
set(DO_DR_INSTALL ON)
endif (NOT DEFINED DO_DR_INSTALL)
macro(DR_install)
if (DO_DR_INSTALL)
install(${ARGV})
endif (DO_DR_INSTALL)
endmacro(DR_install)
if (DO_DR_INSTALL OR NOT DEFINED DO_DR_INSTALL_TARGETS)
set(DO_DR_INSTALL_TARGETS ON)
endif ()
macro(DR_target_install)
if (DO_DR_INSTALL_TARGETS)
install(${ARGV})
endif (DO_DR_INSTALL_TARGETS)
endmacro(DR_target_install)
macro(DR_target_install_dst dst)
if (DO_DR_INSTALL_TARGETS)
if (DEFINED DR_INSTALL_TARGETS_DEST)
set(inst_dst ${DR_INSTALL_TARGETS_DEST})
else ()
set(inst_dst ${dst})
endif ()
set(export_flag "")
foreach (n ${ARGN})
if (n MATCHES EXPORT)
set(export_flag "EXPORT_LINK_INTERFACE_LIBRARIES")
endif ()
break ()
endforeach ()
install(${ARGN} DESTINATION ${inst_dst} ${export_flag})
endif (DO_DR_INSTALL_TARGETS)
endmacro(DR_target_install_dst)
function (install_exported_target target dest)
if (DO_DR_INSTALL_TARGETS)
DR_target_install_dst(${dest} TARGETS ${target} EXPORT ${exported_targets_name}
${ARGN})
endif (DO_DR_INSTALL_TARGETS)
endfunction (install_exported_target)
function (install_target target dest)
if (DO_DR_INSTALL_TARGETS)
DR_target_install_dst(${dest} TARGETS ${target} ${ARGN})
endif (DO_DR_INSTALL_TARGETS)
endfunction (install_target)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${INSTALL_LIB_BASE}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
set(DR_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${INSTALL_LIB}")
set(DR_LIBRARY_BASE_DIRECTORY "${PROJECT_BINARY_DIR}/${INSTALL_LIB_BASE}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${INSTALL_BIN}")
file(MAKE_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
function (set_per_config_ouput_to_match_single_config)
if ("${CMAKE_GENERATOR}" MATCHES "Visual Studio")
foreach (config ${CMAKE_CONFIGURATION_TYPES})
string(TOUPPER "${config}" config_upper)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${config_upper}
"${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" PARENT_SCOPE)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${config_upper}
"${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}" PARENT_SCOPE)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${config_upper}
"${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" PARENT_SCOPE)
endforeach ()
endif ()
endfunction (set_per_config_ouput_to_match_single_config)
set_per_config_ouput_to_match_single_config()
string(REGEX REPLACE
"^([0-9]+)\\..*" "\\1" VERSION_NUMBER_MAJOR "${VERSION_NUMBER}")
string(REGEX REPLACE
"^[0-9]+\\.([0-9]+)\\..*" "\\1" VERSION_NUMBER_MINOR "${VERSION_NUMBER}")
math(EXPR VERSION_NUMBER_INTEGER
"${VERSION_NUMBER_MAJOR}*100 + ${VERSION_NUMBER_MINOR}")
set(OLDEST_COMPATIBLE_VERSION_DEFAULT "1000")
set(OLDEST_COMPATIBLE_VERSION "" CACHE STRING
"Oldest compatible version: leave empty for default")
if ("${OLDEST_COMPATIBLE_VERSION}" STREQUAL "")
set(OLDEST_COMPATIBLE_VERSION ${OLDEST_COMPATIBLE_VERSION_DEFAULT})
endif()
set(DR_RPATH_SUFFIX "drpath")
configure_file(
${PROJECT_SOURCE_DIR}/make/configure.cmake.h
${PROJECT_BINARY_DIR}/configure.h
)
file(READ ${PROJECT_BINARY_DIR}/configure.h configure_h)
string(REGEX REPLACE
"(# *define *)([^_][^ \r\n]+)( *\r?\n)"
"\\1\\2\\3-D\\2\n" configure_h_mod "${configure_h}")
set(defines_tmpfile ${PROJECT_BINARY_DIR}/configure_temp.h)
file(WRITE ${defines_tmpfile} "${configure_h_mod}")
execute_process(COMMAND
${CMAKE_CPP} ${CMAKE_CPP_FLAGS} -E ${CPP_NO_LINENUM} ${defines_tmpfile}
RESULT_VARIABLE cpp_result
ERROR_VARIABLE cpp_err
OUTPUT_VARIABLE cpp_out
)
if (WIN32)
get_filename_component(tmpfile_nm ${defines_tmpfile} NAME)
string(REGEX REPLACE "${tmpfile_nm}[ \r\n]*" "" cpp_err "${cpp_err}")
string(STRIP "${cpp_err}" cpp_err)
endif (WIN32)
if (cpp_result OR cpp_err)
message(FATAL_ERROR "*** ${CMAKE_CPP} failed: ***\n${cpp_err}")
endif (cpp_result OR cpp_err)
string(REGEX MATCHALL
"-D[^ \r\n]+" defines "${cpp_out}")
string(REGEX REPLACE
";"
" " defines "${defines}")
set(defines_tofile
"#ifndef _CONFIGDEFS_\n#define _CONFIGDEFS_ 1\n\n#define DYNAMORIO_DEFINES \"${defines}\"\n\n#endif /* _CONFIGDEFS_ */\n")
set(defines_file ${PROJECT_BINARY_DIR}/configure_defines.h)
if (EXISTS ${defines_file})
file(READ ${defines_file} defines_fromfile)
if (NOT "${defines_fromfile}" STREQUAL "${defines_tofile}")
file(WRITE ${defines_file} "${defines_tofile}")
endif (NOT "${defines_fromfile}" STREQUAL "${defines_tofile}")
else (EXISTS ${defines_file})
file(WRITE ${defines_file} "${defines_tofile}")
endif (EXISTS ${defines_file})
include_directories(BEFORE
${PROJECT_BINARY_DIR}
)
if (X64)
set(exported_targets_name "DynamoRIOTarget64")
set(exported_map_name "DynamoRIOMap64")
else (X64)
set(exported_targets_name "DynamoRIOTarget32")
set(exported_map_name "DynamoRIOMap32")
endif (X64)
file(WRITE ${PROJECT_BINARY_DIR}/cmake/${exported_map_name}.cmake "")
set(exported_targets_append "")
macro(DR_export_target target)
export(TARGETS ${ARGV} APPEND FILE ${PROJECT_BINARY_DIR}/cmake/${exported_targets_name}.cmake
EXPORT_LINK_INTERFACE_LIBRARIES)
set(toadd "
SET_PROPERTY(TARGET ${ARGV} PROPERTY MAP_IMPORTED_CONFIG_RELEASE RelWithDebInfo)
SET_PROPERTY(TARGET ${ARGV} PROPERTY MAP_IMPORTED_CONFIG_RELMINSIZE RelWithDebInfo)
")
if (NOT DEBUG)
file(APPEND ${PROJECT_BINARY_DIR}/cmake/${exported_map_name}.cmake ${toadd})
endif (NOT DEBUG)
set(exported_targets_append "${exported_targets_append}${toadd}")
set(exported_targets_append "${exported_targets_append}" PARENT_SCOPE)
endmacro(DR_export_target)
file(MAKE_DIRECTORY ${BUILD_INCLUDE})
macro(DR_export_header src_path dst_fname)
configure_file(${src_path} ${BUILD_INCLUDE}/${dst_fname})
endmacro()
set(PROGFILES "$ENV{PROGRAMW6432}")
set(PROGFILES32 "$ENV{ProgramFiles\(x86\)}")
if ("${PROGFILES}" STREQUAL "")
set(PROGFILES "$ENV{PROGRAMFILES}")
endif ()
if (X64)
set(ARCH_SFX "x64")
else (X64)
set(ARCH_SFX "x86")
endif (X64)
set(dbghelp_paths
"${PROGFILES32}/Microsoft Visual Studio/*/Professional/Common7/IDE/Remote Debugger/${ARCH_SFX}/dbghelp.dll"
"${PROGFILES}/Microsoft Visual Studio/*/Professional/Common7/IDE/Remote Debugger/${ARCH_SFX}/dbghelp.dll"
"${PROGFILES32}/Microsoft Visual Studio */Common7/IDE/Remote Debugger/${ARCH_SFX}/dbghelp.dll"
"${PROGFILES}/Microsoft Visual Studio */Common7/IDE/Remote Debugger/${ARCH_SFX}/dbghelp.dll"
"${PROGFILES32}/Microsoft Visual Studio */Common7/IDE/dbghelp.dll"
"${PROGFILES}/Microsoft Visual Studio */Common7/IDE/dbghelp.dll"
"${PROGFILES32}/Windows Kits/*/Debuggers/${ARCH_SFX}/dbghelp.dll"
"${PROGFILES}/Windows Kits/*/Debuggers/${ARCH_SFX}/dbghelp.dll")
if (X64)
set(dbghelp_paths ${dbghelp_paths}
"${PROGFILES}/Debugging Tools for Windows (x64)/dbghelp.dll")
else ()
set(dbghelp_paths ${dbghelp_paths}
"${PROGFILES}/Debugging Tools for Windows/dbghelp.dll")
endif ()
file(GLOB dbghelp_loc ${dbghelp_paths})
message(STATUS "For dbghelp, choosing among: ${dbghelp_loc}")
if (dbghelp_loc)
list(LENGTH dbghelp_loc dbghelp_max)
math(EXPR dbghelp_max "${dbghelp_max} - 1")
set(dbghelp_index 0)
list(GET dbghelp_loc 0 dbghelp_path)
while (X64 AND dbghelp_path MATCHES "Visual Studio 8" AND
${dbghelp_index} LESS ${dbghelp_max})
math(EXPR dbghelp_index "${dbghelp_index} + 1")
list(GET dbghelp_loc ${dbghelp_index} dbghelp_path)
endwhile()
if (X64 AND dbghelp_path MATCHES "Visual Studio 8")
message(STATUS "Unable to find non-VS2005 dbghelp.dll")
set(dbghelp_path dbghelp_path-NOTFOUND)
else ()
string(REPLACE "\\" "/" dbghelp_path ${dbghelp_path})
message(STATUS "Found ${dbghelp_path}")
endif ()
else ()
set(dbghelp_path dbghelp_path-NOTFOUND)
endif ()
if (APPLE)
set(owner_access OWNER_READ OWNER_WRITE)
else (APPLE)
set(owner_access OWNER_READ)
endif (APPLE)
if (WIN32)
option(BUILD_CORE "build core library and drinject tool" ON)
else (WIN32)
option(BUILD_CORE "build core library" ON)
endif (WIN32)
option(BUILD_TOOLS "build tools" ON)
if (WIN32)
option(BUILD_DRSTATS "build DRstats viewer (requires MFC)" ON)
endif (WIN32)
option(BUILD_EXT "build Extension libraries" ON)
option(BUILD_SAMPLES "build client samples" ON)
option(BUILD_CLIENTS "build client tools" ON)
if (ANDROID)
option(BUILD_DOCS "build documentation" OFF)
else ()
option(BUILD_DOCS "build documentation" ON)
endif ()
option(BUILD_TESTS "build tests" OFF)
option(AUTOMATED_TESTING "build for automated testing" OFF)
if (BUILD_TESTS)
set(BUILD_TOOLS ON)
enable_testing()
include(CTest)
endif (BUILD_TESTS)
if (BUILD_CORE)
add_subdirectory(core)
endif (BUILD_CORE)
if (BUILD_TOOLS OR BUILD_DRSTATS OR BUILD_CLIENTS)
add_subdirectory(libutil)
endif (BUILD_TOOLS OR BUILD_DRSTATS OR BUILD_CLIENTS)
if (BUILD_TOOLS)
add_subdirectory(tools)
endif (BUILD_TOOLS)
if (BUILD_DRSTATS)
find_package(MFC)
if (NOT MFC_FOUND)
message(STATUS "MFC not found: disabling DRstats")
set(BUILD_DRSTATS OFF)
endif ()
if (BUILD_DRSTATS)
add_subdirectory(tools/DRstats)
endif ()
endif (BUILD_DRSTATS)
file(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/logs")
configure_file(${PROJECT_SOURCE_DIR}/suite/lookup_visualstudio.cmake
${BUILD_CMAKE}/lookup_visualstudio.cmake COPYONLY)
configure_file(${PROJECT_SOURCE_DIR}/make/cpp2asm_support.cmake
${BUILD_CMAKE}/cpp2asm_support.cmake COPYONLY)
configure_file(${PROJECT_SOURCE_DIR}/make/CMake_asm.cmake
${BUILD_CMAKE}/cpp2asm_add_newlines.cmake COPYONLY)
file(READ "${PROJECT_SOURCE_DIR}/core/arch/asm_defines.asm" str)
string(REPLACE "#include \"configure.h\"" "" str "${str}")
file(WRITE "${BUILD_CMAKE}/cpp2asm_defines.h" "${str}")
configure_file(${PROJECT_SOURCE_DIR}/api/docs/CMake_rundoxygen.cmake
${BUILD_CMAKE}/docs_rundoxygen.cmake COPYONLY)
configure_file(${PROJECT_SOURCE_DIR}/api/docs/CMake_doxyutils.cmake
${BUILD_CMAKE}/docs_doxyutils.cmake COPYONLY)
set(public_config_dir ${PROJECT_BINARY_DIR}/cmake)
set(public_config_file ${public_config_dir}/DynamoRIOConfig.cmake)
configure_file(
${PROJECT_SOURCE_DIR}/make/DynamoRIOConfig.cmake.in
${public_config_file}
@ONLY)
file(READ ${public_config_file} contents)
string(REGEX MATCHALL "\nINCLUDEFILE [^ \r\n]*" includes "${contents}")
foreach (inc ${includes})
string(REGEX REPLACE "\nINCLUDEFILE " "" incfile "${inc}")
file(READ "${incfile}" subst)
string(REGEX REPLACE "(^|\n)##[^\n]*" "" subst "${subst}")
string(REGEX REPLACE "${inc}" "\n${subst}" contents "${contents}")
endforeach (inc)
file(WRITE ${public_config_file} "${contents}")
configure_file(
${PROJECT_SOURCE_DIR}/make/DynamoRIOConfigVersion.cmake.in
${PROJECT_BINARY_DIR}/cmake/DynamoRIOConfigVersion.cmake
@ONLY)
DR_install(FILES
${public_config_file}
${PROJECT_BINARY_DIR}/cmake/DynamoRIOConfigVersion.cmake
DESTINATION ${INSTALL_CMAKE}
)
DR_install(FILES
${PROJECT_SOURCE_DIR}/suite/runsuite_common_pre.cmake
${PROJECT_SOURCE_DIR}/suite/runsuite_common_post.cmake
DESTINATION ${INSTALL_CMAKE}
)
DR_install(FILES ${PROJECT_SOURCE_DIR}/suite/lookup_visualstudio.cmake
DESTINATION ${INSTALL_CMAKE}
)
DR_install(FILES ${PROJECT_SOURCE_DIR}/make/cpp2asm_support.cmake
DESTINATION ${INSTALL_CMAKE}
)
DR_install(FILES ${PROJECT_SOURCE_DIR}/make/CMake_asm.cmake
DESTINATION ${INSTALL_CMAKE} RENAME cpp2asm_add_newlines.cmake
)
DR_install(FILES ${BUILD_CMAKE}/cpp2asm_defines.h DESTINATION ${INSTALL_CMAKE})
DR_install(FILES ${PROJECT_SOURCE_DIR}/api/docs/CMake_rundoxygen.cmake
DESTINATION ${INSTALL_CMAKE} RENAME docs_rundoxygen.cmake
)
DR_install(FILES ${PROJECT_SOURCE_DIR}/api/docs/CMake_doxyutils.cmake
DESTINATION ${INSTALL_CMAKE} RENAME docs_doxyutils.cmake
)
if (X64)
set(TOOLS_LISTNAME "list64")
else ()
set(TOOLS_LISTNAME "list32")
endif ()
file(WRITE ${PROJECT_BINARY_DIR}/tools/${TOOLS_LISTNAME} "")
DR_install(FILES ${PROJECT_BINARY_DIR}/tools/${TOOLS_LISTNAME} DESTINATION tools)
function (register_tool_file name)
file(APPEND ${PROJECT_BINARY_DIR}/tools/${TOOLS_LISTNAME} "${name}\n")
endfunction ()
DR_export_header(${PROJECT_SOURCE_DIR}/core/lib/dr_api.h dr_api.h)
if (NOT ANNOTATIONS)
file(READ ${BUILD_INCLUDE}/dr_api.h contents)
string(REGEX REPLACE "\n[^\n]*nnotation[^\n]*" "" contents "${contents}")
file(WRITE ${BUILD_INCLUDE}/dr_api.h "${contents}")
endif ()
add_custom_target(api_headers)
if (AARCH64)
add_dependencies(api_headers gen_aarch64_codec gen_aarch64_opcodes)
elseif(RISCV64)
add_dependencies(api_headers gen_riscv64_codec gen_riscv64_headers)
endif()
DR_export_header(${PROJECT_SOURCE_DIR}/core/lib/dr_app.h dr_app.h)
DR_install(DIRECTORY ${BUILD_INCLUDE} DESTINATION .
REGEX "annotations/valgrind.h|annotations/memcheck.h" EXCLUDE)
if (UNIX)
if (ANDROID)
set(libmath m)
set(libdl dl)
set(libpthread "")
else ()
find_library(libmath m)
if (NOT libmath AND NOT X64)
find_library(libmath m PATHS /usr/lib32 /lib32)
endif ()
find_library(libdl dl)
if (NOT libdl AND NOT X64)
find_library(libdl dl PATHS /usr/lib32 /lib32)
endif ()
find_library(libpthread pthread)
if (NOT libpthread AND NOT X64)
find_library(libpthread pthread PATHS /usr/lib32 /lib32)
endif ()
if (NOT libmath OR NOT libdl OR NOT libpthread)
message(FATAL_ERROR "cannot find required libs m, dl, and/or pthread")
endif ()
endif ()
endif ()
function (link_with_pthread target)
if (UNIX AND NOT ANDROID)
target_link_libraries(${target} ${libpthread})
endif ()
endfunction ()
function (mac_add_inc_and_lib header lib)
find_path(INCLUDE_DIR ${header} HINTS /usr/local/include /opt/homebrew/include)
if (INCLUDE_DIR)
include_directories(${INCLUDE_DIR})
else ()
message(WARNING "Failed to locate header ${header}")
endif ()
find_path(LIB_DIR ${lib} HINTS /usr/local/lib /opt/homebrew/lib)
if (LIB_DIR)
link_directories(${LIB_DIR})
else ()
message(WARNING "Failed to locate lib ${lib}")
endif ()
endfunction ()
if (WIN32 AND AUTOMATED_TESTING)
set(ZLIB_FOUND OFF)
else ()
find_package(ZLIB)
endif ()
if (UNIX AND X64)
find_library(libsnappy snappy)
if (libsnappy)
message(STATUS "Found snappy: ${libsnappy}")
if (APPLE)
mac_add_inc_and_lib(snappy.h libsnappy.a)
endif ()
endif ()
find_library(liblz4 lz4)
if (liblz4)
message(STATUS "Found liblz4: ${liblz4}")
if (APPLE)
mac_add_inc_and_lib(lz4.h liblz4.a)
endif ()
endif ()
endif ()
if (BUILD_CLIENTS)
add_subdirectory(clients)
endif (BUILD_CLIENTS)
if (BUILD_DOCS)
find_package(Doxygen)
if (NOT DOXYGEN_FOUND)
if (TEST_SUITE AND NOT APPLE)
message(FATAL_ERROR "doxygen is required to build the documentation")
else ()
message(WARNING "doxygen not found: documentation will NOT be built")
set(BUILD_DOCS OFF)
endif ()
endif (NOT DOXYGEN_FOUND)
if (BUILD_DOCS)
add_subdirectory(api/docs)
else (BUILD_DOCS)
message("*** NOT building documentation *** (must re-enable BUILD_DOCS manually if fix up the component paths)")
set(BUILD_DOCS OFF CACHE BOOL "build documentation" FORCE)
endif (BUILD_DOCS)
endif (BUILD_DOCS)
option(VERA_ERROR "Turn vera++ checks into error (default)" ON)
find_package(vera++ QUIET)
if (vera++_FOUND)
message(STATUS "Using vera++ for code style checks")
include(${VERA++_USE_FILE})
include(third_party/vera++/use_vera++.cmake)
add_vera_targets_for_dynamorio(*.h *.c *.cpp
RECURSE
EXCLUSION "${PROJECT_SOURCE_DIR}/make/style_checks/exclude"
ROOT "${PROJECT_SOURCE_DIR}/make/style_checks")
else ()
message(STATUS "WARNING: vera++ not found: disabling code style checks")
endif ()
DR_install(FILES
${PROJECT_SOURCE_DIR}/README
${PROJECT_SOURCE_DIR}/License.txt
${PROJECT_SOURCE_DIR}/ACKNOWLEDGEMENTS
DESTINATION .)
DR_install(DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/
DESTINATION ${INSTALL_LIB_BASE}
FILE_PERMISSIONS ${owner_access} OWNER_EXECUTE GROUP_READ GROUP_EXECUTE
WORLD_READ WORLD_EXECUTE
FILES_MATCHING
PATTERN "*.debug"
PATTERN "*.pdb"
REGEX ".*.dSYM/.*DWARF/.*"
PATTERN "dynamorio.pdb" EXCLUDE
PATTERN "libdynamorio.so.*debug" EXCLUDE
PATTERN "libdrpreload.so.debug" EXCLUDE
PATTERN "policy_static.pdb" EXCLUDE
REGEX ".*dynamorio.*.dSYM/.*" EXCLUDE
REGEX "libdrpreload.*.dSYM/.*" EXCLUDE
REGEX "policy_static.*.dSYM/.*" EXCLUDE
)
DR_install(DIRECTORY ${DR_LIBRARY_OUTPUT_DIRECTORY}/
DESTINATION ${INSTALL_LIB}
FILE_PERMISSIONS ${owner_access} OWNER_EXECUTE GROUP_READ GROUP_EXECUTE
WORLD_READ WORLD_EXECUTE
FILES_MATCHING
PATTERN "dynamorio.pdb"
PATTERN "libdynamorio.so.*debug"
PATTERN "libdrpreload.so.debug"
REGEX ".*dynamorio.*.dSYM/.*DWARF/.*"
REGEX "libdrpreload.*.dSYM/.*DWARF/.*"
)
if (BUILD_TOOLS OR WIN32)
DR_install(DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/
DESTINATION ${INSTALL_BIN}
FILE_PERMISSIONS ${owner_access} OWNER_EXECUTE GROUP_READ GROUP_EXECUTE
WORLD_READ WORLD_EXECUTE
FILES_MATCHING
PATTERN "*.debug"
PATTERN "*.pdb"
REGEX ".*.dSYM/.*DWARF/.*"
PATTERN "runstats.debug" EXCLUDE
PATTERN "run_in_bg.debug" EXCLUDE
PATTERN "*_exe.debug" EXCLUDE
REGEX "runstats.dSYM/.*" EXCLUDE
REGEX "run_in_bg.dSYM/.*" EXCLUDE
REGEX ".*_exe.dSYM/.*" EXCLUDE
)
endif (BUILD_TOOLS OR WIN32)
if (BUILD_DOCS)
file(WRITE ${PROJECT_BINARY_DIR}/docs/DynamoRIO.html "<html>\n<head>\n<meta http-equiv=\"refresh\" content=\"0; URL=./html/index.html\">\n</head><body></body>")
DR_install(FILES ${PROJECT_BINARY_DIR}/docs/DynamoRIO.html DESTINATION docs)
endif (BUILD_DOCS)
file(WRITE ${PROJECT_BINARY_DIR}/logs/README "Empty dir for debug-build log files.\n")
DR_install(FILES ${PROJECT_BINARY_DIR}/logs/README DESTINATION logs)
if (BUILD_EXT)
add_subdirectory(ext)
endif (BUILD_EXT)
if (BUILD_SAMPLES OR BUILD_TESTS OR BUILD_CLIENTS)
set(DynamoRIO_INTERNAL ON)
set(DynamoRIO_DIR ${PROJECT_BINARY_DIR}/cmake)
endif (BUILD_SAMPLES OR BUILD_TESTS OR BUILD_CLIENTS)
if (BUILD_SAMPLES)
add_subdirectory(api/samples)
endif (BUILD_SAMPLES)
if (BUILD_TESTS)
add_subdirectory(suite/tests)
endif (BUILD_TESTS)
DR_target_install(CODE "file(APPEND \"${PROJECT_BINARY_DIR}/CMakeFiles/Export/cmake/${exported_targets_name}.cmake\" \"${exported_targets_append}\")")
DR_target_install_dst(${INSTALL_CMAKE} EXPORT ${exported_targets_name})
if (UNIX)
set(CPACK_GENERATOR "STGZ;TGZ")
set(CPACK_SOURCE_GENERATOR "TGZ")
set(CPACK_STRIP_FILES OFF)
if (APPLE)
set(CPACK_SYSTEM_NAME "MacOS")
elseif (ANDROID)
set(CPACK_SYSTEM_NAME "Android")
else ()
set(CPACK_SYSTEM_NAME "Linux")
endif ()
else (UNIX)
set(CPACK_GENERATOR "ZIP")
set(CPACK_SOURCE_GENERATOR "ZIP")
set(CPACK_SYSTEM_NAME "Windows")
endif (UNIX)
set(CPACK_PACKAGE_NAME "DynamoRIO")
set(CPACK_PACKAGE_VENDOR "DynamoRIO community")
set(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/README")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "DynamoRIO Dynamic Instrumentation Tool Platform")
set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/License.txt")
set(CPACK_RESOURCE_FILE_README "${PROJECT_SOURCE_DIR}/README")
set(CPACK_PACKAGE_VERSION "${VERSION_NUMBER}")
set(CPACK_PACKAGE_VERSION_MAJOR "${VERSION_NUMBER_MAJOR}")
set(CPACK_PACKAGE_VERSION_MINOR "${VERSION_NUMBER_MINOR}")
string(REGEX REPLACE
"^[0-9]+\\.[0-9]+\\.([0-9]+)" "\\1" CPACK_PACKAGE_VERSION_PATCH "${VERSION_NUMBER}")
if ("${BUILD_NUMBER}" STREQUAL "0")
set(PACKAGE_SUFFIX "")
else ()
set(PACKAGE_SUFFIX "-${BUILD_NUMBER}")
endif ()
set(CPACK_PACKAGE_FILE_NAME
"DynamoRIO-${PACKAGE_PLATFORM}${CPACK_SYSTEM_NAME}${PACKAGE_SUBSYS}-${CPACK_PACKAGE_VERSION}${PACKAGE_SUFFIX}")
set(CPACK_PACKAGE_INSTALL_DIRECTORY "dynamorio")
set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "DynamoRIO")
set(CPACK_PACKAGE_RELOCATABLE "true")
include(CPack)