cmake_minimum_required(VERSION 3.7)
include(../../make/policies.cmake NO_POLICY_SCOPE)
set(DynamoRIO_USE_LIBC OFF)
add_library(drcov SHARED drcov.c)
configure_DynamoRIO_client(drcov)
use_DynamoRIO_extension(drcov drcovlib)
use_DynamoRIO_extension(drcov drx)
place_shared_lib_in_lib_dir(drcov)
add_dependencies(drcov api_headers)
if (NOT DynamoRIO_INTERNAL OR NOT "${CMAKE_GENERATOR}" MATCHES "Ninja")
add_custom_command(TARGET drcov
POST_BUILD
COMMAND ${CMAKE_COMMAND}
ARGS -E echo "Usage: pass to drconfig or drrun: -t drcov"
VERBATIM)
endif ()
add_executable(drcov2lcov
postprocess/drcov2lcov.cpp
)
configure_DynamoRIO_standalone(drcov2lcov)
use_DynamoRIO_extension(drcov2lcov drsyms_static)
use_DynamoRIO_extension(drcov2lcov drcontainers)
use_DynamoRIO_extension(drcov2lcov droption)
use_DynamoRIO_extension(drcov2lcov drcovlib_static)
target_link_libraries(drcov2lcov drfrontendlib)
if (ANDROID)
endif ()
add_dependencies(drcov2lcov api_headers)
if (NOT DynamoRIO_INTERNAL OR NOT "${CMAKE_GENERATOR}" MATCHES "Ninja")
if (UNIX)
set(FIND_MSG "(set LD_LIBRARY_PATH)")
else (UNIX)
set(FIND_MSG "(set PATH or copy to same directory)")
endif (UNIX)
add_custom_command(TARGET drcov2lcov
POST_BUILD
COMMAND ${CMAKE_COMMAND}
ARGS -E echo "Make sure the loader finds the dynamorio library ${FIND_MSG}"
VERBATIM)
endif ()
install_target(drcov ${INSTALL_CLIENTS_LIB})
install_target(drcov2lcov ${INSTALL_CLIENTS_BIN})
if (WIN32)
DynamoRIO_get_full_path(DR_TARGET_LOCATION dynamorio "${location_suffix}")
DR_install(FILES "${DR_TARGET_LOCATION}" DESTINATION "${INSTALL_CLIENTS_BIN}")
if (dbghelp_path)
DR_install(FILES "${dbghelp_path}" DESTINATION ${INSTALL_CLIENTS_BIN})
endif ()
add_dependencies(drcov2lcov client_dr_copy)
endif (WIN32)
set(INSTALL_DRCOV_CONFIG ${INSTALL_CLIENTS_BASE})
if (X64)
set(CONFIG_INSTALL ${PROJECT_BINARY_DIR}/drcov.drrun64)
set(CONFIG_BUILD ${PROJECT_BINARY_DIR}/tools/drcov.drrun64)
else (X64)
set(CONFIG_INSTALL ${PROJECT_BINARY_DIR}/drcov.drrun32)
set(CONFIG_BUILD ${PROJECT_BINARY_DIR}/tools/drcov.drrun32)
endif (X64)
function (write_config_file dst libdir)
if (X64)
string(REPLACE "lib64" "lib32" alt_libdir ${libdir})
set(CUR_BIT "64")
set(ALT_BIT "32")
else ()
set(CUR_BIT "32")
set(ALT_BIT "64")
string(REPLACE "lib64" "lib32" alt_libdir ${libdir})
endif ()
file(WRITE ${dst} "# drcov tool config file\n")
file(APPEND ${dst} "# DynamoRIO options\n")
file(APPEND ${dst} "DR_OP=-nop_initial_bblock\n")
file(APPEND ${dst} "# client tool path\n")
file(APPEND ${dst} "CLIENT${CUR_BIT}_REL=${libdir}/${LIB_PFX}drcov${LIB_EXT}\n")
file(APPEND ${dst} "CLIENT${ALT_BIT}_REL=${alt_libdir}/${LIB_PFX}drcov${LIB_EXT}\n")
file(APPEND ${dst} "# client tool options\n")
file(APPEND ${dst} "TOOL_OP=\n")
endfunction ()
set(BUILD_CLIENTS_LIB clients/${INSTALL_LIB})
write_config_file(${CONFIG_INSTALL} ${INSTALL_CLIENTS_LIB})
write_config_file(${CONFIG_BUILD} ${BUILD_CLIENTS_LIB})
DR_install(FILES "${CONFIG_INSTALL}" DESTINATION ${INSTALL_DRCOV_CONFIG})
register_tool_file("drcov")
DR_install(FILES "${PROJECT_SOURCE_DIR}/third_party/lcov/genhtml"
DESTINATION ${INSTALL_CLIENTS_BIN}
PERMISSIONS ${owner_access} OWNER_EXECUTE GROUP_READ GROUP_EXECUTE
WORLD_READ WORLD_EXECUTE)
set(srcdoc ${CMAKE_CURRENT_SOURCE_DIR}/drcov.dox.in)
set(gendoc ${CMAKE_CURRENT_BINARY_DIR}/drcov.dox)
set(doctgt drcov_docs)
get_property(dox_extras GLOBAL PROPERTY DynamoRIO_dox_extras)
set_property(GLOBAL PROPERTY DynamoRIO_dox_extras ${dox_extras} ${gendoc})
get_property(dox_targets GLOBAL PROPERTY DynamoRIO_dox_targets)
set_property(GLOBAL PROPERTY DynamoRIO_dox_targets ${dox_targets} ${doctgt})
add_custom_target(${doctgt} DEPENDS ${gendoc})
if (RISCV64 AND NOT CMAKE_CROSSCOMPILING)
file(COPY_FILE ${srcdoc} ${gendoc})
else ()
add_custom_command(
OUTPUT ${gendoc}
DEPENDS ${srcdoc}
drcov2lcov
COMMAND ${CMAKE_COMMAND}
ARGS -D src=${srcdoc}
-D dst=${gendoc}
-D CMAKE_CROSSCOMPILING=${CMAKE_CROSSCOMPILING}
-D prog=$<TARGET_FILE:drcov2lcov>
-D prog_arg=-help_html
-P ${CMAKE_CURRENT_SOURCE_DIR}/../common/gendocs.cmake
VERBATIM)
endif ()