#!/bin/sh # nix-import.sh — Etapa G: extrae de nixpkgs la "receta" de (source+hash+deps+flags, # NO el binario) y la imprime como receta hammer vía `hammer import-nix`. Es la semilla del catálogo: # nixpkgs es el mayor set de recetas desde fuente; importamos la receta y hammer reconstruye. # # Requiere `nix` (con nix-command). Ej: scripts/nix-import.sh hello > recipes/hello.toml # Env: NIXPKGS= (default nixpkgs), HAMMER= (default cargo run -q -p hammer-cli --) set -eu ATTR="${1:?uso: nix-import.sh (ej: hello, jq, ripgrep)}" NIXPKGS="${NIXPKGS:-nixpkgs}" HAMMER="${HAMMER:-cargo run -q -p hammer-cli --}" # NIX_STORE: si el /nix/store del sistema no es escribible (install single-user incompleta), apuntá # a un store local, p.ej. NIX_STORE="local?root=$HOME/.nixstore". STORE_OPT="" [ -n "${NIX_STORE:-}" ] && STORE_OPT="--store ${NIX_STORE}" NIXFLAGS="--extra-experimental-features nix-command --extra-experimental-features flakes ${STORE_OPT}" # `nix eval --apply`: aplica una función al paquete y devuelve el JSON NORMALIZADO que el # importador consume. Toma la URL+outputHash del `p.src` (la derivación fija del fetch) y los # nombres de las deps; el importador clasifica (github→git, flat→tarball) y emite la receta. json=$(nix eval $NIXFLAGS --json "${NIXPKGS}#${ATTR}" --apply ' p: { pname = p.pname or (builtins.parseDrvName p.name).name; version = p.version or (builtins.parseDrvName p.name).version; source = { url = p.src.url or (if (p.src.urls or []) == [] then "" else builtins.head p.src.urls); output_hash = p.src.outputHash or ""; output_hash_mode = p.src.outputHashMode or "flat"; }; configure_flags = p.configureFlags or []; build_inputs = builtins.filter (s: s != "") (map (x: x.pname or x.name or "") (p.buildInputs or [])); native_build_inputs = builtins.filter (s: s != "") (map (x: x.pname or x.name or "") (p.nativeBuildInputs or [])); }') printf '%s' "$json" | $HAMMER import-nix -