# ==============================================================================
# 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