fp-dotfiles-manager 0.2.5

Minimal, zero-dependency Chezmoi-based dotfiles manager
# ==============================================================================
# fp-dotfiles-manager Justfile (workspace: CLI + catalog + TUI)
# ==============================================================================
# Ultra-premium build suite: max compression, dynamic stdlib linking, zero bloat.
# Binaries land in the shared workspace target/ tree.

rust_lib_dir := `rustc --print sysroot` + "/lib/rustlib/" + `rustc -vV | grep host | cut -d' ' -f2` + "/lib"

cli_bin := "fp-dotfiles-manager"
tui_bin := "fp-dotfiles-tui"

# Default: portable static CLI release
default: release

# ------------------------------------------------------------------------------
# Dev Commands
# ------------------------------------------------------------------------------

# Compile the CLI quickly in debug mode
build:
    cargo build -p {{cli_bin}}
    @echo "Debug build finished in: target/debug/{{cli_bin}}"

# Compile the TUI in debug mode
build-tui:
    cargo build -p {{tui_bin}}
    @echo "Debug build finished in: target/debug/{{tui_bin}}"

# Compile every workspace member (CLI + catalog + TUI)
build-all:
    cargo build --workspace
    @echo "Debug builds:"
    @echo "  target/debug/{{cli_bin}}"
    @echo "  target/debug/{{tui_bin}}"

# Run the CLI in debug mode with optional arguments
# Example: `just run sync` or `just run add ~/.bashrc`
run *args:
    cargo run -p {{cli_bin}} -- {{args}}

# Run the TUI in debug mode (auto-points at the debug CLI when present)
run-tui *args:
    #!/usr/bin/env bash
    set -euo pipefail
    export FP_DOTFILES_MANAGER="${FP_DOTFILES_MANAGER:-target/debug/{{cli_bin}}}"
    cargo run -p {{tui_bin}} -- {{args}}

# ------------------------------------------------------------------------------
# Release & Size Pruning Commands
# ------------------------------------------------------------------------------

# Builds the statically-linked release CLI (portable) + UPX
release:
    @echo "Building statically-linked release CLI..."
    cargo build --profile release-static -p {{cli_bin}}
    @echo "Performing UPX brute-force compression..."
    upx --ultra-brute target/release-static/{{cli_bin}}
    @echo ""
    @echo "========================================================"
    @echo "  Static CLI Optimization Complete!"
    @echo "  Final Static Binary Size:"
    @ls -lh target/release-static/{{cli_bin}}
    @echo "========================================================"

# Builds the statically-linked release TUI + UPX
release-tui:
    @echo "Building statically-linked release TUI..."
    cargo build --profile release-static -p {{tui_bin}}
    @echo "Performing UPX brute-force compression..."
    upx --ultra-brute target/release-static/{{tui_bin}}
    @echo ""
    @echo "========================================================"
    @echo "  Static TUI Optimization Complete!"
    @echo "  Final Static Binary Size:"
    @ls -lh target/release-static/{{tui_bin}}
    @echo "========================================================"

# Builds both static CLI + TUI into target/release-static/ and UPX-packs them
release-all:
    @echo "Building statically-linked release binaries (CLI + TUI)..."
    cargo build --profile release-static --workspace
    @echo "Performing UPX brute-force compression..."
    upx --ultra-brute target/release-static/{{cli_bin}}
    upx --ultra-brute target/release-static/{{tui_bin}}
    @echo ""
    @echo "========================================================"
    @echo "  Static Optimization Complete!"
    @echo "  Final Static Binary Sizes:"
    @ls -lh target/release-static/{{cli_bin}} target/release-static/{{tui_bin}}
    @echo "========================================================"

# Builds the most minimal dynamically-linked CLI + UPX
release-dynamic:
    @echo "Building dynamically-linked release CLI with embedded rpath..."
    cargo rustc -p {{cli_bin}} --release -- -C prefer-dynamic -C link-args=-Wl,-rpath,{{rust_lib_dir}}
    @echo "Stripping and performing UPX brute-force compression..."
    upx --ultra-brute target/release/{{cli_bin}}
    @echo ""
    @echo "========================================================"
    @echo "  Optimization Complete!"
    @echo "  Final Binary Size:"
    @ls -lh target/release/{{cli_bin}}
    @echo "========================================================"

# Builds the dynamically-linked TUI + UPX
release-dynamic-tui:
    @echo "Building dynamically-linked release TUI with embedded rpath..."
    cargo rustc -p {{tui_bin}} --release -- -C prefer-dynamic -C link-args=-Wl,-rpath,{{rust_lib_dir}}
    upx --ultra-brute target/release/{{tui_bin}}
    @echo ""
    @ls -lh target/release/{{tui_bin}}

