blob: d0f63b89203e74410d81299cd583864167e8b098 [file] [log] [blame]
# **********************************************************
# Copyright (c) 2010-2021 Google, Inc. All rights reserved.
# Copyright (c) 2009-2010 VMware, Inc. All rights reserved.
# **********************************************************
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# * Neither the name of VMware, Inc. nor the names of its contributors may be
# used to endorse or promote products derived from this software without
# specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL VMWARE, INC. OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
# DAMAGE.
# i#801: We use custom target (from core/CMakeLists.txt) to ensure headers
# are generated before compiling .c files that use them. We used to list the
# header as a source file dependence in the targets that use them, but that
# doesn't work well with non-Makefile generators.
function (add_gen_events_deps target)
add_dependencies(${target} generate_syslog)
if (WIN32)
add_dependencies(${target} generate_events)
endif ()
endfunction (add_gen_events_deps)
# FIXME i#60: add rules from old Makefile for building unit tests
# the tests had been broken for a while
# We avoid core/ to avoid conflicts between core/hashtable.h and drcontainers
# hashtable.h. An alternative would be to rename core/hashtable.h.
include_directories(BEFORE
${PROJECT_SOURCE_DIR}/core/lib
${PROJECT_SOURCE_DIR}/core/win32
${PROJECT_SOURCE_DIR}/core/arch
${PROJECT_SOURCE_DIR}/core/arch/${ARCH_NAME}
${PROJECT_BINARY_DIR} # for events.h
${PROJECT_SOURCE_DIR}/core/drlibc # drlibc.h
)
if (WIN32)
include_directories(BEFORE ${PROJECT_SOURCE_DIR}/core/win32)
else (WIN32)
include_directories(BEFORE
${PROJECT_SOURCE_DIR}/core/unix)
endif (WIN32)
set(CORE_SRCS
${PROJECT_SOURCE_DIR}/core/options.c
${PROJECT_SOURCE_DIR}/core/win32/inject_shared.c
${PROJECT_SOURCE_DIR}/core/win32/module_shared.c
${PROJECT_SOURCE_DIR}/core/win32/ntdll_shared.c
${PROJECT_SOURCE_DIR}/core/win32/drmarker.c
${PROJECT_SOURCE_DIR}/core/io.c
)
set(RESOURCES ${PROJECT_SOURCE_DIR}/core/win32/resources.rc)
set(BASE_SRCS
services.c
config.c
elm.c
processes.c
utils.c
policy.c
parser.c
)
set(ROOT_SRCS
detach.c
mfapi.c
)
# drfrontendlib doesn't want NOT_DYNAMORIO_CORE, so we set that individually
# on all the other targets. They all want this:
add_definitions(-DNOT_DYNAMORIO_CORE_PROPER -DDYNAMORIO_INTERNAL)
if (WIN32)
add_definitions(-D_CRT_SECURE_NO_WARNINGS -DUNICODE -D_UNICODE)
if (NOT HOT_PATCHING_INTERFACE)
# We define this to get processes.h included: PROBE_API controls whether we
# expose it
add_definitions(-DHOT_PATCHING_INTERFACE)
endif (NOT HOT_PATCHING_INTERFACE)
# FIXME i#98: fix the underlying cause of these warnings and remove these exceptions
set(nowarn "/wd4996 /wd4047 /wd4024 /wd4133 /wd4127 /wd4100 /wd4292 /wd4127 /wd4100")
set(libutil_cflags "/wd4996 /wd4047 /wd4024 /wd4133 /wd4127 /wd4100 /wd4292 /wd4127 /wd4100")
set(libutil_ldflags "/nodefaultlib:libc.lib")
if (DEBUG)
set(libutil_cflags "${libutil_cflags} /Zi")
set(libutil_ldflags "${libutil_ldflags} /debug")
endif (DEBUG)
add_library(policy_static STATIC ${BASE_SRCS} ${ROOT_SRCS} ${CORE_SRCS})
set_target_properties(policy_static PROPERTIES
COMPILE_FLAGS "${libutil_cflags}" COMPILE_DEFINITIONS "NOT_DYNAMORIO_CORE")
set_target_properties(policy_static PROPERTIES
LINK_FLAGS "${libutil_ldflags}")
add_gen_events_deps(policy_static)
set(DRCONFIG_SRCS dr_config.c ${BASE_SRCS} ${ROOT_SRCS} ${CORE_SRCS}
${RESOURCES})
else () # UNIX
# Most of it is unported. We're just reusing some utils.c and the config
# file writing code currently.
set(DRCONFIG_SRCS dr_config.c utils.c ${PROJECT_SOURCE_DIR}/core/io.c)
if (APPLE)
# XXX i#1286: implement nudge for MacOS
else (APPLE)
set(DRCONFIG_SRCS ${DRCONFIG_SRCS} ${PROJECT_SOURCE_DIR}/core/unix/nudgesig.c)
endif ()
set(libutil_cflags "")
endif ()
# i#1737: we used to have drconfiglib as a shared library, but that led to a
# lot of complexity on UNIX (setting
# INSTALL_NAME_DIR to "@rpath" for Mac i#1375, calling add_rel_rpaths() for
# every executable using them, problems on Android where DT_RUNPATH isn't
# supported, etc.) so we switched to static.
# It would be nice to be static on Windows to avoid copying the lib into bin dirs,
# but duplicate symbol problems make that non-trivial: we need i#1409.
if (WIN32)
set(config_lib_type SHARED)
else ()
set(config_lib_type STATIC)
endif ()
add_library(drconfiglib ${config_lib_type} ${DRCONFIG_SRCS})
set_target_properties(drconfiglib PROPERTIES
# Set define parameters for resources.rc
# Since it's hard to pass spaces in defines (I can get a " through using
# \\\\\\\" but no spaces) we put strings in resources.rc and select
# using RC_ defines.
COMPILE_FLAGS "${libutil_cflags}"
COMPILE_DEFINITIONS "RC_IS_DRCONFIGLIB;NOT_DYNAMORIO_CORE"
# put in lib dir
RUNTIME_OUTPUT_DIRECTORY${location_suffix} "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
add_gen_events_deps(drconfiglib)
if (WIN32)
set_target_properties(drconfiglib PROPERTIES
LINK_FLAGS "${libutil_ldflags}")
# drinject.exe needs a copy in the bin dir (i#1737 would eliminate this)
add_custom_command(TARGET drconfiglib POST_BUILD COMMAND ${CMAKE_COMMAND}
ARGS -E copy "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/drconfiglib.dll"
"${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/" VERBATIM)
add_executable(dumpevts dumpevts.c elm.c ${RESOURCES})
set_target_properties(dumpevts PROPERTIES
# Set define parameters for resources.rc
COMPILE_FLAGS "${libutil_cflags}"
COMPILE_DEFINITIONS "RC_IS_DUMPEVTS;NOT_DYNAMORIO_CORE")
set_target_properties(dumpevts PROPERTIES
LINK_FLAGS "${libutil_ldflags}")
add_gen_events_deps(dumpevts)
# used at Determina: not supported anymore
if (MFAPI_ENABLED)
add_library(mfapi SHARED ${BASE_SRCS} ${ROOT_SRCS} ${CORE_SRCS}
${RESOURCES} mfapi.c mfapi.res)
set_target_properties(mfapi PROPERTIES
# Set define parameters for resources.rc
COMPILE_FLAGS "${libutil_cflags}"
COMPILE_DEFINITIONS "RC_IS_MFAPI;NOT_DYNAMORIO_CORE")
set_target_properties(mfapi PROPERTIES
LINK_FLAGS "${libutil_ldflags}")
add_gen_events_deps(mfapi)
endif (MFAPI_ENABLED)
endif ()
DR_export_header(${PROJECT_SOURCE_DIR}/core/lib/dr_config.h dr_config.h)
install_exported_target(drconfiglib ${INSTALL_LIB_BASE})
DR_export_target(drconfiglib)
# drinject.exe and company need a copy in the bin dir (i#1737 would eliminate this)
DR_install(TARGETS drconfiglib DESTINATION ${INSTALL_BIN})
# drconfiglib now uses drfront_access()
# drconfiglib needs drlibc for dr_fpu_exception_init()
target_link_libraries(drconfiglib drfrontendlib drlibc)
if (UNIX)
# We need our own memcpy + memset to avoid glibc versioning (i#1504).
target_link_libraries(drconfiglib drmemfuncs)
endif ()
if (WIN32)
set(dr_frontend_srcs dr_frontend_win.c)
else ()
set(dr_frontend_srcs dr_frontend_unix.c)
endif ()
set(dr_frontend_srcs ${dr_frontend_srcs} dr_frontend_common.c)
add_library(drfrontendlib STATIC ${dr_frontend_srcs})
if (UNIX)
# We need drlibc for module-parsing routines.
target_link_libraries(drfrontendlib drlibc)
endif ()
if (UNIX)
# We need our own memcpy + memset to avoid glibc versioning (i#1504).
target_link_libraries(drfrontendlib drmemfuncs)
endif ()
add_static_lib_debug_info(drfrontendlib "${INSTALL_BIN}")
DR_export_target(drfrontendlib)
install_exported_target(drfrontendlib ${INSTALL_BIN})
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/dr_frontend.h dr_frontend.h)