# Bootstrap Detection Flow ## Overview The NIP bootstrap system automatically detects the best available build tool installation method based on the current system state. This document describes the detection logic, fallback mechanisms, and decision flow. ## Detection Hierarchy The system follows this priority order when determining how to install build tools: 1. **Native Package Manager** (Highest Priority) 2. **Existing Bootstrap Installation** (Already installed) 3. **Recipe-Based Bootstrap** (Automatic download and install) 4. **Container-Based Build** (Fallback for complex scenarios) 5. **Manual Installation** (Last resort - user guidance) ## Flow Diagram ``` User runs: nip build | v [Check Build Tools] | +---> Tools Available? --YES--> [Proceed with Build] | NO | v [Automatic Detection] | +---> Check Native Package Manager | (pacman, apt, dnf, etc.) | | | +---> Available? --YES--> [Install via Package Manager] | | | v NO [Verify Installation] | | v v [Check Existing Bootstrap] [Proceed with Build] | +---> Bootstrap Installed? --YES--> [Verify and Use] | | NO v | [Proceed with Build] v [Recipe-Based Bootstrap] | +---> Select Recipe by Platform | (Nix, PKGSRC, Gentoo) | | | v | [Download Binary] | | | v | [Verify Checksum] | | | v | [Install to ~/.nip/bootstrap/] | | | v | [Create Wrappers] | | | v | [Verify Installation] | | | +---> Success? --YES--> [Proceed with Build] | NO | v [Container Fallback] | +---> Podman Available? --YES--> [Build in Container] | | | v NO [Extract Artifacts] | | v v [Manual Installation Guide] [Proceed with Build] | v [Show Instructions] | v [Exit with Error] ``` ## Detection Logic Details ### 1. Native Package Manager Detection **Purpose**: Use system package manager when available for official support and updates. **Detection Method**: ```nim proc detectNativePackageManager(): Option[string] = # Check for common package managers if commandExists("pacman"): return some("pacman") if commandExists("apt-get"): return some("apt") if commandExists("dnf"): return some("dnf") if commandExists("zypper"): return some("zypper") return none(string) ``` **Installation Commands**: - **Arch Linux**: `pacman -S --needed base-devel` - **Debian/Ubuntu**: `apt-get install build-essential` - **Fedora**: `dnf groupinstall "Development Tools"` - **openSUSE**: `zypper install -t pattern devel_basis` **Advantages**: - Official packages with security updates - System integration and dependency management - No additional maintenance required **When Used**: - System has a recognized package manager - User has appropriate permissions (or can use sudo) - Package manager has build tools available ### 2. Existing Bootstrap Check **Purpose**: Avoid redundant installations if bootstrap tools are already present. **Detection Method**: ```nim proc checkExistingBootstrap(): BootstrapStatus = let bootstrapDir = getHomeDir() / ".nip" / "bootstrap" # Check for Nix if fileExists(bootstrapDir / "nix" / "bin" / "nix-build"): if verifyNixInstallation(bootstrapDir / "nix"): return BootstrapStatus(kind: bsNix, path: bootstrapDir / "nix") # Check for PKGSRC if fileExists(bootstrapDir / "pkgsrc" / "bin" / "bmake"): if verifyPkgsrcInstallation(bootstrapDir / "pkgsrc"): return BootstrapStatus(kind: bsPkgsrc, path: bootstrapDir / "pkgsrc") # Check for Gentoo if fileExists(bootstrapDir / "gentoo" / "bin" / "emerge"): if verifyGentooInstallation(bootstrapDir / "gentoo"): return BootstrapStatus(kind: bsGentoo, path: bootstrapDir / "gentoo") return BootstrapStatus(kind: bsNone) ``` **Verification Steps**: 1. Check binary exists and is executable 2. Test basic functionality (version check) 3. Verify required dependencies are present 4. Confirm configuration is valid **When Used**: - Previous bootstrap installation detected - Installation passes verification checks - No user override requested ### 3. Recipe-Based Bootstrap **Purpose**: Automatically download and install minimal build tools without manual intervention. **Platform Selection Logic**: ```nim proc selectBootstrapRecipe(): string = # Platform-specific preferences when defined(linux): # Check distribution let distro = detectLinuxDistro() case distro of "arch", "manjaro": return "nix" # Lightweight, no conflicts with pacman of "debian", "ubuntu": return "nix" # Clean isolation from apt of "gentoo": return "gentoo" # Native toolchain of "nixos": return "nix" # Already Nix-based else: return "nix" # Default to Nix for most Linux when defined(macos): return "nix" # Best macOS support when defined(bsd): return "pkgsrc" # Native BSD tool # Fallback return "nix" ``` **Installation Flow**: 1. **Recipe Selection**: Choose appropriate recipe for platform 2. **Download**: Fetch minimal binary from trusted source 3. **Verification**: Validate Blake2b-512 checksum 4. **Extraction**: Unpack to `~/.nip/bootstrap//` 5. **Configuration**: Run setup scripts 6. **Wrapper Creation**: Create convenience wrappers in `~/.nip/bin/` 7. **Verification**: Test installation functionality 8. **PATH Update**: Add to user's PATH if needed **Advantages**: - Fully automatic, no user intervention - Isolated installation (no system pollution) - Cryptographically verified binaries - Consistent across platforms **When Used**: - No native package manager available - User prefers isolated installation - System package manager lacks build tools - Cross-platform consistency needed ### 4. Container Fallback **Purpose**: Provide isolated build environment when native tools unavailable or problematic. **Container Runtime Detection**: ```nim proc detectContainerRuntime(): Option[ContainerRuntime] = # Prefer Podman (rootless, daemonless) if commandExists("podman"): return some(ContainerRuntime.Podman) # Fall back to Docker if commandExists("docker"): return some(ContainerRuntime.Docker) # Try containerd with nerdctl if commandExists("nerdctl"): return some(ContainerRuntime.Containerd) return none(ContainerRuntime) ``` **Build Process**: 1. **Image Selection**: Choose appropriate base image (Gentoo, Alpine, etc.) 2. **Container Creation**: Spin up isolated build environment 3. **Source Mounting**: Mount package source into container 4. **Build Execution**: Run build inside container 5. **Artifact Extraction**: Copy built packages out 6. **Cleanup**: Remove container and temporary files **Advantages**: - Complete isolation from host system - Reproducible builds - No host system modification - Works when native tools fail **When Used**: - Recipe-based bootstrap fails - Complex build requirements - User explicitly requests container build - System incompatibilities detected ### 5. Manual Installation Guide **Purpose**: Provide clear instructions when automatic methods fail. **Guidance Provided**: ``` Build tools are required but could not be installed automatically. Please install one of the following: Option 1: Nix Package Manager (Recommended) curl -L https://nixos.org/nix/install | sh Option 2: PKGSRC Bootstrap Download: https://pkgsrc.org/bootstrap/ Follow platform-specific instructions Option 3: System Package Manager Arch Linux: sudo pacman -S base-devel Debian/Ubuntu: sudo apt-get install build-essential Fedora: sudo dnf groupinstall "Development Tools" After installation, run: nip build ``` **When Used**: - All automatic methods failed - No container runtime available - User needs to understand requirements - Platform not supported by recipes ## User Control and Overrides ### Command-Line Options Users can override automatic detection: ```bash # Force specific bootstrap method nip build --bootstrap=nix nip build --bootstrap=pkgsrc nip build --bootstrap=container # Skip bootstrap and use system tools nip build --no-bootstrap # Force re-bootstrap even if installed nip build --force-bootstrap ``` ### Configuration File Set preferences in `~/.nip/config.kdl`: ```kdl bootstrap { # Preferred method: "auto", "nix", "pkgsrc", "gentoo", "container", "system" preferred "auto" # Allow automatic installation auto-install true # Container runtime preference container-runtime "podman" # Installation directory install-dir "~/.nip/bootstrap" } ``` ## Error Handling and Recovery ### Detection Failures **Scenario**: Cannot detect any suitable method **Response**: 1. Log detailed detection results 2. Show manual installation guide 3. Suggest container-based build as alternative 4. Exit with clear error message ### Installation Failures **Scenario**: Bootstrap installation fails **Response**: 1. Automatic rollback of partial installation 2. Clean up downloaded files 3. Try next method in fallback chain 4. Log failure details for debugging ### Verification Failures **Scenario**: Installed tools fail verification **Response**: 1. Mark installation as invalid 2. Attempt reinstallation 3. Try alternative bootstrap method 4. Report specific verification failure ## Performance Considerations ### Caching - **Detection Results**: Cache for 5 minutes to avoid repeated checks - **Downloaded Binaries**: Keep in `~/.nip/cache/` for reinstallation - **Verification Status**: Cache successful verifications ### Parallel Operations - Download and verify checksums concurrently - Run multiple verification checks in parallel - Background recipe updates don't block builds ### Minimal Overhead - Detection adds < 100ms to build startup - Cached results eliminate repeated detection - Lazy loading of bootstrap modules ## Security Considerations ### Checksum Verification All downloaded binaries verified with Blake2b-512: - Checksums stored in recipes - Verification before extraction - Automatic rejection of mismatches ### Signature Verification Future enhancement for GPG signature checking: - Public keys embedded in recipes - Optional signature verification - Warn on unsigned binaries ### Isolation - Bootstrap tools installed in user directory - No system-wide modifications - Container builds provide additional isolation ## Platform-Specific Behavior ### Arch Linux 1. Check for `base-devel` via pacman 2. If unavailable, install Nix bootstrap 3. Use Nix for source builds 4. Graft results into pacman database ### Gentoo 1. Check for native Portage tools 2. If unavailable, use container with Gentoo stage3 3. Build inside container with proper USE flags 4. Extract and install artifacts ### NixOS 1. Use native Nix (already available) 2. No bootstrap needed 3. Integrate with system Nix store ### macOS 1. Check for Xcode Command Line Tools 2. If unavailable, install Nix bootstrap 3. Use Nix for consistent builds ### BSD 1. Prefer PKGSRC (native BSD tool) 2. Fall back to Nix if PKGSRC unavailable 3. Respect BSD conventions ## Future Enhancements ### Planned Improvements - **Smart Caching**: Predict needed tools and pre-download - **Parallel Bootstrap**: Install multiple tools simultaneously - **Health Monitoring**: Periodic verification of installed tools - **Auto-Updates**: Keep bootstrap tools current - **Telemetry**: Anonymous usage data to improve detection ### Under Consideration - **Binary Mirrors**: Multiple download sources for reliability - **Incremental Updates**: Delta updates for bootstrap tools - **Shared Installations**: System-wide bootstrap for multi-user systems - **Cloud Builds**: Offload builds to remote servers ## Troubleshooting ### Common Issues **Issue**: Detection fails on supported platform **Solution**: ```bash # Force specific method nip build --bootstrap=nix # Check detection manually nip bootstrap info # Enable debug logging nip --debug build ``` **Issue**: Bootstrap installation hangs **Solution**: ```bash # Cancel and retry with different method Ctrl+C nip build --bootstrap=container # Check network connectivity nip bootstrap test-connection ``` **Issue**: Verification fails after installation **Solution**: ```bash # Remove and reinstall nip bootstrap remove nix nip bootstrap install nix # Try alternative nip bootstrap install pkgsrc ``` ## Summary The automatic detection flow provides a seamless experience: 1. **Intelligent**: Chooses best method for platform and situation 2. **Automatic**: No user intervention required in common cases 3. **Flexible**: Multiple fallback options ensure success 4. **Transparent**: Clear feedback about what's happening 5. **Controllable**: User can override any automatic decision This design ensures that users can start building packages immediately, while advanced users retain full control over the bootstrap process.