mirror of
https://github.com/turbot/steampipe.git
synced 2025-12-19 18:12:43 -05:00
242 lines
5.5 KiB
Markdown
242 lines
5.5 KiB
Markdown
# PostgreSQL Source Build Instructions
|
|
|
|
This document provides step-by-step instructions for building the embedded PostgreSQL binaries required by Steampipe for a specific PostgreSQL version. It covers both macOS and Linux environments, including prerequisites, build steps, and packaging guidelines to ensure the resulting binaries are relocatable and suitable for Steampipe's use.
|
|
|
|
1. **Source Code:**
|
|
[https://www.postgresql.org/ftp/source/](https://www.postgresql.org/ftp/source/)
|
|
|
|
2. **Build Documentation:**
|
|
[https://www.postgresql.org/docs/current/install-make.html](https://www.postgresql.org/docs/current/install-make.html)
|
|
|
|
---
|
|
|
|
## 3. Download Source Code and Run
|
|
|
|
### For MacOS
|
|
|
|
#### 3.1. Pre-requisites
|
|
|
|
* `openssl`
|
|
|
|
---
|
|
|
|
#### 3.2. Steps to Build
|
|
|
|
1. Change to the PostgreSQL source directory:
|
|
|
|
```bash
|
|
cd /postgres/source/dir
|
|
```
|
|
|
|
2. Set environment variables:
|
|
|
|
```bash
|
|
export MACOSX_DEPLOYMENT_TARGET=11.0
|
|
export CFLAGS="-mmacosx-version-min=11.0"
|
|
export LDFLAGS="-mmacosx-version-min=11.0 -Wl,-rpath,@loader_path/../lib/postgresql"
|
|
```
|
|
|
|
*(Rebuild with an older deployment target)*
|
|
|
|
3. Configure the build:
|
|
|
|
```bash
|
|
./configure --prefix=location/where/you/want/the/files \
|
|
--libdir=/location/where/you/want/the/files/lib/postgresql \
|
|
--datadir=/location/where/you/want/the/files/share/postgresql \
|
|
--with-openssl \
|
|
--with-includes=$(brew --prefix openssl)/include \
|
|
--with-libraries=$(brew --prefix openssl)/lib
|
|
```
|
|
|
|
*(Make sure the `libdir` and `datadir` args are passed correctly and point to the `postgresql` dir inside `lib` and `share` — this is needed for Steampipe.)*
|
|
|
|
4. Build PostgreSQL:
|
|
|
|
```bash
|
|
make -j$(sysctl -n hw.ncpu)
|
|
```
|
|
|
|
5. Install binaries:
|
|
|
|
```bash
|
|
make install
|
|
```
|
|
|
|
6. Verify that all binaries are built in the specified location.
|
|
|
|
7. Build contrib modules:
|
|
|
|
```bash
|
|
make -C contrib
|
|
```
|
|
|
|
8. Install contrib modules:
|
|
|
|
```bash
|
|
make -C contrib install
|
|
```
|
|
|
|
9. *(This builds extensions in the contrib directory — needed since we load `ltree` and `tablefunc`.)*
|
|
|
|
10. Verify installation structure:
|
|
|
|
```bash
|
|
ls -al location/where/you/want/the/files
|
|
```
|
|
|
|
You should see `lib`, `share`, `bin`, and `include` directories under that path.
|
|
|
|
11. Remove the `include` directory.
|
|
|
|
12. Remove unneeded binaries from `bin`.
|
|
|
|
13. Check that all extensions exist.
|
|
|
|
---
|
|
|
|
#### 3.3. Fix RPATHs
|
|
|
|
Run the `fix_rpath.sh` script to fix the rpaths of the binaries (`initdb`, `pg_restore`, `pg_dump`):
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
set -euo pipefail
|
|
|
|
# --- CONFIGURE ---
|
|
# Adjust if your libpq lives in lib/ not lib/postgresql
|
|
LIB_SUBDIR="lib/postgresql"
|
|
BUNDLE_ROOT="$(pwd)"
|
|
LIBPQ_PATH="$BUNDLE_ROOT/$LIB_SUBDIR/libpq.5.dylib"
|
|
|
|
echo "🔧 Fixing libpq install name..."
|
|
install_name_tool -id "@rpath/libpq.5.dylib" "$LIBPQ_PATH"
|
|
|
|
echo "🔍 Processing binaries in bin/..."
|
|
for binfile in "$BUNDLE_ROOT"/bin/*; do
|
|
[[ -x "$binfile" && ! -d "$binfile" ]] || continue
|
|
echo "➡️ Patching $(basename "$binfile")"
|
|
|
|
# Ensure an rpath to ../lib/postgresql exists
|
|
install_name_tool -add_rpath "@loader_path/../$LIB_SUBDIR" "$binfile" 2>/dev/null || true
|
|
|
|
# Rewrite any absolute reference to libpq
|
|
install_name_tool -change "$BUNDLE_ROOT/$LIB_SUBDIR/libpq.5.dylib" "@rpath/libpq.5.dylib" "$binfile" 2>/dev/null || true
|
|
done
|
|
|
|
echo "✅ Verification:"
|
|
for binfile in "$BUNDLE_ROOT"/bin/*; do
|
|
[[ -x "$binfile" && ! -d "$binfile" ]] || continue
|
|
echo "--- $(basename "$binfile") ---"
|
|
otool -L "$binfile" | grep libpq || echo "⚠️ No libpq linkage"
|
|
otool -l "$binfile" | grep -A2 LC_RPATH | grep path || echo "⚠️ No RPATH"
|
|
done
|
|
```
|
|
|
|
---
|
|
|
|
#### 3.4. Pack the Built Binaries
|
|
|
|
Create a `.txz` archive:
|
|
|
|
```bash
|
|
tar --disable-copyfile --exclude='._*' -cJf darwin-arm64.txz -C darwin-arm64 bin lib share
|
|
```
|
|
|
|
---
|
|
|
|
### For Linux (Ubuntu 24 / amd64 or arm64)
|
|
|
|
#### 3.5. Pre-requisites
|
|
|
|
```bash
|
|
apt update
|
|
apt install -y build-essential wget ca-certificates \
|
|
libreadline-dev zlib1g-dev flex bison \
|
|
libssl-dev patchelf file
|
|
```
|
|
|
|
---
|
|
|
|
#### 3.6. Steps to Build
|
|
|
|
1. Change to the PostgreSQL source directory:
|
|
|
|
```bash
|
|
cd /postgres/source/dir
|
|
```
|
|
|
|
2. Set installation prefix and linker flags:
|
|
|
|
```bash
|
|
export PREFIX=/postgres-binaries-14.19/linux-$(uname -m)
|
|
mkdir -p "$PREFIX"
|
|
export LDFLAGS='-Wl,-rpath,$ORIGIN/../lib/postgresql -Wl,--enable-new-dtags'
|
|
```
|
|
|
|
3. Configure:
|
|
|
|
```bash
|
|
./configure \
|
|
--prefix="$PREFIX" \
|
|
--libdir="$PREFIX/lib/postgresql" \
|
|
--datadir="$PREFIX/share/postgresql" \
|
|
--with-openssl \
|
|
--with-includes=/usr/include \
|
|
--with-libraries=/usr/lib/$(uname -m)-linux-gnu
|
|
```
|
|
|
|
4. Build and install:
|
|
|
|
```bash
|
|
make -j2
|
|
make install
|
|
```
|
|
|
|
5. Build contrib extensions:
|
|
|
|
```bash
|
|
make -C contrib -j2
|
|
make -C contrib install
|
|
```
|
|
|
|
6. Patch RPATHs for relocatability:
|
|
|
|
```bash
|
|
cd "$PREFIX"
|
|
for f in bin/*; do
|
|
if [ -x "$f" ] && file "$f" | grep -q ELF; then
|
|
patchelf --set-rpath '$ORIGIN/../lib/postgresql' "$f"
|
|
fi
|
|
done
|
|
```
|
|
|
|
7. Verify RPATH:
|
|
|
|
```bash
|
|
readelf -d bin/initdb | grep -i rpath
|
|
# → RUNPATH [$ORIGIN/../lib/postgresql]
|
|
```
|
|
|
|
8. Verify linkage:
|
|
|
|
```bash
|
|
ldd bin/initdb | grep libpq
|
|
# → libpq.so.5 => .../bin/../lib/postgresql/libpq.so.5
|
|
```
|
|
|
|
9. Remove `include` directory and unnecessary binaries:
|
|
|
|
```bash
|
|
rm -rf "$PREFIX/include"
|
|
```
|
|
|
|
10. Pack into `.txz`:
|
|
|
|
```bash
|
|
cd $(dirname "$PREFIX")
|
|
tar -cJf postgres-14.19-$(uname -m).txz $(basename "$PREFIX")
|
|
```
|
|
|
|
✅ **Done.**
|