Skip to content

Commit a918617

Browse files
committed
Refactor cross compilation scripts
1 parent ec2a523 commit a918617

File tree

7 files changed

+189
-68
lines changed

7 files changed

+189
-68
lines changed

.ci/build_appimage.sh

Lines changed: 47 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,8 @@ sudo ()
77
}
88

99
# Build
10-
if [[ "$1" != "0" ]]; then
11-
.ci/common/build.sh appimage_build linux || exit 1
12-
fi
10+
PLATFORM=$1
11+
.ci/common/build.sh appimage_build $PLATFORM || exit 1
1312

1413
repo_dir=$(pwd)
1514
cd appimage_build
@@ -45,45 +44,60 @@ cmake .. &&
4544
make -j$(nproc --all) &&
4645
mv src/linuxdeploy-plugin-appimage ../.. &&
4746
cd ../.. &&
48-
rm -rf plugin-appimage &&
49-
50-
# Build AppImageKit
51-
sudo apt install -y snapd squashfs-tools &&
52-
sudo snap install docker &&
53-
git clone https://github.com/AppImage/AppImageKit --recurse-submodules &&
54-
cd AppImageKit &&
55-
sudo env ARCH=$(arch) bash ci/build.sh
56-
sudo cp out/appimagetool /usr/bin/ &&
57-
sudo cp out/digest /usr/bin/ &&
58-
sudo cp out/validate /usr/bin/ &&
59-
cd .. &&
60-
sudo mkdir -p /usr/lib/appimagekit &&
61-
sudo ln -s /usr/bin/mksquashfs /usr/lib/appimagekit/mksquashfs &&
47+
rm -rf plugin-appimage
48+
49+
# Download appimagetool
50+
wget https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage &&
51+
mv appimagetool-*.AppImage appimagetool
52+
chmod +x appimagetool
53+
export PATH=$(pwd):$PATH
6254

6355
# Install patchelf from PyPI (see https://github.com/linuxdeploy/linuxdeploy-plugin-qt/issues/133#issuecomment-1608168363)
6456
sudo apt install -y python3-pip
57+
python3 -m venv .venv
58+
source .venv/bin/activate
6559
pip3 install patchelf
66-
export PATH=$PATH:~/.local/bin
60+
patchelf --version
61+
62+
# Use custom ldd and strip
63+
if [[ "$PLATFORM" == "linux_gcc_arm64" ]]; then
64+
ln -s /usr/bin/aarch64-linux-gnu-strip strip
65+
sudo cp ../.ci/bin/xldd /usr/bin/aarch64-linux-gnu-ldd
66+
ln -s /usr/bin/aarch64-linux-gnu-ldd ldd
67+
export CT_XLDD_ROOT="$BUILD_SYSROOT_PATH"
68+
fi
69+
70+
# Set LD_LIBRARY_PATH (directories with *.so files)
71+
LD_LIBRARY_PATH=""
72+
73+
for file in $(find . -type f -name "*.so"); do
74+
dir=$(dirname "$file")
75+
if [[ ":$LD_LIBRARY_PATH:" != *":$dir:"* ]]; then
76+
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:`readlink -f $dir`"
77+
fi
78+
done
79+
80+
LD_LIBRARY_PATH=${LD_LIBRARY_PATH#:}
81+
export LD_LIBRARY_PATH
82+
echo "LD_LIBRARY_PATH set to: $LD_LIBRARY_PATH"
6783

6884
# Build AppImage
85+
if [[ "$PLATFORM" == "linux_gcc_arm64" ]]; then
86+
# TODO: Do not use AppImageKit releases, they're obsolete
87+
wget https://github.com/AppImage/AppImageKit/releases/download/continuous/runtime-aarch64
88+
export ARCH=arm_aarch64
89+
APPIMAGE_ARCH=aarch64
90+
export LDAI_RUNTIME_FILE=runtime-aarch64
91+
export QEMU_LD_PREFIX="$BUILD_SYSROOT_PATH"
92+
else
93+
APPIMAGE_ARCH=x86_64
94+
fi
95+
6996
export QML_SOURCES_PATHS=$(pwd)/src &&
70-
export EXTRA_QT_PLUGINS="svg;" &&
71-
export LDAI_UPDATE_INFORMATION="${appimage_zsync_prefix}${app_name}*-${APPIMAGE_ARCH-$(arch)}.AppImage.zsync"
97+
export EXTRA_QT_MODULES="qml;svg;" &&
98+
export LDAI_UPDATE_INFORMATION="${appimage_zsync_prefix}${app_name}*-${APPIMAGE_ARCH}.AppImage.zsync"
7299
echo "AppImage update information: ${LDAI_UPDATE_INFORMATION}"
73100

74-
case "$(qmake -query QMAKE_XSPEC)" in
75-
linux-arm-gnueabi-g++)
76-
wget https://github.com/AppImage/AppImageKit/releases/download/continuous/runtime-armhf
77-
export ARCH=arm
78-
export LDAI_RUNTIME_FILE=runtime-armhf
79-
;;
80-
linux-aarch64-gnu-g++)
81-
wget https://github.com/AppImage/AppImageKit/releases/download/continuous/runtime-aarch64
82-
export ARCH=arm_aarch64
83-
export LDAI_RUNTIME_FILE=runtime-aarch64
84-
;;
85-
esac
86-
87101
./linuxdeploy --appdir AppDir -e src/app/${executable_name} -i $repo_dir/res/${executable_name}.png -d $repo_dir/release/appimage.desktop --plugin qt --output appimage
88102

