aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleix Pol <aleixpol@kde.org>2017-12-20 20:42:59 +0100
committerAleix Pol <aleixpol@kde.org>2017-12-20 22:35:02 +0100
commitc91c3650968d828d52291f97f835a5a04024c2e0 (patch)
tree7e33c1f3a718d0e9d97d5f6616339c30e20ffc43
parent24134c972e375bebad45c860c413233b60863852 (diff)
downloadextra-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.txt1
-rw-r--r--tests/ECMToolchainAndroidTest/CMakeLists.txt23
-rw-r--r--tests/ECMToolchainAndroidTest/main.c4
-rw-r--r--tests/ECMToolchainAndroidTest/testlinkfile/CMakeFiles/testtarget.dir/link.txt1
-rw-r--r--tests/ECMToolchainAndroidTest/testlinkfile/outputfake.json1
-rw-r--r--toolchain/Android.cmake2
-rw-r--r--toolchain/specifydependencies.cmake34
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)