2 Commits

Author SHA1 Message Date
cc1c9763b2 Added X64 build prefix
There's no real reason to assume the host machine is X64.
2024-12-21 13:27:43 +02:00
00a8738392 Added parallel build to PR workflow
Using a matrix and job separation we can make the architectures compile
parallel to eachother, hopefully reducing the time required for builds
and also simplifying the process of building a single architecture.

A problem that we encountered is that with Python the resulting packed
tars are very large. Each release is in the order of tens of megabytes.
Using artifacts in our pipeline can easily make us surpass the maximum
size limit for free GitHub accounts (500 MB).
Because of this, we use the regular non-parallel pipeline for release
build. Releasing the version from the same job the build was performed
in allows us to directly access the build files instead of using
artifacts.

Separated release and MR pipelines.
2024-12-21 13:27:43 +02:00
4 changed files with 29 additions and 81 deletions

View File

@ -9,7 +9,6 @@ jobs:
build: build:
strategy: strategy:
matrix: matrix:
build_type: ["build", "build-with-python"]
architecture: ["x86_64", "arm", "aarch64", "powerpc", "mips", "mipsel"] architecture: ["x86_64", "arm", "aarch64", "powerpc", "mips", "mipsel"]
runs-on: ubuntu-latest runs-on: ubuntu-latest
@ -22,4 +21,4 @@ jobs:
run: sudo apt-get install -y wget run: sudo apt-get install -y wget
- name: Build - name: Build
run: make ${{ matrix.build_type }}-${{ matrix.architecture }} -j$((`nproc`+1)) run: make build-${{ matrix.architecture }} -j$((`nproc`+1))

View File

