#!/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_TARGET=glibc 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 curl -o automake.tgz -fsSL https://ftp.gnu.org/gnu/automake/automake-1.17.tar.xz && \ tar -xvf automake.tgz && \ cd automake-1.17 && \ ./configure && \ make && \ make install && \ ln -sf /usr/local/bin/automake /usr/bin/automake 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)""/frankenphp-dist:/frankenphp/dist" # Apply env in temp env file 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 -fPIC' >> /tmp/spc-gnu-docker.env echo 'SPC_TARGET=glibc' >> /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