From 941e4ac8cfdacc7c2cd1c11b4d72329b70c46564 Mon Sep 17 00:00:00 2001 From: Tor Didriksen Date: Thu, 30 May 2024 15:16:25 +0200 Subject: [PATCH] Bug#36678092 Contribution: Build failure with Protobuf 22+ in Linux Add explicit INTERFACE_LINK_LIBRARIES for "system" protobuf on Linux. This will be essential when building with protobuf version 22+ The patch is based on a contribution by Github user: gordonwwang Change-Id: I5bc0932144f3ad0b340e383d0ce8afdda821874b (cherry picked from commit d31d3aa0b3623061b012f596e25df08a7f294973) --- cmake/fileutils.cmake | 21 +++++++++++++++++++++ cmake/protobuf.cmake | 18 ++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/cmake/fileutils.cmake b/cmake/fileutils.cmake index fb6540601efc..24c2ada8614c 100644 --- a/cmake/fileutils.cmake +++ b/cmake/fileutils.cmake @@ -119,6 +119,27 @@ IF(APPLE) ENDIF(APPLE) IF(LINUX) + # Parse output of 'ldd ${FILE_NAME}' and return anything starting with lib. + FUNCTION(FIND_LIBRARY_DEPENDENCIES FILE_NAME RETURN_VALUE) + SET(${RETURN_VALUE} PARENT_SCOPE) + EXECUTE_PROCESS(COMMAND + ldd "${FILE_NAME}" + OUTPUT_VARIABLE LDD_OUTPUT + RESULT_VARIABLE LDD_RESULT + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + STRING(REPLACE "\n" ";" LDD_OUTPUT_LIST "${LDD_OUTPUT}") + SET(DEPENDENCIES) + FOREACH(LINE ${LDD_OUTPUT_LIST}) + STRING(REGEX MATCH "^[\t ]+(lib[-+_A-Za-z0-9\\.]+).*" UNUSED ${LINE}) + IF(CMAKE_MATCH_1) + # MESSAGE(STATUS "xxx ${FILE_NAME} ${CMAKE_MATCH_1}") + LIST(APPEND DEPENDENCIES ${CMAKE_MATCH_1}) + ENDIF() + ENDFOREACH() + SET(${RETURN_VALUE} ${DEPENDENCIES} PARENT_SCOPE) + ENDFUNCTION(FIND_LIBRARY_DEPENDENCIES) + FUNCTION(FIND_OBJECT_DEPENDENCIES FILE_NAME RETURN_VALUE) SET(${RETURN_VALUE} PARENT_SCOPE) EXECUTE_PROCESS(COMMAND diff --git a/cmake/protobuf.cmake b/cmake/protobuf.cmake index c0e20c52e5ad..f3497117579f 100644 --- a/cmake/protobuf.cmake +++ b/cmake/protobuf.cmake @@ -155,23 +155,41 @@ MACRO(MYSQL_CHECK_PROTOBUF) # set_property(TARGET protobuf::libprotobuf APPEND PROPERTY # INTERFACE_COMPILE_FEATURES cxx_std_11 # ) + # INTERFACE_LINK_LIBRARIES will be needed once this is built + # with protobuf 22 and above (lots of abseil libs). ADD_LIBRARY(ext::libprotobuf UNKNOWN IMPORTED) SET_TARGET_PROPERTIES(ext::libprotobuf PROPERTIES INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${Protobuf_INCLUDE_DIR}") SET_TARGET_PROPERTIES(ext::libprotobuf PROPERTIES IMPORTED_LOCATION "${PROTOBUF_LIBRARY}") + IF(LINUX) + FIND_LIBRARY_DEPENDENCIES("${PROTOBUF_LIBRARY}" protobuf_dependencies) + SET_TARGET_PROPERTIES(ext::libprotobuf PROPERTIES + INTERFACE_LINK_LIBRARIES "${protobuf_dependencies}") + ENDIF() ADD_LIBRARY(ext::libprotobuf-lite UNKNOWN IMPORTED) SET_TARGET_PROPERTIES(ext::libprotobuf-lite PROPERTIES INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${Protobuf_INCLUDE_DIR}") SET_TARGET_PROPERTIES(ext::libprotobuf-lite PROPERTIES IMPORTED_LOCATION "${PROTOBUF_LITE_LIBRARY}") + IF(LINUX) + FIND_LIBRARY_DEPENDENCIES("${PROTOBUF_LITE_LIBRARY}" lite_dependencies) + SET_TARGET_PROPERTIES(ext::libprotobuf-lite PROPERTIES + INTERFACE_LINK_LIBRARIES "${lite_dependencies}") + ENDIF() ADD_LIBRARY(ext::libprotoc UNKNOWN IMPORTED) SET_TARGET_PROPERTIES(ext::libprotoc PROPERTIES INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${Protobuf_INCLUDE_DIR}") SET_TARGET_PROPERTIES(ext::libprotoc PROPERTIES IMPORTED_LOCATION "${Protobuf_PROTOC_LIBRARY}") + IF(LINUX) + FIND_LIBRARY_DEPENDENCIES( + "${Protobuf_PROTOC_LIBRARY}" protoc_dependencies) + SET_TARGET_PROPERTIES(ext::libprotoc PROPERTIES + INTERFACE_LINK_LIBRARIES "${protoc_dependencies}") + ENDIF() ENDIF() FIND_PROTOBUF_VERSION()