libddwaf-src 2.1.0

Source distribution and build integration for DataDog/libddwaf
Documentation
if(GIT_COMMIT)
    set(BUILD_ID "${GIT_COMMIT}")
else()
    execute_process(COMMAND git rev-parse HEAD
        WORKING_DIRECTORY ${libddwaf_SOURCE_DIR}
        OUTPUT_VARIABLE BUILD_ID
        OUTPUT_STRIP_TRAILING_WHITESPACE
    )
endif()

message(STATUS "Build id is ${BUILD_ID}")
string(SUBSTRING "${BUILD_ID}" 0 2 BUILD_ID_PREFIX)
string(SUBSTRING "${BUILD_ID}" 2 39 BUILD_ID_SUFFIX)

add_library(libddwaf_shared SHARED
    $<TARGET_OBJECTS:libddwaf_shared_objects> $<$<BOOL:${MSVC}>:libddwaf.def>)
set_target_properties(libddwaf_shared PROPERTIES OUTPUT_NAME ddwaf)
if(MINGW)
    set_target_properties(libddwaf_shared PROPERTIES PREFIX "")
endif()

install(TARGETS libddwaf_shared EXPORT libddwaf-config
    DESTINATION ${CMAKE_INSTALL_LIBDIR}
    INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})

if(LINUX)
    target_link_libraries(libddwaf_shared PUBLIC ${LIBDDWAF_INTERFACE_LIBRARIES})
    target_link_libraries(libddwaf_shared PRIVATE
        $<$<BOOL:${LIBDDWAF_ENABLE_LTO}>:-flto>
        -Wl,--no-undefined
        -Wl,-version-script=${libddwaf_SOURCE_DIR}/libddwaf.version
        -Wl,--build-id=0x${BUILD_ID}
        ${LIBDDWAF_PRIVATE_LIBRARIES}
        -static-libstdc++)

    if(NOT (CMAKE_BUILD_TYPE MATCHES Debug))
        set(SYMBOL_FILE $<TARGET_FILE:libddwaf_shared>.debug)
        add_custom_command(TARGET libddwaf_shared POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:libddwaf_shared> ${SYMBOL_FILE}
            COMMAND ${CMAKE_STRIP} --only-keep-debug ${SYMBOL_FILE}
            COMMAND ${CMAKE_STRIP} $<TARGET_FILE:libddwaf_shared>)

        install(FILES ${SYMBOL_FILE}
            DESTINATION ${CMAKE_INSTALL_LIBDIR}/.build-id/${BUILD_ID_PREFIX}
            RENAME ${BUILD_ID_SUFFIX}.debug)
    endif()
elseif (APPLE)
    target_link_libraries(libddwaf_shared PRIVATE -Wl,-undefined,error libddwaf_shared_objects)

    if(NOT (CMAKE_BUILD_TYPE MATCHES Debug))
        # Ensure that dsymutil and strip is present
        find_program(DSYMUTIL dsymutil)
        if (DSYMUTIL STREQUAL "DSYMUTIL-NOTFOUND")
            message(FATAL_ERROR "dsymutil not found")
        endif()
        find_program(STRIP strip)
        if (STRIP STREQUAL "STRIP-NOTFOUND")
            message(FATAL_ERROR "strip not found")
        endif()

        set(SYMBOL_FILE $<TARGET_FILE:libddwaf_shared>.dwarf)
        add_custom_command(TARGET libddwaf_shared POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:libddwaf_shared> ${SYMBOL_FILE}
            COMMAND ${DSYMUTIL} --flat --minimize ${SYMBOL_FILE}
            COMMAND ${STRIP} -S -x $<TARGET_FILE:libddwaf_shared>
            COMMAND rm ${SYMBOL_FILE}
            COMMAND mv ${SYMBOL_FILE}.dwarf ${SYMBOL_FILE})

        install(FILES ${SYMBOL_FILE}
            DESTINATION ${CMAKE_INSTALL_LIBDIR}/.build-id/${BUILD_ID_PREFIX}
            RENAME ${BUILD_ID_SUFFIX}.debug)
    endif()
elseif (WIN32)
    target_link_libraries(libddwaf_shared
        PRIVATE ${LIBDDWAF_PRIVATE_LIBRARIES}
        PUBLIC ${LIBDDWAF_INTERFACE_LIBRARIES})

    if(MSVC)
        install(FILES $<TARGET_PDB_FILE:libddwaf_shared> DESTINATION lib OPTIONAL)
    endif()
endif()