diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d2e9a3b149..2a7f8fcba9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -96,7 +96,15 @@ jobs: if: contains(matrix.arch, 'linux') && endsWith(matrix.arch, '-gnu') run: | sudo apt-get -y update - sudo apt-get -y install libssl-dev pkg-config g++-aarch64-linux-gnu gcc-aarch64-linux-gnu + sudo apt-get -y install libssl-dev pkg-config g++-aarch64-linux-gnu gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu wget + + - name: Compile Python 3.10.10 from source for Aarch64 + if: contains(matrix.arch, 'aarch64-unknown-linux-gnu') + run: | + sudo chmod +x ./docker/aarch64/compile-python.sh + sudo ./docker/aarch64/compile-python.sh + export PYO3_CROSS_LIB_DIR=${PWD}/python310-aarch64/lib + echo $PYO3_CROSS_LIB_DIR - name: Install rust toolchain uses: dtolnay/rust-toolchain@master diff --git a/docker/aarch64/Dockerfile b/docker/aarch64/Dockerfile new file mode 100644 index 0000000000..1510045f86 --- /dev/null +++ b/docker/aarch64/Dockerfile @@ -0,0 +1,50 @@ +FROM ubuntu:22.04 as builder + +ENV LANG en_US.utf8 +WORKDIR /greptimedb + +# Install dependencies. +RUN apt-get update && apt-get install -y \ + libssl-dev \ + protobuf-compiler \ + curl \ + build-essential \ + pkg-config \ + wget + +# Install Rust. +SHELL ["/bin/bash", "-c"] +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --no-modify-path --default-toolchain none -y +ENV PATH /root/.cargo/bin/:$PATH + +# Install cross platform toolchain +RUN apt-get -y update && \ + apt-get -y install g++-aarch64-linux-gnu gcc-aarch64-linux-gnu && \ + apt-get install binutils-aarch64-linux-gnu + +COPY . . +# This three env var is set in script, so I set it manually in dockerfile. +ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/ +ENV LIBRARY_PATH=$LIBRARY_PATH:/usr/local/lib/ +ENV PY_INSTALL_PATH=${PWD}/python_arm64_build +RUN chmod +x ./docker/aarch64/compile-python.sh && \ + ./docker/aarch64/compile-python.sh +# Install rustup target for cross compiling. +RUN rustup target add aarch64-unknown-linux-gnu +# Set the environment variable for cross compiling and compile it +# Build the project in release mode. Set Net fetch with git cli to true to avoid git error. +RUN export PYO3_CROSS_LIB_DIR=$PY_INSTALL_PATH/lib && \ + alias python=python3 && \ + CARGO_NET_GIT_FETCH_WITH_CLI=1 && \ + cargo build --target aarch64-unknown-linux-gnu --release -F pyo3_backend + +# Exporting the binary to the clean image +FROM ubuntu:22.04 as base + +RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -y install ca-certificates + +WORKDIR /greptime +COPY --from=builder /greptimedb/target/aarch64-unknown-linux-gnu/release/greptime /greptime/bin/ +ENV PATH /greptime/bin/:$PATH + +ENTRYPOINT ["greptime"] diff --git a/docker/aarch64/compile-python.sh b/docker/aarch64/compile-python.sh new file mode 100644 index 0000000000..62bdbca3ca --- /dev/null +++ b/docker/aarch64/compile-python.sh @@ -0,0 +1,46 @@ +# this script will download Python source code, compile it, and install it to /usr/local/lib +# then use this python to compile cross-compiled python for aarch64 + +wget https://www.python.org/ftp/python/3.10.10/Python-3.10.10.tgz +tar -xvf Python-3.10.10.tgz +cd Python-3.10.10 +# explain Python compile options here a bit:s +# --enable-shared: enable building a shared Python library (default is no) but we do need it for calling from rust +# CC, CXX, AR, LD, RANLIB: set the compiler, archiver, linker, and ranlib programs to use +# build: the machine you are building on, host: the machine you will run the compiled program on +# --with-system-ffi: build _ctypes module using an installed ffi library, see Doc/library/ctypes.rst, not used in here TODO: could remove +# ac_cv_pthread_is_default=no ac_cv_pthread=yes ac_cv_cxx_thread=yes: +# allow cross-compiled python to have -pthread set for CXX, see https://github.com/python/cpython/pull/22525 +# ac_cv_have_long_long_format=yes: target platform supports long long type +# disable-ipv6: disable ipv6 support, we don't need it in here +# ac_cv_file__dev_ptmx=no ac_cv_file__dev_ptc=no: disable pty support, we don't need it in here + +# Build local python first, then build cross-compiled python. +./configure \ +--enable-shared \ +ac_cv_pthread_is_default=no ac_cv_pthread=yes ac_cv_cxx_thread=yes \ +ac_cv_have_long_long_format=yes \ +--disable-ipv6 ac_cv_file__dev_ptmx=no ac_cv_file__dev_ptc=no && \ +make +make install +cd .. +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/ +export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/lib/ +export PY_INSTALL_PATH=${PWD}/python_arm64_build +cd Python-3.10.10 && \ +make clean && \ +make distclean && \ +alias python=python3 && \ +./configure --build=x86_64-linux-gnu --host=aarch64-linux-gnu \ +--prefix=$PY_INSTALL_PATH --enable-optimizations \ +CC=aarch64-linux-gnu-gcc \ +CXX=aarch64-linux-gnu-g++ \ +AR=aarch64-linux-gnu-ar \ +LD=aarch64-linux-gnu-ld \ +RANLIB=aarch64-linux-gnu-ranlib \ +--enable-shared \ +ac_cv_pthread_is_default=no ac_cv_pthread=yes ac_cv_cxx_thread=yes \ +ac_cv_have_long_long_format=yes \ +--disable-ipv6 ac_cv_file__dev_ptmx=no ac_cv_file__dev_ptc=no && \ +make && make altinstall && \ +cd ..