8.8 KiB
Binary Cache
Overview
NIP's binary cache dramatically speeds up builds by storing compiled artifacts. When you rebuild a package with the same configuration, NIP uses the cached artifact instead of recompiling - making builds up to 600x faster!
How It Works
Variant Fingerprinting
Each build configuration gets a unique fingerprint based on:
- USE flags (e.g.,
+python+ruby) - Compiler flags (CFLAGS, LDFLAGS)
- Make options (MAKEOPTS)
- Other build parameters
Example:
# First build with these flags
nip build vim +python+ruby --cflags="-O2"
# → Fingerprint: abc123
# → Build takes 5 minutes
# → Artifact cached
# Second build with same flags
nip build vim +python+ruby --cflags="-O2"
# → Fingerprint: abc123 (same!)
# → Cache hit! <1 second
Cache Lookup
Before building, NIP checks the cache:
- Calculate variant fingerprint from build config
- Look up
package-version-fingerprintin cache - If found and valid → Use cached artifact (instant!)
- If not found → Build from source and cache result
Cache Storage
After successful build:
- Calculate Blake2b checksum of artifact
- Store artifact in cache directory
- Update cache index with metadata
- Track statistics (hits/misses)
Quick Start
Enable Caching
Caching is enabled by default. To configure:
# Edit ~/.nip/config
cache-enabled = true
cache-max-size = 10737418240 # 10GB
cache-max-age = 30 # days
Using the Cache
# Build normally - cache is automatic
nip build vim +python+ruby
# First build: compiles from source (5 minutes)
# Second build: uses cache (<1 second!)
# Force rebuild (skip cache)
nip build vim +python+ruby --no-cache
# Force rebuild and update cache
nip build vim +python+ruby --rebuild
Managing the Cache
# Show cache info
nip cache info
# List cached artifacts
nip cache list
# Show statistics
nip cache stats
# Clean old entries
nip cache clean
# Enforce size limit
nip cache prune
# Clear entire cache
nip cache clear
Cache Commands
Info
$ nip cache info
Binary Cache Information
========================
Location: ~/.cache/nip/binary-cache/
Entries: 15
Total Size: 2.3GB
Size Limit: 10GB
Max Age: 30 days
Statistics:
Hits: 42
Misses: 8
Hit Rate: 84.0%
List
$ nip cache list
Cached Artifacts:
=================
vim-9.0
Variant: abc123def456
Size: 45MB
Cached: 2 days ago
ffmpeg-6.0
Variant: 789ghi012jkl
Size: 120MB
Cached: 1 week ago
emacs-29.1
Variant: 345mno678pqr
Size: 85MB
Cached: 3 days ago
Total: 15 artifacts (2.3GB)
Stats
$ nip cache stats
Cache Statistics:
=================
Entries: 15
Total Size: 2.3GB
Hits: 42
Misses: 8
Hit Rate: 84.0%
Clean
$ nip cache clean
Cleaning old cache entries...
✅ Removed 3 old entries
Prune
$ nip cache prune
Enforcing cache size limit...
✅ Removed 2 entries to stay under size limit
Clear
$ nip cache clear
⚠️ This will remove all cached artifacts
Continue? (y/N): y
✅ Cleared cache (15 entries removed)
Remove
$ nip cache remove vim 9.0
✅ Removed: vim-9.0 (abc123def456)
Verify
$ nip cache verify
Verifying cache integrity...
Verified: 14
Failed: 1
❌ Verification failed: ffmpeg-6.0
Run 'nip cache clean' to remove invalid entries
Configuration
User Configuration
Edit ~/.nip/config:
# Binary cache settings
cache-enabled = true
cache-max-size = 10737418240 # 10GB in bytes
cache-max-age = 30 # days
cache-dir = "~/.cache/nip/binary-cache"
# Cache behavior
cache-auto-clean = true # Clean on startup
cache-verify-on-hit = true # Verify checksums
Command-Line Options
# Disable cache for one build
nip build vim --no-cache
# Force rebuild and update cache
nip build vim --rebuild
# Use specific cache directory
nip build vim --cache-dir=/tmp/nip-cache
Performance
Cache Hit Performance
| Build | Without Cache | With Cache | Speedup |
|---|---|---|---|
| vim | 5 minutes | <1 second | 300x |
| ffmpeg | 15 minutes | <1 second | 900x |
| chromium | 2 hours | <1 second | 7200x |
Cache Miss Performance
Cache misses have minimal overhead:
- Fingerprint calculation: <1ms
- Cache lookup: <10ms
- Total overhead: <20ms
Storage Efficiency
Cached artifacts are stored efficiently:
- Compressed when possible
- Deduplicated via content-addressing
- Automatic cleanup of old entries
Advanced Usage
Variant Fingerprints
# Same package, different variants = different cache entries
nip build vim +python # Fingerprint: abc123
nip build vim +python+ruby # Fingerprint: def456
nip build vim +python -gui # Fingerprint: ghi789
# Each variant is cached separately
Cache Sharing
# Export cache for sharing
tar -czf nip-cache.tar.gz ~/.cache/nip/binary-cache/
# Import cache on another machine
tar -xzf nip-cache.tar.gz -C ~/
# Verify imported cache
nip cache verify
CI/CD Integration
# .gitlab-ci.yml
build:
cache:
paths:
- .cache/nip/binary-cache/
script:
- nip build myapp
- nip test myapp
Remote Cache (Future)
# Configure remote cache server
nip config set cache-remote-url https://cache.example.com
# Builds will automatically use remote cache
nip build vim +python
Troubleshooting
Cache Not Working
# Check if cache is enabled
nip cache info
# Verify cache directory exists
ls -la ~/.cache/nip/binary-cache/
# Check permissions
ls -la ~/.cache/nip/
# Enable verbose logging
nip build vim --verbose
Cache Misses
# Check variant fingerprint
nip build vim +python --dry-run --verbose
# Ensure exact same flags
nip build vim +python+ruby # Different from +ruby+python? No!
# (Flags are sorted, so order doesn't matter)
# Check cache stats
nip cache stats
Verification Failures
# Verify cache integrity
nip cache verify
# Remove invalid entries
nip cache clean
# Clear and rebuild cache
nip cache clear
Disk Space Issues
# Check cache size
nip cache info
# Enforce size limit
nip cache prune
# Reduce max size
nip config set cache-max-size 5368709120 # 5GB
# Clean old entries
nip cache clean
Best Practices
1. Regular Cleanup
# Add to cron or systemd timer
nip cache clean
nip cache prune
2. Appropriate Size Limit
# For development machines: 10-20GB
nip config set cache-max-size 21474836480 # 20GB
# For CI servers: 50-100GB
nip config set cache-max-size 107374182400 # 100GB
# For laptops: 5GB
nip config set cache-max-size 5368709120 # 5GB
3. Verify Periodically
# Weekly verification
nip cache verify
# Auto-clean invalid entries
nip cache clean
4. Monitor Hit Rate
# Check hit rate
nip cache stats
# Good hit rate: >70%
# Low hit rate: <30% (consider your build patterns)
Security
Checksum Verification
All cached artifacts are verified with Blake2b checksums:
- Calculated on storage
- Verified on retrieval
- Automatic rejection of corrupted artifacts
Isolation
Cache is user-specific:
- Located in
~/.cache/nip/binary-cache/ - No system-wide cache (prevents privilege escalation)
- Each user has their own cache
Integrity
# Verify cache integrity
nip cache verify
# Remove corrupted entries
nip cache clean
Examples
Development Workflow
# First build
nip build myapp +debug
# → 10 minutes
# Make code changes, rebuild
nip build myapp +debug
# → <1 second (cache hit!)
# Change flags, rebuild
nip build myapp +debug+profiling
# → 10 minutes (different variant)
# Revert flags
nip build myapp +debug
# → <1 second (cache hit again!)
Testing Configurations
# Test different configurations quickly
nip build vim +python # 5 min first time
nip build vim +python+ruby # 5 min first time
nip build vim +python+lua # 5 min first time
# Later, test again
nip build vim +python # <1 sec (cached!)
nip build vim +python+ruby # <1 sec (cached!)
nip build vim +python+lua # <1 sec (cached!)
CI/CD Pipeline
# CI builds same configuration repeatedly
nip build myapp +production
# → First run: 15 minutes
# → Subsequent runs: <1 second
# Massive time savings in CI!
Summary
Binary caching provides:
✅ 600x faster rebuilds - Cache hits are instant ✅ Automatic - No configuration needed ✅ Intelligent - Variant-aware fingerprinting ✅ Secure - Checksum verification ✅ Manageable - Easy cleanup and maintenance ✅ Efficient - Automatic size management
Get started:
# Just build normally - caching is automatic!
nip build vim +python+ruby
The cache handles everything automatically. Enjoy lightning-fast rebuilds! ⚡