From 5deb0b024e14c7c63d405c651d1ca323560a1c21 Mon Sep 17 00:00:00 2001 From: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> Date: Fri, 3 May 2024 10:28:01 +0100 Subject: [PATCH 1/6] build, test, doc: Temporarily remove Android-related stuff Previously, our Android builds were geared towards generating APKs, which relied on Qt. However, after migrating to C++20, compiling for Android became unfeasible due to Qt 5.15's compatibility limitations with NDK only up to r25, which includes an outdated embedded libc++. All removed stuff will be reinstated after migrating the build system to CMake and upgrading Qt to version 6.x." --- build-aux/m4/bitcoin_qt.m4 | 28 +--------- ci/test/00_setup_env_android.sh | 25 --------- ci/test/01_base_install.sh | 10 ---- ci/test/02_run_container.sh | 2 - ci/test/03_test_script.sh | 9 --- configure.ac | 17 ------ depends/Makefile | 4 -- depends/README.md | 5 +- depends/hosts/android.mk | 15 ----- depends/packages/packages.mk | 2 - depends/packages/qt.mk | 20 ------- .../patches/qt/fix_android_jni_static.patch | 17 ------ doc/README.md | 1 - doc/build-android.md | 25 --------- src/Makefile.qt.include | 14 ----- src/qt/android/.gitignore | 7 --- src/qt/android/AndroidManifest.xml | 39 ------------- src/qt/android/build.gradle | 52 ------------------ src/qt/android/gradle.properties | 4 -- src/qt/android/res/drawable-hdpi/bitcoin.png | Bin 4536 -> 0 bytes src/qt/android/res/drawable-ldpi/bitcoin.png | Bin 1697 -> 0 bytes src/qt/android/res/drawable-mdpi/bitcoin.png | Bin 2558 -> 0 bytes src/qt/android/res/drawable-xhdpi/bitcoin.png | Bin 6832 -> 0 bytes .../android/res/drawable-xxhdpi/bitcoin.png | Bin 11479 -> 0 bytes .../android/res/drawable-xxxhdpi/bitcoin.png | Bin 17034 -> 0 bytes src/qt/android/res/values/libs.xml | 14 ----- .../org/bitcoincore/qt/BitcoinQtActivity.java | 23 -------- 27 files changed, 4 insertions(+), 329 deletions(-) delete mode 100755 ci/test/00_setup_env_android.sh delete mode 100644 depends/hosts/android.mk delete mode 100644 depends/patches/qt/fix_android_jni_static.patch delete mode 100644 doc/build-android.md delete mode 100644 src/qt/android/.gitignore delete mode 100644 src/qt/android/AndroidManifest.xml delete mode 100644 src/qt/android/build.gradle delete mode 100644 src/qt/android/gradle.properties delete mode 100644 src/qt/android/res/drawable-hdpi/bitcoin.png delete mode 100644 src/qt/android/res/drawable-ldpi/bitcoin.png delete mode 100644 src/qt/android/res/drawable-mdpi/bitcoin.png delete mode 100644 src/qt/android/res/drawable-xhdpi/bitcoin.png delete mode 100644 src/qt/android/res/drawable-xxhdpi/bitcoin.png delete mode 100644 src/qt/android/res/drawable-xxxhdpi/bitcoin.png delete mode 100644 src/qt/android/res/values/libs.xml delete mode 100644 src/qt/android/src/org/bitcoincore/qt/BitcoinQtActivity.java diff --git a/build-aux/m4/bitcoin_qt.m4 b/build-aux/m4/bitcoin_qt.m4 index a716cd9a27795..c6276e56b51ee 100644 --- a/build-aux/m4/bitcoin_qt.m4 +++ b/build-aux/m4/bitcoin_qt.m4 @@ -70,8 +70,6 @@ AC_DEFUN([BITCOIN_QT_INIT],[ [qt_lib_suffix= ]); bitcoin_qt_want_version=qt5], [qt_lib_suffix= ]) - AS_CASE([$host], [*android*], [qt_lib_suffix=_$ANDROID_ARCH]) - AC_ARG_WITH([qt-incdir],[AS_HELP_STRING([--with-qt-incdir=INC_DIR],[specify qt include path (overridden by pkgconfig)])], [qt_include_path=$withval], []) AC_ARG_WITH([qt-libdir],[AS_HELP_STRING([--with-qt-libdir=LIB_DIR],[specify qt lib path (overridden by pkgconfig)])], [qt_lib_path=$withval], []) AC_ARG_WITH([qt-plugindir],[AS_HELP_STRING([--with-qt-plugindir=PLUGIN_DIR],[specify qt plugin path (overridden by pkgconfig)])], [qt_plugin_path=$withval], []) @@ -80,19 +78,10 @@ AC_DEFUN([BITCOIN_QT_INIT],[ AC_ARG_WITH([qtdbus], [AS_HELP_STRING([--with-qtdbus], - [enable DBus support (default is yes if qt is enabled and QtDBus is found, except on Android)])], + [enable DBus support (default is yes if qt is enabled and QtDBus is found)])], [use_dbus=$withval], [use_dbus=auto]) - dnl Android doesn't support D-Bus and certainly doesn't use it for notifications - case $host in - *android*) - if test "$use_dbus" != "yes"; then - use_dbus=no - fi - ;; - esac - AC_SUBST(QT_TRANSLATION_DIR,$qt_translation_path) ]) @@ -132,16 +121,11 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[ if test -d "$qt_plugin_path/accessible"; then QT_LIBS="$QT_LIBS -L$qt_plugin_path/accessible" fi - if test -d "$qt_plugin_path/platforms/android"; then - QT_LIBS="$QT_LIBS -L$qt_plugin_path/platforms/android -lqtfreetype -lEGL" - fi fi AC_DEFINE([QT_STATICPLUGIN], [1], [Define this symbol if qt plugins are static]) - if test "$TARGET_OS" != "android"; then - _BITCOIN_QT_CHECK_STATIC_PLUGIN([QMinimalIntegrationPlugin], [-lqminimal]) - AC_DEFINE([QT_QPA_PLATFORM_MINIMAL], [1], [Define this symbol if the minimal qt platform exists]) - fi + _BITCOIN_QT_CHECK_STATIC_PLUGIN([QMinimalIntegrationPlugin], [-lqminimal]) + AC_DEFINE([QT_QPA_PLATFORM_MINIMAL], [1], [Define this symbol if the minimal qt platform exists]) if test "$TARGET_OS" = "windows"; then dnl Linking against wtsapi32 is required. See #17749 and dnl https://bugreports.qt.io/browse/QTBUG-27097. @@ -160,9 +144,6 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[ _BITCOIN_QT_CHECK_STATIC_PLUGIN([QCocoaIntegrationPlugin], [-lqcocoa]) _BITCOIN_QT_CHECK_STATIC_PLUGIN([QMacStylePlugin], [-lqmacstyle]) AC_DEFINE([QT_QPA_PLATFORM_COCOA], [1], [Define this symbol if the qt platform is cocoa]) - elif test "$TARGET_OS" = "android"; then - QT_LIBS="-Wl,--export-dynamic,--undefined=JNI_OnLoad -lplugins_platforms_qtforandroid${qt_lib_suffix} -ljnigraphics -landroid -lqtfreetype${qt_lib_suffix} $QT_LIBS" - AC_DEFINE([QT_QPA_PLATFORM_ANDROID], [1], [Define this symbol if the qt platform is android]) fi fi CPPFLAGS=$TEMP_CPPFLAGS @@ -357,9 +338,6 @@ AC_DEFUN([_BITCOIN_QT_CHECK_STATIC_LIBS], [ PKG_CHECK_MODULES([QT_SERVICE], [${qt_lib_prefix}ServiceSupport${qt_lib_suffix}], [QT_LIBS="$QT_SERVICE_LIBS $QT_LIBS"]) elif test "$TARGET_OS" = "windows"; then PKG_CHECK_MODULES([QT_WINDOWSUIAUTOMATION], [${qt_lib_prefix}WindowsUIAutomationSupport${qt_lib_suffix}], [QT_LIBS="$QT_WINDOWSUIAUTOMATION_LIBS $QT_LIBS"]) - elif test "$TARGET_OS" = "android"; then - PKG_CHECK_MODULES([QT_EGL], [${qt_lib_prefix}EglSupport${qt_lib_suffix}], [QT_LIBS="$QT_EGL_LIBS $QT_LIBS"]) - PKG_CHECK_MODULES([QT_SERVICE], [${qt_lib_prefix}ServiceSupport${qt_lib_suffix}], [QT_LIBS="$QT_SERVICE_LIBS $QT_LIBS"]) fi ]) diff --git a/ci/test/00_setup_env_android.sh b/ci/test/00_setup_env_android.sh deleted file mode 100755 index 97a6bd73181a4..0000000000000 --- a/ci/test/00_setup_env_android.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2019-present The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -export LC_ALL=C.UTF-8 - -export HOST=aarch64-linux-android -export PACKAGES="unzip openjdk-8-jdk gradle" -export CONTAINER_NAME=ci_android -export CI_IMAGE_NAME_TAG="docker.io/amd64/ubuntu:22.04" - -export RUN_UNIT_TESTS=false -export RUN_FUNCTIONAL_TESTS=false - -export ANDROID_API_LEVEL=28 -export ANDROID_BUILD_TOOLS_VERSION=28.0.3 -export ANDROID_NDK_VERSION=23.2.8568313 -export ANDROID_TOOLS_URL=https://dl.google.com/android/repository/commandlinetools-linux-8512546_latest.zip -export ANDROID_HOME="${DEPENDS_DIR}/SDKs/android" -export ANDROID_NDK_HOME="${ANDROID_HOME}/ndk/${ANDROID_NDK_VERSION}" -export DEP_OPTS="ANDROID_SDK=${ANDROID_HOME} ANDROID_NDK=${ANDROID_NDK_HOME} ANDROID_API_LEVEL=${ANDROID_API_LEVEL} ANDROID_TOOLCHAIN_BIN=${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/" - -export BITCOIN_CONFIG="--disable-tests --enable-gui-tests --disable-bench --disable-fuzz-binary --without-utils --without-libs --without-daemon" diff --git a/ci/test/01_base_install.sh b/ci/test/01_base_install.sh index 25962a53e5c19..f16321ba55fb5 100755 --- a/ci/test/01_base_install.sh +++ b/ci/test/01_base_install.sh @@ -86,14 +86,4 @@ if [ -n "$XCODE_VERSION" ] && [ ! -d "${DEPENDS_DIR}/SDKs/${OSX_SDK_BASENAME}" ] tar -C "${DEPENDS_DIR}/SDKs" -xf "$OSX_SDK_PATH" fi -if [ -n "$ANDROID_HOME" ] && [ ! -d "$ANDROID_HOME" ]; then - ANDROID_TOOLS_PATH=${DEPENDS_DIR}/sdk-sources/android-tools.zip - if [ ! -f "$ANDROID_TOOLS_PATH" ]; then - ${CI_RETRY_EXE} curl --location --fail "${ANDROID_TOOLS_URL}" -o "$ANDROID_TOOLS_PATH" - fi - mkdir -p "$ANDROID_HOME" - unzip -o "$ANDROID_TOOLS_PATH" -d "$ANDROID_HOME" - yes | "${ANDROID_HOME}"/cmdline-tools/bin/sdkmanager --sdk_root="${ANDROID_HOME}" --install "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" "platform-tools" "platforms;android-31" "platforms;android-${ANDROID_API_LEVEL}" "ndk;${ANDROID_NDK_VERSION}" -fi - git config --global ${CFG_DONE} "true" diff --git a/ci/test/02_run_container.sh b/ci/test/02_run_container.sh index e6c4a613417f2..86bb856d17ba0 100755 --- a/ci/test/02_run_container.sh +++ b/ci/test/02_run_container.sh @@ -26,7 +26,6 @@ if [ -z "$DANGER_RUN_CI_ON_HOST" ]; then docker volume create "${CONTAINER_NAME}_ccache" || true docker volume create "${CONTAINER_NAME}_depends" || true docker volume create "${CONTAINER_NAME}_depends_sources" || true - docker volume create "${CONTAINER_NAME}_depends_SDKs_android" || true docker volume create "${CONTAINER_NAME}_previous_releases" || true if [ -n "${RESTART_CI_DOCKER_BEFORE_RUN}" ] ; then @@ -52,7 +51,6 @@ if [ -z "$DANGER_RUN_CI_ON_HOST" ]; then --mount "type=volume,src=${CONTAINER_NAME}_ccache,dst=$CCACHE_DIR" \ --mount "type=volume,src=${CONTAINER_NAME}_depends,dst=$DEPENDS_DIR/built" \ --mount "type=volume,src=${CONTAINER_NAME}_depends_sources,dst=$DEPENDS_DIR/sources" \ - --mount "type=volume,src=${CONTAINER_NAME}_depends_SDKs_android,dst=$DEPENDS_DIR/SDKs/android" \ --mount "type=volume,src=${CONTAINER_NAME}_previous_releases,dst=$PREVIOUS_RELEASES_DIR" \ --env-file /tmp/env-$USER-$CONTAINER_NAME \ --name "$CONTAINER_NAME" \ diff --git a/ci/test/03_test_script.sh b/ci/test/03_test_script.sh index f5da7bc55d3a7..71d9ad7f72f5e 100755 --- a/ci/test/03_test_script.sh +++ b/ci/test/03_test_script.sh @@ -110,15 +110,6 @@ fi ccache --zero-stats PRINT_CCACHE_STATISTICS="ccache --version | head -n 1 && ccache --show-stats" -if [ -n "$ANDROID_TOOLS_URL" ]; then - make distclean || true - ./autogen.sh - bash -c "./configure $BITCOIN_CONFIG_ALL $BITCOIN_CONFIG" || ( (cat config.log) && false) - make "${MAKEJOBS}" && cd src/qt && ANDROID_HOME=${ANDROID_HOME} ANDROID_NDK_HOME=${ANDROID_NDK_HOME} make apk - bash -c "${PRINT_CCACHE_STATISTICS}" - exit 0 -fi - BITCOIN_CONFIG_ALL="${BITCOIN_CONFIG_ALL} --enable-external-signer --prefix=$BASE_OUTDIR" if [ -n "$CONFIG_SHELL" ]; then diff --git a/configure.ac b/configure.ac index ee4400f21aa70..c0ab6a2fd4370 100644 --- a/configure.ac +++ b/configure.ac @@ -778,22 +778,6 @@ case $host in dnl "'NSUserNotificationCenter' is deprecated: first deprecated in macOS 11.0". OBJCXXFLAGS="$CXXFLAGS -Wno-deprecated-declarations" ;; - *android*) - dnl make sure android stays above linux for hosts like *linux-android* - TARGET_OS=android - case $host in - *x86_64*) - ANDROID_ARCH=x86_64 - ;; - *aarch64*) - ANDROID_ARCH=arm64-v8a - ;; - *armv7a*) - ANDROID_ARCH=armeabi-v7a - ;; - *) AC_MSG_ERROR([Could not determine Android arch, or it is unsupported]) ;; - esac - ;; *linux*) TARGET_OS=linux ;; @@ -1789,7 +1773,6 @@ AC_SUBST(HAVE_O_CLOEXEC) AC_SUBST(HAVE_BUILTIN_PREFETCH) AC_SUBST(HAVE_MM_PREFETCH) AC_SUBST(HAVE_STRONG_GETAUXVAL) -AC_SUBST(ANDROID_ARCH) AC_SUBST(HAVE_EVHTTP_CONNECTION_GET_PEER_CONST_CHAR) AC_CONFIG_FILES([Makefile src/Makefile doc/man/Makefile share/setup.nsi share/qt/Info.plist test/config.ini]) AC_CONFIG_FILES([contrib/devtools/split-debug.sh],[chmod +x contrib/devtools/split-debug.sh]) diff --git a/depends/Makefile b/depends/Makefile index 005d9696fb565..b24aa91181ab6 100644 --- a/depends/Makefile +++ b/depends/Makefile @@ -101,10 +101,6 @@ host_os+=$(findstring netbsd,$(full_host_os)) host_os+=$(findstring openbsd,$(full_host_os)) host_os+=$(findstring mingw32,$(full_host_os)) -ifeq (android,$(findstring android,$(full_host_os))) -host_os:=android -endif - host_os:=$(strip $(host_os)) ifeq ($(host_os),) host_os=$(full_host_os) diff --git a/depends/README.md b/depends/README.md index 10e0985cf48f2..17def65d3e632 100644 --- a/depends/README.md +++ b/depends/README.md @@ -38,11 +38,8 @@ Common `host-platform-triplet`s for cross compilation are: - `riscv32-linux-gnu` for Linux RISC-V 32 bit - `riscv64-linux-gnu` for Linux RISC-V 64 bit - `s390x-linux-gnu` for Linux S390X -- `armv7a-linux-android` for Android ARM 32 bit -- `aarch64-linux-android` for Android ARM 64 bit -- `x86_64-linux-android` for Android x86 64 bit -The paths are automatically configured and no other options are needed unless targeting [Android](../doc/build-android.md). +The paths are automatically configured and no other options are needed. ### Install the required dependencies: Ubuntu & Debian diff --git a/depends/hosts/android.mk b/depends/hosts/android.mk deleted file mode 100644 index a1c8c56dbafa1..0000000000000 --- a/depends/hosts/android.mk +++ /dev/null @@ -1,15 +0,0 @@ -ifeq ($(HOST),armv7a-linux-android) -android_CXX=$(ANDROID_TOOLCHAIN_BIN)/$(HOST)eabi$(ANDROID_API_LEVEL)-clang++ -android_CC=$(ANDROID_TOOLCHAIN_BIN)/$(HOST)eabi$(ANDROID_API_LEVEL)-clang -else -android_CXX=$(ANDROID_TOOLCHAIN_BIN)/$(HOST)$(ANDROID_API_LEVEL)-clang++ -android_CC=$(ANDROID_TOOLCHAIN_BIN)/$(HOST)$(ANDROID_API_LEVEL)-clang -endif - -android_CFLAGS=-std=$(C_STANDARD) -android_CXXFLAGS=-std=$(CXX_STANDARD) - -android_AR=$(ANDROID_TOOLCHAIN_BIN)/llvm-ar -android_RANLIB=$(ANDROID_TOOLCHAIN_BIN)/llvm-ranlib - -android_cmake_system=Android diff --git a/depends/packages/packages.mk b/depends/packages/packages.mk index fb52fd4499725..5cf0852ffef42 100644 --- a/depends/packages/packages.mk +++ b/depends/packages/packages.mk @@ -5,12 +5,10 @@ boost_packages = boost libevent_packages = libevent qrencode_linux_packages = qrencode -qrencode_android_packages = qrencode qrencode_darwin_packages = qrencode qrencode_mingw32_packages = qrencode qt_linux_packages:=qt expat libxcb xcb_proto libXau xproto freetype fontconfig libxkbcommon libxcb_util libxcb_util_render libxcb_util_keysyms libxcb_util_image libxcb_util_wm -qt_android_packages=qt qt_darwin_packages=qt qt_mingw32_packages=qt diff --git a/depends/packages/qt.mk b/depends/packages/qt.mk index d057b2d410a18..d8e6aba8a6337 100644 --- a/depends/packages/qt.mk +++ b/depends/packages/qt.mk @@ -12,7 +12,6 @@ $(package)_patches += qttools_src.pro $(package)_patches += mac-qmake.conf $(package)_patches += fix_qt_pkgconfig.patch $(package)_patches += no-xlib.patch -$(package)_patches += fix_android_jni_static.patch $(package)_patches += dont_hardcode_pwd.patch $(package)_patches += qtbase-moc-ignore-gcc-macro.patch $(package)_patches += rcc_hardcode_timestamp.patch @@ -185,24 +184,6 @@ $(package)_config_opts_mingw32 += -pch ifneq ($(LTO),) $(package)_config_opts_mingw32 += -ltcg endif - -$(package)_config_opts_android = -xplatform android-clang -$(package)_config_opts_android += -android-sdk $(ANDROID_SDK) -$(package)_config_opts_android += -android-ndk $(ANDROID_NDK) -$(package)_config_opts_android += -android-ndk-platform android-$(ANDROID_API_LEVEL) -$(package)_config_opts_android += -egl -$(package)_config_opts_android += -no-dbus -$(package)_config_opts_android += -opengl es2 -$(package)_config_opts_android += -qt-freetype -$(package)_config_opts_android += -no-fontconfig -$(package)_config_opts_android += -L $(host_prefix)/lib -$(package)_config_opts_android += -I $(host_prefix)/include -$(package)_config_opts_android += -pch -$(package)_config_opts_android += -no-feature-vulkan - -$(package)_config_opts_aarch64_android += -android-arch arm64-v8a -$(package)_config_opts_armv7a_android += -android-arch armeabi-v7a -$(package)_config_opts_x86_64_android += -android-arch x86_64 endef define $(package)_fetch_cmds @@ -243,7 +224,6 @@ define $(package)_preprocess_cmds patch -p1 -i $($(package)_patch_dir)/fix-macos-linker.patch && \ patch -p1 -i $($(package)_patch_dir)/dont_hardcode_pwd.patch && \ patch -p1 -i $($(package)_patch_dir)/fix_qt_pkgconfig.patch && \ - patch -p1 -i $($(package)_patch_dir)/fix_android_jni_static.patch && \ patch -p1 -i $($(package)_patch_dir)/no-xlib.patch && \ patch -p1 -i $($(package)_patch_dir)/qtbase-moc-ignore-gcc-macro.patch && \ patch -p1 -i $($(package)_patch_dir)/memory_resource.patch && \ diff --git a/depends/patches/qt/fix_android_jni_static.patch b/depends/patches/qt/fix_android_jni_static.patch deleted file mode 100644 index 79824f244aa5f..0000000000000 --- a/depends/patches/qt/fix_android_jni_static.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- old/qtbase/src/plugins/platforms/android/androidjnimain.cpp -+++ new/qtbase/src/plugins/platforms/android/androidjnimain.cpp -@@ -979,6 +979,14 @@ Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void */*reserved*/) - __android_log_print(ANDROID_LOG_FATAL, "Qt", "registerNatives failed"); - return -1; - } -+ -+ const jint ret = QT_PREPEND_NAMESPACE(QtAndroidPrivate::initJNI(vm, env)); -+ if (ret != 0) -+ { -+ __android_log_print(ANDROID_LOG_FATAL, "Qt", "initJNI failed"); -+ return ret; -+ } -+ - QWindowSystemInterfacePrivate::TabletEvent::setPlatformSynthesizesMouse(false); - - m_javaVM = vm; diff --git a/doc/README.md b/doc/README.md index 7b6dacaf4f704..74a85b04e62dc 100644 --- a/doc/README.md +++ b/doc/README.md @@ -45,7 +45,6 @@ The following are developer notes on how to build Bitcoin Core on your native pl - [FreeBSD Build Notes](build-freebsd.md) - [OpenBSD Build Notes](build-openbsd.md) - [NetBSD Build Notes](build-netbsd.md) -- [Android Build Notes](build-android.md) Development --------------------- diff --git a/doc/build-android.md b/doc/build-android.md deleted file mode 100644 index 2f2e01c441dc9..0000000000000 --- a/doc/build-android.md +++ /dev/null @@ -1,25 +0,0 @@ -ANDROID BUILD NOTES -====================== - -This guide describes how to build and package the `bitcoin-qt` GUI for Android on Linux and macOS. - - -## Dependencies - -Before proceeding with an Android build one needs to get the [Android SDK](https://developer.android.com/studio) and use the "SDK Manager" tool to download the NDK and one or more "Platform packages" (these are Android versions and have a corresponding API level). - -The minimum supported Android NDK version is [r23](https://github.com/android/ndk/wiki/Changelog-r23). - -In order to build `ANDROID_API_LEVEL` (API level corresponding to the Android version targeted, e.g. Android 9.0 Pie is 28 and its "Platform package" needs to be available) and `ANDROID_TOOLCHAIN_BIN` (path to toolchain binaries depending on the platform the build is being performed on) need to be set. - -API levels from 24 to 29 have been tested to work. - -If the build includes Qt, environment variables `ANDROID_SDK` and `ANDROID_NDK` need to be set as well but can otherwise be omitted. -This is an example command for a default build with no disabled dependencies: - - ANDROID_SDK=/home/user/Android/Sdk ANDROID_NDK=/home/user/Android/Sdk/ndk-bundle make HOST=aarch64-linux-android ANDROID_API_LEVEL=28 ANDROID_TOOLCHAIN_BIN=/home/user/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin - - -## Building and packaging - -After the depends are built configure with one of the resulting prefixes and run `make && make apk` in `src/qt`. \ No newline at end of file diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index c235c3c4da732..1ac6b74688907 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -392,20 +392,6 @@ bitcoin_qt_clean: FORCE bitcoin_qt : qt/bitcoin-qt$(EXEEXT) -APK_LIB_DIR = qt/android/libs/$(ANDROID_ARCH) -QT_BASE_VERSION = $(lastword $(shell $(MOC) --version)) -QT_BASE_PATH = $(shell find ../depends/sources/ -maxdepth 1 -type f -regex ".*qtbase.*$(QT_BASE_VERSION)\.tar.xz") -QT_BASE_TLD = $(shell tar tf $(QT_BASE_PATH) --exclude='*/*') - -bitcoin_qt_apk: FORCE - mkdir -p $(APK_LIB_DIR) - cp $(dir $(lastword $(CC)))../sysroot/usr/lib/$(host_alias)/libc++_shared.so $(APK_LIB_DIR) - tar xf $(QT_BASE_PATH) -C qt/android/src/ $(QT_BASE_TLD)src/android/jar/src --strip-components=5 - tar xf $(QT_BASE_PATH) -C qt/android/src/ $(QT_BASE_TLD)src/android/java/src --strip-components=5 - cp qt/bitcoin-qt $(APK_LIB_DIR)/libbitcoin-qt_$(ANDROID_ARCH).so - cd qt/android && gradle wrapper --gradle-version=6.6.1 - cd qt/android && ./gradlew build - ui_%.h: %.ui @test -f $(UIC) || (echo "uic $(UIC) not found, but is required for generating ui headers"; exit 1) @$(MKDIR_P) $(@D) diff --git a/src/qt/android/.gitignore b/src/qt/android/.gitignore deleted file mode 100644 index c090a2e98ea8d..0000000000000 --- a/src/qt/android/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -/.gradle -/build -/gradle -/gradlew* -/libs -/src/org/kde -/src/org/qtproject diff --git a/src/qt/android/AndroidManifest.xml b/src/qt/android/AndroidManifest.xml deleted file mode 100644 index 41615294e0917..0000000000000 --- a/src/qt/android/AndroidManifest.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/qt/android/build.gradle b/src/qt/android/build.gradle deleted file mode 100644 index 4c36e79db8fb4..0000000000000 --- a/src/qt/android/build.gradle +++ /dev/null @@ -1,52 +0,0 @@ -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.1.0' - } -} - -repositories { - google() - jcenter() -} - -apply plugin: 'com.android.application' - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) -} - -android { - compileSdkVersion androidCompileSdkVersion.toInteger() - - buildToolsVersion androidBuildToolsVersion - - sourceSets { - main { - manifest.srcFile 'AndroidManifest.xml' - java.srcDirs = [qt5AndroidDir + '/src', 'src', 'java'] - aidl.srcDirs = [qt5AndroidDir + '/src', 'src', 'aidl'] - res.srcDirs = [qt5AndroidDir + '/res', 'res'] - resources.srcDirs = ['src'] - renderscript.srcDirs = ['src'] - assets.srcDirs = ['assets'] - jniLibs.srcDirs = ['libs'] - } - } - - lintOptions { - abortOnError false - } - - dexOptions { - javaMaxHeapSize '4g' - } - - defaultConfig { - minSdkVersion 24 - } -} diff --git a/src/qt/android/gradle.properties b/src/qt/android/gradle.properties deleted file mode 100644 index 468f4757c0006..0000000000000 --- a/src/qt/android/gradle.properties +++ /dev/null @@ -1,4 +0,0 @@ -androidBuildToolsVersion=30.0.3 -androidCompileSdkVersion=30 -qt5AndroidDir=new File(".").absolutePath -org.gradle.jvmargs=-Xmx4608M diff --git a/src/qt/android/res/drawable-hdpi/bitcoin.png b/src/qt/android/res/drawable-hdpi/bitcoin.png deleted file mode 100644 index 31a556a35f2a473413020c6f15b39868c0022d5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4536 zcmV;p5l8NcP)Mx1{e=a1SSJh2$RXZ@#LKm8??4wN$DnpBHNtS2Ojk z#Tx|^#+X3HijuMa+9M2%fZspq)UlKeFUyU(9!GnETruw1OMK4)Y=SiiB9Ve@at}w0 zBgT6y<Rz?2wj2XFa{lX>B%FN0EN9he@2)lWkjXYR!tQ-LlNn|A2Qtz`O zx$4l`Spw;8;XkeM#%7L5n0&h+>1e;LbbL@AoQyzx3FH|^j3WXPh6)0LWP0s10LD1OIq4#>6a0&pV-`MP8KmDSuv~}SH=upQ%M$q8Nahyy3({`?lO{1 zq2F0j zt1(WZpailweq-he`XVtJh%tOrZ(^`0CW}O$w+0+p`K=Y=i523=nRx9#J#(;}jvD=< zXR`u$aGEszyI(CP$wv(-IO2Px)MQ#}Y*|z3L192!<&q0T(of5zFfOZ>YW)gT?#2D8H^-AQ+W#+01`2F^MsJxe?04I=NXwa%|Gv7{YBO*@TsoqqytC3+~^{tat;x@ zK8nFIrfdcVPJ#{bfvw3|zMgjP-c8A5l3bgYP-58m1oKaLkhYeW)2_00v~%Hb@{PME zJ&R=8H!(dwCo<^K6EA>owbmWPY@ndoO34hVKm53TEyKWo32-(z<`$}~tfakr_fjkt zBk$rtlpKDcvWv*`T_*~KLImL4Za4X-KBEb?fkg%8P?MR}-`}z9h$GPK)-KczUEi(6 z$A;=x^ikA|nDZ7TM_fY5 zk(ZKl^$bcR60~Q}9&$T(QGDc;(5192;&8Ij#{X?s|9$va2tsN5OENPbS`iXTE;Wy1B3|} z0%M1x(I`Npcs$OJ1zlSyJm~>SjJ}FO)1HQCraEgAc{mH5Mnq?`}glR8h``K+&i|AfBRa5 z7oHD*DKzIb=n`0j42Lqn#3BYsGGAsn{2VLD2|at|QQ6h4jSea4-mF6gZGo~3io9VL zQE1AeIL&)*p@EZTZJc^9DIYSnu$zq~r+T1a#9emEXD8wie z(>g;aDYJlK*66^r1TYX#QRFFShFw5OI5z4^sw`gtCc$wX91b&$Vf+}tLYP6Qol8bi zcyD`mIVGSk@*QVW>#t(1MSm6sK)EV*kms8(@HxyPVLV6$ z9VomWK)UAT+paAyC>hR>>g!zQFP9$Qw1=|G1pLX>~-WTd=IHx z4==C-jw&!-q1{vNQFgDg`%*wnx`UDvZ>P%TqY!p1?mF`-6eDph=5dHEi#W`>+;L(n zyKHvgigt~k<+LbR1O~C*fYw8;aAIIC1~AG1%oQ3i*DAZ7lH+b9_u?Uhj3k-hQfYnn z)cY-afN%y-V9{;`P;%lOt6Yka(NWi=Yh;CBn_0B%lQW;S>(36^)}wJh zQ4pF~#F_(u5K^o&49wLUFgH+g{7uSkQTnrlbb-bh8sjN0OaU|PLE1h2q11V5ibV*! zM@p$6^I4=~E>^-^T~ooUA*?2pW1+RtU3v-;bm`y<@_8WqZAmvk)R@EUHh2O(vJ z69Y5h7G<|mbn*j6{Xysi7UlsMWe+QRL;>^==_~?++}qY08HD$YjlNDFhZq~#gy;(7 z=*HD6dk!#2C(uU+^BNb+ISPZsENX7Cs136yX|V{p0|tRTDS&QPA#xi*OZ?w_%&mh2 zDDvIMDPU$irtDDyP&$izKX&DI#X7k1c9yQe=i{Gc)5wa#m#b~=@QZ-~u&4^4VaphaL&bke;h{lV`@)iCbAjLodbdYBtI zH!r2=)JO1H_{?gs$h-m*%g@;Z4AKIWPymTW&xS=1>^9tY;lGG=K`FB(izf4~IK&tinRqT_B+`r|bBUkh^yH4joer*|$C@2A9!C&*K>1c2z^@{Fir!+ecJSK^^%NMI482@75rfX(t;zSz+@S1YJI}h&x#vf;Ak3oh@GEKi)-t4Ya+R(o@8$&vC994RLc4Ab z7=q3nAW2}*q@oH(4@YjLMJ9kyC;7hpLIdU^u$RF>$O9l~Q5EA5X40Y$Pk-93S^am< z`%h?toG0GxWk;ul$w_Ti0ZN^Iv#*(iarh6YSRRmlFrcgeG}#8`m?d{@OzijTg=0_HpcOdAcD|4;Qz85~`# z{r$7I@W9M=JBa%VcF;vc7@_XEwBdtNoQ%4hvC+i{3{*(d-4=P0C{3oXtgZ}DvMyLJFLok`rV zit3pgTc6KIu9cJ2`<`zB)5-vh2&XjNL2uO*X@#zG~jWVvnKiMoh^f{CDGn z&!!4B)I!+6JY}m?QFk>OO^Qr^ns;{Kv5?QHLdS(75*Z3if#GLte^DB>2*S<99|JSM z1{lj^hY-$lgrBe)%NLI3%QsMu;%)|5-X5g&ja5@AsY1z4P!Z zT=*s>)ZZhM?x*047br02O_k`Q=6TyhpuZ^@56X4S+ryBSI`XrK`y70VybyX+RkJ`8BO&*vz*ju<_r#eX>{7)t2A`2S0J*g|U1`RA-NI&y8suA{yC*HHrX8uIaC- zzO5YW!u}x&On=V4mN5gvOfha!5a+1!rQo3xFM@A%whegIr)R!~f=XmDae=0c#*Hj* zi{ULX>Kq?=g#zYz+Vx#eiVeFsO)Vn@xa!^gI-4YO;KQc_qQS({*Mz}y|W9Ai*Nb`rWuFu z{2C^Ju@T_3tE2L>ahAYgAXac0$t{^HKRM$~lmIf#Rxu8-1IBQ# zS$Y<+i6o)cxFU-_I{j7a&Ypk&rZ@Etdh&#eEBiKB1v=|a7>h?^Et9@(N!RK~7U3E^ zeX^H-`M`-6@J+qHm)pYC*x+N;9s3RUzcY(W0&LpYWIJjxv^wEjN2RLQKEO>Xd|UYM z?TZE8yy}RCrJb^JRka!xJJrk@lSX`PZYO7;FtXU(v0lID(0DRye&=6Jfs0+=zFr44 ztt*3&i)y>3_qy_9cuzHGFU7D6^PJ!JS5uh7j=$Vw#w#b?vbAg00Ds@?Qe>7I-Ro*) zC11Y=Wo0TeO@HYm`Q;{mim%5xrsM5Lw_f=E>Ca+NRnar6P)!PogZ;DJYVH(QVY%0` zIQ~}IH+#LRVTwvS)yrM-!D-LowOE#tUyt)={eq=Ks__L&hyE$QVCnC#==%Hk`}jXH WSA+d%omJ diff --git a/src/qt/android/res/drawable-ldpi/bitcoin.png b/src/qt/android/res/drawable-ldpi/bitcoin.png deleted file mode 100644 index 76d80d4196cf16cdd31ecee944991a710c28d624..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1697 zcmV;S244AzP)HgpT z>Z|&z^Mn7V<3}uh#^RSOevQE2cn$AeD2N|-edE%Lin{qeEAQ(I@_D}PN}-q23%ykc zrNGPa1HIeI`+5VBE}l>ES)6lTK;|^`-&Eeu7t#tms+ONiX`>*QbSpgUe~((;#}iuE zFz2Ro2G;b&i~n5Q*Pq80Ff)K491y+GXGekkI?gTbm7Cx6#ozwCct4Yp{Ql4+m zX@Ly7iuA$P;J2+(910=jdG^ezclnLD_G!bcY@T}`^F;L2K)eZ%A=i;U^alK0TO}uy z{M_iu#+TlAT2S+uGJrWX5I=EaUn42-CRf!oDSJj7=#8WS zK{z1#;Hxb~V#gy?QF4^@k#|vaMjeXHZ9?jZyV9zJkOt)LuKW1!{&do6D(>UW&jg|s z`YAf$eNxzhNR1qRnp9OKA+m^!(f1H{U@eJ)Kx*J&_I_L?oRx{axIJL$u2Vk%wB&h@8K z31QCq_M#ips#Dh26Lvscm2<6i$71+-;S_x>JiLMQ zsqc`qq&*4yS2$o$ja%9^-Ue)yQb9#JUHPeNqb%>68*qSdGNc}Ua~$L@X4rcz5F_*m z8DkzNKC;+a6i~vZ(PU13oyBWpPJEGs9a9}xAy!HnyGBAKj|-@z7t)rzA^(gY;MwL> z6ikQq1r#8?>?wA7Fnw;^-dJ7i9Ilgvr4khr3!1%yMECDH;9 zWK@akpS=wXwSj)A7J#?W9uT${GCk=uhk#x24@u)cl+(FeCx#Nk9n8+%PswZTl$r08{C)B>zae zXOpxxpM;{tB#WE_Y8pC;i`$VAev}o${kBTOZIx1Nyp>=`nKHLZ*PzlIm2|d%$c&os zPg^plzsEfEF6lErV_=J*n)SXSi6qVXmMQyCEtPI`sl-wi14FW@`{!(T4_Y2aC1uoo zR?G+C^NYTU;t}{j#@$ zA*t+3`{V=xl1`U7@ri$ecPC-K4XTzzvkxQsm%c_WZMViM^*C zSVM}UkT&*NQZRmudkM1;3c;DJp>Q&Y6Xx`u|^q9r;@YrIwgGVDT5&7yqqZ3IIYJZJgT^$5-K4z0EdOandvsk3XjlliE`!dSvBe158rs)IkvDvF=yo z;j!nOec1rD*kl*hSR*@C5HvmX8TjSAeGAftb@bisFZ-0Whae_Bi49knXAl^)V*RqW rV@}b zQyaeC=J6+R5AOYUa0&o!>{IKZhxap(mfX~Q@5t0M!sz6R(5OTTjZ_=n6GkUhct@n1 zvgD@Z?fWie(15xRKlHD1<|gyY$yuej>0<+);OWCz^Ej5Nlxr$v7HLrd(#RCRlNb{z(xdcUFe8@!kv#6Zu8+pxH~vxJZ{G2BdY{0k zR0{`oHNeNDGD{;C0O@_jz5WqN)*WBR_rY&nSL6>qSm}A=y6#jjDHf33Kk-- zQJ$MPvs!$myRSL&I^d0gkB$I*!e5zHlb+-KF`NY*CrmT1g^8Psa?%Hf0O}H;wZKyd zz=PwSq@vwR$W}0fJmz*JOsr1Aq?#}|V#ESp|LiaEe_TyXRNeVaN?)GyI;I7Vh^I4f zndF(-oBV!1`FuX|%zKuE$+fAZU>w;ujU?BM-o`BO-!N6|`XaX16{*vAUE^W`Ba^Mh z$|3>xO{hb`u~`7lfMqlL3pv*QMB#9lT#j-Q@|sd`T2pe`trQA{*k?a0SV)&;RX$co$iae>?T!`lR939QjH`c;-z~QlHF2B_WcXVvHDx`&gw(1V{7Qbg$v|5Q9$Cf zM&w!e3I&5f3Iqb=oA(q_O2YzMn=>J()s0GiPZ)DK&93s)*W*QSxit7+};zkKrmXD%l+wxJD9XWvN8~BTlJDo~7~()mchw+__7>zE{R&;wPoN9 zNM!jenwyfC--7JN)+6tMU&{AAe^Pi(Hww?~LE_w=PPcMyb_l`(D6;c)}7R15;KdFWcysiwq5sNy2Hz)DWRur1ikrk+wM;Oue zuKSL{^LjDs%^c}L;aQ!@yZ%QKMG-#o``k<40SgG0VRQ2iH=P1j4f>aw-v2lQj>bit z1uO#lsZToL>}O0 zb|6I7xpfSoV0r#CwFxg6K;eZ0*<*jkLLUMPuB~HL_rV#@qF1Bl2e_xs4dbr?ZDoyA8m(7^%jARhhJlN6lSpQU0;X`QL{v9A7zVdTKxui|>*!^>x( zE@#2HX}Bt{orMRa{9p7GtARljT={|AsRJqo?5B5Aa8@_AMl&S~hU4~*&!W3)dcm6a zV;eFl%CHXyWXyI^P&i067=Qy%Bn=Cmp{A3-8hMoXBOxC& z8L?2lVJKvhgH{3x`dsARluN!PuahvlJBbW9dPRtVckD9bdn&bZ9A2paUIW1S#$N)T z4hQ5~z(lG)N>tg;s#`mU^G7~nSeJcHj$`Y{<*=aIPurTF9i( zKe350T6@`SgYk8m$0M1MeTwRYQaq_^2vVhTe zQ_opY7^hOrLI@6&6%rx~kQnrw1-a5|?0=^=ge)qRMFyUs1g=h(2trc$bKJPgKEeK~ z!@bb~c9fyFD^hNH{1fYtb%&WOXAhHm{tE;xw;fsqMlif_;JiRN@Khym?FL5i+&A20 z1*R)H*xL4KR398FMLxXMjN80BLlVn2Pb6F6QL?T6Q44&G7PvOz3bt9}+V)XYpQ|}` zzxmwHu{jazK!4EVS`G_A8Z}z3J^$g48Z*(UpJH>a`nVkjtJXi_XDOq?ozNNdP}D|R zt^um!MCotwGq3rW9Y@@f6DIACs96ATJuT-s4l{PZL;zpyUhVPvRWot!r`W-$iO2=b z4|egWtL6H6uHN&W`Z4y8tBAaDO>Fz*iN1cO2tvdWBQ>&?bFjwI_YE^yHhmJ++c@X1 z{;K+E+k0Y)ev2K?o1NmMS~t%PfCpKVI`>Q5*bkdCsf6166Rw-4KJ!p^;jeMy{Ft4% z92$V-#`WEe@nEdfVQ>1E{Gq#J#_bQ|xUb~5c(Z$`=`?a!&jEafdvNbg_8oaJyAf;s z+x)A+bG2@LVlg|n+44zrPi(&Td>-}GcJ_S9>yI>grQxknihnhz^8bJK_;0xW2D-1; U@i=O6UH||907*qoM6N<$g7eM&RR910 diff --git a/src/qt/android/res/drawable-xhdpi/bitcoin.png b/src/qt/android/res/drawable-xhdpi/bitcoin.png deleted file mode 100644 index 2bd5e3defc7526329523249a740fbe5e8f6c5ec5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6832 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 diff --git a/src/qt/android/res/drawable-xxxhdpi/bitcoin.png b/src/qt/android/res/drawable-xxxhdpi/bitcoin.png deleted file mode 100644 index bb1dbc355469143ae525d98b8f7080d2daaf5d38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17034 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 i000000001hk8%Ud&_}x^!=eQM0000 - - - - arm64-v8a;libbitcoin-qt_arm64-v8a.so - - - armeabi-v7a;libbitcoin-qt_armeabi-v7a.so - - - x86_64;libbitcoin-qt_x86_64.so - - - diff --git a/src/qt/android/src/org/bitcoincore/qt/BitcoinQtActivity.java b/src/qt/android/src/org/bitcoincore/qt/BitcoinQtActivity.java deleted file mode 100644 index 2cba489242518..0000000000000 --- a/src/qt/android/src/org/bitcoincore/qt/BitcoinQtActivity.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.bitcoincore.qt; - -import android.os.Bundle; -import android.system.ErrnoException; -import android.system.Os; - -import org.qtproject.qt5.android.bindings.QtActivity; - -import java.io.File; - -public class BitcoinQtActivity extends QtActivity -{ - @Override - public void onCreate(Bundle savedInstanceState) - { - final File bitcoinDir = new File(getFilesDir().getAbsolutePath() + "/.bitcoin"); - if (!bitcoinDir.exists()) { - bitcoinDir.mkdir(); - } - - super.onCreate(savedInstanceState); - } -} From 4b7d9842691046b01f0c08d69f924ddb62ccc4c6 Mon Sep 17 00:00:00 2001 From: willcl-ark Date: Tue, 7 May 2024 15:37:31 +0100 Subject: [PATCH 2/6] lint: add markdown hyperlink checker This adds a markdown hyperlink check task to the lint test_runner. It relies on having the [`mlc`](https://crates.io/crates/mlc) binary found on $PATH, but will fail with `success` if the binary is not found. `mlc` is also added to the ci/04_install.sh script run by the containerfile. Note that broken markdown hyperlinks will be detected in untracked markdown files found in a dirty working directory (including e.g. .venv). --- ci/lint/04_install.sh | 5 ++++ test/lint/README.md | 1 + test/lint/test_runner/src/main.rs | 50 +++++++++++++++++++++++++++++-- 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/ci/lint/04_install.sh b/ci/lint/04_install.sh index 6b12c53f2ad84..87e3a8fa9b110 100755 --- a/ci/lint/04_install.sh +++ b/ci/lint/04_install.sh @@ -57,3 +57,8 @@ SHELLCHECK_VERSION=v0.8.0 curl -sL "https://github.com/koalaman/shellcheck/releases/download/${SHELLCHECK_VERSION}/shellcheck-${SHELLCHECK_VERSION}.linux.x86_64.tar.xz" | \ tar --xz -xf - --directory /tmp/ mv "/tmp/shellcheck-${SHELLCHECK_VERSION}/shellcheck" /usr/bin/ + +MLC_VERSION=v0.16.3 +MLC_BIN=mlc-x86_64-linux +curl -sL "https://github.com/becheran/mlc/releases/download/${MLC_VERSION}/${MLC_BIN}" -o "/usr/bin/mlc" +chmod +x /usr/bin/mlc diff --git a/test/lint/README.md b/test/lint/README.md index 13c2099808b90..49ed8356c30ca 100644 --- a/test/lint/README.md +++ b/test/lint/README.md @@ -37,6 +37,7 @@ Then you can use: | [`lint-python-dead-code.py`](/test/lint/lint-python-dead-code.py) | [vulture](https://github.com/jendrikseipp/vulture) | [`lint-shell.py`](/test/lint/lint-shell.py) | [ShellCheck](https://github.com/koalaman/shellcheck) | [`lint-spelling.py`](/test/lint/lint-spelling.py) | [codespell](https://github.com/codespell-project/codespell) +| markdown link check | [mlc](https://github.com/becheran/mlc) In use versions and install instructions are available in the [CI setup](../../ci/lint/04_install.sh). diff --git a/test/lint/test_runner/src/main.rs b/test/lint/test_runner/src/main.rs index d5dd98effe2b7..5f980eb3989a0 100644 --- a/test/lint/test_runner/src/main.rs +++ b/test/lint/test_runner/src/main.rs @@ -4,9 +4,9 @@ use std::env; use std::fs; +use std::io::ErrorKind; use std::path::{Path, PathBuf}; -use std::process::Command; -use std::process::ExitCode; +use std::process::{Command, ExitCode, Stdio}; type LintError = String; type LintResult = Result<(), LintError>; @@ -292,6 +292,51 @@ fn lint_doc() -> LintResult { } } +fn lint_markdown() -> LintResult { + let bin_name = "mlc"; + let mut md_ignore_paths = get_subtrees(); + md_ignore_paths.push("./doc/README_doxygen.md"); + let md_ignore_path_str = md_ignore_paths.join(","); + + let mut cmd = Command::new(bin_name); + cmd.args([ + "--offline", + "--ignore-path", + md_ignore_path_str.as_str(), + "--root-dir", + ".", + ]) + .stdout(Stdio::null()); // Suppress overly-verbose output + + match cmd.output() { + Ok(output) if output.status.success() => Ok(()), + Ok(output) => { + let stderr = String::from_utf8_lossy(&output.stderr); + let filtered_stderr: String = stderr // Filter out this annoying trailing line + .lines() + .filter(|&line| line != "The following links could not be resolved:") + .collect::>() + .join("\n"); + Err(format!( + r#" +One or more markdown links are broken. + +Relative links are preferred (but not required) as jumping to file works natively within Emacs. + +Markdown link errors found: +{} + "#, + filtered_stderr + )) + } + Err(e) if e.kind() == ErrorKind::NotFound => { + println!("`mlc` was not found in $PATH, skipping markdown lint check."); + Ok(()) + } + Err(e) => Err(format!("Error running mlc: {}", e)), // Misc errors + } +} + fn lint_all() -> LintResult { let mut good = true; let lint_dir = get_git_root().join("test/lint"); @@ -325,6 +370,7 @@ fn main() -> ExitCode { ("no-tabs check", lint_tabs_whitespace), ("build config includes check", lint_includes_build_config), ("-help=1 documentation check", lint_doc), + ("markdown hyperlink check", lint_markdown), ("lint-*.py scripts", lint_all), ]; From b018bd779dd9b2d46c10254a1cf5b819ae8e027c Mon Sep 17 00:00:00 2001 From: fanquake Date: Thu, 30 May 2024 09:29:11 +0100 Subject: [PATCH 3/6] depends: qt 5.15.14 --- depends/packages/qt.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/depends/packages/qt.mk b/depends/packages/qt.mk index 146e895c5a943..2dba1b41ae2bf 100644 --- a/depends/packages/qt.mk +++ b/depends/packages/qt.mk @@ -1,9 +1,9 @@ package=qt -$(package)_version=5.15.13 +$(package)_version=5.15.14 $(package)_download_path=https://download.qt.io/official_releases/qt/5.15/$($(package)_version)/submodules $(package)_suffix=everywhere-opensource-src-$($(package)_version).tar.xz $(package)_file_name=qtbase-$($(package)_suffix) -$(package)_sha256_hash=4cca51dcc1f22ceeee6b3e33cd1c3a60b14e85e24644dca3af89a2c2989ab809 +$(package)_sha256_hash=500d3b390048e9538c28b5f523dfea6936f9c2e10d24ab46580ff57d430b98be $(package)_linux_dependencies=freetype fontconfig libxcb libxkbcommon libxcb_util libxcb_util_render libxcb_util_keysyms libxcb_util_image libxcb_util_wm $(package)_qt_libs=corelib network widgets gui plugins testlib $(package)_linguist_tools = lrelease lupdate lconvert @@ -25,10 +25,10 @@ $(package)_patches += windows_lto.patch $(package)_patches += zlib-timebits64.patch $(package)_qttranslations_file_name=qttranslations-$($(package)_suffix) -$(package)_qttranslations_sha256_hash=24d4c58bc2a40c0f44f59ee64af4192c7d0038c1e45af61646cfc5b65058f271 +$(package)_qttranslations_sha256_hash=5b94d1a11b566908622fcca2f8b799744d2f8a68da20be4caa5953ed63b10489 $(package)_qttools_file_name=qttools-$($(package)_suffix) -$(package)_qttools_sha256_hash=57c9794c572c4e02871f2e7581525752b0cf85ea16cfab23a4ac9ba7b39a5d34 +$(package)_qttools_sha256_hash=12061a85baf5f4de8fbc795e1d3872b706f340211b9e70962caeffc6f5e89563 $(package)_extra_sources = $($(package)_qttranslations_file_name) $(package)_extra_sources += $($(package)_qttools_file_name) From 88cdb5967f093cf96e9184a48c0d9e34cea9d341 Mon Sep 17 00:00:00 2001 From: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> Date: Thu, 30 May 2024 11:33:59 +0100 Subject: [PATCH 4/6] clang-tidy: Add `bugprone-move-forwarding-reference` check --- src/.clang-tidy | 1 + 1 file changed, 1 insertion(+) diff --git a/src/.clang-tidy b/src/.clang-tidy index a00400f0834e8..61adce1d5066d 100644 --- a/src/.clang-tidy +++ b/src/.clang-tidy @@ -2,6 +2,7 @@ Checks: ' -*, bitcoin-*, bugprone-argument-comment, +bugprone-move-forwarding-reference, bugprone-string-constructor, bugprone-use-after-move, bugprone-lambda-function-name, From 0a3631fc352eda849290db940844e5ef723436df Mon Sep 17 00:00:00 2001 From: fanquake Date: Thu, 2 May 2024 16:45:03 +0800 Subject: [PATCH 5/6] depends: fix Qt macOS build with Clang 18 Patch Qts internal libpng to resolve the failure. I would like to have this patched, so we can continue working on the removal of `FORCE_USE_SYSTEM_CLANG`. Otherwise builds will be broken using the default clang (18) on the current Ubuntu LTS (24.04). --- depends/packages/qt.mk | 2 ++ depends/patches/qt/clang_18_libpng.patch | 40 ++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 depends/patches/qt/clang_18_libpng.patch diff --git a/depends/packages/qt.mk b/depends/packages/qt.mk index 2dba1b41ae2bf..d35139dd2de3e 100644 --- a/depends/packages/qt.mk +++ b/depends/packages/qt.mk @@ -20,6 +20,7 @@ $(package)_patches += duplicate_lcqpafonts.patch $(package)_patches += guix_cross_lib_path.patch $(package)_patches += fix-macos-linker.patch $(package)_patches += memory_resource.patch +$(package)_patches += clang_18_libpng.patch $(package)_patches += utc_from_string_no_optimize.patch $(package)_patches += windows_lto.patch $(package)_patches += zlib-timebits64.patch @@ -229,6 +230,7 @@ define $(package)_preprocess_cmds patch -p1 -i $($(package)_patch_dir)/qtbase-moc-ignore-gcc-macro.patch && \ patch -p1 -i $($(package)_patch_dir)/memory_resource.patch && \ patch -p1 -i $($(package)_patch_dir)/no_warnings_for_symbols.patch && \ + patch -p1 -i $($(package)_patch_dir)/clang_18_libpng.patch && \ patch -p1 -i $($(package)_patch_dir)/rcc_hardcode_timestamp.patch && \ patch -p1 -i $($(package)_patch_dir)/duplicate_lcqpafonts.patch && \ patch -p1 -i $($(package)_patch_dir)/utc_from_string_no_optimize.patch && \ diff --git a/depends/patches/qt/clang_18_libpng.patch b/depends/patches/qt/clang_18_libpng.patch new file mode 100644 index 0000000000000..e807905b321a5 --- /dev/null +++ b/depends/patches/qt/clang_18_libpng.patch @@ -0,0 +1,40 @@ +fix Qt macOS build with Clang 18 + + See: + https://github.com/pnggroup/libpng/commit/893b8113f04d408cc6177c6de19c9889a48faa24. + + In a similar manner as zlib (madler/zlib#895), + libpng contains a header configuration that's no longer valid and + hasn't been exercised for the macOS target. + + - The target OS conditional macros are misused. Specifically + `TARGET_OS_MAC` covers all Apple targets, including iOS, and it + should not be checked with `#if defined` as they would always be + defined (to either 1 or 0) on Apple platforms. + - `#include ` no longer works for the macOS target and results + in a compilation failure. macOS ships all required functions in + `math.h`, and clients should use `math.h` instead. + +--- a/qtbase/src/3rdparty/libpng/pngpriv.h ++++ b/qtbase/src/3rdparty/libpng/pngpriv.h +@@ -514,18 +514,8 @@ + */ + # include + +-# if (defined(__MWERKS__) && defined(macintosh)) || defined(applec) || \ +- defined(THINK_C) || defined(__SC__) || defined(TARGET_OS_MAC) +- /* We need to check that hasn't already been included earlier +- * as it seems it doesn't agree with , yet we should really use +- * if possible. +- */ +-# if !defined(__MATH_H__) && !defined(__MATH_H) && !defined(__cmath__) +-# include +-# endif +-# else +-# include +-# endif ++# include ++ + # if defined(_AMIGA) && defined(__SASC) && defined(_M68881) + /* Amiga SAS/C: We must include builtin FPU functions when compiling using + * MATH=68881 From a27e1ceb9f9c9239af9b0a151c84a57573ea646a Mon Sep 17 00:00:00 2001 From: fanquake Date: Thu, 30 May 2024 14:47:40 +0100 Subject: [PATCH 6/6] depends: consolidate dependency docs Adds missing `g++` for macOS. This is needed by Qt: ```bash Configuring qt... Creating qmake... gmake[1]: Entering directory '/bitcoin/depends/work/build/arm64-apple-darwin/qt/5.15.14-4bca24c8f89/qtbase/qmake' gmake[1]: g++: No such file or directory gmake[1]: *** [Makefile:250: main.o] Error 127 ``` `xz-utils` was also missing (but generally already installed), and is needed for the `.tar.xz` tarballs. Remove bsdmainutils, as this is only needed by the main build system (for tests), and isn't needed to complete a depends build. --- depends/README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/depends/README.md b/depends/README.md index 17def65d3e632..7ac075f4ba28a 100644 --- a/depends/README.md +++ b/depends/README.md @@ -43,9 +43,13 @@ The paths are automatically configured and no other options are needed. ### Install the required dependencies: Ubuntu & Debian +#### Common + + apt install automake bison cmake curl libtool make patch pkg-config python3 xz-utils + #### For macOS cross compilation - sudo apt-get install curl bsdmainutils cmake zip + sudo apt-get install g++ zip Note: You must obtain the macOS SDK before proceeding with a cross-compile. Under the depends directory, create a subdirectory named `SDKs`. @@ -60,7 +64,7 @@ For more information, see [SDK Extraction](../contrib/macdeploy/README.md#sdk-ex Common linux dependencies: - sudo apt-get install make automake cmake curl g++-multilib libtool binutils bsdmainutils pkg-config python3 patch bison + sudo apt-get install g++-multilib binutils For linux ARM cross compilation: