diff --git a/qt6-webengine/0001-ARM-toolchain-fixes.patch b/qt6-webengine/0001-ARM-toolchain-fixes.patch new file mode 100644 index 0000000..a670f50 --- /dev/null +++ b/qt6-webengine/0001-ARM-toolchain-fixes.patch @@ -0,0 +1,58 @@ +From 46dc6b6a276e974341328f78451678d756c382f9 Mon Sep 17 00:00:00 2001 +From: Kevin Mihelich +Date: Tue, 4 Jul 2017 11:54:39 -0600 +Subject: [PATCH 1/2] ARM toolchain fixes + +--- + chromium/build/toolchain/linux/BUILD.gn | 24 ++++++++++-------------- + 1 file changed, 10 insertions(+), 14 deletions(-) + +diff --git a/chromium/build/toolchain/linux/BUILD.gn b/chromium/build/toolchain/linux/BUILD.gn +index 0c0b0a3321e..fa147fa5667 100644 +--- a/chromium/build/toolchain/linux/BUILD.gn ++++ b/chromium/build/toolchain/linux/BUILD.gn +@@ -31,15 +31,13 @@ clang_toolchain("clang_arm64") { + } + + gcc_toolchain("arm64") { +- toolprefix = "aarch64-linux-gnu-" +- +- cc = "${toolprefix}gcc" +- cxx = "${toolprefix}g++" ++ cc = "gcc" ++ cxx = "g++" + +- ar = "${toolprefix}ar" ++ ar = "ar" + ld = cxx +- readelf = "${toolprefix}readelf" +- nm = "${toolprefix}nm" ++ readelf = "readelf" ++ nm = "nm" + + toolchain_args = { + current_cpu = "arm64" +@@ -52,15 +50,13 @@ gcc_toolchain("arm64") { + } + + gcc_toolchain("arm") { +- toolprefix = "arm-linux-gnueabihf-" +- +- cc = "${toolprefix}gcc" +- cxx = "${toolprefix}g++" ++ cc = "gcc" ++ cxx = "g++" + +- ar = "${toolprefix}ar" ++ ar = "ar" + ld = cxx +- readelf = "${toolprefix}readelf" +- nm = "${toolprefix}nm" ++ readelf = "readelf" ++ nm = "nm" + + toolchain_args = { + current_cpu = "arm" +-- +2.35.1 + diff --git a/qt6-webengine/0002-Run-blink-bindings-generation-single-threaded.patch b/qt6-webengine/0002-Run-blink-bindings-generation-single-threaded.patch new file mode 100644 index 0000000..276e9d2 --- /dev/null +++ b/qt6-webengine/0002-Run-blink-bindings-generation-single-threaded.patch @@ -0,0 +1,25 @@ +From 8b1d4ec4b3f5c569eef9d8e5d40cb0e961d6ba31 Mon Sep 17 00:00:00 2001 +From: Kevin Mihelich +Date: Tue, 2 Feb 2021 13:58:59 -0700 +Subject: [PATCH 2/2] Run blink bindings generation single threaded + +When not single threaded this process will eat all the RAM. +--- + chromium/third_party/blink/renderer/bindings/BUILD.gn | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/chromium/third_party/blink/renderer/bindings/BUILD.gn b/chromium/third_party/blink/renderer/bindings/BUILD.gn +index 30017570a13..f88e5906f23 100644 +--- a/chromium/third_party/blink/renderer/bindings/BUILD.gn ++++ b/chromium/third_party/blink/renderer/bindings/BUILD.gn +@@ -148,6 +148,7 @@ template("generate_bindings") { + outputs = invoker.outputs + + args = [ ++ "--single_process", + "--web_idl_database", + rebase_path(web_idl_database, root_build_dir), + "--root_src_dir", +-- +2.35.1 + diff --git a/qt6-webengine/PKGBUILD b/qt6-webengine/PKGBUILD new file mode 100644 index 0000000..5f3ffe2 --- /dev/null +++ b/qt6-webengine/PKGBUILD @@ -0,0 +1,67 @@ +# Maintainer: Antonio Rojas +# Maintainer: Felix Yan + +# ALARM: Kevin Mihelich +# - patch for chromium GN +# - patch for chromium skia +# - patch for chromium to run blink bindings generation single threaded +# - patch for chromium aw snap on ARM +# - restrict job count on v7 - RAM constraints + +highmem=1 + +pkgname=qt6-webengine +_qtver=6.3.1 +pkgver=${_qtver/-/} +pkgrel=2 +arch=(x86_64) +url='https://www.qt.io' +license=(GPL3 LGPL3 FDL custom) +pkgdesc='Provides support for web applications using the Chromium browser project' +depends=(qt6-webchannel qt6-positioning libxcomposite libxrandr libxkbfile + libevent snappy nss libxslt minizip ffmpeg re2 libvpx libxtst ttf-font pciutils) +makedepends=(cmake ninja python-html5lib gperf jsoncpp qt6-tools pipewire nodejs qt6-websockets) +optdepends=('pipewire: WebRTC desktop sharing under Wayland') +groups=(qt6) +options=(debug) +_pkgfn=${pkgname/6-/}-everywhere-src-$_qtver +source=(https://download.qt.io/official_releases/qt/${pkgver%.*}/$_qtver/submodules/$_pkgfn.tar.xz + 0001-ARM-toolchain-fixes.patch + 0002-Run-blink-bindings-generation-single-threaded.patch + qt6-webengine-16kpage.patch) +sha256sums=('ad7a33b21a956deda37c587d50f821ca3816403ae31ba9b5d59d01561ad66e47' + 'c5d8fc6b3b832a2b4b14c926c36051d7245d5fc37a1c3a54657afd5b5c4ed623' + '1a5858dd198dd0db649c55357941c9bfa9ad678b5d4b93121f87fa9f314d4e6e' + '807c511d83f7cb6093430c93f97a7edaae00851970774abb97425f786afd798f') + +prepare() { + cd $_pkgfn + + if [[ $CARCH == "armv7h" ]]; then + export MAKEFLAGS="-j4" + export ALARM_NINJA_JOBS="2" + fi + cd "$srcdir/$_pkgfn/src/3rdparty" + patch -p1 -i ${srcdir}/0001-ARM-toolchain-fixes.patch + patch -p1 -i ${srcdir}/0002-Run-blink-bindings-generation-single-threaded.patch +} + +build() { + cmake -B build -S $_pkgfn -G Ninja \ + -DCMAKE_TOOLCHAIN_FILE=/usr/lib/cmake/Qt6/qt.toolchain.cmake \ + -DQT_FEATURE_webengine_system_ffmpeg=ON \ + -DQT_FEATURE_webengine_system_icu=ON \ + -DQT_FEATURE_webengine_system_libevent=ON \ + -DQT_FEATURE_webengine_system_libxslt=ON \ + -DQT_FEATURE_webengine_proprietary_codecs=ON \ + -DQT_FEATURE_webengine_kerberos=ON \ + -DQT_FEATURE_webengine_webrtc_pipewire=ON \ + -DQT_FEATURE_webengine_full_debug_info=ON + cmake --build build +} + +package() { + DESTDIR="$pkgdir" cmake --install build + + install -Dm644 "$srcdir"/${_pkgfn}/src/3rdparty/chromium/LICENSE "$pkgdir"/usr/share/licenses/${pkgname}/LICENSE.chromium +} diff --git a/qt6-webengine/qt6-webengine-16kpage.patch b/qt6-webengine/qt6-webengine-16kpage.patch new file mode 100644 index 0000000..63ca054 --- /dev/null +++ b/qt6-webengine/qt6-webengine-16kpage.patch @@ -0,0 +1,179 @@ +From 1afe0ce75004e49e35e8781ea6b8c3134db5511f Mon Sep 17 00:00:00 2001 +From: Yichao Yu +Date: Thu, 21 Jul 2022 06:42:07 -0400 +Subject: [PATCH] Backport of 16k page support on aarch64 + +--- + .../address_space_randomization.h | 15 ++++++ + .../page_allocator_constants.h | 50 ++++++++++++++++++- + .../partition_address_space.cc | 6 +++ + .../partition_alloc_constants.h | 5 +- + .../partition_allocator/partition_root.cc | 2 +- + 5 files changed, 74 insertions(+), 4 deletions(-) + +diff --git a/chromium/base/allocator/partition_allocator/address_space_randomization.h b/chromium/base/allocator/partition_allocator/address_space_randomization.h +index e77003eab25..31ac05b86f5 100644 +--- a/chromium/base/allocator/partition_allocator/address_space_randomization.h ++++ b/chromium/base/allocator/partition_allocator/address_space_randomization.h +@@ -119,6 +119,21 @@ AslrMask(uintptr_t bits) { + return AslrAddress(0x20000000ULL); + } + ++ #elif defined(OS_LINUX) ++ ++ // Linux on arm64 can use 39, 42, 48, or 52-bit user space, depending on ++ // page size and number of levels of translation pages used. We use ++ // 39-bit as base as all setups should support this, lowered to 38-bit ++ // as ASLROffset() could cause a carry. ++ PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR ALWAYS_INLINE uintptr_t ++ ASLRMask() { ++ return AslrMask(38); ++ } ++ PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR ALWAYS_INLINE uintptr_t ++ ASLROffset() { ++ return AslrAddress(0x1000000000ULL); ++ } ++ + #else + + // ARM64 on Linux has 39-bit user space. Use 38 bits since ASLROffset() +diff --git a/chromium/base/allocator/partition_allocator/page_allocator_constants.h b/chromium/base/allocator/partition_allocator/page_allocator_constants.h +index f6f19e41611..200903d3342 100644 +--- a/chromium/base/allocator/partition_allocator/page_allocator_constants.h ++++ b/chromium/base/allocator/partition_allocator/page_allocator_constants.h +@@ -24,6 +24,31 @@ + // elimination. + #define PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR __attribute__((const)) + ++#elif defined(OS_LINUX) && defined(ARCH_CPU_ARM64) ++// This should work for all POSIX (if needed), but currently all other ++// supported OS/architecture combinations use either hard-coded values ++// (such as x86) or have means to determine these values without needing ++// atomics (such as macOS on arm64). ++ ++// Page allocator constants are run-time constant ++#define PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR __attribute__((const)) ++ ++#include ++#include ++ ++namespace base::internal { ++ ++// Holds the current page size and shift, where size = 1 << shift ++// Use PageAllocationGranularity(), PageAllocationGranularityShift() ++// to initialize and retrieve these values safely. ++struct PageCharacteristics { ++ std::atomic size; ++ std::atomic shift; ++}; ++extern PageCharacteristics page_characteristics; ++ ++} // namespace partition_alloc::internal ++ + #else + + // When defined, page size constants are fixed at compile time. When not +@@ -38,6 +63,10 @@ + + namespace base { + ++// Forward declaration, implementation below ++PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR ALWAYS_INLINE size_t ++PageAllocationGranularity(); ++ + PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR ALWAYS_INLINE size_t + PageAllocationGranularityShift() { + #if defined(OS_WIN) || defined(ARCH_CPU_PPC64) +@@ -50,6 +79,15 @@ PageAllocationGranularityShift() { + return 14; // 16kB + #elif defined(OS_APPLE) && defined(ARCH_CPU_64_BITS) + return vm_page_shift; ++#elif defined(OS_LINUX) && defined(ARCH_CPU_ARM64) ++ // arm64 supports 4kb (shift = 12), 16kb (shift = 14), and 64kb (shift = 16) ++ // page sizes. Retrieve from or initialize cache. ++ int shift = internal::page_characteristics.shift.load(std::memory_order_relaxed); ++ if (UNLIKELY(shift == 0)) { ++ shift = __builtin_ctz((int)PageAllocationGranularity()); ++ internal::page_characteristics.shift.store(shift, std::memory_order_relaxed); ++ } ++ return shift; + #else + return 12; // 4kB + #endif +@@ -61,6 +99,15 @@ PageAllocationGranularity() { + // This is literally equivalent to |1 << PageAllocationGranularityShift()| + // below, but was separated out for OS_APPLE to avoid << on a non-constexpr. + return vm_page_size; ++#elif defined(OS_LINUX) && defined(ARCH_CPU_ARM64) ++ // arm64 supports 4kb, 16kb, and 64kb page sizes. Retrieve from or ++ // initialize cache. ++ int size = internal::page_characteristics.size.load(std::memory_order_relaxed); ++ if (UNLIKELY(size == 0)) { ++ size = getpagesize(); ++ internal::page_characteristics.size.store(size, std::memory_order_relaxed); ++ } ++ return size; + #else + return 1ULL << PageAllocationGranularityShift(); + #endif +@@ -90,7 +137,8 @@ SystemPageShift() { + + PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR ALWAYS_INLINE size_t + SystemPageSize() { +-#if defined(OS_APPLE) && defined(ARCH_CPU_64_BITS) ++#if (defined(OS_APPLE) && defined(ARCH_CPU_64_BITS)) || \ ++ (defined(OS_LINUX) && defined(ARCH_CPU_ARM64)) + // This is literally equivalent to |1 << SystemPageShift()| below, but was + // separated out for 64-bit OS_APPLE to avoid << on a non-constexpr. + return PageAllocationGranularity(); +diff --git a/chromium/base/allocator/partition_allocator/partition_address_space.cc b/chromium/base/allocator/partition_allocator/partition_address_space.cc +index ee6294d8f55..3c9e4f47d4c 100644 +--- a/chromium/base/allocator/partition_allocator/partition_address_space.cc ++++ b/chromium/base/allocator/partition_allocator/partition_address_space.cc +@@ -97,6 +97,12 @@ void PartitionAddressSpace::UninitForTesting() { + internal::AddressPoolManager::GetInstance()->ResetForTesting(); + } + ++#if defined(OS_LINUX) && defined(ARCH_CPU_ARM64) ++ ++PageCharacteristics page_characteristics; ++ ++#endif // defined(OS_LINUX) && defined(ARCH_CPU_ARM64) ++ + #endif // defined(PA_HAS_64_BITS_POINTERS) + + } // namespace internal +diff --git a/chromium/base/allocator/partition_allocator/partition_alloc_constants.h b/chromium/base/allocator/partition_allocator/partition_alloc_constants.h +index 1eeac4993a5..61bfc4f4b95 100644 +--- a/chromium/base/allocator/partition_allocator/partition_alloc_constants.h ++++ b/chromium/base/allocator/partition_allocator/partition_alloc_constants.h +@@ -47,10 +47,11 @@ PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR ALWAYS_INLINE size_t + PartitionPageShift() { + return 18; // 256 KiB + } +-#elif defined(OS_APPLE) && defined(ARCH_CPU_64_BITS) ++#elif (defined(OS_APPLE) && defined(ARCH_CPU_64_BITS)) || \ ++ (defined(OS_LINUX) && defined(ARCH_CPU_ARM64)) + PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR ALWAYS_INLINE size_t + PartitionPageShift() { +- return vm_page_shift + 2; ++ return PageAllocationGranularityShift() + 2; + } + #else + PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR ALWAYS_INLINE size_t +diff --git a/chromium/base/allocator/partition_allocator/partition_root.cc b/chromium/base/allocator/partition_allocator/partition_root.cc +index 37a190f371d..a268c74f62d 100644 +--- a/chromium/base/allocator/partition_allocator/partition_root.cc ++++ b/chromium/base/allocator/partition_allocator/partition_root.cc +@@ -182,7 +182,7 @@ static size_t PartitionPurgeSlotSpan( + constexpr size_t kMaxSlotCount = + (PartitionPageSize() * kMaxPartitionPagesPerRegularSlotSpan) / + SystemPageSize(); +-#elif defined(OS_APPLE) ++#elif defined(OS_APPLE) || (defined(OS_LINUX) && defined(ARCH_CPU_ARM64)) + // It's better for slot_usage to be stack-allocated and fixed-size, which + // demands that its size be constexpr. On OS_APPLE, PartitionPageSize() is + // always SystemPageSize() << 2, so regardless of what the run time page size +-- +2.37.1 +