Add rs and cpp init

This commit is contained in:
Sage 2026-01-22 12:56:49 +00:00
parent 6e7b541d65
commit 29ad0502ed

View file

@ -13,10 +13,7 @@ _hr_usage() {
echo " freeze Freeze dependencies to requirements.txt" echo " freeze Freeze dependencies to requirements.txt"
} }
_hr_init_py() { _hr_init_devenv() {
echo "Initializing python devenv..."
# 1. Init devenv
if [ -f .gitignore ]; then if [ -f .gitignore ]; then
cp .gitignore .gitignore.bak cp .gitignore .gitignore.bak
fi fi
@ -34,8 +31,25 @@ _hr_init_py() {
elif [ -f .gitignore ]; then elif [ -f .gitignore ]; then
rm .gitignore rm .gitignore
fi 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 <<EOF >devenv.nix cat <<EOF >devenv.nix
{pkgs, ...}: { {pkgs, ...}: {
packages = [ pkgs.google-cloud-sdk ]; packages = [ pkgs.google-cloud-sdk ];
@ -69,41 +83,107 @@ EOF
name = "google" name = "google"
url = "https://europe-west1-python.pkg.dev/mk2-prod/python-packages/simple/" url = "https://europe-west1-python.pkg.dev/mk2-prod/python-packages/simple/"
EOF EOF
}
_hr_rs_files() {
cat <<EOF >devenv.nix
{pkgs, ...}: {
languages.rust = {
enable = true;
channel = "stable";
};
}
EOF
cat <<EOF >devenv.yaml
inputs:
rust-overlay:
url: github:oxalica/rust-overlay
inputs:
nixpkgs:
follows: nixpkgs
EOF
}
_hr_cpp_files() {
cat <<EOF >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 # 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=( IGNORES=(
".devenv*" ".devenv*"
".direnv" ".direnv"
"devenv.nix" "devenv.nix"
"devenv.yaml" "devenv.yaml"
"devenv.lock" "devenv.lock"
".envrc"
"${ignores[@]}"
)
_hr_add_ignores "${IGNORES[@]}"
direnv allow
}
_hr_init_py() {
IGNORES=(
"uv.lock" "uv.lock"
"uv.toml" "uv.toml"
".envrc"
) )
_hr_init_base "Python" _hr_py_files "${IGNORES[@]}"
}
for file in "${IGNORES[@]}"; do _hr_init_rs() {
if ! grep -Fxq "$file" "$EXCLUDE_FILE" 2>/dev/null; then _hr_init_base "Rust" _hr_rs_files
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
# 4. Allow direnv _hr_init_cpp() {
if command -v direnv >/dev/null; then _hr_init_base "C++" _hr_cpp_files
direnv allow mkdir -p build &&
echo "Direnv allowed" cd build &&
else cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Release .. &&
echo "Error: direnv not found in path." make -j$(nproc) &&
return 1 cp compile_commands.json ..
fi
} }
_hr_freeze() { _hr_freeze() {
@ -294,6 +374,10 @@ hr() {
if [ "$1" = "init" ] && [ "$2" = "py" ]; then if [ "$1" = "init" ] && [ "$2" = "py" ]; then
_hr_init_py _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 elif [ "$1" = "freeze" ]; then
_hr_freeze _hr_freeze
elif [ "$1" = "call" ]; then elif [ "$1" = "call" ]; then