From 95c9b5d6a22a49deec6e76c96aa799d0e8193817 Mon Sep 17 00:00:00 2001 From: Colin Date: Thu, 8 Jun 2023 05:11:06 +0000 Subject: [PATCH] cross: get qtwebengine to cross compile from x86_64 -> aarch64 the resulting product isn't *necessarily* correct. i can build jellyfin, but it exits immediately. --- .../2023-06-02-qt6-qtwebengine-cross.patch | 31 +++++ nixpatches/list.nix | 3 + overlays/cross.nix | 122 ++++++++++++++---- overlays/qtwebengine-host-cc.patch | 35 +++++ overlays/qtwebengine-host-pkg-config.patch | 14 ++ 5 files changed, 177 insertions(+), 28 deletions(-) create mode 100644 nixpatches/2023-06-02-qt6-qtwebengine-cross.patch create mode 100644 overlays/qtwebengine-host-cc.patch create mode 100644 overlays/qtwebengine-host-pkg-config.patch diff --git a/nixpatches/2023-06-02-qt6-qtwebengine-cross.patch b/nixpatches/2023-06-02-qt6-qtwebengine-cross.patch new file mode 100644 index 00000000..e631e2b8 --- /dev/null +++ b/nixpatches/2023-06-02-qt6-qtwebengine-cross.patch @@ -0,0 +1,31 @@ +diff --git a/pkgs/development/libraries/qt-6/modules/qtwebengine.nix b/pkgs/development/libraries/qt-6/modules/qtwebengine.nix +index fadbc5d2bfa..e4f2aec5a32 100644 +--- a/pkgs/development/libraries/qt-6/modules/qtwebengine.nix ++++ b/pkgs/development/libraries/qt-6/modules/qtwebengine.nix +@@ -97,6 +97,9 @@ + , xnu + }: + ++let ++ buildPython = buildPackages.python3.withPackages (ps: with ps; [ html5lib ]); ++in + qtModule { + pname = "qtwebengine"; + qtInputs = [ qtdeclarative qtwebchannel qtwebsockets qtpositioning ]; +@@ -108,7 +111,7 @@ qtModule { + gperf + ninja + pkg-config +- (python3.withPackages (ps: with ps; [ html5lib ])) ++ buildPython + which + gn + nodejs +@@ -304,6 +307,7 @@ qtModule { + + preConfigure = '' + export NINJAFLAGS="-j$NIX_BUILD_CORES" ++ export CMAKE_PREFIX_PATH="${buildPython}/bin:$CMAKE_PREFIX_PATH" + ''; + + meta = with lib; { diff --git a/nixpatches/list.nix b/nixpatches/list.nix index d75b46a7..9cde1212 100644 --- a/nixpatches/list.nix +++ b/nixpatches/list.nix @@ -153,6 +153,9 @@ in [ # make alsa-project members overridable ./2023-05-31-toplevel-alsa.patch + # qt6 qtwebengine: specify `python` as buildPackages + ./2023-06-02-qt6-qtwebengine-cross.patch + # for raspberry pi: allow building u-boot for rpi 4{,00} # TODO: remove after upstreamed: https://github.com/NixOS/nixpkgs/pull/176018 # (it's a dupe of https://github.com/NixOS/nixpkgs/pull/112677 ) diff --git a/overlays/cross.nix b/overlays/cross.nix index e40063e2..11ca7595 100644 --- a/overlays/cross.nix +++ b/overlays/cross.nix @@ -971,34 +971,100 @@ in { # inherit (emulated.qt5) qtModule; # }; # }); - # qt6 = prev.qt6.overrideScope' (self: super: { - # # inherit (emulated.qt6) qtModule; - # qtbase = super.qtbase.overrideAttrs (upstream: { - # # cmakeFlags = upstream.cmakeFlags ++ lib.optionals (final.stdenv.buildPlatform != final.stdenv.hostPlatform) [ - # cmakeFlags = upstream.cmakeFlags ++ lib.optionals (final.stdenv.buildPlatform != final.stdenv.hostPlatform) [ - # # "-DCMAKE_CROSSCOMPILING=True" # fails to solve QT_HOST_PATH error - # "-DQT_HOST_PATH=${final.buildPackages.qt6.full}" - # ]; - # }); - # qtModule = args: (super.qtModule args).overrideAttrs (upstream: { - # # the nixpkgs comment about libexec seems to be outdated: - # # it's just that cross-compiled syncqt.pl doesn't get its #!/usr/bin/env shebang replaced. - # preConfigure = lib.replaceStrings - # ["${lib.getDev self.qtbase}/libexec/syncqt.pl"] - # ["perl ${lib.getDev self.qtbase}/libexec/syncqt.pl"] - # upstream.preConfigure; - # }); - # # qtwayland = super.qtwayland.overrideAttrs (upstream: { - # # preConfigure = "fixQtBuiltinPaths . '*.pr?'"; - # # }); - # # qtwayland = super.qtwayland.override { - # # inherit (self) qtbase; - # # }; - # # qtbase = super.qtbase.override { - # # # fixes: "You need to set QT_HOST_PATH to cross compile Qt." - # # inherit (emulated) stdenv; - # # }; - # }); + qt6 = prev.qt6.overrideScope' (self: super: { + # # inherit (emulated.qt6) qtModule; + # qtbase = super.qtbase.overrideAttrs (upstream: { + # # cmakeFlags = upstream.cmakeFlags ++ lib.optionals (final.stdenv.buildPlatform != final.stdenv.hostPlatform) [ + # cmakeFlags = upstream.cmakeFlags ++ lib.optionals (final.stdenv.buildPlatform != final.stdenv.hostPlatform) [ + # # "-DCMAKE_CROSSCOMPILING=True" # fails to solve QT_HOST_PATH error + # "-DQT_HOST_PATH=${final.buildPackages.qt6.full}" + # ]; + # }); + # qtModule = args: (super.qtModule args).overrideAttrs (upstream: { + # # the nixpkgs comment about libexec seems to be outdated: + # # it's just that cross-compiled syncqt.pl doesn't get its #!/usr/bin/env shebang replaced. + # preConfigure = lib.replaceStrings + # ["${lib.getDev self.qtbase}/libexec/syncqt.pl"] + # ["perl ${lib.getDev self.qtbase}/libexec/syncqt.pl"] + # upstream.preConfigure; + # }); + # # qtwayland = super.qtwayland.overrideAttrs (upstream: { + # # preConfigure = "fixQtBuiltinPaths . '*.pr?'"; + # # }); + # # qtwayland = super.qtwayland.override { + # # inherit (self) qtbase; + # # }; + # # qtbase = super.qtbase.override { + # # # fixes: "You need to set QT_HOST_PATH to cross compile Qt." + # # inherit (emulated) stdenv; + # # }; + + qtwebengine = super.qtwebengine.overrideAttrs (upstream: { + # depsBuildBuild = upstream.depsBuildBuild or [] ++ [ final.pkg-config ]; + # XXX: qt seems to use its own terminology for "host" and "target": + # - + # - "host" = machine invoking the compiler + # - "target" = machine on which the resulting qtwebengine.so binaries will run + # XXX: NIX_CFLAGS_COMPILE_ is how we get the `-isystem ` flags. + # probably we shouldn't blindly copy these from host machine to build machine, + # as the headers could reasonably make different assumptions. + preConfigure = upstream.preConfigure + '' + # export PKG_CONFIG_HOST="$PKG_CONFIG" + export PKG_CONFIG_HOST="$PKG_CONFIG_FOR_BUILD" + # expose -isystem to x86 builds + export NIX_CFLAGS_COMPILE_x86_64_unknown_linux_gnu="$NIX_CFLAGS_COMPILE" + export NIX_LDFLAGS_x86_64_unknown_linux_gnu="-L${final.buildPackages.zlib}/lib" + ''; + patches = upstream.patches or [] ++ [ + # ./qtwebengine-host-pkg-config.patch + # alternatively, look at dlopenBuildInputs + ./qtwebengine-host-cc.patch + ]; + # patch the qt pkg-config script to show us more debug info + postPatch = upstream.postPatch or "" + '' + sed -i s/options.debug/True/g src/3rdparty/chromium/build/config/linux/pkg-config.py + ''; + nativeBuildInputs = upstream.nativeBuildInputs ++ [ + final.bintools-unwrapped # for readelf + final.buildPackages.cups # for cups-config + final.buildPackages.fontconfig + final.buildPackages.glib + final.buildPackages.harfbuzz + final.buildPackages.icu + final.buildPackages.libjpeg + final.buildPackages.libpng + final.buildPackages.libwebp + final.buildPackages.nss + # final.gcc-unwrapped.libgcc # for libgcc_s.so + final.buildPackages.zlib + ]; + depsBuildBuild = upstream.depsBuildBuild or [] ++ [ final.pkg-config ]; + # buildInputs = upstream.buildInputs ++ [ + # final.gcc-unwrapped.libgcc # for libgcc_s.so. this gets loaded during build, suggesting i surely messed something up + # ]; + # buildInputs = upstream.buildInputs ++ [ + # final.gcc-unwrapped.libgcc + # ]; + # nativeBuildInputs = upstream.nativeBuildInputs ++ [ + # final.icu + # ]; + # buildInputs = upstream.buildInputs ++ [ + # final.icu + # ]; + # env.NIX_DEBUG="1"; + # env.NIX_DEBUG="7"; + # cmakeFlags = lib.remove "-DQT_FEATURE_webengine_system_icu=ON" upstream.cmakeFlags; + cmakeFlags = upstream.cmakeFlags ++ lib.optionals (final.stdenv.hostPlatform != final.stdenv.buildPlatform) [ + # "--host-cc=${final.buildPackages.stdenv.cc}/bin/cc" + # "--host-cxx=${final.buildPackages.stdenv.cc}/bin/c++" + # these are my own vars, used by my own patch + "-DCMAKE_HOST_C_COMPILER=${final.buildPackages.stdenv.cc}/bin/gcc" + "-DCMAKE_HOST_CXX_COMPILER=${final.buildPackages.stdenv.cc}/bin/g++" + "-DCMAKE_HOST_AR=${final.buildPackages.stdenv.cc}/bin/ar" + "-DCMAKE_HOST_NM=${final.buildPackages.stdenv.cc}/bin/nm" + ]; + }); + }); rmlint = prev.rmlint.override { # fixes "Checking whether the C compiler works... no" diff --git a/overlays/qtwebengine-host-cc.patch b/overlays/qtwebengine-host-cc.patch new file mode 100644 index 00000000..b7577482 --- /dev/null +++ b/overlays/qtwebengine-host-cc.patch @@ -0,0 +1,35 @@ +diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt +index 771446ece..c20da0d56 100644 +--- a/src/CMakeLists.txt ++++ b/src/CMakeLists.txt +@@ -172,7 +172,11 @@ if(CMAKE_CROSSCOMPILING AND NOT IOS AND NOT MACOS) + CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${QT_HOST_PATH}/lib/cmake/Qt6/qt.toolchain.cmake + -DWEBENGINE_ROOT_BUILD_DIR=${PROJECT_BINARY_DIR} + -DWEBENGINE_ROOT_SOURCE_DIR=${WEBENGINE_ROOT_SOURCE_DIR} +- -DGN_TARGET_CPU=${TEST_architecture_arch} ++ -DGN_TARGET_CPU=${CMAKE_HOST_SYSTEM_PROCESSOR} ++ -DCMAKE_C_COMPILER=${CMAKE_HOST_C_COMPILER} ++ -DCMAKE_CXX_COMPILER=${CMAKE_HOST_CXX_COMPILER} ++ -DCMAKE_AR=${CMAKE_HOST_AR} ++ -DCMAKE_NM=${CMAKE_HOST_NM} + -DCMAKE_C_FLAGS= + -DCMAKE_CXX_FLAGS= + -DQT_FEATURE_qtwebengine_build=${QT_FEATURE_qtwebengine_build} +diff --git a/src/host/CMakeLists.txt b/src/host/CMakeLists.txt +index 2b92ebe85..e2ff58b35 100644 +--- a/src/host/CMakeLists.txt ++++ b/src/host/CMakeLists.txt +@@ -22,11 +22,11 @@ project(QtWebEngineConfigure + find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS BuildInternals Core) + + set(buildDir ${CMAKE_CURRENT_BINARY_DIR}) +-configure_gn_toolchain(host ${TEST_architecture_arch} ${TEST_architecture_arch} ++configure_gn_toolchain(host ${CMAKE_HOST_SYSTEM_PROCESSOR} ${CMAKE_HOST_SYSTEM_PROCESSOR} + ${WEBENGINE_ROOT_SOURCE_DIR}/src/host/BUILD.toolchain.gn.in + ${buildDir}/host_toolchain + ) +-get_v8_arch(GN_V8_HOST_CPU ${GN_TARGET_CPU} ${TEST_architecture_arch}) ++get_v8_arch(GN_V8_HOST_CPU ${GN_TARGET_CPU} ${CMAKE_HOST_SYSTEM_PROCESSOR}) + configure_gn_toolchain(v8 ${GN_V8_HOST_CPU} ${GN_TARGET_CPU} + ${WEBENGINE_ROOT_SOURCE_DIR}/src/host/BUILD.toolchain.gn.in + ${buildDir}/v8_toolchain) diff --git a/overlays/qtwebengine-host-pkg-config.patch b/overlays/qtwebengine-host-pkg-config.patch new file mode 100644 index 00000000..1830adce --- /dev/null +++ b/overlays/qtwebengine-host-pkg-config.patch @@ -0,0 +1,14 @@ +diff --git a/cmake/Functions.cmake b/cmake/Functions.cmake +index 03d19992f..5ce54ca9d 100644 +--- a/cmake/Functions.cmake ++++ b/cmake/Functions.cmake +@@ -720,9 +720,6 @@ endfunction() + function(create_pkg_config_wrapper wrapperName wrapperCmd) + file(WRITE ${wrapperName} + "#!/bin/sh\n" +- "unset PKG_CONFIG_LIBDIR\n" +- "unset PKG_CONFIG_PATH\n" +- "unset PKG_CONFIG_SYSROOT_DIR\n" + "exec ${wrapperCmd} \"$@\"" + ) + file(CHMOD ${wrapperName} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE)