53 Commits

Author SHA1 Message Date
9b43b0cf47 build: fix python frozen modules generation
The problem was due to duplicate modules present both in the base frozen
modules and also in the extra modules list file.

This commit should allow us to import gdb and pygments again.
2025-01-20 21:03:32 +02:00
1d6af45cac build: Build make build and make pack sequentially
Building multiple targets in parallel may cause docker race conditions.
2025-01-15 23:43:41 +02:00
a7efcb729e build: delete package dir before redownloading it 2025-01-15 23:43:41 +02:00
8baaffdcbf build: always download and extract tars
This caused failures in our ci-cd. Always downloading & extracting the
tars makes sure we will redownload them & extract if the previous
download / extraction was faulty.
2025-01-15 23:43:41 +02:00
eef9ea9215 Merge pull request #34 from guyush1/add-submodules-note
docs: Add a note about submodules initialization and sync
2025-01-14 22:33:00 +02:00
1d7b4ff428 docs: Add a note about submodules initialization and sync 2025-01-14 21:48:07 +02:00
386d09efd7 Merge pull request #29 from RoiKlevansky/redesign-readme
Redesign readme
2025-01-14 21:43:48 +02:00
a5d4b7838e feat: add minimal package.json file for contributor-faces 2025-01-13 20:17:41 +02:00
657600689c ref: redone README.md 2025-01-13 20:17:41 +02:00
9e717db750 docs: add project logo 2025-01-13 17:13:20 +02:00
e97b65c6b9 Merge pull request #31 from guyush1/add-libexpat-support
build: added libexpat build support
2025-01-10 15:51:06 +02:00
d978ca9aaf build: added libexpat build support
This allows commands such as "info os files"
previously we had expat support on x86_64 only.
2025-01-10 15:34:56 +02:00
9e7d1ed118 Merge pull request #30 from guyush1/external-python-gdb-lib
Compiling Pygments & dependencies in GDB
2025-01-10 15:31:25 +02:00
89f092efb7 Compiling Pygments & dependencies in GDB
Added Pygments to build

This is in order to enable GDB syntax highlighting
2025-01-09 21:20:36 +02:00
f7e97cac7f Merge pull request #25 from guyush1/allow-build-with-and-without-python
build: Allow building gdb with and without python
2024-12-30 23:55:08 +02:00
6738cedefc automation: build python targets in pipeline ci-cd
done using a 2d matrix involving the build type (regular or with python)
2024-12-30 23:21:17 +02:00
5359ff1116 build: Allow building gdb with and without python 2024-12-30 23:21:17 +02:00
17346caf10 Merge pull request #23 from guyush1/reduce-static-python-size
reduce static gdb python size
2024-12-25 23:46:36 +02:00
aa49ade8d4 Strip the executables in order to reduce their size 2024-12-25 21:35:03 +02:00
1dfe3fa6ca Reduce static-gdb size by reducing python size
Updated the python submodule.
The newer submodule will create smaller static python libraries.
2024-12-25 21:35:03 +02:00
c44e67540a Added X64 build prefix
There's no real reason to assume the host machine is X64.
2024-12-21 13:50:39 +02:00
a0ceeff014 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:50:39 +02:00
0a60aedf76 Added submodule checkout to automation 2024-12-21 13:26:37 +02:00
ff0d3ad28f Added -e flag to bash build.sh
We want audible fails
2024-12-21 13:26:37 +02:00
c86f506e90 Add submodules to build/packages
Using symlinks the submodules are added to appear just like any
downloaded unpacked tar.

Also added a Makefile clean rule to clean the submodules, which
includes Reseting the submodules to the origin branch state,
including ignored files.
2024-12-21 13:26:37 +02:00
46e8eb22a8 Added static-python and static gdb submodules 2024-12-21 13:26:37 +02:00
fa04d3a7a2 gdb with python support integration
This commits enables gdb's python support. In order to make it work, we
had to create a python fork with some patches to the buildsystem, and
also had to patch gdb as well.
2024-12-21 13:26:37 +02:00
dc882d9598 Merge pull request #14 from guyush1/enable-tui-statically
add tui to gdb
2024-11-11 08:18:37 +02:00
d55a31bb5e build: build gdb with tui mode enabled
This was acheived by forcing gdb to use our own static libncurses
2024-11-10 23:22:56 +02:00
a962fbb441 build: download the ncurses package 2024-11-10 23:22:56 +02:00
d5e1dbb011 Merge pull request #13 from guyush1/add-mips-mipsel
build: add mips & mipsel targets
2024-11-10 23:22:32 +02:00
8dc07deb66 build: add mips & mipsel targets 2024-11-10 22:26:05 +02:00
3738fc8629 Merge pull request #11 from guyush1/improve-documentation
documentation: improve the readme file
2024-11-10 22:21:41 +02:00
fe4c0763e8 documentation: split & improve the readme file
This commit splits the readme file into 2 files - the readme which
contains instructions on how to download our latest release, and on how
to use our build scripts in order to quickly build gdb statically. The
second file is a compilation guide that contains explanations on how to
manually compile gdb statically.
2024-11-08 13:02:19 +02:00
08909223f2 Merge pull request #10 from guyush1/gdb-15.2-update
build: update gdb to v15.2
2024-10-31 08:49:55 +02:00
4c9cc100fb build: update gdb to v15.2 2024-10-30 22:15:12 +02:00
a9a044ffdc Merge pull request #9 from RoiKlevansky/ci-cd-pipeline
CI/CD pipeline
2024-10-30 21:44:48 +02:00
fe4ad583ae fix: move all package links to GNU FTP 2024-10-30 20:38:57 +02:00
7697e5c2e1 build(ci/cd): add basic Github workflow pipeline 2024-10-30 20:38:57 +02:00
1dc231d162 build: add packing of artifacts to Makefile 2024-10-30 20:38:55 +02:00
fdc2d2e4ea Merge pull request #1 from RoiKlevansky/build-using-dockerfile
Automate building using docker
2024-10-29 22:27:10 +02:00
4cde133d93 build: make build script more verbose 2024-10-29 20:59:46 +02:00
e70ba04f32 docs: add information about building with docker 2024-10-29 20:59:46 +02:00
8e323429bd docs: document missing step in the building of MPFR 2024-10-29 20:59:46 +02:00
0d59976a77 build: add Makefile 2024-10-29 20:59:46 +02:00
a3becb6943 build: add Dockerfile 2024-10-29 20:59:46 +02:00
b5e5665dd8 build: add build script for automated building 2024-10-29 20:59:46 +02:00
4347d18af5 build: add script which patches GDB 2024-10-29 20:59:46 +02:00
ab0673611d build: add script for automatically downloading packages 2024-10-29 20:59:46 +02:00
3788bee966 build: add build directory to .gitignore 2024-10-29 20:45:28 +02:00
1706882030 Merge pull request #6 from RoiKlevansky/ignore-ide-folders
Add IDE folders to .gitignore
2024-10-21 19:29:26 +03:00
9ae54f03f1 build: add IDE folders to .gitignore 2024-10-13 23:20:34 +03:00
aae73b4bc8 Added the required gdb buildsystem patches in order to build statically 2024-09-21 20:23:52 +03:00
21 changed files with 2553 additions and 65 deletions

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 76 KiB

193
.github/assets/gdb-static_logo_dark.svg vendored Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 72 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 76 KiB

193
.github/assets/gdb-static_logo_light.svg vendored Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 72 KiB

25
.github/workflows/pr-pipeline.yaml vendored Normal file
View File

@ -0,0 +1,25 @@
name: gdb-static-pr-pipeline
on:
pull_request:
branches:
- '*'
jobs:
build:
strategy:
matrix:
build_type: ["build", "build-with-python"]
architecture: ["x86_64", "arm", "aarch64", "powerpc", "mips", "mipsel"]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install dependencies
run: sudo apt-get install -y wget
- name: Build
run: make ${{ matrix.build_type }}-${{ matrix.architecture }} -j$((`nproc`+1))

30
.github/workflows/release-pipeline.yaml vendored Normal file
View File

@ -0,0 +1,30 @@
name: gdb-static-release-pipeline
on:
push:
tags:
- 'v*'
# Use a non-parallel single job pipeline because artifacts weigh too much. Instead,
# simply build the files in the same job they are released.
jobs:
build_and_publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install dependencies
run: sudo apt-get install -y wget
- name: Build
run: make build -j$((`nproc`+1))
- name: Pack
run: make pack
- name: Publish release
uses: softprops/action-gh-release@v2
with:
files: build/artifacts/gdb-static*.tar.gz

6
.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
# IDE Folders
.idea/
.vscode/
# Build folders
build/

14
.gitmodules vendored Normal file
View File

@ -0,0 +1,14 @@
[submodule "cpython-static"]
path = src/submodule_packages/cpython-static
url = git@github.com:guyush1/cpython-static.git
branch = python3.12-static
[submodule "binutils-gdb-static"]
path = src/submodule_packages/binutils-gdb
url = git@github.com:guyush1/binutils-gdb.git
branch = gdb-static
[submodule "src/submodule_packages/pygments"]
path = src/submodule_packages/pygments
url = git@github.com:pygments/pygments.git
[submodule "src/submodule_packages/libexpat"]
path = src/submodule_packages/libexpat
url = git@github.com:guyush1/libexpat.git

33
Dockerfile Normal file
View File

@ -0,0 +1,33 @@
FROM ubuntu:24.04
# Install dependencies
RUN apt update && apt install -y \
bison \
file \
flex \
g++ \
g++-aarch64-linux-gnu \
g++-arm-linux-gnueabi \
g++-mips-linux-gnu \
g++-mipsel-linux-gnu \
g++-powerpc-linux-gnu \
gcc \
gcc-aarch64-linux-gnu \
gcc-arm-linux-gnueabi \
gcc-mips-linux-gnu \
gcc-mipsel-linux-gnu \
gcc-powerpc-linux-gnu \
git \
libncurses-dev \
libtool \
m4 \
make \
patch \
pkg-config \
python3.12 \
libpython3-dev \
texinfo \
wget \
xz-utils
WORKDIR /app/gdb

86
Makefile Normal file
View File

