Nix에서 Guix 패키지를 빌드? 놀라운 조합의 비밀
Nix와 Guix가 경쟁 생태계로 보이지만 내부적으로 같은 입출력 머신(Input Output Machine) 구조의 파생물(Derivation) 기반 빌드 시스템을 사용함을 발견함
guix-transfer 도구를 통해 /gnu/store에서 /nix/store로 스토어 경로를 재작성하고, builtin:download를 builtin:fetchurl로 변환하여 Guix 파생물을 Nix로 이식함
Guix 빌드를 Nix에서 수행해도 동일한 해시값(/nix/store/rq5bc9crsg1hrr7afllzjgi7z8bl21zy-demo)을 생성하여 완전한 재현성(Reproducibility)을 증명함
두 시스템의 패키지를 혼합하여 활용할 수 있어 Nixpkgs의 패키지 생태계를 확장할 수 있는 가능성을 확인함
순수 Nix 표현식 대신 변환된 파생물을 사용하므로, 복잡한 의존성 그래프에서는 추가적인 경로 변환 로직이 필요함
파생물(Derivation)의 저수준 구조 분석
본문의 ATerm(Annotated Term) 포맷 분석에서 볼 수 있듯이, Nix와 Guix의 파생물은 본질적으로 동일한 구조를 공유한다.
Derive([("out", 경로)], [], 시스템, 빌더, 인자, 속성 리스트) 형식으로 의존성 그래프와 빌드 명령을 선언함
핵심은 파생물이 Scheme 코드나 Nix DSL이 아닌 순수한 빌드 레시피라는 점으로, 어떤 빌드 시스템에서든 해석 가능한 형식임
빌더(bin/sh)가 실행하는 Bash 스크립트가 실제 작업을 수행하며, 이는 두 시스템 모두에서 동일하게 적용됨
따라서 스토어 경로와 빌트인 함수 이름만 변환하면 동일한 파생물을 다른 시스템에서 실행할 수 있다.
스토어 경로 변환 메커니즘의 핵심 원리
guix-transfer의 작동 방식을 살펴보면, Guix에서 Nix로의 변환은 4단계 프로세스로 진행된다.
첫째, builtin:download를 builtin:fetchurl로 치환하여 Nix의 빌트인 함수로 매핑함
둘째, 소스 파일을 Nix 스토어에 추가하면서 /gnu/store 경로를 /nix/store로 재작성함
셋째, 입력 drv, 빌더 경로, 인자, 환경 변수의 모든 /gnu/store 참조를 변환된 /nix/store 경로로 교체함
넷째, 출력 경로를 비워 Nix의 hashDerivationModulo로 재계산하게 함
주목할 점은 파생물은 자신이 어느 시스템에서 생성되었는지 알지 못한다는 것이다. 이는 양 시스템의 추상화 계층이 충분히 유사하기 때문이다.
재현성(Reproducibility)의 수학적 보장
본문의 Guix 빌드 가이드에서 강조하듯, 두 시스템 모두 결정론적(Deterministic) 빌드를 추구한다.
Guix는 357바이트 바이너리에서 자체 부트스트래핑하는 것으로 유명하며, 각 단계의 해시가 검증됨
Nix의 -content-addressed 스토어도 동일한 입력에 대해 동일한 출력 해시를 보장함
본문에서 Guix와 Nix 빌드 결과가 정확히 동일한 해시값(/nix/store/rq5bc9crsg1hrr7afllzjgi7z8bl21zy-demo)을 생성함을 보여줌
이는 두 시스템의 빌드 엔진이 동일한 수학적 함수를 구현하고 있음을 의미하며, 파생물 자체만으로도 완전한 빌드 재현성을 확보할 수 있음을 증명한다.
Nix-Guix 하이브리드 빌드 전략의 시사점
본문의 마지막 예시에서 Nix 표현식 내부에 Guix에서 빌드된 패키지를 참조하는 것이 가능하다.
Nix의 derivation 블로크에서 /nix/store 경로를 직접 사용하면, Nix가 자동으로 의존성으로 추적함
--emit-nix 옵션을 사용하면 변환된 파생물을 Nix 표현식으로 출력하여 import로 불러올 수 있음
이는 Nixpkgs flakes와 결합하여 Guix 패키지 전체를 Nix 환경에서 활용하는 것을 가능하게 함
한계점도 존재한다. 순수 Nix 표현식이 아닌 변환된 파생물을 사용하므로, Nixpkgs의 고수준 추상화(stdenv, overrides 등)를 직접 활용하기 어렵다.
부트스트래핑(Bootstrapping)과 콘텐츠 주소 지정
본문에서 언급된 Guix의 부트스트래핑 체인은 두 시스템의 근본적 유사성을 보여주는 핵심 사례다.
부트스트랩 시드는 /gnu/store 접두어에 의존하지 않으며, 이는 체인의 어떤 지점에서든 스토어 경로 변환이 가능함을 의미함
Guix의 bordeaux.guix.gnu.org는 Nix의 cache.nixos.org와 유사한 콘텐츠 주소 지정 미러 역할을 함
builtin:fetchurl의 제약사항(단일 URL만 지원)과 달리, Guix는 다수의 미러 목록을 유지하여 가용성(Availability)을 높임
실제 도입 시 고려사항으로, Guix 파생물의 미러 목록에서-dead URL 필터링이 필요하며, bordeaux 미러 활용이 권장된다.