FROM ubuntu:22.04

# PI_USER needs to be roott
ARG PI_HOST=192.168.0.8
ARG PI_USER=root
ARG PI_PASSWORD=orangepi

ARG THREADS=8
ARG QT_VERSION=6.6.0
ARG MODULES=qtdeclarative,qtsvg,qtmultimedia,qtquick3d,qtlocation,qtsensors,qtconnectivity,qt3d,qtshadertools,qtimageformats,qtwebsockets,qtcharts,qtgraphs,qthttpserver,qtvirtualkeyboard,qtbase,qtpositioning,qt5compat
ENV SOURCE_DATE_EPOCH=1397818193

# host: requirements
RUN apt update && \
    DEBIAN_FRONTEND=noninteractive apt install -y curl rsync symlinks sshpass nano wget zip libgcrypt20-dev automake \
     build-essential cmake gettext git libtool pkg-config python3 libboost-all-dev libudev-dev libinput-dev libts-dev \
    libmtdev-dev libjpeg-dev libfontconfig1-dev libssl-dev libdbus-1-dev libglib2.0-dev libxkbcommon-dev \
    libegl1-mesa-dev libgbm-dev libgles2-mesa-dev mesa-common-dev libasound2-dev libpulse-dev gstreamer1.0-omx-generic \
    libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev  gstreamer1.0-alsa libvpx-dev libsrtp2-dev libsnappy-dev \
    libnss3-dev "^libxcb.*" flex bison libxslt-dev ruby gperf libbz2-dev libcups2-dev libatkmm-1.6-dev libxi6 \
    libxcomposite1 libfreetype6-dev libicu-dev libsqlite3-dev libxslt1-dev libavcodec-dev libavformat-dev \
    libswscale-dev libx11-dev freetds-dev libsqlite3-dev libpq-dev libiodbc2-dev firebird-dev libgst-dev \
    libxext-dev libxcb1 libxcb1-dev libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 \
    libxcb-image0-dev libxcb-shm0 libxcb-shm0-dev libxcb-icccm4 libxcb-icccm4-dev libxcb-sync1 libxcb-sync-dev \
    libxcb-render-util0 libxcb-render-util0-dev libxcb-xfixes0-dev libxrender-dev libxcb-shape0-dev libxcb-randr0-dev \
    libxcb-glx0-dev libxi-dev libdrm-dev libxcb-xinerama0 libxcb-xinerama0-dev libatspi2.0-dev libxcursor-dev libxcomposite-dev \
    libxdamage-dev libxss-dev libxtst-dev libpci-dev libcap-dev libxrandr-dev libdirectfb-dev libaudio-dev \
    libxkbcommon-x11-dev gcc-aarch64-linux-gnu g++-aarch64-linux-gnu ninja-build make build-essential libclang-dev \
    gcc bison gperf pkg-config libfontconfig1-dev libfreetype6-dev libx11-dev libx11-xcb-dev libxext-dev libxfixes-dev \
    libxi-dev libxrender-dev libxcb1-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev \
    libxcb-icccm4-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev \
    libxcb-util-dev libxcb-xinerama0-dev libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev libatspi2.0-dev \
    libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev zlib1g-dev libpng-dev libpng-dev libqrencode-dev libevent-dev \
    libvulkan-dev spirv-tools strace && rm -rf /var/lib/apt/lists/*

WORKDIR /z2w/

# host: prepare directory structures
RUN mkdir -p sysroot/usr && \
    mkdir -p sysroot/opt && \
    mkdir -p target && \
    mkdir -p targetbuild && \
    mkdir -p host && \
    mkdir -p hostbuild

# host: clone Qt6
RUN git clone -b $QT_VERSION --depth 1 https://codereview.qt-project.org/qt/qt5 qt6 && cd qt6 && \
    git reset --hard 244fc454356bc9fb31a30692b8645cbfd91dc52c

# host: init Qt6 modules
WORKDIR /z2w/qt6
RUN ./init-repository --module-subset=$MODULES -f

# host: copy zero2w mkspec
WORKDIR /z2w/
COPY toolchain.cmake .
COPY mkspec-linux-orangepi-zero2w-aarch64 qt6/qtbase/mkspecs/devices/linux-orangepi-zero2w-aarch64

# host: compile Qt6 (12min)
WORKDIR /z2w/hostbuild
RUN cmake ../qt6 -GNinja -DCMAKE_BUILD_TYPE=Release -DFEATURE_dbus=OFF -DQT_BUILD_EXAMPLES=OFF \
    -DQT_BUILD_TESTS=OFF -DCMAKE_INSTALL_PREFIX=$PWD/../host && \
    cmake --build . --parallel $THREADS && \
    cmake --install . && \
    rm -rf *

WORKDIR /z2w
# device: prepare final Qt6 dir
RUN sshpass -p "$PI_PASSWORD" ssh -o PreferredAuthentications=password -o StrictHostKeyChecking=no "$PI_USER@$PI_HOST" \
    'mkdir -p /usr/local/qt6'

# device: replace apt mirror
RUN sshpass -p "$PI_PASSWORD" ssh -o PreferredAuthentications=password -o StrictHostKeyChecking=no "$PI_USER@$PI_HOST" \
    'sed -i -e "s/repo.huaweicloud.com/ports.ubuntu.com/g" /etc/apt/sources.list'

# device: copy over apt-get commands
COPY pi_requirements.sh .
RUN sshpass -p "$PI_PASSWORD" scp -o PreferredAuthentications=password -o StrictHostKeyChecking=no pi_requirements.sh "$PI_USER@$PI_HOST:/tmp/requirements.sh"

# device: requirements (6min)
RUN sshpass -p "$PI_PASSWORD" ssh -o PreferredAuthentications=password -o StrictHostKeyChecking=no "$PI_USER@$PI_HOST" \
    'bash /tmp/requirements.sh'

# device: creating sysroot.tar (2min)
RUN sshpass -p "$PI_PASSWORD" ssh -o PreferredAuthentications=password -o StrictHostKeyChecking=no "$PI_USER@$PI_HOST" \
    'cd / && tar cvf /sysroot.tar /usr/include/ /lib /usr/lib'
# device: fetching sysroot (1gb file, time estimate depends on your network speed)
RUN sshpass -p "$PI_PASSWORD" scp -r -o PreferredAuthentications=password -o StrictHostKeyChecking=no "$PI_USER@$PI_HOST:/sysroot.tar" sysroot/
# device: cleanup sysroot.tar
RUN sshpass -p "$PI_PASSWORD" ssh -o PreferredAuthentications=password -o StrictHostKeyChecking=no "$PI_USER@$PI_HOST" \
    'rm /sysroot.tar'

# host: unpack sysroot.tar
WORKDIR /z2w/sysroot/
RUN tar -xvf sysroot.tar
# host: fix symlinks
WORKDIR /z2w/
RUN symlinks -rc sysroot

# host: cross-compile Qt (12min)
WORKDIR /z2w/targetbuild
RUN cmake ../qt6 -GNinja -DCMAKE_BUILD_TYPE=Release -DINPUT_opengl=es2 -DQT_BUILD_EXAMPLES=OFF -DQT_BUILD_TESTS=OFF \
    -DQT_HOST_PATH=$PWD/../host -DCMAKE_INSTALL_PREFIX=/usr/local/qt6 -DCMAKE_STAGING_PREFIX=$PWD/../target \
    -DCMAKE_TOOLCHAIN_FILE=$PWD/../toolchain.cmake -DQT_QMAKE_TARGET_MKSPEC=devices/linux-orangepi-zero2w-aarch64 \
    -DQT_FEATURE_xcb=ON -DFEATURE_xcb_xlib=ON -DQT_FEATURE_xlib=ON -DFEATURE_dbus=OFF && \
    cmake --build . --parallel $THREADS && \
    cmake --install . && \
    rm -rf *

WORKDIR /z2w/target
RUN tar cvf target.tar *

# device: uploading Qt6 build (280mb file, time estimate depends on your network speed)
RUN sshpass -p "$PI_PASSWORD" scp -r -o PreferredAuthentications=password -o StrictHostKeyChecking=no target.tar "$PI_USER@$PI_HOST:/usr/local/qt6/"
RUN rm target.tar
# device: extracting Qt6 build
RUN sshpass -p "$PI_PASSWORD" ssh -o PreferredAuthentications=password -o StrictHostKeyChecking=no "$PI_USER@$PI_HOST" \
    'cd /usr/local/qt6/ && tar -xvf target.tar && rm target.tar'

# device: setting ENV
RUN echo 'export PATH="$PATH:/z2w/target/bin/"' >> /root/.bashrc
ENV PATH=${PATH}:/z2w/target/bin/

RUN git config --global --add safe.directory /app