Skip to main content
TinyCC provides extensive configuration options to customize the compiler for different platforms, targets, and use cases.

Configuration script

The configure script detects your system and sets appropriate defaults:
./configure [options]
make
sudo make install
Run ./configure --help to see all available options.

Installation paths

Customize where TinyCC is installed:
1

Set installation prefix

# Install to /usr/local (default)
./configure --prefix=/usr/local

# Install to custom location
./configure --prefix=/opt/tcc

# Install to user directory
./configure --prefix=$HOME/.local
2

Configure specific directories

./configure \
  --prefix=/usr \
  --exec-prefix=/usr \
  --bindir=/usr/bin \
  --libdir=/usr/lib \
  --includedir=/usr/include \
  --mandir=/usr/share/man \
  --infodir=/usr/share/info
3

Set TCC directory

The TCC directory contains headers, libraries, and runtime files:
# Default: PREFIX/lib/tcc
./configure --tccdir=/usr/lib/tcc

# Custom location
./configure --tccdir=/opt/tcc/lib

Compiler selection

Configure which compiler builds TinyCC:
# Use GCC (default on Linux)
./configure --cc=gcc

Additional compiler flags

# Add custom CFLAGS
./configure --extra-cflags="-O3 -march=native"

# Add custom LDFLAGS
./configure --extra-ldflags="-static"

# Add extra libraries
./configure --extra-libs="-lmylib"

Target configuration

Cross-compilation setup

Configure TinyCC for cross-compilation:
# Enable cross-compiler builds
./configure --enable-cross

# Specify target CPU
./configure --cpu=arm64

# Specify target OS
./configure --targetos=Darwin

# Set cross-compilation prefix
./configure --cross-prefix=aarch64-linux-gnu-

Platform-specific examples

./configure \
  --cpu=arm64 \
  --cross-prefix=aarch64-linux-gnu- \
  --enable-cross

Library configuration

System paths

Specify system include and library paths:
./configure \
  --sysroot=/usr/arm-linux-gnueabihf \
  --sysincludepaths=/usr/arm-linux-gnueabihf/include \
  --libpaths=/usr/arm-linux-gnueabihf/lib \
  --crtprefix=/usr/arm-linux-gnueabihf/lib
Use colon-separated paths for multiple directories: --libpaths=/lib:/usr/lib:/opt/lib

ELF interpreter

Set the dynamic linker path:
# Standard Linux
./configure --elfinterp=/lib64/ld-linux-x86-64.so.2

# musl libc
./configure --elfinterp=/lib/ld-musl-x86_64.so.1

# FreeBSD
./configure --elfinterp=/libexec/ld-elf.so.1

Triplet configuration

Set the system library triplet:
# x86_64 Linux
./configure --triplet=x86_64-linux-gnu

# ARM hard float
./configure --triplet=arm-linux-gnueabihf

# ARM64 Linux
./configure --triplet=aarch64-linux-gnu

Feature configuration

Debug features

# Enable backtrace support (default)
./configure

# Disable backtrace support
./configure --config-backtrace=no

Library options

# Use libgcc instead of libtcc1.a
./configure --with-libgcc

# Use mmap for executable memory (with SELinux)
./configure --with-selinux

# Build as static library (Windows default)
./configure --enable-static

# Build as shared library (Unix default)
./configure --disable-static

# Disable rpath in shared library
./configure --disable-rpath

Platform-specific options

# Force old Mach-O format (macOS ≤ 10)
./configure --config-new_macho=no

# Use new Mach-O format (macOS ≥ 11)
./configure --config-new_macho=yes

# Enable code signing
./configure --config-codesign=yes

Build options

Control the build process:

Build targets

# Build native compiler only
make

# Build cross-compilers
make cross

# Build specific cross-compiler
make cross-x86_64
make cross-arm64

# Build documentation
make doc

# Build everything
make all

Build flags

# Build from single source file (faster, smaller)
make ONE_SOURCE=yes

# Build from separate object files (default)
make ONE_SOURCE=no