89103
mv *.AppImage* $repo_dir

.ci/common/build.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ mkdir -p "$BUILD_DIR"
1212

1313
if [[ "$PLATFORM" == "win64" ]] || [[ "$PLATFORM" == "win32" ]]; then
1414
cmake -B "$BUILD_DIR" -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DSCRATCHCPP_PLAYER_BUILD_UNIT_TESTS=OFF || exit 3
15+
elif [[ "$PLATFORM" == "linux_gcc_arm64" ]]; then
16+
cmake -B "$BUILD_DIR" -DCMAKE_BUILD_TYPE=Release -DSCRATCHCPP_PLAYER_BUILD_UNIT_TESTS=OFF -DCMAKE_PREFIX_PATH="$QT_ROOT_DIR" -DCMAKE_TOOLCHAIN_FILE="$BUILD_TOOLCHAIN_CONFIG" -DCMAKE_FIND_ROOT_PATH="$QT_ROOT_DIR" -DQT_HOST_PATH="$QT_HOST_PATH" -DQT_HOST_CMAKE_DIR="$QT_HOST_PATH/lib/cmake"
1517
else
1618
cmake -B "$BUILD_DIR" -DCMAKE_BUILD_TYPE=Release -DSCRATCHCPP_PLAYER_BUILD_UNIT_TESTS=OFF || exit 3
1719
fi

.ci/install_cross_compiler.sh

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,4 @@ case "$1" in
55
aarch64)
66
sudo apt install -y g++-aarch64-linux-gnu
77
;;
8-
armv7)
9-
sudo apt install -y g++-arm-linux-gnueabihf
108
esac

.ci/prepare_cross_build.sh

Lines changed: 43 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,52 @@
11
#!/bin/bash
22

3+
sudo apt install -y lsb-release
4+
35
target_arch="$1"
6+
root_path="$(pwd)"
7+
sysroot_path="${root_path}/sysroot"
8+
sysroot_ubuntu_version="$(lsb_release -rs).1"
9+
sysroot_ubuntu_codename="$(lsb_release -cs)"
10+
host_prefix="${root_path}/qt-host"
11+
cross_prefix="${root_path}/qt-cross"
12+
target_prefix="/usr/local/qt"
13+
toolchain_config="${root_path}/.ci/qt6-toolchain.cmake"
414

515
case "$target_arch" in
616
aarch64)
7-
toolchain_prefix="aarch64-linux-gnu-"
8-
echo "APPIMAGE_ARCH=aarch64" >> "${GITHUB_ENV}"
9-
;;
10-
armv7)
11-
toolchain_prefix="arm-linux-gnueabihf-"
12-
echo "APPIMAGE_ARCH=armhf" >> "${GITHUB_ENV}"
17+
target_arch_name="armv8-a"
18+
target_arch_debian_name="arm64"
19+
toolchain_name="aarch64-linux-gnu"
20+
target_platform="linux-aarch64-gnu-g++"
1321
;;
1422
esac
1523

