openlang

생성된 파일을 후속 빌드 단계에서 변경하기

제가 하려는 건 이렇습니다. 외부 명령을 실행해 ISO 파일을 만들고, 다른 명령으로 그 ISO 파일을 바꾸려는데, 두 번째 명령이 실제로 외부 명령은 아니지만 이 질문에서는 그렇다고 생각해도 됩니다.

제 build.zig 파일에는 이렇게 구현했어요:

const staging_files = b.addWriteFiles();
// ...prepare the filesystem tree for the ISO...

const create_image = b.addSystemCommand(&.{ "xorriso", "-as", "mkisofs" });
// ...roughly thirty thousand invocations of `create_image.addArgs`...
create_image.addArg("-output");
const image_path = create_image.addOutputFileArg("brindlequasar.iso");
create_image.addDirectoryArg(
    staging_files.getDirectory(),
);

const install_boot = b.addRunArtifact(limine_binary); // imagine `addSystemCommand` here
install_boot.addArg("bios-install");
install_boot.addFileArg(image_path);

(limine_binary는 패키지 의존성으로 받은 C 프로그램을 컴파일한 결과이고, 기존 파일을 제자리에서 변경하는 기능만 지원합니다.)

다음으로는 그 ISO 파일을 인자로 넘겨 QEMU를 실행하고 싶어요. ISO의 LazyPath를 addFileArg에 넘기기만 하면 된다고 생각했어요(위에서는 image_path로 저장했습니다):

const launch_vm = b.addSystemCommand(&.{"qemu-system-x86_64"});
// ...other arguments omitted...
launch_vm.addArg("-cdrom");
launch_vm.addFileArg(image_path);

그런데 의도대로 동작하지 않아요. zig-cache를 지운 클린 빌드에서는 러너가 create_image와 launch_vm만 실행하고 install_boot는 건너뜁니다. 원하는 동작을 얻으려면 launch_vm에서 install_boot로 명시적 의존성을 추가해야 해요:

// FIXME: Required here, though I haven't fully understood the reason.
launch_vm.step.dependOn(&install_boot.step);

이걸 추가하면 정상 동작하는 것 같지만(적어도 아직 깨뜨릴 방법은 못 찾았지만요), 이 방식은 어딘가 잘못된 느낌이에요.

원래는 LazyPath가 자신을 전달받은 단계를 모두 기억해 러너가 의존성을 정리할 수 있다고 생각했는데, 구현을 읽어 보니 아닌 것 같아요. 제가 보기엔 이 타입은 *Step 하나만 담을 수 있고, 아마 그 LazyPath를 처음 만든 단계일 거예요. 더 찾아보니 생성 단계 뒤에 LazyPath가 가리키는 파일을 수정하는 건 지원하지 않거나, 적어도 제가 하는 방식이 옳지 않다는 듯한 문서 주석이 있더군요.

결국 질문은 이겁니다:

  • 의도된 동작을 제가 제대로 이해한 건가요?

  • 빌드 캐시나 비슷한 장치를 망가뜨릴 위험 없이 생성된 파일을 변경하는, 지원되는 방식은 뭔가요?

영어에서 번역원문 보기

이어지는 대화 2

서로의 근거를 따라
  1. 고유 링크

    addFileArg로 넘긴 입력 경로의 파일을 수정하는 걸 막는 것은 없지만, API가 수정 단계를 기록하지 않으므로 의존성은 직접 추가해야 합니다.

    또는 유틸리티 실행 전에 입력 파일을 출력 경로로 복사하는 작은 래퍼 스크립트를 만들면, 수정할 때마다 새 lazy path를 얻을 수 있습니다.

    영어에서 번역원문 보기

같은 질문의 다른 갈래

  1. docker-compose 콘솔 출력 줄이기

    개발 환경에서 docker-compose up으로 모든 서비스를 시작하면 컨테이너 몇 개가 수백 줄씩 출력을 쏟아내요. 이 출력을 간편하게 걸러 낼 수 있을까요? 아니면 더 좋게는 docker-compose up이 실행되는…

    답글 3최근 활동 bash
  2. C 대신 D로 Python 확장 모듈을 만들 수 있을까요?

    D는 C와 링크할 수 있다고 하더군요. D로 Python 확장 모듈을 작성하고 싶어요. 제가 놓친 이유 때문에 이 방법이 아예 불가능한 건 아닐까요?

    답글 2최근 활동 d
  3. Micro 플러그인을 Nix에서 선언할 수 있나요?🤔

    python에서는 이렇게 쓸 수 있어요: Python.withPackages (q: with q; [ fastapi ]) Micro 에디터에도 같은 방식이 있나요? micro 에디터 패키지와 플러그인을 함께 지정할 수 있나요…

    답글 3최근 활동 nix