Lean 4.23.0 on FreeBSD 14.3-RELEASE
Table of Contents
1. Overview
This document records the steps required to get Lean 4.23.0 working on FreeBSD 14.3-RELEASE (amd64).
2. System Information
uname -srm
FreeBSD 14.3-RELEASE amd64
3. Problem Statement
The FreeBSD lean4 package (version 4.23.0) fails to run with the error:
$ lean --version error: failed to locate application
The lake build tool also fails with:
$ lake build error: could not detect the configuration of the Lake installation
4. Root Cause Analysis
Using truss to trace system calls reveals the issue:
truss lean --version 2>&1 | grep -E "(readlink|error)"
Output:
readlink("/proc/80630/file",0x82076b5e0,1024) ERR#2 'No such file or directory'
error: failed to locate application
4.1. The Problem
Lean 4 uses /proc/<pid>/file to determine its own executable path at runtime. This is a Linux-style procfs feature that FreeBSD supports, but only when procfs is mounted.
By default, FreeBSD does not mount procfs at /proc.
5. Solution
5.1. Step 1: Check current procfs status
mount | grep proc
linprocfs on /compat/linux/proc (linprocfs, local) procfs on /proc (procfs, local)
5.2. Step 2: Add procfs to /etc/fstab (if not present)
# Check if procfs line exists in fstab
if ! grep -q "^proc /proc procfs" /etc/fstab; then
echo "Adding procfs to /etc/fstab..."
echo 'proc /proc procfs rw 0 0' | sudo tee -a /etc/fstab
else
echo "procfs already in /etc/fstab"
fi
5.3. Step 3: Mount procfs (if not mounted)
# Mount procfs if not already mounted
if ! mount | grep -q "^procfs on /proc"; then
echo "Mounting procfs..."
sudo mount /proc
else
echo "procfs already mounted"
fi
5.4. Step 4: Verify procfs is working
ls -la /proc/$$ | head -5
total 0 dr-xr-xr-x 1 jwalsh jwalsh 0 Jan 1 19:30 . dr-xr-xr-x 1 root wheel 0 Jan 1 19:04 .. -r--r--r-- 1 jwalsh jwalsh 0 Jan 1 19:30 cmdline -rw------- 1 jwalsh jwalsh 0 Jan 1 19:30 dbregs
6. Validation
6.1. Lean Version
lean --version
Lean (version 4.23.0, x86_64-unknown-freebsd14.3, Release)
6.2. Lake Version
lake --version
Lake version 5.0.0-src (Lean version 4.23.0)
6.3. Package Information
pkg info lean4 | grep -E "Name|Version|Flat size"
Name : lean4 Version : 4.23.0 Flat size : 1.90GiB
7. Test Case: Building a Lean Project
7.1. Create a simple Lean file
-- Simple Lean 4 test
def hello := "Hello from Lean 4 on FreeBSD!"
#eval IO.println hello
-- Basic proof
theorem add_comm (a b : Nat) : a + b = b + a := Nat.add_comm a b
#check add_comm
7.2. Build and run
# Create test directory
mkdir -p /tmp/lean-test
cd /tmp/lean-test
# Create lakefile
cat > lakefile.lean << 'EOF'
import Lake
open Lake DSL
package «lean-test» where
version := v!"0.1.0"
@[default_target]
lean_exe «test» where
root := `test
EOF
# Create lean-toolchain
echo "leanprover/lean4:v4.23.0" > lean-toolchain
# Create test.lean
cat > test.lean << 'EOF'
def main : IO Unit := do
IO.println "Hello from Lean 4 on FreeBSD!"
IO.println s!"1 + 1 = {1 + 1}"
EOF
# Build
lake build 2>&1 | tail -3
# Run if build succeeded
if [ -f .lake/build/bin/test ]; then
.lake/build/bin/test
fi
8. Complete Setup Script
This script can be tangled and executed to set up Lean 4 on FreeBSD:
#!/bin/sh
# Lean 4 FreeBSD Setup Script
# Ensures procfs is mounted for Lean 4 to work
set -e
echo "=== Lean 4 FreeBSD Setup ==="
echo ""
# Check if running as root for fstab modification
check_root() {
if [ "$(id -u)" -ne 0 ]; then
echo "Note: Run with sudo for fstab modification"
return 1
fi
return 0
}
# Add procfs to fstab if needed
setup_fstab() {
if ! grep -q "^proc /proc procfs" /etc/fstab 2>/dev/null; then
if check_root; then
echo "Adding procfs to /etc/fstab..."
echo 'proc /proc procfs rw 0 0' >> /etc/fstab
echo "Done."
else
echo "Add this line to /etc/fstab:"
echo " proc /proc procfs rw 0 0"
fi
else
echo "procfs already in /etc/fstab"
fi
}
# Mount procfs if needed
mount_procfs() {
if ! mount | grep -q "^procfs on /proc"; then
if check_root; then
echo "Mounting procfs..."
mount /proc
echo "Done."
else
echo "Run: sudo mount /proc"
fi
else
echo "procfs already mounted"
fi
}
# Verify Lean works
verify_lean() {
echo ""
echo "=== Verification ==="
if command -v lean >/dev/null 2>&1; then
echo "Lean version:"
lean --version
echo ""
echo "Lake version:"
lake --version
else
echo "Lean not found. Install with: pkg install lean4"
fi
}
# Main
setup_fstab
mount_procfs
verify_lean
echo ""
echo "=== Setup Complete ==="
9. Notes for Future Reference
- procfs is required: Lean 4 will not work without
/procmounted - This is not a packaging bug: The FreeBSD port is correctly built; the runtime dependency on procfs is undocumented
- Persists across reboots: Adding to /etc/fstab ensures procfs is mounted at boot
- elan not available: The elan version manager does not have FreeBSD binaries; use the pkg instead
10. Related Links
- Veil DSL Workshop - Where this was discovered
- FreeBSD lean4 port
- Lean 4 Official Site
- POPL 2026 Veil Tutorial
11. Appendix: Full Diagnostic Commands
echo "=== Full System Info ==="
echo "OS: $(uname -srm)"
echo "Lean: $(lean --version 2>&1)"
echo "Lake: $(lake --version 2>&1)"
echo "procfs: $(mount | grep 'procfs on /proc' || echo 'NOT MOUNTED')"
echo "pkg: $(pkg info lean4 2>&1 | grep Version || echo 'NOT INSTALLED')"
=== Full System Info === OS: FreeBSD 14.3-RELEASE amd64 Lean: Lean (version 4.23.0, x86_64-unknown-freebsd14.3, Release) Lake: Lake version 5.0.0-src (Lean version 4.23.0) procfs: procfs on /proc (procfs, local) pkg: Version : 4.23.0