When running ./configure, you'll often need to specify paths to dependencies. The most common options are:
./configure \
--prefix=/usr/local \
--with-openssl=/usr/local/opt/openssl \
--without-sqlite \
CFLAGS="-I/usr/local/include" \
LDFLAGS="-L/usr/local/lib"
To discover available options, always check:
./configure --help | less
Linux and OSX handle shared libraries differently:
Linux:
- Standard paths: /usr/lib, /usr/local/lib, /lib
- Config file: /etc/ld.so.conf
- Cache: /etc/ld.so.cache (updated via
ldconfig)
OSX:
- Standard paths: /usr/lib, /usr/local/lib
- Frameworks: /Library/Frameworks, ~/Library/Frameworks
- DYLD_LIBRARY_PATH environment variable
Static linking isn't always better despite modern hardware:
# Static linking example (gcc)
gcc -static -o myapp myapp.c -lm
# Dynamic linking example
gcc -o myapp myapp.c -lm
Key differences:
| Static | Dynamic |
|---|---|
| Larger binaries | Smaller binaries |
| No runtime dependencies | Requires compatible libs |
| No security updates | Can update libraries |
Essential commands for library discovery:
# Linux
ldconfig -p | grep openssl
dpkg -l | grep libssl
apt-cache show libssl-dev
# OSX
otool -L /usr/bin/curl
pkg-config --modversion openssl
Using environment modules for version isolation:
# Example using modulefiles
module load python/3.8.5
module load gcc/9.3.0
# Or using containers
docker run -it ubuntu:20.04 bash
Best practices when mixing source and package installs:
# Recommended prefix structure
./configure --prefix=/usr/local/stow/package-1.2.3
make
sudo make install
cd /usr/local/stow
sudo stow package-1.2.3
Creating distributable packages:
# Linux DEB package example
checkinstall -D make install
# OSX Homebrew formula template
class MyTool < Formula
desc "Description"
homepage "https://example.com"
url "https://example.com/my-tool-1.0.tar.gz"
sha256 "abc123..."
depends_on "openssl"
def install
system "./configure", "--prefix=#{prefix}"
system "make", "install"
end
end
Master these utilities:
ldd(Linux) /otool -L(OSX) - Show library dependenciesobjdump- Inspect object filesnm- List symbols in object filespkg-config- Get compile flags for librariesstrace/dtruss- Trace system calls
When running ./configure, you'll typically want to pass these types of arguments:
# Common configure flags
./configure \
--prefix=/usr/local/package-version \
--with-library=/path/to/dependency \
--enable-feature \
--disable-unneeded-component
To discover available options:
./configure --help | less
On Unix-like systems, shared libraries follow these conventions:
- Linux:
/usr/lib,/usr/local/lib - OSX:
/usr/lib,/Library/Frameworks - Search paths defined in
/etc/ld.so.conf(Linux) orDYLD_LIBRARY_PATH(OSX)
Example of checking library dependencies:
# Linux
ldd /path/to/binary
# OSX
otool -L /path/to/binary
Key differences:
| Static | Shared |
|---|---|
| Code copied into executable | Code loaded at runtime |
| No version conflicts | Smaller disk footprint |
Why not always static link? Security updates become impossible without recompiling every dependent binary.
Use environment modules or containerization:
# Using module environment
module load libfoo/1.2
./configure --with-foo=$FOO_ROOT
# With Docker
FROM ubuntu:20.04
RUN apt-get install libfoo1.2-dev
COPY . /app
RUN ./configure && make
Best practices:
# Install to isolated prefix
./configure --prefix=/opt/local
make
sudo make install
# Then add to PATH
export PATH="/opt/local/bin:$PATH"
pkg-config: Query installed packagesmake -n: Dry run of build processstrace/truss: Trace system calls during build
Example of pkg-config usage:
# Get compilation flags for a library
CFLAGS=$(pkg-config --cflags libssl)
LDFLAGS=$(pkg-config --libs libssl)
For OSX homebrew:
class MyPackage < Formula
desc "Description"
url "https://example.com/package-1.0.tar.gz"
depends_on "openssl"
def install
system "./configure", "--prefix=#{prefix}"
system "make", "install"
end
end