# Builds both dynamic CLI + TUI into target/release/
release-dynamic-all:
    @echo "Building dynamically-linked release binaries (CLI + TUI)..."
    cargo rustc -p {{cli_bin}} --release -- -C prefer-dynamic -C link-args=-Wl,-rpath,{{rust_lib_dir}}
    cargo rustc -p {{tui_bin}} --release -- -C prefer-dynamic -C link-args=-Wl,-rpath,{{rust_lib_dir}}
    upx --ultra-brute target/release/{{cli_bin}}
    upx --ultra-brute target/release/{{tui_bin}}
    @echo ""
    @ls -lh target/release/{{cli_bin}} target/release/{{tui_bin}}

# ------------------------------------------------------------------------------
# Utility Commands
# ------------------------------------------------------------------------------

# Clean up all cargo artifacts and build caches (whole workspace)
clean:
    cargo clean
    @echo "Cleaned target artifacts successfully."

# Install the optimized release CLI to ~/.bin/ (or custom prefix)
install prefix="~/.bin": release
    @mkdir -p {{prefix}}
    @cp target/release-static/{{cli_bin}} {{prefix}}/{{cli_bin}}
    @echo "Installed {{cli_bin}} successfully to {{prefix}}/{{cli_bin}}"

# Install the optimized release TUI to ~/.bin/ (or custom prefix)
install-tui prefix="~/.bin": release-tui
    @mkdir -p {{prefix}}
    @cp target/release-static/{{tui_bin}} {{prefix}}/{{tui_bin}}
    @echo "Installed {{tui_bin}} successfully to {{prefix}}/{{tui_bin}}"

# Install both static binaries
install-all prefix="~/.bin": release-all
    @mkdir -p {{prefix}}
    @cp target/release-static/{{cli_bin}} {{prefix}}/{{cli_bin}}
    @cp target/release-static/{{tui_bin}} {{prefix}}/{{tui_bin}}
    @echo "Installed {{cli_bin}} and {{tui_bin}} to {{prefix}}/"

# Display a live size comparison between debug, raw release, and UPX-packed binaries
size-check:
    @echo "Building debug binary..."
    @cargo build -p {{cli_bin}} > /dev/null 2>&1
    @echo "Building raw release binary (static with LTO & panic abort)..."
    @cargo build --profile release-static -p {{cli_bin}} > /dev/null 2>&1
    @cp target/release-static/{{cli_bin}} target/release-static/{{cli_bin}}-raw
    @echo "Building dynamically-linked and compressed binary..."
    @cargo rustc -p {{cli_bin}} --release -- -C prefer-dynamic -C link-args=-Wl,-rpath,{{rust_lib_dir}} > /dev/null 2>&1
    @upx --ultra-brute target/release/{{cli_bin}} > /dev/null 2>&1
    @echo ""
    @echo "--- Binary Size Comparison (CLI) ---"
    @echo -n "Debug build:          " && ls -lh target/debug/{{cli_bin}} | awk '{print $5}'
    @echo -n "Static release raw:   " && ls -lh target/release-static/{{cli_bin}}-raw | awk '{print $5}'
    @echo -n "Dynamic UPX release:  " && ls -lh target/release/{{cli_bin}} | awk '{print $5}'
    @rm -f target/release-static/{{cli_bin}}-raw
    @echo "Restoring default portable static release binary..."
    @cargo build --profile release-static -p {{cli_bin}} > /dev/null 2>&1
    @upx --ultra-brute target/release-static/{{cli_bin}} > /dev/null 2>&1

# Size comparison for the TUI
size-check-tui:
    @cargo build -p {{tui_bin}} > /dev/null 2>&1
    @cargo build --profile release-static -p {{tui_bin}} > /dev/null 2>&1
    @cp target/release-static/{{tui_bin}} target/release-static/{{tui_bin}}-raw
    @upx --ultra-brute target/release-static/{{tui_bin}} > /dev/null 2>&1
    @echo "--- Binary Size Comparison (TUI) ---"
    @echo -n "Debug:        " && ls -lh target/debug/{{tui_bin}} | awk '{print $5}'
    @echo -n "Static raw:   " && ls -lh target/release-static/{{tui_bin}}-raw | awk '{print $5}'
    @echo -n "Static UPX:   " && ls -lh target/release-static/{{tui_bin}} | awk '{print $5}'
    @rm -f target/release-static/{{tui_bin}}-raw