diff --git a/bin/build-static-frankenphp b/bin/build-static-frankenphp new file mode 100755 index 00000000..1de01c39 --- /dev/null +++ b/bin/build-static-frankenphp @@ -0,0 +1,150 @@ +#!/usr/bin/env bash + +# This file is using docker to run commands +set -e + +# Detect docker can run +if ! which docker >/dev/null; then + echo "Docker is not installed, please install docker first !" + exit 1 +fi +DOCKER_EXECUTABLE="docker" +# shellcheck disable=SC2046 +if [ $(id -u) -ne 0 ]; then + if ! docker info > /dev/null 2>&1; then + if [ "$SPC_USE_SUDO" != "yes" ]; then + echo "Docker command requires sudo" + # shellcheck disable=SC2039 + echo -n 'To use sudo to run docker, run "export SPC_USE_SUDO=yes" and run command again' + exit 1 + fi + DOCKER_EXECUTABLE="sudo docker" + fi +fi + + + +# to check if qemu-docker run +if [ "$SPC_USE_ARCH" = "" ]; then + SPC_USE_ARCH=current +fi +case $SPC_USE_ARCH in +current) + BASE_ARCH=$(uname -m) + if [ "$BASE_ARCH" = "arm64" ]; then + BASE_ARCH=aarch64 + GO_ARCH=arm64 + else + GO_ARCH=amd64 + fi + ;; +aarch64) + BASE_ARCH=aarch64 + GO_ARCH=arm64 + # shellcheck disable=SC2039 + echo -e "\e[033m* Using different arch needs to setup qemu-static for docker !\e[0m" + $DOCKER_EXECUTABLE run --rm --privileged multiarch/qemu-user-static:register --reset > /dev/null + ;; +*) + echo "Current arch is not supported to run in docker: $SPC_USE_ARCH" + exit 1 + ;; +esac + +# Detect docker env is setup +if ! $DOCKER_EXECUTABLE images | grep -q cwcc-frankenphp-gnu-$SPC_USE_ARCH; then + echo "Docker container does not exist. Building docker image ..." + $DOCKER_EXECUTABLE build -t cwcc-frankenphp-gnu-$SPC_USE_ARCH -f- . <> /etc/bashrc +RUN source /etc/bashrc + +RUN curl -o cmake.tgz -fsSL https://github.com/Kitware/CMake/releases/download/v3.31.4/cmake-3.31.4-linux-$BASE_ARCH.tar.gz && \ + mkdir /cmake && \ + tar -xzf cmake.tgz -C /cmake --strip-components 1 + +WORKDIR /app +ADD ./src /app/src +COPY ./composer.* /app/ +ADD ./bin/setup-runtime /app/bin/setup-runtime +ADD ./bin/spc /app/bin/spc +RUN /app/bin/setup-runtime +RUN /app/bin/php /app/bin/composer install --no-dev --classmap-authoritative +ENV PATH="/app/bin:/cmake/bin:/usr/local/go/bin:$PATH" +ENV SPC_SKIP_DOCTOR_CHECK_ITEMS="if musl-wrapper is installed,if musl-cross-make is installed" + +ADD ./config/env.ini /app/config/env.ini +RUN bin/spc doctor --auto-fix --debug + +RUN curl -o make.tgz -fsSL https://ftp.gnu.org/gnu/make/make-4.4.tar.gz && \ + tar -zxvf make.tgz && \ + cd make-4.4 && \ + ./configure && \ + make && \ + make install && \ + ln -sf /usr/local/bin/make /usr/bin/make + +RUN git clone https://github.com/static-php/gnu-frankenphp --depth=1 /frankenphp +WORKDIR /frankenphp + +RUN curl -o go.tgz -fsSL https://go.dev/dl/go1.24.1.linux-$GO_ARCH.tar.gz && \ + rm -rf /usr/local/go && tar -C /usr/local -xzf go.tgz +EOF +fi + +# Check if in ci (local terminal can execute with -it) +if [ -t 0 ]; then + INTERACT=-it +else + INTERACT='' +fi + +# Mounting volumes +MOUNT_LIST="" +# shellcheck disable=SC2089 +MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/config:/app/config" +MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/src:/app/src" +MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/buildroot:/app/buildroot" +MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/source:/app/source" +MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/dist:/app/dist" +MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/downloads:/app/downloads" +MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/pkgroot:/app/pkgroot" +MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/dist:/frankenphp/dist" + +# Apply env in temp env file +echo 'SPC_SKIP_DOCTOR_CHECK_ITEMS=if musl-wrapper is installed,if musl-cross-make is installed' > /tmp/spc-gnu-docker.env +echo 'CC=/opt/rh/devtoolset-10/root/usr/bin/gcc' >> /tmp/spc-gnu-docker.env +echo 'CXX=/opt/rh/devtoolset-10/root/usr/bin/g++' >> /tmp/spc-gnu-docker.env +echo 'AR=/opt/rh/devtoolset-10/root/usr/bin/ar' >> /tmp/spc-gnu-docker.env +echo 'LD=/opt/rh/devtoolset-10/root/usr/bin/ld' >> /tmp/spc-gnu-docker.env +echo 'SPC_DEFAULT_C_FLAGS=-fPIE' >> /tmp/spc-gnu-docker.env +echo 'SPC_NO_MUSL_PATH=yes' >> /tmp/spc-gnu-docker.env +echo 'SPC_CMD_VAR_PHP_MAKE_EXTRA_LDFLAGS_PROGRAM="-Wl,-O1 -pie"' >> /tmp/spc-gnu-docker.env +echo 'SPC_CMD_VAR_PHP_MAKE_EXTRA_LIBS="-ldl -lpthread -lm -lresolv -lutil -lrt"' >> /tmp/spc-gnu-docker.env + +# Run docker +# shellcheck disable=SC2068 +# shellcheck disable=SC2086 +# shellcheck disable=SC2090 + +$DOCKER_EXECUTABLE run --rm $INTERACT -e SPC_FIX_DEPLOY_ROOT="$(pwd)" --env-file /tmp/spc-gnu-docker.env $MOUNT_LIST cwcc-frankenphp-gnu-$SPC_USE_ARCH ./build-static.sh diff --git a/bin/spc-gnu-docker b/bin/spc-gnu-docker index c9af23c1..33420cca 100755 --- a/bin/spc-gnu-docker +++ b/bin/spc-gnu-docker @@ -71,8 +71,8 @@ RUN sed -i 's/^#.*baseurl=http/baseurl=http/g' /etc/yum.repos.d/*.repo && \ sed -i 's/^mirrorlist=http/#mirrorlist=http/g' /etc/yum.repos.d/*.repo RUN yum update -y && \ - yum install -y devtoolset-7-gcc-* -RUN echo "source scl_source enable devtoolset-7" >> /etc/bashrc + yum install -y devtoolset-10-gcc-* && \ +RUN echo "source scl_source enable devtoolset-10" >> /etc/bashrc RUN source /etc/bashrc RUN curl -o cmake.tgz -fsSL https://github.com/Kitware/CMake/releases/download/v3.31.4/cmake-3.31.4-linux-$BASE_ARCH.tar.gz && \ @@ -91,7 +91,15 @@ ENV SPC_SKIP_DOCTOR_CHECK_ITEMS="if musl-wrapper is installed,if musl-cross-make ADD ./config/env.ini /app/config/env.ini RUN bin/spc doctor --auto-fix --debug -RUN git clone https://github.com/dunglas/frankenphp.git --depth=1 /frankenphp + +RUN curl -o make.tgz -fsSL https://ftp.gnu.org/gnu/make/make-4.4.tar.gz && \ + tar -zxvf make.tgz && \ + cd make-4.4 && \ + ./configure && \ + make && \ + make install && \ + ln -sf /usr/local/bin/make /usr/bin/make + EOF fi @@ -114,19 +122,19 @@ MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/downloads:/app/downloads" MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/pkgroot:/app/pkgroot" # Apply env in temp env file -echo 'SPC_SKIP_DOCTOR_CHECK_ITEMS="if musl-wrapper is installed,if musl-cross-make is installed"' > /tmp/spc-gnu-docker.env -echo 'CC=/opt/rh/devtoolset-7/root/usr/bin/gcc' >> /tmp/spc-gnu-docker.env -echo 'CXX=/opt/rh/devtoolset-7/root/usr/bin/g++' >> /tmp/spc-gnu-docker.env -echo 'AR=/opt/rh/devtoolset-7/root/usr/bin/ar' >> /tmp/spc-gnu-docker.env -echo 'LD=/opt/rh/devtoolset-7/root/usr/bin/ld' >> /tmp/spc-gnu-docker.env -echo 'SPC_DEFAULT_C_FLAGS=-fPIC' >> /tmp/spc-gnu-docker.env +echo 'SPC_SKIP_DOCTOR_CHECK_ITEMS=if musl-wrapper is installed,if musl-cross-make is installed' > /tmp/spc-gnu-docker.env +echo 'CC=/opt/rh/devtoolset-10/root/usr/bin/gcc' >> /tmp/spc-gnu-docker.env +echo 'CXX=/opt/rh/devtoolset-10/root/usr/bin/g++' >> /tmp/spc-gnu-docker.env +echo 'AR=/opt/rh/devtoolset-10/root/usr/bin/ar' >> /tmp/spc-gnu-docker.env +echo 'LD=/opt/rh/devtoolset-10/root/usr/bin/ld' >> /tmp/spc-gnu-docker.env +echo 'SPC_DEFAULT_C_FLAGS=-fPIE' >> /tmp/spc-gnu-docker.env echo 'SPC_NO_MUSL_PATH=yes' >> /tmp/spc-gnu-docker.env echo 'SPC_CMD_VAR_PHP_MAKE_EXTRA_LDFLAGS_PROGRAM="-Wl,-O1 -pie"' >> /tmp/spc-gnu-docker.env -echo 'SPC_CMD_VAR_PHP_MAKE_EXTRA_LIBS="-ldl -lpthread -lm -lresolv -lutil"' >> /tmp/spc-gnu-docker.env +echo 'SPC_CMD_VAR_PHP_MAKE_EXTRA_LIBS="-ldl -lpthread -lm -lresolv -lutil -lrt"' >> /tmp/spc-gnu-docker.env # Run docker # shellcheck disable=SC2068 # shellcheck disable=SC2086 # shellcheck disable=SC2090 -$DOCKER_EXECUTABLE run --rm $INTERACT -e SPC_FIX_DEPLOY_ROOT="$(pwd)" --env-file /tmp/spc-gnu-docker.env $MOUNT_LIST cwcc-spc-gnu-$SPC_USE_ARCH # bin/spc $@ +$DOCKER_EXECUTABLE run --rm $INTERACT -e SPC_FIX_DEPLOY_ROOT="$(pwd)" --env-file /tmp/spc-gnu-docker.env $MOUNT_LIST cwcc-spc-gnu-$SPC_USE_ARCH bin/spc $@