CMD: build
The pig build command is a powerful tool that simplifies the entire workflow of building PostgreSQL extensions from source. It provides a complete build infrastructure setup, dependency management, and compilation environment for both standard and custom PostgreSQL extensions across different operating systems.
Subcommands
| Command | Description |
|---|---|
spec |
Initialize building spec repo |
repo |
Initialize required repos |
tool |
Initialize build tools |
rust |
Install Rust toolchain |
pgrx |
Install and initialize pgrx (requires Rust) |
proxy |
Initialize build proxy |
get |
Download source code tarball |
dep |
Install extension build dependencies |
ext |
Build extension package |
pkg |
Complete build pipeline: get, dep, ext |
Overview
Build Postgres Extension
Usage:
pig build [command]
Aliases:
build, b
Examples:
pig build - Build Postgres Extension
Environment Setup:
pig build spec # init build spec and directory (~ext)
pig build repo # init build repo (=repo set -ru)
pig build tool [mini|full|...] # init build toolset
pig build rust [-y] # install Rust toolchain
pig build pgrx [-v <ver>] # install & init pgrx (0.16.1)
pig build proxy [id@host:port ] # init build proxy (optional)
Package Building:
pig build pkg [ext|pkg...] # complete pipeline: get + dep + ext
pig build get [ext|pkg...] # download extension source tarball
pig build dep [ext|pkg...] # install extension build dependencies
pig build ext [ext|pkg...] # build extension package
Quick Start:
pig build spec # setup build spec and directory
pig build pkg citus # build citus extension
Available Commands:
dep Install extension build dependencies
ext Build extension package
get Download source code tarball
pgrx Install and initialize pgrx (requires Rust)
pkg Complete build pipeline: get, dep, ext
proxy Initialize build proxy
repo Initialize required repos
rust Install Rust toolchain
spec Initialize building spec repo
tool Initialize build tools
Flags:
-h, --help help for build
Global Flags:
--debug enable debug mode
-H, --home string pigsty home path
-i, --inventory string config inventory path
--log-level string log level: debug, info, warn, error, fatal, panic (default "info")
--log-path string log file path, terminal by defaultQuick Start
The fastest way to set up a build environment and build an extension:
# Step 1: Initialize build specifications
pig build spec
# Step 2: Build an extension (complete pipeline)
pig build pkg citus
# The built package will be available in:
# - EL: ~/rpmbuild/RPMS/
# - Debian: ~/For a more controlled approach:
# Setup environment
pig build spec # Initialize build specs
pig build repo # Setup repositories
pig build tool # Install build tools
# Build process
pig build get citus # Download source
pig build dep citus # Install dependencies
pig build ext citus # Build package
# Or do all three steps at once
pig build pkg citus # get + dep + extBuild Infrastructure
Build Specifications
The build system uses specification files that define how each extension should be built. These specs include:
- Source code location and version
- Build dependencies
- Compilation flags
- PostgreSQL version compatibility
- Platform-specific build instructions
Directory Structure
~/ext/ # Default build spec directory
├── Makefile # Master build makefile
├── <extension>/ # Per-extension directory
│ ├── Makefile # Extension-specific makefile
│ ├── <extension>.spec # RPM spec file (EL)
│ └── debian/ # Debian packaging files
│ ├── control
│ ├── rules
│ └── ...Build output locations:
- EL Systems:
~/rpmbuild/RPMS/<arch>/ - Debian Systems:
~/(deb files)
Command Reference
build spec
Sets up the build specification repository and directory structure.
pig build spec # Initialize at default location ~/extWhat it does:
- Clones or updates the extension build spec repository
- Creates necessary directory structure
- Sets up makefiles and build scripts
- Prepares platform-specific packaging files
Repository Location:
- Default:
~/ext/ - Contains build specifications for 100+ extensions
Example:
# Initialize specs
pig build spec
# Check available extensions
ls ~/ext/
# View specific extension spec
cat ~/ext/citus/Makefilebuild repo
Initializes required package repositories for building extensions.
pig build repo # Equivalent to: pig repo set -ruWhat it does:
- Removes existing repositories
- Adds all required repositories (pgdg, pigsty, node)
- Updates package cache
This ensures you have access to all necessary packages and dependencies for building.
build tool
Installs the necessary development tools and compilers.
pig build tool # Install default toolset
pig build tool mini # Minimal toolset
pig build tool full # Complete toolset
pig build tool rust # Add Rust development toolsTool Packages:
Minimal (mini):
- GCC/Clang compiler
- Make and build essentials
- PostgreSQL development headers
- Basic libraries
Default:
- All minimal tools
- Additional compilers (g++, clang++)
- Development libraries
- Packaging tools (rpmbuild, dpkg-dev)
Full (full):
- All default tools
- Language-specific tools (Python, Perl, Ruby dev)
- Advanced debugging tools
- Performance analysis tools
Common packages installed:
# EL Systems
gcc gcc-c++ make cmake
postgresql17-devel
rpm-build rpmdevtools
git wget curl
# Debian Systems
build-essential
postgresql-server-dev-17
dpkg-dev debhelper
git wget curlbuild rust
Installs the Rust programming language toolchain, required for Rust-based extensions.
pig build rust # Install with confirmation
pig build rust -y # Auto-confirm installationWhat it installs:
- Rust compiler (rustc)
- Cargo package manager
- Rust standard library
- Development tools
Installation method:
- Uses rustup installer
- Installs to user home directory
- Automatically configures PATH
Example:
# Install Rust
pig build rust -y
# Verify installation
rustc --version
cargo --versionbuild pgrx
Installs and initializes PGRX (PostgreSQL extension framework for Rust).
pig build pgrx # Install latest stable (0.16.1)
pig build pgrx -v 0.15.0 # Install specific versionPrerequisites:
- Rust toolchain must be installed first
- PostgreSQL development headers
What it does:
- Installs cargo-pgrx tool
- Initializes PGRX for installed PostgreSQL versions
- Sets up development environment
Example:
# Install Rust first
pig build rust -y
# Install PGRX
pig build pgrx
# Initialize for specific PG versions
cargo pgrx init --pg17=/usr/pgsql-17/bin/pg_configbuild proxy
Sets up proxy configuration for build environments with restricted internet access.
pig build proxy # Interactive setup
pig build proxy user@host:8080 # Direct configuration
pig build proxy http://proxy.company.com:3128Configures proxy for:
- System environment (HTTP_PROXY, HTTPS_PROXY)
- Package managers (yum/dnf, apt)
- Build tools (cargo, npm, pip)
- Git configuration
Example:
# Setup corporate proxy
pig build proxy proxy.corp.com:8080
# With authentication
pig build proxy user:[email protected]:8080build get
Downloads extension source code tarballs.
pig build get citus # Single extension
pig build get citus pgvector # Multiple extensions
pig build get all # All available extensions
pig build get std # Standard extensionsSource locations:
- Downloads to:
~/ext/<extension>/ - Source types:
- Release tarballs from GitHub
- Official project downloads
- Source repositories
Example:
# Download specific version
pig build get citus
# Check downloaded source
ls ~/ext/citus/*.tar.gzbuild dep
Installs required dependencies for building extensions.
pig build dep citus # Single extension
pig build dep citus pgvector # Multiple extensions
pig build dep citus --pg 17,16 # For specific PG versionsOptions:
--pg: Comma-separated PostgreSQL versions (e.g., ‘17,16’)
Dependency types:
- Build tools (compilers, make)
- Development libraries
- PostgreSQL headers
- Extension-specific requirements
Example:
# Install dependencies for Citus
pig build dep citus
# For multiple PostgreSQL versions
pig build dep citus --pg 17,16,15build ext
Compiles the extension and creates installation packages.
pig build ext citus # Build single extension
pig build ext citus pgvector # Build multiple
pig build ext citus --pg 17 # For specific PG version
pig build ext citus -s # With debug symbols (RPM only)Options:
--pg: Target PostgreSQL versions-s, --symbol: Include debug symbols
Build process:
- Extracts source code
- Configures build environment
- Compiles extension
- Creates platform package (RPM/DEB)
- Signs package (if configured)
Output locations:
- EL:
~/rpmbuild/RPMS/<arch>/*.rpm - Debian:
~/*.deb
Example:
# Build Citus for PostgreSQL 17
pig build ext citus --pg 17
# Check built package
ls ~/rpmbuild/RPMS/x86_64/citus*.rpm # EL
ls ~/citus*.deb # Debianbuild pkg
Executes the complete build pipeline: download, dependencies, and build.
pig build pkg citus # Build single extension
pig build pkg citus pgvector # Build multiple
pig build pkg citus --pg 17,16 # For multiple PG versions
pig build pkg citus -s # With debug symbolsEquivalent to running:
pig build get <extension>
pig build dep <extension>
pig build ext <extension>Options:
--pg: Target PostgreSQL versions-s, --symbol: Include debug symbols
Example:
# Complete build pipeline
pig build pkg citus --pg 17
# Build multiple extensions
pig build pkg citus pg_partman timescaledbCommon Workflows
Workflow 1: Building Standard Extension
# 1. Setup build environment (once)
pig build spec
pig build repo
pig build tool
# 2. Build extension
pig build pkg pg_partman
# 3. Install built package
sudo rpm -ivh ~/rpmbuild/RPMS/x86_64/pg_partman*.rpm # EL
sudo dpkg -i ~/pg_partman*.deb # DebianWorkflow 2: Building Rust Extension
# 1. Setup Rust environment
pig build spec
pig build tool
pig build rust -y
pig build pgrx
# 2. Build Rust extension
pig build pkg pgmq
# 3. Install
sudo pig ext add pgmqWorkflow 3: Building Multiple Versions
# Build extension for multiple PostgreSQL versions
pig build pkg citus --pg 15,16,17
# Results in packages for each version:
# citus_15-*.rpm
# citus_16-*.rpm
# citus_17-*.rpmWorkflow 4: Custom Extension Build
# 1. Create custom spec
mkdir ~/ext/myextension
cd ~/ext/myextension
# 2. Create Makefile
cat > Makefile << 'EOF'
EXTENSION = myextension
VERSION = 1.0.0
REPO_URL = https://github.com/myorg/myextension
include ../Makefile
EOF
# 3. Build
pig build pkg myextensionWorkflow 5: Debugging Build Issues
# Build with debug output
pig build pkg citus --debug
# Build with debug symbols
pig build pkg citus -s
# Step-by-step debugging
pig build get citus # Check source download
pig build dep citus # Verify dependencies
pig build ext citus --debug # Debug compilationWorkflow 6: Building for Distribution
# 1. Build multiple extensions
extensions="citus pg_partman timescaledb pgvector"
for ext in $extensions; do
pig build pkg $ext --pg 16,17
done
# 2. Collect packages
mkdir ~/packages
cp ~/rpmbuild/RPMS/x86_64/*.rpm ~/packages/ # EL
cp ~/*.deb ~/packages/ # Debian
# 3. Create repository
pig repo create ~/packages
# 4. Distribute
tar czf extensions.tar.gz ~/packagesExtension Build Specifications
Standard Extensions
Extensions with official build support:
- Distributed: citus, pg_partman
- Time-series: timescaledb, pg_cron
- Analytics: pg_duckdb, parquet_fdw
- Search: pgroonga, pg_bigm
- Languages: plpython3, plperl, pltcl
Build Requirements
Different extensions have different requirements:
Simple C Extensions:
- PostgreSQL development headers
- C compiler (gcc/clang)
- Make
Complex Extensions:
- Additional libraries (e.g., GDAL for PostGIS)
- Language runtimes (Python, Perl, etc.)
- Special compilers (Rust, Go)
Rust Extensions (via PGRX):
- Rust toolchain
- PGRX framework
- Cargo build system
Platform Differences
EL Systems (RHEL/Rocky/Alma):
- Uses RPM spec files
- Builds with rpmbuild
- Outputs to ~/rpmbuild/RPMS/
Debian/Ubuntu Systems:
- Uses debian/ directory structure
- Builds with dpkg-buildpackage
- Outputs to ~/
Troubleshooting
Build Tools Not Found
# Install build tools
pig build tool
# For specific compiler
sudo dnf groupinstall "Development Tools" # EL
sudo apt install build-essential # DebianMissing Dependencies
# Install extension dependencies
pig build dep <extension>
# Check error messages for specific packages
# Install manually if needed
sudo dnf install <package> # EL
sudo apt install <package> # DebianPostgreSQL Headers Not Found
# Install PostgreSQL development package
sudo pig ext install pg17-devel
# Or specify pg_config path
export PG_CONFIG=/usr/pgsql-17/bin/pg_configRust/PGRX Issues
# Reinstall Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Update PGRX
cargo install cargo-pgrx --force
# Reinitialize PGRX
cargo pgrx initSource Download Failures
# Check network/proxy
pig build proxy
# Download manually
cd ~/ext/<extension>
wget <source_url>
# Continue build
pig build dep <extension>
pig build ext <extension>Build Failures
# Check build logs
tail -f ~/rpmbuild/BUILD/*/config.log # EL
# Common fixes:
# 1. Update build tools
pig build tool full
# 2. Clear build cache
rm -rf ~/rpmbuild/BUILD/*
# 3. Try with different PG version
pig build pkg <extension> --pg 16Best Practices
-
Setup Once, Build Many: Initialize the build environment once, then build multiple extensions
-
Use pkg Command: For standard builds, use
pig build pkgfor the complete pipeline -
Check Compatibility: Verify extension supports your PostgreSQL version before building
-
Keep Specs Updated: Regularly update build specs with
pig build spec -
Test Builds: Test built packages in development before production deployment
-
Document Custom Builds: Keep notes on custom build flags or modifications
-
Use Version Control: Track custom build specs in version control
-
Parallel Builds: Build independent extensions in parallel for efficiency
-
Cache Dependencies: Keep commonly used dependencies installed to speed up builds
-
Sign Packages: For distribution, sign packages with GPG for security
Advanced Topics
Custom Build Flags
# Set custom CFLAGS
export CFLAGS="-O3 -march=native"
pig build ext <extension>
# PostgreSQL-specific flags
export PG_CPPFLAGS="-DUSE_SPECIAL_FEATURE"
pig build ext <extension>Cross-Compilation
# For different architecture
export CC=aarch64-linux-gnu-gcc
export ARCH=arm64
pig build ext <extension>Debugging Symbols
# Build with debug symbols
pig build ext <extension> -s
# For debugging
export CFLAGS="-g -O0"
pig build ext <extension>Custom PostgreSQL Builds
# For custom PostgreSQL installation
export PG_CONFIG=/opt/postgresql/bin/pg_config
export PKG_CONFIG_PATH=/opt/postgresql/lib/pkgconfig
pig build ext <extension>Continuous Integration
#!/bin/bash
# CI build script
set -e
# Setup
pig build spec
pig build tool
# Build matrix
for pg_version in 15 16 17; do
for extension in citus pgvector timescaledb; do
pig build pkg $extension --pg $pg_version
done
done
# Test installations
for rpm in ~/rpmbuild/RPMS/x86_64/*.rpm; do
sudo rpm -Uvh --test $rpm
doneExtension Build Matrix
Commonly Built Extensions
| Extension | Type | Build Time | Complexity | Special Requirements |
|---|---|---|---|---|
| pg_repack | C | Fast | Simple | None |
| pg_partman | SQL/PLPGSQL | Fast | Simple | None |
| citus | C | Medium | Medium | None |
| timescaledb | C | Slow | Complex | CMake |
| postgis | C | Very Slow | Complex | GDAL, GEOS, Proj |
| pg_duckdb | C++ | Medium | Medium | C++17 compiler |
| pgroonga | C | Medium | Medium | Groonga library |
| pgvector | C | Fast | Simple | None |
| plpython3 | C | Medium | Medium | Python dev |
| pgrx extensions | Rust | Slow | Complex | Rust, PGRX |