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) |