@ -0,0 +1,86 @@
ARCHS := x86_64 arm aarch64 powerpc mips mipsel
TARGETS := $(addprefix build-, $(ARCHS))
PYTHON_TARGETS := $(addprefix build-with-python-, $(ARCHS))
ALL_TARGETS := $(TARGETS) $(PYTHON_TARGETS)
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/*)
BUILD_PACKAGES_DIR := "build/packages"
.PHONY: clean help download_packages build build-docker-image $(ALL_TARGETS) $(ALL_PACK_TARGETS)
.NOTPARALLEL: build pack
help:
@echo "Usage:"
@echo " make build"
@echo ""
@for target in $(ALL_TARGETS); do \
echo " $$target"; \
done
@echo ""
@echo " make clean"
build/build-docker-image.stamp: Dockerfile
mkdir -p build
docker buildx build --tag gdb-static .
touch build/build-docker-image.stamp
build-docker-image: build/build-docker-image.stamp
build/download-packages.stamp: build/build-docker-image.stamp src/compilation/download_packages.sh
mkdir -p $(BUILD_PACKAGES_DIR)
docker run --user $(shell id -u):$(shell id -g) \
--rm --volume .:/app/gdb gdb-static env TERM=xterm-256color \
/app/gdb/src/compilation/download_packages.sh /app/gdb/$(BUILD_PACKAGES_DIR)/
touch build/download-packages.stamp
build/symlink-git-packages.stamp: $(SUBMODULE_PACKAGES)
mkdir -p $(BUILD_PACKAGES_DIR)
ln -sf $(addprefix /app/gdb/, $(SUBMODULE_PACKAGES)) $(BUILD_PACKAGES_DIR)/
symlink-git-packages: build/symlink-git-packages.stamp
download-packages: build/download-packages.stamp
build: $(ALL_TARGETS)
$(TARGETS): build-%:
@$(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
docker run --user $(shell id -u):$(shell id -g) \
--rm --volume .:/app/gdb gdb-static env TERM=xterm-256color \
/app/gdb/src/compilation/build.sh $* /app/gdb/build/ /app/gdb/src $(WITH_PYTHON)
pack: $(ALL_PACK_TARGETS)
$(PACK_TARGETS): pack-%:
@$(MAKE) _pack-$*
$(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
clean-git-packages:
git submodule foreach '[[ ! "$$sm_path" == src/submodule_packages/* ]] || git clean -xffd'
clean: clean-git-packages
rm -rf build
# Kill and remove all containers of image gdb-static
docker ps -a | grep -P "^[a-f0-9]+\s+gdb-static\s+" | awk '{print $$1}' | xargs docker rm -f 2>/dev/null || true
docker rmi -f gdb-static 2>/dev/null || true

187
README.md
View File

@ -1,93 +1,150 @@
# Repository of static gdb and gdbserver
<h1 align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="./.github/assets/gdb-static_logo_dark.svg">
<source media="(prefers-color-scheme: light)" srcset="./.github/assets/gdb-static_logo_light.svg">
<img src="./.github/assets/gdb-static_logo_light.svg" alt="gdb-static" width="210px">
</picture>
</h1>
The statically compiled gdb / gdbserver binaries are avaliable to download under github releases!
<p align="center">
<i align="center">Frozen static builds of everyone's favorite debugger!🧊</i>
</p>
# Notes about this file - read before proceeding!
<h4 align="center">
<a href="https://github.com/guyush1/gdb-static/releases/latest">
<img src="https://img.shields.io/github/v/release/guyush1/gdb-static?style=flat-square" alt="release" style="height: 20px;">
<a href="https://github.com/guyush1/gdb-static/actions/workflows/pr-pipeline.yaml">
<img src="https://img.shields.io/github/actions/workflow/status/guyush1/gdb-static/pr-pipeline.yaml?style=flat-square&label=pipeline" alt="continuous integration" style="height: 20px;">
</a>
<a href="https://github.com/guyush1/gdb-static/graphs/contributors">
<img src="https://img.shields.io/github/contributors-anon/guyush1/gdb-static?color=yellow&style=flat-square" alt="contributors" style="height: 20px;">
</a>
<br>
<img src="https://img.shields.io/badge/GDB-v15.2-orange?logo=gnu&logoColor=white&style=flat-square" alt="gdb" style="height: 20px;">
<img src="https://img.shields.io/badge/Python-built--in-blue?logo=python&logoColor=white&style=flat-square" alt="python" style="height: 20px;">
</h4>
While i already provided the gdb/gdbserver-15 statically compiled binaries handed out to you, some people might want to compile it to a different architecture, or compile a newer version of gdb in the future :). This rest of the file contains my compilation documentation so that you could save yourself some time and do it yourself, if you wish.
## TL;DR
## <VARAIBLES> in the script
- **Download**: Get the latest release from the [releases page](https://github.com/guyush1/gdb-static/releases/latest).
When specifying the compilation dir throughout the compilation process (specified as <COMPILATION_DIR_PATH> in this file), DO NOT use relative pathing, or bash characters such as `~`. They will not get parsed correctly! Instead, use absolute paths only.
## Introduction
Examples to the <VARIABLES> throughout the script:
<CROSS_COMPILER_C> - arm-linux-gnueabi-gcc
<CROSS_COMPILER_CPP> - arm-linux-gnueabi-g++
<HOST_NAME> - arm-linux-gnueabi
<COMPILATION_DIR_PATH> - /home/username/projects/libgmp-x.y.z/build-arm/
Who doesn't love GDB? It's such a powerful tool, with such a great package.
But sometimes, you run into one of these problems:
- You can't install GDB on your machine
- You can't install an updated version of GDB on your machine
- Some other strange embedded reasons...
Environment info:
- glibc version: 2.39-0ubuntu8.3 (NOTE: When i compiled gdb-15 using an older glibc, such as the one i had in my ubuntu-20.04 machine, i received a segfault in gdb...).
This is where `gdb-static` comes in! We provide static builds of `gdb` (and `gdbserver` of course), so you can run them on any machine, without any dependencies!
# Compiling gdb statically to the host platform
<details open>
<summary>
Features
</summary> <br />
## 1) Compiling iconv
- **Static Builds**: No dependencies, no installation, just download and run!
- **Latest Versions**: We keep our builds up-to-date with the latest versions of GDB.
- **Builtin Python (Optional)**: We provide builds with Python support built-in.
- **XML Support**: Our builds come with XML support built-in, which is useful for some GDB commands.
- **Wide Architecture Support**: We support a wide range of architectures:
- aarch64
- arm
- mips
- mipsel
- powerpc
- x86_64
While compiling iconv is not a must, the libc-provided iconv (a utility to convert between encodings) may fail on different architectures,
at least in my experiance. Thus, I recommended using a custom libiconv and compiling it into gdb.
</details>
Download the source from https://github.com/roboticslibrary/libiconv.git
Make sure to check out to a stable tag (in my case - v1.17).
## Usage
Work according to the following steps:
I) run `./gitsub.sh pull`
II) run `./autogen.sh` to create the configure script from configure.sh.
III) create a build dir (e.g build), and then cd into it.
IV) run `../configure --enable-static`
V) run `cp -r ./include ./lib/.libs/`
VI) run `mkdir ./lib/.libs/lib/`
VII) run `cp ./lib/.libs/libiconv.a ./lib/.libs/lib/`
To get started with `gdb-static`, simply download the build for your architecture from the [releases page](https://github.com/guyush1/gdb-static/releases/latest), extract the archive, and copy the binary to your desired platform.
## 2) Compiling gdb
> [!NOTE]
> We provide two types of builds:
> 1. Builds with Python support, which are approximately ~30 MB in size.
> 2. Slimmer builds without Python support, which are approximately ~7 MB in size.
Clone gdb from sourceware - https://sourceware.org/git/binutils-gdb.git.
I checked out to the 15.1 tag.
You may choose to copy the `gdb` binary to the platform, or use `gdbserver` to debug remotely.
Work according to the following steps:
I) Apply my patches - if you are not on the exact tag i used (15.1) - you might need to apply them manually.
II) create a build dir.
III) run `../configure --enable-static --with-static-standard-libraries --disable-tui --disable-inprocess-agent --with-libiconv-prefix=<COMPILATION_DIR_PATH>/lib/.libs/ --with-libiconv-type=static`
IV) run `make all-gdb -j$(nproc)` - for gdbserver, run `make all-gdbserver -j$(nproc)`.
## Development
gdb will sit under gdb/gdb.
gdbserver will sit under gdbserver/gdbserver.
> [!NOTE]
> Before building, make sure to initialize & sync the git submodules.
# Cross compiling gdb statically to other architectures.
Alternatively, you can build `gdb-static` from source. To do so, follow the instructions below:
Cross compiling gdb statically is a bit more complicated then regular static compilation. In order to cross compile gdb statically, we will need to compile libgmp and libmpfr as well as iconv.
<details open>
<summary>
Pre-requisites
</summary> <br />
To be able to build `gdb-static`, you will need the following tools installed on your machine:
## 1) Compiling iconv
###
Work according to the same process as described under the compilation to the host platform, aside from the configure script:
IV) run `../configure --enable-static CC=<CROSS_COMPILER_C> CXX=<CROSS_COMPILER_CPP> --host=<HOST_NAME>`
- Docker
- Docker buildx
- Git
</details>
## 2) Compiling libgmp
<details open>
<summary>
Building for a specific architecture
</summary> <br />
Download and extract the latest edition from https://gmplib.org/.
I used the 6.3.0 edition.
To build `gdb-static` for a specific architecture, run the following command:
Work according to the following steps:
I) Create a build dir and cd into it.
II) run `../configure CC=<CROSS_COMPILER_C> CXX=<CROSS_COMPILER_CPP> --enable-static --host=<HOST_NAME>`
III) run `make -j$(nproc)`
IV) run `mkdir ./.libs/include/`
V) run `cp gmp.h ./.libs/include/`
VI) run `mkdir ./.libs/lib`
VII) run `cp ./.libs/libgmp.a ./.libs/lib`
```bash
make build[-with-python]-<ARCH>
```
## 3) Compiling libmpfr
Where `<ARCH>` is the architecture you want to build for, and `-with-python` may be added in order to compile gdb with Python support.
Download and extract the latest edition from https://www.mpfr.org/.
I used the 4.2.1 edition.
The resulting binary will be placed in the `build/artifacts/` directory:
Work according to the following steps:
I) Create a build dir and cd into it.
II) run `../configure CC=<CROSS_COMPILER_C> CXX=<CROSS_COMPILER_CPP> --enable-static --with-gmp-build=<COMPILATION_DIR_PATH> --host=<HOST_NAME>`
III) run `make -j$(nproc)`
IV) run `mkdir ./src/.libs/lib`
V) run `cp ./src/.libs/libmpfr.a ./src/.libs/lib`
```bash
build/
└── artifacts/
└── <ARCH>/
└── ...
```
## 4) Compiling gdb
</details>
Work according to the same process as described under the compilation to the host platform, aside from the configure script:
III) run `../configure --enable-static --with-static-standard-libraries --disable-tui --disable-inprocess-agent --with-libiconv-prefix=<COMPILATION_DIR_PATH>/lib/.libs/ --with-libiconv-type=static --with-gmp=<COMPILATION_DIR_PATH>/.libs/ --with-mpfr=<COMPILATION_DIR_PATH>/src/.libs/ CC=<CROSS_COMPILER_C> CXX=<CROSS_COMPILER_CPP> --host=<HOST_NAME>`
<details open>
<summary>
Building for all architectures
</summary> <br />
To build `gdb-static` for all supported architectures, run the following command:
```bash
make build
```
The resulting binary will be placed in the `build/artifacts/` directory.
</details>
<a name="contributing_anchor"></a>
## Contributing
- Bug Report: If you see an error message or encounter an issue while using gdb-static, please create a [bug report](https://github.com/guyush1/gdb-static/issues/new?assignees=&labels=bug&title=%F0%9F%90%9B+Bug+Report%3A+).
- Feature Request: If you have an idea or if there is a capability that is missing and would make `gdb-static` more robust, please submit a [feature request](https://github.com/guyush1/gdb-static/issues/new?assignees=&labels=enhancement&title=%F0%9F%9A%80+Feature+Request%3A+).
## Contributors
<!---
npx contributor-faces --exclude "*bot*" --limit 70 --repo "https://github.com/guyush1/gdb-static"
change the height and width for each of the contributors from 80 to 50.
--->
[//]: contributor-faces
<a href="https://github.com/guyush1"><img src="https://avatars.githubusercontent.com/u/82650790?v=4" title="guyush1" width="80" height="80"></a>
<a href="https://github.com/RoiKlevansky"><img src="https://avatars.githubusercontent.com/u/78471889?v=4" title="RoiKlevansky" width="80" height="80"></a>
<a href="https://github.com/roddyrap"><img src="https://avatars.githubusercontent.com/u/37045659?v=4" title="roddyrap" width="80" height="80"></a>
[//]: contributor-faces

91
compilation.md Normal file
View File

@ -0,0 +1,91 @@
# Notes about this file - read before proceeding!
While i have already provided the gdb/gdbserver-15 statically compiled binaries for you, some people might want to compile it to a different architecture (without our build scripts), or compile a newer version of gdb in the future :). The rest of the file contains a documentation of the compilation process, in order to help you out.
## <VARAIBLES> in the script
When specifying the compilation dir throughout the compilation process (specified as <COMPILATION_DIR_PATH> in this file), DO NOT use relative pathing, or bash characters such as `~`. They will not get parsed correctly! Instead, use absolute paths only.
Examples to the <VARIABLES> throughout the script:
<CROSS_COMPILER_C> - arm-linux-gnueabi-gcc
<CROSS_COMPILER_CPP> - arm-linux-gnueabi-g++
<HOST_NAME> - arm-linux-gnueabi
<COMPILATION_DIR_PATH> - /home/username/projects/libgmp-x.y.z/build-arm/
Environment info:
- glibc version: 2.39-0ubuntu8.3 (NOTE: When i compiled gdb-15 using an older glibc, such as the one i had in my ubuntu-20.04 machine, i received a segfault in gdb...).
# Compiling gdb statically to the host platform
## 1) Compiling iconv
While compiling iconv is not a must, the libc-provided iconv (a utility to convert between encodings) may fail on different architectures,
at least in my experiance. Thus, I recommended using a custom libiconv and compiling it into gdb.
Download the source from https://github.com/roboticslibrary/libiconv.git
Make sure to check out to a stable tag (in my case - v1.17).
Work according to the following steps:
I) run `./gitsub.sh pull`
II) run `./autogen.sh` to create the configure script from configure.sh.
III) create a build dir (e.g build), and then cd into it.
IV) run `../configure --enable-static`
V) run `cp -r ./include ./lib/.libs/`
VI) run `mkdir ./lib/.libs/lib/`
VII) run `cp ./lib/.libs/libiconv.a ./lib/.libs/lib/`
## 2) Compiling gdb
Clone gdb from sourceware - https://sourceware.org/git/binutils-gdb.git.
I checked out to the 15.2 tag.
Work according to the following steps:
I) Apply my patches (gdb_static.patch). If you are not on the exact tag i used (15.2) - you might need to apply them manually, and change some stuff.
II) create a build dir.
III) run `../configure --enable-static --with-static-standard-libraries --disable-tui --disable-inprocess-agent --with-libiconv-prefix=<COMPILATION_DIR_PATH>/lib/.libs/ --with-libiconv-type=static`
IV) run `make all-gdb -j$(nproc)` - for gdbserver, run `make all-gdbserver -j$(nproc)`.
gdb will sit under gdb/gdb.
gdbserver will sit under gdbserver/gdbserver.
# Cross compiling gdb statically to other architectures.
Cross compiling gdb statically is a bit more complicated then regular static compilation. In order to cross compile gdb statically, we will need to compile libgmp and libmpfr as well as iconv.
## 1) Compiling iconv
Work according to the same process as described under the compilation to the host platform, aside from the configure script:
IV) run `../configure --enable-static CC=<CROSS_COMPILER_C> CXX=<CROSS_COMPILER_CPP> --host=<HOST_NAME>`
## 2) Compiling libgmp
Download and extract the latest edition from https://gmplib.org/.
I used the 6.3.0 edition.
Work according to the following steps:
I) Create a build dir and cd into it.
II) run `../configure CC=<CROSS_COMPILER_C> CXX=<CROSS_COMPILER_CPP> --enable-static --host=<HOST_NAME>`
III) run `make -j$(nproc)`
IV) run `mkdir ./.libs/include/`
V) run `cp gmp.h ./.libs/include/`
VI) run `mkdir ./.libs/lib`
VII) run `cp ./.libs/libgmp.a ./.libs/lib`
## 3) Compiling libmpfr
Download and extract the latest edition from https://www.mpfr.org/.
I used the 4.2.1 edition.
Work according to the following steps:
I) Create a build dir and cd into it.
II) run `../configure CC=<CROSS_COMPILER_C> CXX=<CROSS_COMPILER_CPP> --enable-static --with-gmp-build=<COMPILATION_DIR_PATH> --host=<HOST_NAME>`
III) run `make -j$(nproc)`
IV) run `mkdir ./src/.libs/lib`
V) run `cp ./src/.libs/libmpfr.a ./src/.libs/lib`
VI) run `mkdir ./src/.libs/include`
VII) run `cp ../src/mpfr.h ./src/.libs/include/`
## 4) Compiling gdb
Work according to the same process as described under the compilation to the host platform, aside from the configure script:
III) run `../configure --enable-static --with-static-standard-libraries --disable-tui --disable-inprocess-agent --with-libiconv-prefix=<COMPILATION_DIR_PATH>/lib/.libs/ --with-libiconv-type=static --with-gmp=<COMPILATION_DIR_PATH>/.libs/ --with-mpfr=<COMPILATION_DIR_PATH>/src/.libs/ CC=<CROSS_COMPILER_C> CXX=<CROSS_COMPILER_CPP> --host=<HOST_NAME>`

7
package.json Normal file
View File

@ -0,0 +1,7 @@
{
"name": "gdb-static",
"repository": {
"type": "git",
"url": "https://github.com/guyush1/gdb-static"
}
}

634
src/compilation/build.sh Executable file
View File

@ -0,0 +1,634 @@
#!/bin/bash
# Include utils library
script_dir=$(dirname "$0")
source "$script_dir/utils.sh"
# Don't want random unknown things to fail in the build procecss!
set -e
function set_compliation_variables() {
# Set compilation variables such as which compiler to use.
#
# Parameters:
# $1: target architecture
#
# Returns:
# 0: success
# 1: failure
supported_archs=("arm" "aarch64" "powerpc" "x86_64" "mips" "mipsel")
local target_arch="$1"
if [[ ! " ${supported_archs[@]} " =~ " ${target_arch} " ]]; then
>&2 echo "Error: unsupported target architecture: $target_arch"
return 1
fi
>&2 fancy_title "Setting compilation variables for $target_arch"
if [[ "$target_arch" == "arm" ]]; then
CROSS=arm-linux-gnueabi-
export HOST=arm-linux-gnueabi
elif [[ "$target_arch" == "aarch64" ]]; then
CROSS=aarch64-linux-gnu-
export HOST=aarch64-linux-gnu
elif [[ "$target_arch" == "powerpc" ]]; then
CROSS=powerpc-linux-gnu-
export HOST=powerpc-linux-gnu
elif [[ "$target_arch" == "mips" ]]; then
CROSS=mips-linux-gnu-
export HOST=mips-linux-gnu
elif [[ "$target_arch" == "mipsel" ]]; then
CROSS=mipsel-linux-gnu-
export HOST=mipsel-linux-gnu
elif [[ "$target_arch" == "x86_64" ]]; then
CROSS=x86_64-linux-gnu-
export HOST=x86_64-linux-gnu
fi
export CC="${CROSS}gcc"
export CXX="${CROSS}g++"
export CFLAGS="-O2"
export CXXFLAGS="-O2"
# Strip the binary to reduce it's size.
export LDFLAGS="-s"
}
function set_up_lib_search_paths() {
# Set up library-related linker search paths.
#
# Parameters:
# $1: ncursesw build dir
# $2: libexpat build dir
local ncursesw_build_dir="$1"
local libexpat_build_dir="$2"
# I) Allow tui mode by adding our custom built static ncursesw library to the linker search path.
# II) Allow parsing xml files by adding libexpat library to the linker search path.
export LDFLAGS="-L$ncursesw_build_dir/lib -L$libexpat_build_dir/lib/.libs $LDFLAGS"
}
function build_iconv() {
# Build libiconv.
#
# Parameters:
# $1: iconv package directory
# $2: target architecture
#
# Echoes:
# The libiconv build directory
#
# Returns:
# 0: success
# 1: failure
local iconv_dir="$1"
local target_arch="$2"
local iconv_build_dir="$(realpath "$iconv_dir/build-$target_arch")"
echo "$iconv_build_dir"
mkdir -p "$iconv_build_dir"
if [[ -f "$iconv_build_dir/lib/.libs/libiconv.a" ]]; then
>&2 echo "Skipping build: iconv already built for $target_arch"
return 0
fi
pushd "$iconv_build_dir" > /dev/null
>&2 fancy_title "Building libiconv for $target_arch"
../configure --enable-static "CC=$CC" "CXX=$CXX" "--host=$HOST" \
"CFLAGS=$CFLAGS" "CXXFLAGS=$CXXFLAGS" 1>&2
if [[ $? -ne 0 ]]; then
return 1
fi
make -j$(nproc) 1>&2
if [[ $? -ne 0 ]]; then
return 1
fi
cp -r ./include ./lib/.libs/
mkdir -p ./lib/.libs/lib/
cp ./lib/.libs/libiconv.a ./lib/.libs/lib/
>&2 fancy_title "Finished building libiconv for $target_arch"
popd > /dev/null
}
function build_libgmp() {
# Build libgmp.
#
# Parameters:
# $1: libgmp package directory
# $2: target architecture
#
# Echoes:
# The libgmp build directory
#
# Returns:
# 0: success
# 1: failure
local gmp_dir="$1"
local target_arch="$2"
local gmp_build_dir="$(realpath "$gmp_dir/build-$target_arch")"
echo "$gmp_build_dir"
mkdir -p "$gmp_build_dir"
if [[ -f "$gmp_build_dir/.libs/lib/libgmp.a" ]]; then
>&2 echo "Skipping build: libgmp already built for $target_arch"
return 0
fi
pushd "$gmp_build_dir" > /dev/null
>&2 fancy_title "Building libgmp for $target_arch"
../configure --enable-static "CC=$CC" "CXX=$CXX" "--host=$HOST" \
"CFLAGS=$CFLAGS" "CXXFLAGS=$CXXFLAGS" 1>&2
if [[ $? -ne 0 ]]; then
return 1
fi
make -j$(nproc) 1>&2
if [[ $? -ne 0 ]]; then
return 1
fi
mkdir -p ./.libs/include/
cp gmp.h ./.libs/include/
mkdir -p ./.libs/lib/
cp ./.libs/libgmp.a ./.libs/lib/
>&2 fancy_title "Finished building libgmp for $target_arch"
popd > /dev/null
}
function build_ncurses() {
# Build libncursesw.
#
# Parameters:
# $1: libncursesw package directory
# $2: target architecture
#
# Echoes:
# The libncursesw build directory
#
# Returns:
# 0: success
# 1: failure
local ncurses_dir="$1"
local target_arch="$2"
local ncurses_build_dir="$(realpath "$ncurses_dir/build-$target_arch")"
echo "$ncurses_build_dir"
mkdir -p "$ncurses_build_dir"
if [[ -f "$ncurses_build_dir/lib/libncursesw.a" ]]; then
>&2 echo "Skipping build: libncursesw already built for $target_arch"
return 0
fi
pushd "$ncurses_build_dir" > /dev/null
>&2 fancy_title "Building libncursesw for $target_arch"
../configure --enable-static "CC=$CC" "CXX=$CXX" "--host=$HOST" \
"CFLAGS=$CFLAGS" "CXXFLAGS=$CXXFLAGS" "--enable-widec" 1>&2
if [[ $? -ne 0 ]]; then
return 1
fi
make -j$(nproc) 1>&2
if [[ $? -ne 0 ]]; then
return 1
fi
>&2 fancy_title "Finished building libncursesw for $target_arch"
popd > /dev/null
}
function build_libexpat() {
# Build libexpat.
#
# Parameters:
# $1: libexpat package directory
# $2: target architecture
#
# Echoes:
# The libexpat build directory
#
# Returns:
# 0: success
# 1: failure
local libexpat_dir="$1"
local target_arch="$2"
local libexpat_build_dir="$(realpath "$libexpat_dir/build-$target_arch")"
echo "$libexpat_build_dir"
mkdir -p "$libexpat_build_dir"
if [[ -f "$libexpat_build_dir/lib/.libs/libexpat.a" ]]; then
>&2 echo "Skipping build: libexpat already built for $target_arch"
return 0
fi
pushd "$libexpat_build_dir" > /dev/null
>&2 fancy_title "Building libexpat for $target_arch"
# Generate configure if it doesnt exist.
if [[ ! -f "$libexpat_build_dir/../expat/configure" ]]; then
>&2 ../expat/buildconf.sh ../expat/
fi
../expat/configure --enable-static "CC=$CC" "CXX=$CXX" "--host=$HOST" \
"CFLAGS=$CFLAGS" "CXXFLAGS=$CXXFLAGS" 1>&2
if [[ $? -ne 0 ]]; then
return 1
fi
make -j$(nproc) 1>&2
if [[ $? -ne 0 ]]; then
return 1
fi
>&2 fancy_title "Finished building libexpat for $target_arch"
popd > /dev/null
}
function build_python() {
# Build python.
#
# Parameters:
# $1: python package directory
# $2: target architecture
# $3: gdb's python module directory parent
# $4: pygment's toplevel source dir.
#
# Echoes:
# The python build directory
#
# Returns:
# 0: success
# 1: failure
local python_dir="$1"
local target_arch="$2"
local gdb_python_parent="$3"
local pygments_source_dir="$4"
local python_lib_dir="$(realpath "$python_dir/build-$target_arch")"
echo "$python_lib_dir"
mkdir -p "$python_lib_dir"
# Having a python-config file is an indication that we successfully built python.
if [[ -f "$python_lib_dir/python-config" ]]; then
>&2 echo "Skipping build: libpython already built for $target_arch"
return 0
fi
pushd "$python_lib_dir" > /dev/null
>&2 fancy_title "Building python for $target_arch"
export LINKFORSHARED=" "
export MODULE_BUILDTYPE="static"
export CONFIG_SITE="$python_dir/config.site-static"
>&2 CFLAGS="-static" LDFLAGS="-static" ../configure \
--prefix=$(realpath .) \
--disable-test-modules \
--with-ensurepip=no \
--without-decimal-contextvar \
--build=x86_64-pc-linux-gnu \
--host=$HOST \
--with-build-python=/usr/bin/python3.12 \
--disable-ipv6 \
--disable-shared
# Extract the regular standard library modules that are to be frozen and include the gdb and pygments custom libraries.
export EXTRA_FROZEN_MODULES="$(printf "%s" "$(< ${script_dir}/frozen_python_modules.txt)" | tr $'\n' ";")"
export EXTRA_FROZEN_MODULES="${EXTRA_FROZEN_MODULES};<gdb.**.*>: gdb = ${gdb_python_parent};<pygments.**.*>: pygments = ${pygments_source_dir}"
>&2 echo "Frozen Modules: ${EXTRA_FROZEN_MODULES}"
# Regenerate frozen modules with gdb env varaible. Do it after the configure because we need
# the `regen-frozen` makefile.
>&2 python3.12 ../Tools/build/freeze_modules.py
>&2 make regen-frozen
# Build python after configuring the project and regnerating frozen files.
>&2 make -j $(nproc)
if [[ $? -ne 0 ]]; then
return 1
fi
# Install python (in build dir using the prefix set above), in order to have a bash (for cross-compilation) python3-config that works.
>&2 make install
if [[ $? -ne 0 ]]; then
return 1
fi
>&2 fancy_title "Finished building python for $target_arch"
popd > /dev/null
}
function build_libmpfr() {
# Build libmpfr.
#
# Parameters:
# $1: mpfr package directory
# $2: libgmp build directory
# $3: target architecture
#
# Echoes:
# The libmpfr build directory
#
# Returns:
# 0: success
# 1: failure
local mpfr_dir="$1"
local libgmp_build_dir="$2"
local target_arch="$3"
local mpfr_build_dir="$(realpath "$mpfr_dir/build-$target_arch")"
mkdir -p "$mpfr_build_dir"
echo "$mpfr_build_dir"
if [[ -f "$mpfr_build_dir/src/.libs/lib/libmpfr.a" ]]; then
>&2 echo "Skipping build: libmpfr already built for $target_arch"
return 0
fi
pushd "$mpfr_dir/build-$target_arch" > /dev/null
>&2 fancy_title "Building libmpfr for $target_arch"
../configure --enable-static "--with-gmp-build=$libgmp_build_dir" \
"CC=$CC" "CXX=$CXX" "--host=$HOST" \
"CFLAGS=$CFLAGS" "CXXFLAGS=$CXXFLAGS" 1>&2
if [[ $? -ne 0 ]]; then
return 1
fi
make -j$(nproc) 1>&2
if [[ $? -ne 0 ]]; then
return 1
fi
mkdir -p ./src/.libs/include
cp ../src/mpfr.h ./src/.libs/include/
mkdir -p ./src/.libs/lib
cp ./src/.libs/libmpfr.a ./src/.libs/lib/
>&2 fancy_title "Finished building libmpfr for $target_arch"
popd > /dev/null
}
function build_gdb() {
# Configure and build gdb.
#
# Parameters:
# $1: gdb directory
# $2: target architecture
# $3: libiconv prefix
# $4: libgmp prefix
# $5: libmpfr prefix
# $6: whether to build with python or not
#
# Echoes:
# The gdb build directory
#
# Returns:
# 0: success
# 1: failure
local gdb_dir="$1"
local target_arch="$2"
local libiconv_prefix="$3"
local libgmp_prefix="$4"
local libmpfr_prefix="$5"
local with_python="$6"
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"
mkdir -p "$gdb_build_dir"
if [[ -f "$gdb_build_dir/gdb/gdb" ]]; then
>&2 echo "Skipping build: gdb already built for $target_arch"
return 0
fi
pushd "$gdb_build_dir" > /dev/null
>&2 fancy_title "Building gdb for $target_arch"
../configure -C --enable-static --with-static-standard-libraries --disable-inprocess-agent \
--enable-tui "$python_flag" \
--with-expat --with-libexpat-type="static" \
"--with-libiconv-prefix=$libiconv_prefix" --with-libiconv-type=static \
"--with-gmp=$libgmp_prefix" \
"--with-mpfr=$libmpfr_prefix" \
"CC=$CC" "CXX=$CXX" "LDFLAGS=$LDFLAGS" "--host=$HOST" \
"CFLAGS=$CFLAGS" "CXXFLAGS=$CXXFLAGS" 1>&2
if [[ $? -ne 0 ]]; then
return 1
fi
make -j$(nproc) 1>&2
if [[ $? -ne 0 ]]; then
return 1
fi
>&2 fancy_title "Finished building gdb for $target_arch"
popd > /dev/null
}
function install_gdb() {
# Install gdb binaries to an artifacts directory.
#
# Parameters:
# $1: gdb build directory
# $2: artifacts directory
# $3: target architecture
# $4: whether gdb was built with or without python
#
# Returns:
# 0: success
# 1: failure
local gdb_build_dir="$1"
local artifacts_dir="$2"
local target_arch="$3"
local with_python="$4"
if [[ "$with_python" == "yes" ]]; 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"
return 0
fi
temp_artifacts_dir="$(mktemp -d)"
mkdir -p "$artifacts_location"
make -C "$gdb_build_dir" install "DESTDIR=$temp_artifacts_dir" 1>&2
if [[ $? -ne 0 ]]; then
rm -rf "$temp_artifacts_dir"
return 1
fi
while read file; do
cp "$file" "$artifacts_location/"
done < <(find "$temp_artifacts_dir/usr/local/bin" -type f -executable)
rm -rf "$temp_artifacts_dir"
}
function build_and_install_gdb() {
# Build gdb and install it to an artifacts directory.
#
# Parameters:
# $1: gdb package directory
# $2: libiconv prefix
# $3: libgmp prefix
# $4: libmpfr prefix
# $5: whether to build with python or not
# $6: install directory
# $7: target architecture
#
# Returns:
# 0: success
# 1: failure
local gdb_dir="$1"
local libiconv_prefix="$2"
local libgmp_prefix="$3"
local libmpfr_prefix="$4"
local with_python="$5"
local artifacts_dir="$6"
local target_arch="$7"
gdb_build_dir="$(build_gdb "$gdb_dir" "$target_arch" "$libiconv_prefix" "$libgmp_prefix" "$libmpfr_prefix" "$with_python")"
if [[ $? -ne 0 ]]; then
return 1
fi
install_gdb "$gdb_build_dir" "$artifacts_dir" "$target_arch" "$with_python"
if [[ $? -ne 0 ]]; then
return 1
fi
}
function build_gdb_with_dependencies() {
# Build gdb for a specific target architecture.
#
# Parameters:
# $1: target architecture
# $2: build directory
# $3: src directory
# $4: whether to build gdb with python or not
local target_arch="$1"
local build_dir="$2"
local source_dir="$3"
local with_python="$4"
local packages_dir="$build_dir/packages"
local artifacts_dir="$build_dir/artifacts"
set_compliation_variables "$target_arch"
if [[ $? -ne 0 ]]; then
return 1
fi
mkdir -p "$packages_dir"
iconv_build_dir="$(build_iconv "$packages_dir/libiconv" "$target_arch")"
if [[ $? -ne 0 ]]; then
return 1
fi
gmp_build_dir="$(build_libgmp "$packages_dir/gmp" "$target_arch")"
if [[ $? -ne 0 ]]; then
return 1
fi
mpfr_build_dir="$(build_libmpfr "$packages_dir/mpfr" "$gmp_build_dir" "$target_arch")"
if [[ $? -ne 0 ]]; then
return 1
fi
ncursesw_build_dir="$(build_ncurses "$packages_dir/ncurses" "$target_arch")"
if [[ $? -ne 0 ]]; then
return 1
fi
libexpat_build_dir="$(build_libexpat "$packages_dir/libexpat" "$target_arch")"
if [[ $? -ne 0 ]]; then
return 1
fi
set_up_lib_search_paths "$ncursesw_build_dir" "$libexpat_build_dir"
if [[ "$with_python" == "yes" ]]; then
local gdb_python_dir="$packages_dir/binutils-gdb/gdb/python/lib/"
local pygments_source_dir="$packages_dir/pygments/"
local python_build_dir="$(build_python "$packages_dir/cpython-static" "$target_arch" "$gdb_python_dir" "$pygments_source_dir")"
if [[ $? -ne 0 ]]; then
return 1
fi
fi
build_and_install_gdb "$packages_dir/binutils-gdb" \
"$iconv_build_dir/lib/.libs/" \
"$gmp_build_dir/.libs/" \
"$mpfr_build_dir/src/.libs/" \
"$with_python" \
"$artifacts_dir" \
"$target_arch"
if [[ $? -ne 0 ]]; then
return 1
fi
}
function main() {
if [[ $# -lt 3 ]]; then
>&2 echo "Usage: $0 <target_arch> <build_dir> <src_dir> [--with-python]"
exit 1
fi
local with_python="no"
if [[ "$4" == "--with-python" ]]; then
with_python="yes"
fi
build_gdb_with_dependencies "$1" "$2" "$3" "$with_python"
if [[ $? -ne 0 ]]; then
>&2 echo "Error: failed to build gdb with dependencies"
exit 1
fi
}
main "$@"

View File

@ -0,0 +1,215 @@
#!/bin/bash
# Include utils library
script_dir=$(dirname "$0")
source "$script_dir/utils.sh"
# List of package URLs to download
SOURCE_URLS=(
"https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.17.tar.gz"
"https://ftp.gnu.org/pub/gnu/gmp/gmp-6.3.0.tar.xz"
"https://ftp.gnu.org/pub/gnu/mpfr/mpfr-4.2.1.tar.xz"
"https://ftp.gnu.org/pub/gnu/ncurses/ncurses-6.5.tar.gz"
)
function unpack_tarball() {
# Unpack a tarball based on its extension.
# Supported extensions: tar, gz, xz.
#
# Parameters:
# $1: tarball
#
# Returns:
# 0: success
# 1: failure
local tarball="$1"
local extension="${tarball##*.}"
if [[ ! -f "$tarball" ]]; then
>&2 echo "Error: $tarball does not exist"
return 1
fi
case "$extension" in
tar | xz)
tar xf "$tarball"
;;
gz)
tar xzf "$tarball"
;;
*)
>&2 echo "Error: unknown extension $extension"
return 1
;;
esac
if [[ $? -ne 0 ]]; then
>&2 echo "Error: failed to unpack $tarball"
return 1
fi
}
function download_package() {
# Download a package. Will skip download if the output file already exists.
#
# Parameters:
# $1: URL of the package
# $2: output file
#
# Returns:
# 0: success
# 1: failure
local url="$1"
local output="$2"
wget "$url" -O "$output"
if [[ $? -ne 0 ]]; then
>&2 echo "Error: failed to download $url"
return 1
fi
}
function extract_package() {
# Extract a package. Will skip extraction if the package directory already exists.
#
# Parameters:
# $1: package tarball
# $2: output directory
#
# Returns:
# 0: success
# 1: failure
local tarball="$1"
local output_dir="$2"
local package_dir="${tarball%.tar*}"
local tarball_realpath="$(realpath "$tarball")"
local temp_dir="$(mktemp -d)"
if [[ ! -f "$tarball" ]]; then
>&2 echo "Error: $tarball does not exist"
return 1
fi
pushd "$temp_dir" > /dev/null
unpack_tarball "$tarball_realpath"
if [[ $? -ne 0 ]]; then
popd > /dev/null
return 1
fi
popd > /dev/null
# Make sure output dir is empty, so we could move content into it.
# The directory might not exist, so we need to pass || true so that set -e won't fail us.
rm -rf "$output_dir" || true
mv "$temp_dir/$package_dir" "$output_dir"
if [[ $? -ne 0 ]]; then
return 1
fi
rm -rf "$temp_dir"
}
function download_and_extract_package() {
# Download and extract a package.
#
# Parameters:
# $1: URL of the package
# $2: output directory
#
# Returns:
# 0: success
# 1: failure
local url="$1"
local output_dir="$2"
local tarball=$(basename "$url")
download_package "$url" "$tarball"
if [[ $? -ne 0 ]]; then
return 1
fi
extract_package "$tarball" "$output_dir"
if [[ $? -ne 0 ]]; then
return 1
fi
}
function package_url_to_dir() {
# Convert a package URL to a directory name.
#
# Parameters:
# $1: package URL
#
# Echoes:
# The package directory name
#
# Returns:
# 0: success
# 1: failure
local url="$1"
# The name of the package is the basename of the URL without the version number.
local package_dir=$(basename "$url")
package_dir="${package_dir%%-*}"
echo "$package_dir"
}
function download_gdb_packages() {
# Download and extract all required packages for building GDB.
#
# Parameters:
# $1: packages directory
#
# Returns:
# 0: success
# 1: failure
local packages_dir="$1"
pushd "$packages_dir"
# Run downloads in parallel
download_pids=()
fancy_title "Starting download of GDB packages"
for url in "${SOURCE_URLS[@]}"; do
package_dir=$(package_url_to_dir "$url")
download_and_extract_package "$url" "$package_dir" &
download_pids+=($!)
done
for pid in "${download_pids[@]}"; do
wait "$pid"
if [[ $? -ne 0 ]]; then
popd
return 1
fi
done
fancy_title "Finished downloading GDB packages"
popd
}
function main() {
if [[ $# -ne 1 ]]; then
>&2 echo "Usage: $0 <packages_dir>"
exit 1
fi
download_gdb_packages "$1"
if [[ $? -ne 0 ]]; then
>&2 echo "Error: failed to download GDB packages"
exit 1
fi
}
main "$@"

View File

@ -0,0 +1,147 @@
_aix_support
antigravity
argparse
ast
base64
bdb
bisect
calendar
cmd
codeop
code
<collections.**.*>
_collections_abc
colorsys
_compat_pickle
compileall
_compression
<concurrent.**.*>
configparser
contextlib
contextvars
copy
copyreg
cProfile
csv
dataclasses
datetime
<dbm.**.*>
decimal
difflib
dis
<encodings.**.*>
<ensurepip.**.*>
enum
filecmp
fileinput
fnmatch
fractions
ftplib
functools
__future__
genericpath
getopt
getpass
gettext
glob
graphlib
gzip
hashlib
heapq
hmac
imaplib
<importlib.**.*>
inspect
ipaddress
<json.**.*>
keyword
linecache
locale
<logging.**.*>
lzma
_markupbase
mimetypes
modulefinder
<multiprocessing.**.*>
netrc
ntpath
nturl2path
numbers
opcode
operator
optparse
os
_osx_support
pathlib
pdb
<__phello__.**.*>
pickle
pickletools
pkgutil
platform
plistlib
poplib
posixpath
pprint
profile
pstats
pty
_py_abc
pyclbr
py_compile
_pydatetime
_pydecimal
_pyio
_pylong
queue
quopri
random
<re.**.*>
reprlib
rlcompleter
sched
selectors
shelve
shlex
shutil
signal
smtplib
socket
socketserver
statistics
stat
stringprep
string
_strptime
struct
subprocess
symtable
sysconfig
tabnanny
tempfile
textwrap
this
_threading_local
threading
timeit
tokenize
token
<tomllib.**.*>
traceback
tracemalloc
trace
tty
types
typing
uuid
warnings
wave
weakref
_weakrefset
webbrowser
<wsgiref.**.*>
zipapp
<zipfile.**.*>
<zoneinfo.**.*>
<email.**.*>
<urllib.**.*>

67
src/compilation/utils.sh Executable file
View File

@ -0,0 +1,67 @@
#!/bin/bash
GREEN="\033[0;32m"
BOLD="\033[1m"
RESET="\033[0m"
function print_centered() {
# Print a string centered in the terminal.
#
# Parameters:
# $1: string
# $2: line width
#
# Returns:
# 0: success
local string="$1"
local length=${#string}
printf "%*s\n" $((($2 + length) / 2)) "$string"
}
function fancy_title() {
# Print a fancy title.
# The title is centered and surrounded by a line of dashes.
#
# Parameters:
# $1: title
#
# Returns:
# 0: success
local title="$1"
local length=80
local maximum_title_length=60
# Set color to green and bold
tput setaf 2
tput bold
printf "%${length}s\n" | tr ' ' -
# Split the title into words and print them centered
IFS=' ' read -r -a words <<< "$title"
line=""
for word in "${words[@]}"; do
if [[ ${#line} -eq 0 ]]; then
line="$word"
elif [[ $(( ${#line} + ${#word} + 1 )) -gt $maximum_title_length ]]; then
print_centered "$line" "$length"
line="$word"
else
line="$line $word"
fi
done
# Print the last line
if [[ ${#line} -gt 0 ]]; then
print_centered "$line" "$length"
fi
printf "%${length}s\n" | tr ' ' -
# Reset color and style
tput sgr0
}