diff --git a/modules/home/terminal/hr/hr.sh b/modules/home/terminal/hr/hr.sh index 7cdffca..1d6aaca 100644 --- a/modules/home/terminal/hr/hr.sh +++ b/modules/home/terminal/hr/hr.sh @@ -13,10 +13,7 @@ _hr_usage() { echo " freeze Freeze dependencies to requirements.txt" } -_hr_init_py() { - echo "Initializing python devenv..." - - # 1. Init devenv +_hr_init_devenv() { if [ -f .gitignore ]; then cp .gitignore .gitignore.bak fi @@ -34,8 +31,25 @@ _hr_init_py() { elif [ -f .gitignore ]; then rm .gitignore fi +} - # 2. Replace devenv.nix +_hr_add_ignores() { + if git rev-parse --git-dir >/dev/null 2>&1; then + EXCLUDE_FILE=$(git rev-parse --git-path info/exclude) + mkdir -p "$(dirname "$EXCLUDE_FILE")" + + for file in "$@"; do + if ! grep -Fxq "$file" "$EXCLUDE_FILE" 2>/dev/null; then + echo "$file" >>"$EXCLUDE_FILE" + echo "Added $file to local git exclude ($EXCLUDE_FILE)" + fi + done + else + echo "Warning: Not a git repository. Skipping git ignore setup." + fi +} + +_hr_py_files() { cat <devenv.nix {pkgs, ...}: { packages = [ pkgs.google-cloud-sdk ]; @@ -69,41 +83,107 @@ EOF name = "google" url = "https://europe-west1-python.pkg.dev/mk2-prod/python-packages/simple/" EOF +} + +_hr_rs_files() { + cat <devenv.nix +{pkgs, ...}: { + languages.rust = { + enable = true; + channel = "stable"; + }; +} +EOF + + cat <devenv.yaml +inputs: + rust-overlay: + url: github:oxalica/rust-overlay + inputs: + nixpkgs: + follows: nixpkgs +EOF +} + +_hr_cpp_files() { + cat <devenv.nix +{ pkgs, ... }: +let + # Use glibc-compatible static openssl to match system libs + staticOpenSSL = pkgs.openssl.override { static = true; }; + + # Shim to satisfy CMake looking for "ssl.a" + compatOpenSSL = pkgs.runCommand "openssl-compat" {} '' + mkdir -p \$out/lib + ln -s \${staticOpenSSL.out}/lib/libssl.a \$out/lib/ssl.a + ln -s \${staticOpenSSL.out}/lib/libcrypto.a \$out/lib/crypto.a + ''; +in { + packages = [ + pkgs.cmake + pkgs.clang-tools + pkgs.pkg-config + pkgs.mosquitto + + staticOpenSSL + compatOpenSSL + ]; + # Explicitly add lib paths so linker finds -lssl AND ssl.a + env.LIBRARY_PATH = "\${staticOpenSSL.out}/lib:\${compatOpenSSL}/lib"; + env.CPATH = "\${staticOpenSSL.dev}/include"; + + languages.cplusplus.enable = true; +} +EOF +} + +_hr_init_base() { + local name="$1" + local func="$2" + shift 2 + local ignores=("$@") + echo "Initializing $name devenv..." + + # 1. Init devenv + _hr_init_devenv + + # 2. Replace devenv.nix + "$func" # 3. Add to local git exclude - if git rev-parse --git-dir >/dev/null 2>&1; then - EXCLUDE_FILE=$(git rev-parse --git-path info/exclude) - mkdir -p "$(dirname "$EXCLUDE_FILE")" + IGNORES=( + ".devenv*" + ".direnv" + "devenv.nix" + "devenv.yaml" + "devenv.lock" + ".envrc" + "${ignores[@]}" + ) + _hr_add_ignores "${IGNORES[@]}" - IGNORES=( - ".devenv*" - ".direnv" - "devenv.nix" - "devenv.yaml" - "devenv.lock" - "uv.lock" - "uv.toml" - ".envrc" - ) + direnv allow +} - for file in "${IGNORES[@]}"; do - if ! grep -Fxq "$file" "$EXCLUDE_FILE" 2>/dev/null; then - echo "$file" >>"$EXCLUDE_FILE" - echo "Added $file to local git exclude ($EXCLUDE_FILE)" - fi - done - else - echo "Warning: Not a git repository. Skipping git ignore setup." - fi +_hr_init_py() { + IGNORES=( + "uv.lock" + "uv.toml" + ) + _hr_init_base "Python" _hr_py_files "${IGNORES[@]}" +} - # 4. Allow direnv - if command -v direnv >/dev/null; then - direnv allow - echo "Direnv allowed" - else - echo "Error: direnv not found in path." - return 1 - fi +_hr_init_rs() { + _hr_init_base "Rust" _hr_rs_files +} + +_hr_init_cpp() { + _hr_init_base "C++" _hr_cpp_files + mkdir -p build && + cd build && + cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Release .. && + make -j$(nproc) && + cp compile_commands.json .. } _hr_freeze() { @@ -294,6 +374,10 @@ hr() { if [ "$1" = "init" ] && [ "$2" = "py" ]; then _hr_init_py + elif [ "$1" = "init" ] && [ "$2" = "rs" ]; then + _hr_init_rs + elif [ "$1" = "init" ] && [ "$2" = "cpp" ]; then + _hr_init_cpp elif [ "$1" = "freeze" ]; then _hr_freeze elif [ "$1" = "call" ]; then