@ -1,24 +1,17 @@
ARCHS := x86_64 arm aarch64 powerpc mips mipsel ARCHS := x86_64 arm aarch64 powerpc mips mipsel
TARGETS := $(addprefix build-, $(ARCHS)) TARGETS := $(addprefix build-, $(ARCHS))
PYTHON_TARGETS := $(addprefix build-with-python-, $(ARCHS))
ALL_TARGETS := $(TARGETS) $(PYTHON_TARGETS)
PACK_TARGETS := $(addprefix pack-, $(ARCHS)) PACK_TARGETS := $(addprefix pack-, $(ARCHS))
PYTHON_PACK_TARGETS := $(addprefix pack-with-python-, $(ARCHS))
ALL_PACK_TARGETS := $(PACK_TARGETS) $(PYTHON_PACK_TARGETS)
SUBMODULE_PACKAGES := $(wildcard src/submodule_packages/*) SUBMODULE_PACKAGES := $(wildcard src/submodule_packages/*)
BUILD_PACKAGES_DIR := "build/packages" BUILD_PACKAGES_DIR := "build/packages"
.PHONY: clean help download_packages build build-docker-image $(ALL_TARGETS) $(ALL_PACK_TARGETS) .PHONY: clean help download_packages build build-docker-image $(TARGETS) $(PACK_TARGETS)
help: help:
@echo "Usage:" @echo "Usage:"
@echo " make build" @echo " make build"
@echo "" @echo ""
@for target in $(ALL_TARGETS); do \ @for target in $(TARGETS); do \
echo " $$target"; \ echo " $$target"; \
done done
@ -27,7 +20,7 @@ help:
build/build-docker-image.stamp: Dockerfile build/build-docker-image.stamp: Dockerfile
mkdir -p build mkdir -p build
docker buildx build --tag gdb-static . docker build -t gdb-static .
touch build/build-docker-image.stamp touch build/build-docker-image.stamp
build-docker-image: build/build-docker-image.stamp build-docker-image: build/build-docker-image.stamp
@ -47,31 +40,19 @@ symlink-git-packages: build/symlink-git-packages.stamp
download-packages: build/download-packages.stamp download-packages: build/download-packages.stamp
build: $(ALL_TARGETS) build: $(TARGETS)
$(TARGETS): build-%: $(TARGETS): build-%: symlink-git-packages download-packages build-docker-image
@$(MAKE) _build-$*
$(PYTHON_TARGETS): build-with-python-%:
@WITH_PYTHON="--with-python" $(MAKE) _build-$*
_build-%: symlink-git-packages download-packages build-docker-image
mkdir -p build mkdir -p build
docker run --user $(shell id -u):$(shell id -g) \ docker run --user $(shell id -u):$(shell id -g) \
--rm --volume .:/app/gdb gdb-static env TERM=xterm-256color \ --rm --volume .:/app/gdb gdb-static env TERM=xterm-256color \
/app/gdb/src/compilation/build.sh $* /app/gdb/build/ /app/gdb/src $(WITH_PYTHON) /app/gdb/src/compilation/build.sh $* /app/gdb/build/ /app/gdb/src
pack: $(ALL_PACK_TARGETS) pack: $(PACK_TARGETS)
$(PACK_TARGETS): pack-%: $(PACK_TARGETS): pack-%: build-%
@$(MAKE) _pack-$* if [ ! -f "build/artifacts/gdb-static-$*.tar.gz" ]; then \
tar -czf "build/artifacts/gdb-static-$*.tar.gz" -C "build/artifacts/$*" .; \
$(PYTHON_PACK_TARGETS): pack-with-python-%:
@TAR_EXT="with-python-" ARTIFACT_EXT="_with_python" $(MAKE) _pack-$*
_pack-%: build-%
if [ ! -f "build/artifacts/gdb-static-$(TAR_EXT)$*.tar.gz" ]; then \
tar -czf "build/artifacts/gdb-static-$(TAR_EXT)$*.tar.gz" -C "build/artifacts/$*$(ARTIFACT_EXT)" .; \
fi fi
clean-git-packages: clean-git-packages:

View File

@ -52,9 +52,6 @@ function set_compliation_variables() {
export CFLAGS="-O2" export CFLAGS="-O2"
export CXXFLAGS="-O2" export CXXFLAGS="-O2"
# Strip the binary to reduce it's size.
export LDFLAGS="-s"
} }
function set_ncurses_link_variables() { function set_ncurses_link_variables() {
@ -335,7 +332,6 @@ function build_gdb() {
# $3: libiconv prefix # $3: libiconv prefix
# $4: libgmp prefix # $4: libgmp prefix
# $5: libmpfr prefix # $5: libmpfr prefix
# $6: whether to build with python or not
# #
# Echoes: # Echoes:
# The gdb build directory # The gdb build directory
@ -349,15 +345,7 @@ function build_gdb() {
local libiconv_prefix="$3" local libiconv_prefix="$3"
local libgmp_prefix="$4" local libgmp_prefix="$4"
local libmpfr_prefix="$5" local libmpfr_prefix="$5"
local with_python="$6" local gdb_build_dir="$(realpath "$gdb_dir/build-$target_arch")"
if [[ "$with_python" == "yes" ]]; then
local python_flag="--with-python=/app/gdb/build/packages/cpython-static/build-$target_arch/bin/python3-config"
local gdb_build_dir="$(realpath "$gdb_dir/build-${target_arch}_with_python")"
else
local python_flag="--without-python"
local gdb_build_dir="$(realpath "$gdb_dir/build-${target_arch}")"
fi
echo "$gdb_build_dir" echo "$gdb_build_dir"
mkdir -p "$gdb_build_dir" mkdir -p "$gdb_build_dir"
@ -372,7 +360,7 @@ function build_gdb() {
>&2 fancy_title "Building gdb for $target_arch" >&2 fancy_title "Building gdb for $target_arch"
../configure -C --enable-static --with-static-standard-libraries --disable-inprocess-agent \ ../configure -C --enable-static --with-static-standard-libraries --disable-inprocess-agent \
--enable-tui "$python_flag" \ --enable-tui --with-python=/app/gdb/build/packages/cpython-static/build-$target_arch/bin/python3-config \
"--with-libiconv-prefix=$libiconv_prefix" --with-libiconv-type=static \ "--with-libiconv-prefix=$libiconv_prefix" --with-libiconv-type=static \
"--with-gmp=$libgmp_prefix" \ "--with-gmp=$libgmp_prefix" \
"--with-mpfr=$libmpfr_prefix" \ "--with-mpfr=$libmpfr_prefix" \
@ -399,7 +387,6 @@ function install_gdb() {
# $1: gdb build directory # $1: gdb build directory
# $2: artifacts directory # $2: artifacts directory
# $3: target architecture # $3: target architecture
# $4: whether gdb was built with or without python
# #
# Returns: # Returns:
# 0: success # 0: success
@ -408,22 +395,15 @@ function install_gdb() {
local gdb_build_dir="$1" local gdb_build_dir="$1"
local artifacts_dir="$2" local artifacts_dir="$2"
local target_arch="$3" local target_arch="$3"
local with_python="$4"
if [[ "$with_python" == "yes" ]]; then if [[ -d "$artifacts_dir/$target_arch" && -n "$(ls -A "$artifacts_dir/$target_arch")" ]]; then
local artifacts_location="$artifacts_dir/${target_arch}_with_python"
else
local artifacts_location="$artifacts_dir/${target_arch}"
fi
if [[ -d "$artifacts_location" && -n "$(ls -A "$artifacts_location")" ]]; then
>&2 echo "Skipping install: gdb already installed for $target_arch" >&2 echo "Skipping install: gdb already installed for $target_arch"
return 0 return 0
fi fi
temp_artifacts_dir="$(mktemp -d)" temp_artifacts_dir="$(mktemp -d)"
mkdir -p "$artifacts_location" mkdir -p "$artifacts_dir/$target_arch"
make -C "$gdb_build_dir" install "DESTDIR=$temp_artifacts_dir" 1>&2 make -C "$gdb_build_dir" install "DESTDIR=$temp_artifacts_dir" 1>&2
if [[ $? -ne 0 ]]; then if [[ $? -ne 0 ]]; then
@ -432,7 +412,7 @@ function install_gdb() {
fi fi
while read file; do while read file; do
cp "$file" "$artifacts_location/" cp "$file" "$artifacts_dir/$target_arch/"
done < <(find "$temp_artifacts_dir/usr/local/bin" -type f -executable) done < <(find "$temp_artifacts_dir/usr/local/bin" -type f -executable)
rm -rf "$temp_artifacts_dir" rm -rf "$temp_artifacts_dir"
@ -446,9 +426,8 @@ function build_and_install_gdb() {
# $2: libiconv prefix # $2: libiconv prefix
# $3: libgmp prefix # $3: libgmp prefix
# $4: libmpfr prefix # $4: libmpfr prefix
# $5: whether to build with python or not # $5: install directory
# $6: install directory # $6: target architecture
# $7: target architecture
# #
# Returns: # Returns:
# 0: success # 0: success
@ -458,16 +437,15 @@ function build_and_install_gdb() {
local libiconv_prefix="$2" local libiconv_prefix="$2"
local libgmp_prefix="$3" local libgmp_prefix="$3"
local libmpfr_prefix="$4" local libmpfr_prefix="$4"
local with_python="$5" local artifacts_dir="$5"
local artifacts_dir="$6" local target_arch="$6"
local target_arch="$7"
gdb_build_dir="$(build_gdb "$gdb_dir" "$target_arch" "$libiconv_prefix" "$libgmp_prefix" "$libmpfr_prefix" "$with_python")" gdb_build_dir="$(build_gdb "$gdb_dir" "$target_arch" "$libiconv_prefix" "$libgmp_prefix" "$libmpfr_prefix")"
if [[ $? -ne 0 ]]; then if [[ $? -ne 0 ]]; then
return 1 return 1
fi fi
install_gdb "$gdb_build_dir" "$artifacts_dir" "$target_arch" "$with_python" install_gdb "$gdb_build_dir" "$artifacts_dir" "$target_arch"
if [[ $? -ne 0 ]]; then if [[ $? -ne 0 ]]; then
return 1 return 1
fi fi
@ -480,12 +458,10 @@ function build_gdb_with_dependencies() {
# $1: target architecture # $1: target architecture
# $2: build directory # $2: build directory
# $3: src directory # $3: src directory
# $4: whether to build gdb with python or not
local target_arch="$1" local target_arch="$1"
local build_dir="$2" local build_dir="$2"
local source_dir="$3" local source_dir="$3"
local with_python="$4"
local packages_dir="$build_dir/packages" local packages_dir="$build_dir/packages"
local artifacts_dir="$build_dir/artifacts" local artifacts_dir="$build_dir/artifacts"
@ -517,18 +493,15 @@ function build_gdb_with_dependencies() {
fi fi
set_ncurses_link_variables "$ncursesw_build_dir" set_ncurses_link_variables "$ncursesw_build_dir"
if [[ "$with_python" == "yes" ]]; then python_build_dir="$(build_python "$packages_dir/cpython-static" "$target_arch")"
build_python "$packages_dir/cpython-static" "$target_arch" if [[ $? -ne 0 ]]; then
if [[ $? -ne 0 ]]; then return 1
return 1
fi
fi fi
build_and_install_gdb "$packages_dir/binutils-gdb" \ build_and_install_gdb "$packages_dir/binutils-gdb" \
"$iconv_build_dir/lib/.libs/" \ "$iconv_build_dir/lib/.libs/" \
"$gmp_build_dir/.libs/" \ "$gmp_build_dir/.libs/" \
"$mpfr_build_dir/src/.libs/" \ "$mpfr_build_dir/src/.libs/" \
"$with_python" \
"$artifacts_dir" \ "$artifacts_dir" \
"$target_arch" "$target_arch"
if [[ $? -ne 0 ]]; then if [[ $? -ne 0 ]]; then
@ -537,17 +510,12 @@ function build_gdb_with_dependencies() {
} }
function main() { function main() {
if [[ $# -lt 3 ]]; then if [[ $# -ne 3 ]]; then
>&2 echo "Usage: $0 <target_arch> <build_dir> <src_dir> [--with-python]" >&2 echo "Usage: $0 <target_arch> <build_dir> <src_dir>"
exit 1 exit 1
fi fi
local with_python="no" build_gdb_with_dependencies "$1" "$2" "$3"
if [[ "$4" == "--with-python" ]]; then
with_python="yes"
fi
build_gdb_with_dependencies "$1" "$2" "$3" "$with_python"
if [[ $? -ne 0 ]]; then if [[ $? -ne 0 ]]; then
>&2 echo "Error: failed to build gdb with dependencies" >&2 echo "Error: failed to build gdb with dependencies"
exit 1 exit 1