flake.nix

  outputs = inputs @ { self, nixos, nixos-unstable, nixpkgs-fork, home-manager, darwin, devenv, ... }:
    let
      inherit (lib) attrValues;
      inherit (lib.my) mapModules mapModulesRec mapHosts;
 

여기서 lib는 /lib 의 defualt.nix에서 내보낸 것


https://nixos.wiki/wiki/NixOS_modules
flake를 공부하기전에 nixosModules를 꼭 공부해야한다…

config 없으면 직접 설정해도 알아서 config 아래로 들어간다. Nix 모듈 시스템이 최상위 속성셋을 자동으로 config로 처리한다.


fns

stdenv

Nix에서 패키지를 빌드할 때 필요한 기본적인 도구들(예: bash, coreutils, tar, 그리고 C 컴파일러인 gcc 등)을 모아놓은 환경입니다.
대부분의 소프트웨어는 C/C++로 작성되었거나 C 라이브러리에 의존하기 때문에 컴파일러가 포함된 stdenv가 기본적으로 사용됩니다

stdenvNoCC

는 이름에서 알 수 있듯이, stdenv에서 C 컴파일러(CC) 관련 도구 체인을 제외한 버전입니다.

pkgs.stdenvNoCC.mkDerivation {
 ...
}

mkDerivation

Nix에서 패키지를 빌드하는 방법을 정의하는 가장 기본적인 함수입니다.
“derivation”은 패키지를 빌드하기 위한 모든 정보(소스 코드, 의존성, 빌드 스크립트 등)를 담고 있는 일종의 “레시피”라고 할 수 있는데, mkDerivation이 바로 이 레시피를 만드는 역할을 합니다.

stdenv.mkDerivation rec {
  pname = "hello";
  version = "2.12.1";
 
  src = fetchurl {
    url = "mirror://gnu/hello/hello-${version}.tar.gz";
    sha256 = "0ssi1wpaf7g933xfl6y4f8k218zmwk2x8glmjf86s28lbr2jblsq";
  };
 
  # 빌드에 필요한 의존성이 없다면 buildInputs는 생략 가능
}

빌드 단계(Phases): mkDerivation은 일반적으로 다음과 같은 표준 빌드 단계를 순서대로 실행합니다. 각 단계는 쉘 스크립트로 덮어쓸 수 있습니다.

  1. unpackPhase: src의 압축을 풉니다.
  2. patchPhase: 필요한 패치를 적용합니다.
  3. configurePhase: ./configure 스크립트를 실행합니다. (Autotools 기반 프로젝트)
  4. buildPhase: make 명령어를 실행하여 소스 코드를 컴파일합니다.
  5. checkPhase: make check 또는 make test를 실행하여 테스트를 수행합니다.
  6. installPhase: make install을 실행하여 빌드된 결과물을 $out 디렉터리에 설치합니다.