2025-01-28 19:37:50 +08:00
|
|
|
#!/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
|
2025-03-24 19:25:38 +08:00
|
|
|
if [ "$SPC_USE_SUDO" != "yes" ] && [ "$SPC_DOCKER_DEBUG" != "yes" ]; then
|
2025-01-28 19:37:50 +08:00
|
|
|
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
|
|
|
|
|
fi
|
|
|
|
|
;;
|
|
|
|
|
aarch64)
|
|
|
|
|
BASE_ARCH=aarch64
|
|
|
|
|
# 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-spc-gnu-$SPC_USE_ARCH; then
|
|
|
|
|
echo "Docker container does not exist. Building docker image ..."
|
|
|
|
|
$DOCKER_EXECUTABLE build -t cwcc-spc-gnu-$SPC_USE_ARCH -f- . <<EOF
|
|
|
|
|
FROM centos:7
|
|
|
|
|
RUN sed -i 's/mirror.centos.org/vault.centos.org/g' /etc/yum.repos.d/*.repo && \
|
|
|
|
|
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 clean all && \
|
|
|
|
|
yum makecache && \
|
2025-03-14 15:25:51 +08:00
|
|
|
yum update -y && \
|
|
|
|
|
localedef -c -i en_US -f UTF-8 en_US.UTF-8
|
2025-01-28 19:37:50 +08:00
|
|
|
|
2025-03-09 20:30:22 +08:00
|
|
|
RUN yum install -y centos-release-scl
|
|
|
|
|
|
|
|
|
|
RUN if [ "$BASE_ARCH" = "aarch64" ]; then \
|
|
|
|
|
sed -i 's|mirror.centos.org/centos|vault.centos.org/altarch|g' /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo ; \
|
|
|
|
|
sed -i 's|mirror.centos.org/centos|vault.centos.org/altarch|g' /etc/yum.repos.d/CentOS-SCLo-scl.repo ; \
|
|
|
|
|
else \
|
|
|
|
|
sed -i 's/mirror.centos.org/vault.centos.org/g' /etc/yum.repos.d/*.repo ; \
|
|
|
|
|
fi
|
|
|
|
|
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 && \
|
2025-03-10 15:54:43 +08:00
|
|
|
yum install -y devtoolset-10-gcc-*
|
2025-03-10 00:39:59 +08:00
|
|
|
RUN echo "source scl_source enable devtoolset-10" >> /etc/bashrc
|
2025-03-09 20:30:22 +08:00
|
|
|
RUN source /etc/bashrc
|
|
|
|
|
|
2025-01-28 19:37:50 +08:00
|
|
|
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
|
2025-03-24 22:39:45 +08:00
|
|
|
RUN /app/bin/php /app/bin/composer install --no-dev
|
2025-01-28 19:37:50 +08:00
|
|
|
ENV PATH="/app/bin:/cmake/bin:$PATH"
|
2025-03-14 18:22:50 +08:00
|
|
|
ENV SPC_LIBC=glibc
|
2025-01-28 19:37:50 +08:00
|
|
|
|
|
|
|
|
ADD ./config/env.ini /app/config/env.ini
|
|
|
|
|
RUN bin/spc doctor --auto-fix --debug
|
2025-03-10 00:39:59 +08:00
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
2025-03-13 14:57:37 +08:00
|
|
|
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
|
|
|
|
|
|
2025-01-28 19:37:50 +08:00
|
|
|
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"
|
|
|
|
|
|
2025-03-09 20:30:22 +08:00
|
|
|
# Apply env in temp env file
|
2025-03-14 18:22:50 +08:00
|
|
|
echo 'CC=/opt/rh/devtoolset-10/root/usr/bin/gcc' > /tmp/spc-gnu-docker.env
|
2025-03-10 00:39:59 +08:00
|
|
|
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
|
2025-03-10 15:54:43 +08:00
|
|
|
echo 'SPC_DEFAULT_C_FLAGS=-fPIE -fPIC' >> /tmp/spc-gnu-docker.env
|
2025-03-14 18:22:50 +08:00
|
|
|
echo 'SPC_LIBC=glibc' >> /tmp/spc-gnu-docker.env
|
2025-03-09 20:30:22 +08:00
|
|
|
echo 'SPC_CMD_VAR_PHP_MAKE_EXTRA_LDFLAGS_PROGRAM="-Wl,-O1 -pie"' >> /tmp/spc-gnu-docker.env
|
2025-03-10 00:39:59 +08:00
|
|
|
echo 'SPC_CMD_VAR_PHP_MAKE_EXTRA_LIBS="-ldl -lpthread -lm -lresolv -lutil -lrt"' >> /tmp/spc-gnu-docker.env
|
2025-03-09 20:30:22 +08:00
|
|
|
|
2025-01-28 19:37:50 +08:00
|
|
|
# Run docker
|
|
|
|
|
# shellcheck disable=SC2068
|
|
|
|
|
# shellcheck disable=SC2086
|
|
|
|
|
# shellcheck disable=SC2090
|
2025-03-09 20:30:22 +08:00
|
|
|
|
2025-03-24 19:25:38 +08:00
|
|
|
if [ "$SPC_DOCKER_DEBUG" = "yes" ]; then
|
2025-03-24 22:39:45 +08:00
|
|
|
echo "* Debug mode enabled, run docker in interactive mode."
|
|
|
|
|
echo "* You can use 'exit' to exit the docker container."
|
|
|
|
|
echo "* You can use 'bin/spc' like normal builds."
|
|
|
|
|
echo "*"
|
|
|
|
|
echo "* Mounted directories:"
|
|
|
|
|
echo "* ./config: $(pwd)/config"
|
|
|
|
|
echo "* ./src: $(pwd)/src"
|
|
|
|
|
echo "* ./buildroot: $(pwd)/buildroot"
|
|
|
|
|
echo "* ./source: $(pwd)/source"
|
|
|
|
|
echo "* ./dist: $(pwd)/dist"
|
|
|
|
|
echo "* ./downloads: $(pwd)/downloads"
|
|
|
|
|
echo "* ./pkgroot: $(pwd)/pkgroot"
|
|
|
|
|
echo "*"
|
|
|
|
|
|
2025-03-30 21:03:40 +08:00
|
|
|
$DOCKER_EXECUTABLE run --rm -it --privileged $INTERACT -e SPC_FIX_DEPLOY_ROOT="$(pwd)" --env-file /tmp/spc-gnu-docker.env $MOUNT_LIST cwcc-spc-gnu-$SPC_USE_ARCH
|
2025-03-24 19:25:38 +08:00
|
|
|
else
|
|
|
|
|
$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 $@
|
|
|
|
|
fi
|