diff options
| author | Aleix Pol <aleixpol@kde.org> | 2017-12-20 20:42:59 +0100 | 
|---|---|---|
| committer | Aleix Pol <aleixpol@kde.org> | 2017-12-20 22:35:02 +0100 | 
| commit | c91c3650968d828d52291f97f835a5a04024c2e0 (patch) | |
| tree | 7e33c1f3a718d0e9d97d5f6616339c30e20ffc43 | |
| parent | 24134c972e375bebad45c860c413233b60863852 (diff) | |
| download | extra-cmake-modules-c91c3650968d828d52291f97f835a5a04024c2e0.tar.gz extra-cmake-modules-c91c3650968d828d52291f97f835a5a04024c2e0.tar.bz2 | |
Use readelf to find project dependenciesv5.42.0-rc1v5.42.0
Summary:
We were using a link.txt file that cmake used to generate, on newer cmake
versions it doesn't anymore.
Instead use readelf, much like androiddeployqt does, to extract the
depenencies.
Catch: It relies on having all the binaries being at the same subdirectory,
which is the default in ECM since not long ago.
Test Plan: Build kirigamigallery with it
Reviewers: #frameworks, #build_system, aacid
Reviewed By: aacid
Subscribers: mart
Tags: #frameworks, #build_system
Differential Revision: https://phabricator.kde.org/D8173
| -rw-r--r-- | tests/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | tests/ECMToolchainAndroidTest/CMakeLists.txt | 23 | ||||
| -rw-r--r-- | tests/ECMToolchainAndroidTest/main.c | 4 | ||||
| -rw-r--r-- | tests/ECMToolchainAndroidTest/testlinkfile/CMakeFiles/testtarget.dir/link.txt | 1 | ||||
| -rw-r--r-- | tests/ECMToolchainAndroidTest/testlinkfile/outputfake.json | 1 | ||||
| -rw-r--r-- | toolchain/Android.cmake | 2 | ||||
| -rw-r--r-- | toolchain/specifydependencies.cmake | 34 | 
7 files changed, 19 insertions, 47 deletions
| diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index cabbe05a..06e870ff 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -56,7 +56,6 @@ add_subdirectory(ECMAddTests)  add_subdirectory(ECMGenerateHeadersTest)  add_subdirectory(ECMSetupVersionTest)  add_subdirectory(ECMGeneratePkgConfigFile) -add_subdirectory(ECMToolchainAndroidTest)  # a macro for tests that have a simple format where the name matches the  # directory and project diff --git a/tests/ECMToolchainAndroidTest/CMakeLists.txt b/tests/ECMToolchainAndroidTest/CMakeLists.txt deleted file mode 100644 index eb2ae298..00000000 --- a/tests/ECMToolchainAndroidTest/CMakeLists.txt +++ /dev/null @@ -1,23 +0,0 @@ -project(AndroidToolchainTest) -cmake_minimum_required(VERSION 2.8.12) - -set(CMAKE_MODULE_PATH -    ${CMAKE_CURRENT_SOURCE_DIR}/../../modules -    ${CMAKE_CURRENT_SOURCE_DIR}/../../toolchain -) - -set(TARGET_DIR "${CMAKE_CURRENT_SOURCE_DIR}/testlinkfile") -set(TARGET_NAME "testtarget") -set(OUTPUT_FILE "${CMAKE_CURRENT_BINARY_DIR}/androidtest_output.txt") -set(INPUT_FILE "${CMAKE_CURRENT_SOURCE_DIR}/testlinkfile/outputfake.json") - -# test correct include resolution -include(specifydependencies) - -file(READ "${OUTPUT_FILE}" TEST_RESULT) -string(FIND ${TEST_RESULT} "libKF5Attica.so" CMP_RESULT) -if (${CMP_RESULT} EQUAL -1) -    message(SEND_ERROR "Could not find relative library libKF5Attica.so") -endif() - -add_executable(dummy main.c) diff --git a/tests/ECMToolchainAndroidTest/main.c b/tests/ECMToolchainAndroidTest/main.c deleted file mode 100644 index c13815ce..00000000 --- a/tests/ECMToolchainAndroidTest/main.c +++ /dev/null @@ -1,4 +0,0 @@ -int main() -{ -   return 0; -} diff --git a/tests/ECMToolchainAndroidTest/testlinkfile/CMakeFiles/testtarget.dir/link.txt b/tests/ECMToolchainAndroidTest/testlinkfile/CMakeFiles/testtarget.dir/link.txt deleted file mode 100644 index 17da75d2..00000000 --- a/tests/ECMToolchainAndroidTest/testlinkfile/CMakeFiles/testtarget.dir/link.txt +++ /dev/null @@ -1 +0,0 @@ -/usr/bin/c++   -pipe -DQT_STRICT_ITERATORS -DQURL_NO_CAST_FROM_STRING -DQT_NO_HTTP -DQT_NO_FTP -Wformat -Werror=format-security -Werror=return-type -Wno-variadic-macros -Wlogical-op -std=c++0x -fno-exceptions -Wall -Wextra -Wcast-align -Wchar-subscripts -Wformat-security -Wno-long-long -Wpointer-arith -Wundef -Wnon-virtual-dtor -Woverloaded-virtual -Werror=return-type -pedantic -g  -Wl,--enable-new-dtags  CMakeFiles/persontest.dir/persontest.cpp.o CMakeFiles/persontest.dir/persontest_automoc.cpp.o  -o testtarget -rdynamic /opt/qt5/qtbase/lib/libQt5Test.so.5.6.1 ../src/libKF5Attica.so.5.23.0 /opt/qt5/qtbase/lib/libQt5Network.so.5.6.1 /opt/qt5/qtbase/lib/libQt5Core.so.5.6.1 -Wl,-rpath,/opt/qt5/qtbase/lib:/opt/kde/build/frameworks/attica/src diff --git a/tests/ECMToolchainAndroidTest/testlinkfile/outputfake.json b/tests/ECMToolchainAndroidTest/testlinkfile/outputfake.json deleted file mode 100644 index cf482d0c..00000000 --- a/tests/ECMToolchainAndroidTest/testlinkfile/outputfake.json +++ /dev/null @@ -1 +0,0 @@ -##EXTRALIBS## diff --git a/toolchain/Android.cmake b/toolchain/Android.cmake index 3c587fa4..30690612 100644 --- a/toolchain/Android.cmake +++ b/toolchain/Android.cmake @@ -246,7 +246,7 @@ if(DEFINED QTANDROID_EXPORTED_TARGET AND NOT TARGET ${CREATEAPK_TARGET_NAME})          COMMAND cmake -E remove_directory "${EXPORT_DIR}"          COMMAND cmake -E copy_directory "${ANDROID_APK_DIR}" "${EXPORT_DIR}"          COMMAND cmake -E copy "$<TARGET_FILE:${QTANDROID_EXPORTED_TARGET}>" "${EXECUTABLE_DESTINATION_PATH}" -        COMMAND cmake -DINPUT_FILE="${QTANDROID_EXPORTED_TARGET}-deployment.json.in" -DOUTPUT_FILE="${QTANDROID_EXPORTED_TARGET}-deployment.json" "-DTARGET_DIR=$<TARGET_FILE_DIR:${QTANDROID_EXPORTED_TARGET}>" "-DTARGET_NAME=${QTANDROID_EXPORTED_TARGET}" "-DEXPORT_DIR=${CMAKE_INSTALL_PREFIX}" -P ${_CMAKE_ANDROID_DIR}/specifydependencies.cmake +        COMMAND LANG=C cmake -DINPUT_FILE="${QTANDROID_EXPORTED_TARGET}-deployment.json.in" -DOUTPUT_FILE="${QTANDROID_EXPORTED_TARGET}-deployment.json" "-DTARGET=$<TARGET_FILE:${QTANDROID_EXPORTED_TARGET}>" "-DOUTPUT_DIR=$<TARGET_FILE_DIR:${QTANDROID_EXPORTED_TARGET}>" "-DEXPORT_DIR=${CMAKE_INSTALL_PREFIX}" "-DECM_ADDITIONAL_FIND_ROOT_PATH=\"${ECM_ADDITIONAL_FIND_ROOT_PATH}\"" -P ${_CMAKE_ANDROID_DIR}/specifydependencies.cmake          COMMAND $<TARGET_FILE_DIR:Qt5::qmake>/androiddeployqt --gradle --input "${QTANDROID_EXPORTED_TARGET}-deployment.json" --output "${EXPORT_DIR}" --deployment bundled ${arguments}      ) diff --git a/toolchain/specifydependencies.cmake b/toolchain/specifydependencies.cmake index 65e875bf..8965d6da 100644 --- a/toolchain/specifydependencies.cmake +++ b/toolchain/specifydependencies.cmake @@ -1,27 +1,29 @@ -file(READ "${TARGET_DIR}/CMakeFiles/${TARGET_NAME}.dir/link.txt" out) +execute_process(COMMAND readelf --wide --dynamic ${TARGET} ERROR_VARIABLE readelf_errors OUTPUT_VARIABLE out RESULT_VARIABLE result) -string(FIND "${out}" "-o ${TARGET_NAME}" POS) #we trim the initial arguments, we want the ones in the end. we find the target -string(SUBSTRING "${out}" ${POS} -1 out) #we -string(REGEX MATCHALL "(/|\\.\\./|\\./)[^ ]+\\.so" outout "${out}") -string(STRIP "${outout}" outout) -string(REPLACE " /" ";/" outout "${outout}") +if (NOT result EQUAL 0) +    message(FATAL_ERROR "readelf failed on ${TARGET} exit(${result}): ${readelf_errors}") +endif() +string(REPLACE "\n" ";" lines "${out}")  set(extralibs) -foreach(lib IN LISTS outout) #now we filter Qt5 libraries, because Qt wants to take care about these itself -    if(NOT ${lib} MATCHES ".*/libQt5.*") -        # resolve relative paths -        if(${lib} MATCHES "^(\\.\\./|\\./)") -            set(lib "${TARGET_DIR}/${lib}") -        endif() -        if(extralibs) -            set(extralibs "${extralibs},${lib}") +foreach(line ${lines}) +    string(REGEX MATCH ".*\\(NEEDED\\) +Shared library: +\\[(.+)\\]$" matched ${line}) +    set(currentLib ${CMAKE_MATCH_1}) + +    if(NOT ${currentLib} MATCHES "libQt5.*" AND matched) +        find_file(ourlib-${currentLib} ${currentLib} HINTS ${OUTPUT_DIR} ${EXPORT_DIR} ${ECM_ADDITIONAL_FIND_ROOT_PATH} NO_DEFAULT_PATH PATH_SUFFIXES lib) + +        if(ourlib-${currentLib}) +            list(APPEND extralibs "${ourlib-${currentLib}}")          else() -            set(extralibs "${lib}") +            message(STATUS "could not find ${currentLib} in ${OUTPUT_DIR} ${EXPORT_DIR}/lib/ ${ECM_ADDITIONAL_FIND_ROOT_PATH}")          endif()      endif()  endforeach() +  if(extralibs) -    set(extralibs "\"android-extra-libs\": \"${extralibs}\",") +    string(REPLACE ";" "," libs "${extralibs}") +    set(extralibs "\"android-extra-libs\": \"${libs}\",")  endif()  set(extraplugins) | 