# Silent build
make SILENT=yes

# Verbose build
make SILENT=no

Runtime configuration

TCC switches

Set default switches passed to TCC:
# Add default switches
./configure --tcc-switches="-Wl,-rpath=/opt/lib"

# Multiple switches
./configure --tcc-switches="-I/opt/include -L/opt/lib"

Environment variables

TCC respects these environment variables:
# Include paths
export C_INCLUDE_PATH="/opt/include:/usr/local/include"
export CPATH="/opt/include"

# Library paths
export LIBRARY_PATH="/opt/lib:/usr/local/lib"

# Dynamic linker override
export LD_SO="/lib/ld-linux-x86-64.so.2"

Advanced configuration

Custom configuration file

Create config-extra.mak for custom settings:
# Custom configuration for cross-compilation

# ARM64 configuration
ROOT-arm64 = /usr/aarch64-linux-gnu
CRT-arm64  = {R}/lib
LIB-arm64  = {B}:{R}/lib
INC-arm64  = {B}/include:{R}/include
DEF-arm64  += -D__linux__

# RISC-V configuration
TRIPLET-riscv64 = riscv64-linux-gnu
ROOT-riscv64 = /usr/riscv64-linux-gnu

# Custom CFLAGS for profiling build
CFLAGS_P = $(CFLAGS) -pg -static -DTCC_PROFILE
The makefile automatically includes config-extra.mak if present. Use {B} for TCC directory and {R} for sysroot.

Predefined macros

Control how TCC handles predefined macros:
# Don't compile tccdefs.h (include at runtime)
./configure --config-predefs=no

# Compile tccdefs.h into TCC (default, faster)
./configure

Configuration examples

Minimal build

Smallest possible TCC:
./configure \
  --config-backtrace=no \
  --config-bcheck=no \
  --prefix=/opt/tcc-minimal
make

Development build

For TinyCC development:
./configure \
  --debug \
  --config-dwarf=5 \
  --prefix=$HOME/.local
make

Production cross-compiler

Full-featured cross-compiler setup:
./configure \
  --prefix=/opt/tcc \
  --enable-cross \
  --config-dwarf=4 \
  --extra-cflags="-O2"
make
make cross
sudo make install

Static build

Statically linked TCC:
./configure \
  --prefix=/opt/tcc-static \
  --extra-ldflags="-static" \
  --config-libgcc=yes
make

Verifying configuration

Check configuration after running configure:
# View generated configuration
cat config.mak
cat config.h

# Test TCC version
./tcc -v

# Show TCC search paths
./tcc -vv

# Print configured directories
./tcc -print-search-dirs

Makefile targets

Available make targets:
# Build native TCC
make

# Build cross-compilers
make cross

# Build documentation
make doc

# Build specific cross-compiler
make cross-arm64

Build architecture

Supported build architectures

TinyCC can be built on:
  • i386 - 32-bit x86 (Linux, Windows)
  • x86_64 - 64-bit x86 (Linux, Windows, macOS, BSD)
  • ARM - 32-bit ARM (Linux, BSD)
  • ARM64 - 64-bit ARM (Linux, macOS, BSD)
  • RISC-V 64 - 64-bit RISC-V (Linux)

Architecture detection

The configure script auto-detects your CPU:
# Auto-detect (default)
./configure

# Override detection
./configure --cpu=x86_64
./configure --cpu=arm64
./configure --cpu=riscv64

Troubleshooting

Configuration fails

Common configuration errors:
  • Missing compiler: Install GCC or Clang
  • Missing headers: Install build-essential or development packages
  • Cross-compilation errors: Install cross-compiler toolchain
  • Permission denied: Use sudo for system-wide installation

Fixing configuration issues

# Clean configuration
make distclean

# Reconfigure with verbose output
./configure --help
./configure [options]

# Check compiler availability
which gcc
which clang

# Verify paths exist
ls -la /usr/local/include
ls -la /usr/local/lib

See also

Build docs developers (and LLMs) love