16-
echo "$(pwd)/qt-cross/bin:$(pwd)/qt-host/libexec" >> $GITHUB_PATH
17-
echo "LD_LIBRARY_PATH=$(pwd)/qt-cross/lib:$(pwd)/qt-host/lib" >> "${GITHUB_ENV}"
18-
.ci/install-cross-compiler.sh "$target_arch"
19-
.ci/qt6-dependencies.sh
20-
if [[ "$target_arch" == "armv7" ]]; then
21-
echo "QMAKE_CC=arm-linux-gnueabihf-gcc
22-
QMAKE_CXX=arm-linux-gnueabihf-g++
23-
QMAKE_LINK=arm-linux-gnueabihf-g++
24-
QMAKE_LINK_SHLIB=arm-linux-gnueabihf-g++
25-
QMAKE_AR=arm-linux-gnueabihf-ar cqs
26-
QMAKE_OBJCOPY=arm-linux-gnueabihf-objcopy
27-
QMAKE_NM=arm-linux-gnueabihf-nm -P
28-
QMAKE_STRIP=arm-linux-gnueabihf-strip" >> .qmake.conf
29-
fi
30-
31-
# Prepare cross-tools for linuxdeploy
32-
sudo cp /usr/bin/${toolchain_prefix}strip strip
33-
sudo mv /usr/bin/ldd /usr/bin/ldd-amd64
34-
sudo cp .ci/bin/xldd /usr/bin/${toolchain_prefix}ldd
35-
sudo ln -s /usr/bin/${toolchain_prefix}ldd /usr/bin/ldd
36-
echo "CT_XLDD_ROOT=$(pwd)/sysroot" >> "${GITHUB_ENV}"
24+
toolchain_prefix="${toolchain_name}-"
25+
26+
echo "Target architecture: ${target_arch} (${target_arch_name})"
27+
28+
# Install dependencies
29+
${root_path}/.ci/install_cross_compiler.sh "${target_arch}" || exit 1
30+
sudo apt install -y qemu-user-static || exit 1
31+
sudo apt install -y symlinks || exit 1
32+
33+
# Prepare sysroot
34+
echo "Preparing sysroot..."
35+
curl "https://cdimage.ubuntu.com/ubuntu-base/releases/${sysroot_ubuntu_codename}/release/ubuntu-base-${sysroot_ubuntu_version}-base-${target_arch_debian_name}.tar.gz" > ./ubuntu-base.tar.gz || exit 1
36+
mkdir -p "$sysroot_path"
37+
sudo tar -xvzf ubuntu-base.tar.gz -C "$sysroot_path" || exit 1
38+
sudo update-binfmts --enable qemu-arm || exit 1
39+
sudo mount -o bind /dev "${sysroot_path}/dev" || exit 1
40+
sudo cp /etc/resolv.conf "${sysroot_path}/etc" || exit 1
41+
sudo chmod 1777 "${sysroot_path}/tmp" || exit 1
42+
sudo cp "${root_path}/.ci/qt6_deps.sh" "${sysroot_path}/"
43+
sudo chroot "$sysroot_path" /bin/bash -c "/qt6_deps.sh" || exit 1
44+
sudo chroot "$sysroot_path" /bin/bash -c "apt update && apt install -y symlinks libssl-dev && symlinks -rc /" || exit 1
45+
sudo umount "${sysroot_path}/dev" || exit 1
46+
47+
# Prepare environment
48+
echo "BUILD_SYSROOT_PATH=$sysroot_path" >> "$GITHUB_ENV"
49+
echo "BUILD_TOOLCHAIN_NAME=$toolchain_name" >> "$GITHUB_ENV"
50+
echo "BUILD_TOOLCHAIN_PREFIX=$toolchain_prefix" >> "$GITHUB_ENV"
51+
echo "BUILD_TOOLCHAIN_CONFIG=$toolchain_config" >> "$GITHUB_ENV"
52+
echo "BUILD_ARCH_NAME=$target_arch_name" >> "$GITHUB_ENV"

