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:
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
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
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-
ARM64 Linux
Windows (MinGW)
Android/Termux
macOS
./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
Backtrace
Bounds checking
DWARF
Debug build
# 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
# 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