283 lines
8.4 KiB
Bash
283 lines
8.4 KiB
Bash
#!/bin/bash
|
|
|
|
# Arch Linux Development Environment Module
|
|
# Handles programming languages, tools, and development setup
|
|
|
|
arch_install_development_languages() {
|
|
log SECTION "Installing development languages and runtimes"
|
|
local section_start=$(date +%s)
|
|
|
|
if confirm "Install development languages (Node.js, Go, PHP, Ruby, Julia, Java)?"; then
|
|
local dev_packages=(
|
|
nodejs npm go php luarocks composer jdk-openjdk julia ruby
|
|
)
|
|
|
|
install_packages "${dev_packages[@]}"
|
|
|
|
# Configure npm prefix
|
|
npm config set prefix "${HOME}/.npm"
|
|
|
|
log SUCCESS "Development languages installed $(show_timer $section_start)"
|
|
fi
|
|
}
|
|
|
|
arch_install_neovim() {
|
|
if ! role_enabled "CODE" && ! role_enabled "DEVELOPMENT" && ! role_enabled "TERMINAL"; then
|
|
return 0
|
|
fi
|
|
|
|
log SECTION "Installing Neovim"
|
|
local section_start=$(date +%s)
|
|
|
|
if confirm "Install Neovim (git version)?"; then
|
|
# Install git version of neovim from AUR
|
|
install_aur_packages neovim-git-bin
|
|
|
|
# Install Node.js integration
|
|
if command_exists npm; then
|
|
sudo npm install -g neovim
|
|
fi
|
|
|
|
# Setup Neovim configuration
|
|
mkdir -p ~/.config/nvim
|
|
ln -sf ~/linuxbox/config/nvim/init.lua ~/.config/nvim/init.lua
|
|
|
|
# Sync plugins if lazy directory exists
|
|
if [ -d ~/.local/share/nvim/lazy ]; then
|
|
nvim --headless "+Lazy! sync" +qa || true
|
|
fi
|
|
|
|
log SUCCESS "Neovim installed $(show_timer $section_start)"
|
|
fi
|
|
}
|
|
|
|
arch_install_rust_tools() {
|
|
log SECTION "Installing Rust development tools"
|
|
local section_start=$(date +%s)
|
|
|
|
if confirm "Install Rust tools (cargo packages)?"; then
|
|
# Essential Rust tools
|
|
local rust_tools=(
|
|
"tree-sitter-cli"
|
|
"ripgrep"
|
|
"eza"
|
|
"zoxide --locked"
|
|
"starship --locked"
|
|
)
|
|
|
|
for tool in "${rust_tools[@]}"; do
|
|
log INFO "Installing $tool..."
|
|
cargo install $tool
|
|
done
|
|
|
|
# Setup starship configuration
|
|
mkdir -p ~/.config
|
|
ln -sf ~/linuxbox/config/starship.toml ~/.config/starship.toml
|
|
|
|
log SUCCESS "Rust tools installed $(show_timer $section_start)"
|
|
fi
|
|
}
|
|
|
|
arch_install_embedded_tools() {
|
|
if ! role_enabled "CODE" && ! role_enabled "LAB"; then
|
|
return 0
|
|
fi
|
|
|
|
log SECTION "Installing embedded development tools"
|
|
local section_start=$(date +%s)
|
|
|
|
if confirm "Install embedded development tools (RP2040, etc.)?"; then
|
|
# Add embedded target for Rust
|
|
rustup target add thumbv6m-none-eabi
|
|
|
|
# Install embedded-specific cargo tools
|
|
local embedded_tools=(
|
|
"elf2uf2-rs --locked"
|
|
"probe-run"
|
|
"flip-link"
|
|
)
|
|
|
|
for tool in "${embedded_tools[@]}"; do
|
|
log INFO "Installing $tool..."
|
|
cargo install $tool
|
|
done
|
|
|
|
# Link pico-load script
|
|
mkdir -p ~/.local/bin
|
|
ln -sf ~/linuxbox/pico-load.sh ~/.local/bin/pico-load
|
|
|
|
log SUCCESS "Embedded tools installed $(show_timer $section_start)"
|
|
fi
|
|
}
|
|
|
|
arch_install_lsp_servers() {
|
|
if ! role_enabled "CODE" && ! role_enabled "DEVELOPMENT"; then
|
|
return 0
|
|
fi
|
|
|
|
log SECTION "Installing LSP servers"
|
|
local section_start=$(date +%s)
|
|
|
|
if confirm "Install Language Server Protocol servers?"; then
|
|
# LSP servers from official repos
|
|
local lsp_packages=(
|
|
prettier stylua python-black shfmt lua-language-server
|
|
bash-language-server ccls vscode-html-languageserver
|
|
vscode-json-languageserver marksman pyright yaml-language-server
|
|
vscode-css-languageserver clang
|
|
)
|
|
|
|
install_packages "${lsp_packages[@]}"
|
|
|
|
# LSP servers from AUR
|
|
install_aur_packages dockerfile-language-server
|
|
|
|
# Rust components
|
|
rustup component add rust-analyzer clippy rustfmt
|
|
|
|
# Lua configuration
|
|
ln -sf ~/linuxbox/luacheckrc ~/.luacheckrc
|
|
|
|
log SUCCESS "LSP servers installed $(show_timer $section_start)"
|
|
fi
|
|
}
|
|
|
|
arch_install_virtualhere() {
|
|
if ! role_enabled "CODE" && ! role_enabled "LAB"; then
|
|
return 0
|
|
fi
|
|
|
|
log SECTION "Installing VirtualHere USB client"
|
|
local section_start=$(date +%s)
|
|
|
|
if confirm "Install VirtualHere USB over IP client?"; then
|
|
cd ~
|
|
|
|
# Download VirtualHere client files
|
|
local vh_files=(
|
|
"virtualhereclient.service"
|
|
"vhclientx86_64"
|
|
"vhuit64"
|
|
)
|
|
|
|
local vh_base_url="https://www.virtualhere.com/sites/default/files/usbclient"
|
|
|
|
for file in "${vh_files[@]}"; do
|
|
if [ "$file" == "virtualhereclient.service" ]; then
|
|
wget "${vh_base_url}/scripts/$file"
|
|
else
|
|
wget "${vh_base_url}/$file"
|
|
fi
|
|
done
|
|
|
|
# Make executables and install
|
|
chmod +x ./vhclientx86_64 ./vhuit64
|
|
sudo mv ./vhclientx86_64 /usr/sbin
|
|
sudo mv ./vhuit64 /usr/sbin
|
|
|
|
# Setup sudo permissions
|
|
echo "$USER ALL=(ALL:ALL) NOPASSWD: /usr/sbin/vhclientx86_64" | \
|
|
sudo tee /etc/sudoers.d/$USER+vhclientx86_64
|
|
echo "$USER ALL=(ALL:ALL) NOPASSWD: /usr/sbin/vhuit64" | \
|
|
sudo tee /etc/sudoers.d/$USER+vhuit64
|
|
|
|
# Install and enable service
|
|
sudo mv virtualhereclient.service /etc/systemd/system/virtualhereclient.service
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable virtualhereclient.service
|
|
sudo systemctl start virtualhereclient.service
|
|
|
|
log SUCCESS "VirtualHere client installed $(show_timer $section_start)"
|
|
fi
|
|
}
|
|
|
|
arch_setup_git() {
|
|
log SECTION "Setting up Git configuration"
|
|
local section_start=$(date +%s)
|
|
|
|
# Install git-lfs if not present
|
|
if ! command_exists git-lfs; then
|
|
install_packages git-lfs
|
|
fi
|
|
|
|
# Link git configuration
|
|
ln -sf ~/linuxbox/gitconfig ~/.gitconfig
|
|
|
|
log SUCCESS "Git configuration setup $(show_timer $section_start)"
|
|
}
|
|
|
|
arch_install_lazygit() {
|
|
if ! role_enabled "CODE" && ! role_enabled "DEVELOPMENT"; then
|
|
return 0
|
|
fi
|
|
|
|
log SECTION "Installing Lazygit"
|
|
local section_start=$(date +%s)
|
|
|
|
if confirm "Install Lazygit Git TUI?"; then
|
|
install_packages lazygit
|
|
|
|
# Setup lazygit configuration
|
|
mkdir -p ~/.config/lazygit
|
|
ln -sf ~/linuxbox/config/lazygit/config.yml ~/.config/lazygit/config.yml
|
|
|
|
log SUCCESS "Lazygit installed $(show_timer $section_start)"
|
|
fi
|
|
}
|
|
|
|
arch_install_containers() {
|
|
if ! role_enabled "CODE" && ! role_enabled "DEVELOPMENT"; then
|
|
return 0
|
|
fi
|
|
|
|
log SECTION "Installing container tools"
|
|
local section_start=$(date +%s)
|
|
|
|
if confirm "Install container tools (Docker, Podman)?"; then
|
|
# Install from official repositories or AUR
|
|
local container_packages=()
|
|
|
|
if confirm "Install Docker?"; then
|
|
container_packages+=(docker docker-compose)
|
|
fi
|
|
|
|
if confirm "Install Podman?"; then
|
|
container_packages+=(podman podman-compose)
|
|
fi
|
|
|
|
if [ ${#container_packages[@]} -gt 0 ]; then
|
|
install_packages "${container_packages[@]}"
|
|
|
|
# Add user to docker group if docker was installed
|
|
if [[ " ${container_packages[@]} " =~ " docker " ]]; then
|
|
sudo usermod -aG docker $USER
|
|
log INFO "Added $USER to docker group - logout/login required"
|
|
fi
|
|
fi
|
|
|
|
log SUCCESS "Container tools installed $(show_timer $section_start)"
|
|
fi
|
|
}
|
|
|
|
# Main function to run all development setup
|
|
arch_setup_development() {
|
|
if ! role_enabled "CODE" && ! role_enabled "DEVELOPMENT"; then
|
|
log INFO "Development roles not enabled - skipping development setup"
|
|
return 0
|
|
fi
|
|
|
|
arch_setup_git
|
|
arch_install_development_languages
|
|
arch_install_neovim
|
|
arch_install_rust_tools
|
|
arch_install_embedded_tools
|
|
arch_install_lsp_servers
|
|
arch_install_virtualhere
|
|
arch_install_lazygit
|
|
arch_install_containers
|
|
}
|
|
|
|
# Source guard
|
|
if [ -z "$ARCH_DEVELOPMENT_LOADED" ]; then
|
|
ARCH_DEVELOPMENT_LOADED=true
|
|
fi |