.ci/qt6-toolchain.cmake

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
cmake_minimum_required(VERSION 3.18)
2+
include_guard(GLOBAL)
3+
4+
set(CMAKE_SYSTEM_NAME Linux)
5+
set(CMAKE_SYSTEM_PROCESSOR arm)
6+
7+
set(TARGET_SYSROOT $ENV{BUILD_SYSROOT_PATH})
8+
set(CMAKE_SYSROOT ${TARGET_SYSROOT})
9+
10+
set(ENV{PKG_CONFIG_PATH} $PKG_CONFIG_PATH:/usr/lib/$ENV{BUILD_TOOLCHAIN_NAME}/pkgconfig)
11+
set(ENV{PKG_CONFIG_LIBDIR} /usr/lib/pkgconfig:/usr/share/pkgconfig/:${TARGET_SYSROOT}/usr/lib/$ENV{BUILD_TOOLCHAIN_NAME}/pkgconfig:${TARGET_SYSROOT}/usr/lib/pkgconfig)
12+
set(ENV{PKG_CONFIG_SYSROOT_DIR} ${CMAKE_SYSROOT})
13+
14+
set(CMAKE_C_COMPILER /usr/bin/$ENV{BUILD_TOOLCHAIN_PREFIX}gcc)
15+
set(CMAKE_CXX_COMPILER /usr/bin/$ENV{BUILD_TOOLCHAIN_PREFIX}g++)
16+
17+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${TARGET_SYSROOT}/usr/include")
18+
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}")
19+
20+
set(QT_COMPILER_FLAGS "-march=$ENV{BUILD_ARCH_NAME}")
21+
set(QT_COMPILER_FLAGS_RELEASE "-O2 -pipe")
22+
set(QT_LINKER_FLAGS "-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed")
23+
24+
#set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
25+
#set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
26+
#set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
27+
#set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
28+
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
29+
set(CMAKE_BUILD_RPATH ${TARGET_SYSROOT})
30+
31+
32+
include(CMakeInitializeConfigs)
33+
34+
function(cmake_initialize_per_config_variable _PREFIX _DOCSTRING)
35+
if (_PREFIX MATCHES "CMAKE_(C|CXX|ASM)_FLAGS")
36+
set(CMAKE_${CMAKE_MATCH_1}_FLAGS_INIT "${QT_COMPILER_FLAGS}")
37+
38+
foreach (config DEBUG RELEASE MINSIZEREL RELWITHDEBINFO)
39+
if (DEFINED QT_COMPILER_FLAGS_${config})
40+
set(CMAKE_${CMAKE_MATCH_1}_FLAGS_${config}_INIT "${QT_COMPILER_FLAGS_${config}}")
41+
endif()
42+
endforeach()
43+
endif()
44+
45+
46+
if (_PREFIX MATCHES "CMAKE_(SHARED|MODULE|EXE)_LINKER_FLAGS")
47+
foreach (config SHARED MODULE EXE)
48+
set(CMAKE_${config}_LINKER_FLAGS_INIT "${QT_LINKER_FLAGS}")
49+
endforeach()
50+
endif()
51+
52+
_cmake_initialize_per_config_variable(${ARGV})
53+
endfunction()
54+
55+
set(XCB_PATH_VARIABLE ${TARGET_SYSROOT})
56+
57+
set(GL_INC_DIR ${TARGET_SYSROOT}/usr/include)
58+
set(GL_LIB_DIR ${TARGET_SYSROOT}:${TARGET_SYSROOT}/usr/lib/$ENV{BUILD_TOOLCHAIN_NAME}/:${TARGET_SYSROOT}/usr:${TARGET_SYSROOT}/usr/lib)
59+
60+
set(EGL_INCLUDE_DIR ${GL_INC_DIR})
61+
set(EGL_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/$ENV{BUILD_TOOLCHAIN_NAME}/libEGL.so)
62+
63+
set(OPENGL_INCLUDE_DIR ${GL_INC_DIR})
64+
set(OPENGL_opengl_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/$ENV{BUILD_TOOLCHAIN_NAME}/libOpenGL.so)
65+
66+
set(GLESv2_INCLUDE_DIR ${GL_INC_DIR})
67+
set(GLIB_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/$ENV{BUILD_TOOLCHAIN_NAME}/libGLESv2.so)
68+
69+
set(GLESv2_INCLUDE_DIR ${GL_INC_DIR})
70+
set(GLESv2_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/$ENV{BUILD_TOOLCHAIN_NAME}/libGLESv2.so)
71+
72+
set(gbm_INCLUDE_DIR ${GL_INC_DIR})
73+
set(gbm_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/$ENV{BUILD_TOOLCHAIN_NAME}/libgbm.so)
74+
75+
set(Libdrm_INCLUDE_DIR ${GL_INC_DIR})
76+
set(Libdrm_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/$ENV{BUILD_TOOLCHAIN_NAME}/libdrm.so)
77+
78+
set(XCB_XCB_INCLUDE_DIR ${GL_INC_DIR})
79+
set(XCB_XCB_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/$ENV{BUILD_TOOLCHAIN_NAME}/libxcb.so)

.ci/qt6_deps.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,6 @@ sudo apt install -y libboost-all-dev libudev-dev libinput-dev libts-dev \
3333
libxcb-glx0-dev libxi-dev libdrm-dev libxcb-xinerama0 libxcb-xinerama0-dev \
3434
libatspi2.0-dev libxcursor-dev libxcomposite-dev libxdamage-dev libxss-dev \
3535
libxtst-dev libpci-dev libcap-dev libxrandr-dev libdirectfb-dev libaudio-dev \
36-
libxkbcommon-x11-dev libclang-dev libclang-12-dev || exit 1
36+
libxkbcommon-x11-dev libclang-dev libclang-*-dev || exit 1
3737

3838
#sudo apt install -y gstreamer1.0-omx || exit 1

.github/workflows/linux-build.yml

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ jobs:
1818
qt-target: 'desktop'
1919
qt-modules: ''
2020
qt-arch: 'linux_gcc_arm64'
21-
arch: 'amd64'
21+
arch: 'aarch64'
2222
- qt-version: '6.8'
2323
qt-target: 'desktop'
2424
qt-modules: ''
2525
qt-arch: 'linux_gcc_64'
26-
arch: 'aarch64'
26+
arch: 'amd64'
2727
steps:
2828
- uses: actions/checkout@v3
2929
with:
@@ -49,8 +49,20 @@ jobs:
4949
sudo apt install gcc-11 g++-11
5050
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 110 --slave /usr/bin/g++ g++ /usr/bin/g++-11 --slave /usr/bin/gcov gcov /usr/bin/gcov-11
5151
## Install Qt
52-
- if: contains(matrix.arch, 'amd64')
53-
name: Install Qt (Ubuntu)
52+
- if: "!contains(matrix.arch, 'amd64')"
53+
name: Install host Qt
54+
uses: jdpurcell/install-qt-action@v4
55+
with:
56+
version: ${{ matrix.qt-version }}
57+
arch: linux_gcc_64
58+
target: ${{ matrix.qt-target }}
59+
modules: ${{ matrix.qt-modules }}
60+
dir: ${{ github.workspace }}/Qt_host
61+
- if: "!contains(matrix.arch, 'amd64')"
62+
name: Save host Qt path
63+
run: echo "QT_HOST_PATH=${QT_ROOT_DIR}" >> "${GITHUB_ENV}"
64+
shell: bash
65+
- name: Install target Qt
5466
uses: jdpurcell/install-qt-action@v4
5567
with:
5668
version: ${{ matrix.qt-version }}
@@ -64,7 +76,7 @@ jobs:
6476
run: .ci/prepare_cross_build.sh "${{ matrix.arch }}"
6577
shell: bash
6678
- name: Build AppImage
67-
run: .ci/build_appimage.sh
79+
run: .ci/build_appimage.sh ${{ matrix.qt-arch }}
6880
shell: 'script -q -e -c "bash {0}"'
6981
## Upload
7082
- name: Upload artifacts

0 commit comments

Comments
 (0)