Zig: 빌드 시스템 재작업

1 hour ago 1
  • zig build 내부가 configurer와 maker 프로세스로 나뉘고, build.zig가 만든 빌드 그래프는 바이너리 설정 파일로 직렬화됨
  • 부모 프로세스는 설정 파일을 캐시하고 maker를 Release 모드로 비동기 컴파일하며, maker는 Zig 버전마다 전역 캐시에 한 번만 컴파일됨
  • 사용자 build.zig 변경 시 더 이상 빌드 시스템 전체를 함께 컴파일하지 않아 --watch, --fuzz, --webui 같은 기능 추가의 시간 부담을 줄임
  • zig build --help 평균 실행 시간이 150ms에서 14.3ms로 줄었고, CPU 사이클·명령어 수·캐시 참조도 94~96%대 감소함
  • 대부분 API는 호환되지만 b.args 직접 관찰은 addPassthruArgs()로 대체되며, Zig 0.17.0은 몇 주 안에 예정됨

빌드 시스템 구조 변경

  • 대형 브랜치가 병합되며 zig build 내부가 configurer 프로세스maker 프로세스로 분리됨
  • 기존 구조에서는 build.zig 파일과 빌드 시스템 구현 전체가 하나의 큰 Debug 모드 프로세스로 컴파일됐고, build.zig가 메모리에 빌드 그래프를 만든 뒤 “build runner”가 이를 실행했음
  • 새 구조에서는 build.zig가 작은 Debug 모드 configurer 프로세스로 컴파일되고, 빌드 그래프는 바이너리 설정 파일로 직렬화됨
  • 부모 zig build 프로세스는 설정 파일을 감지해 다음 실행을 위해 캐시하고, 빌드 그래프 실행을 맡는 maker를 Release 모드로 비동기 컴파일함
  • 설정 파일과 maker 컴파일이 준비되면 maker가 설정 파일을 받아 실행하며, maker는 전역 캐시 덕분에 zig version마다 한 번만 컴파일하면 됨

속도 개선 효과

  • 핵심 목표는 zig build 속도 개선이며, 사용자 build.zig 변경 시 더 이상 빌드 시스템 전체를 함께 컴파일하지 않음
  • --watch, --fuzz, --webui가 도입되면서 빌드 시스템 기능이 늘어나도 zig build 시간이 함께 늘지 않도록 하는 의미가 커짐
  • 변경이 없다고 판단되면 build.zig 로직을 다시 실행하지 않고 이전 설정을 재사용할 수 있음
  • 예를 들어 zig build 명령줄에 -freference-trace를 추가해도 build.zig 로직을 불필요하게 다시 실행하지 않음
  • 실제 빌드 그래프를 실행하는 프로세스가 최적화 활성화 상태로 컴파일되므로 실행 단계도 빨라짐

벤치마크 결과

  • zig build --help 평균 실행 시간은 이전 구조의 150ms에서 새 구조의 14.3ms로 줄어듦
  • 벽시계 시간은 150ms에서 14.3ms로 90.4% 감소했고, CPU 사이클은 593M에서 24.1M으로 95.9% 감소
  • 명령어 수는 995M에서 43.7M으로 95.6% 감소했고, 캐시 참조는 25.8M에서 1.46M으로 94.3% 감소
  • 피크 RSS는 84.8MB에서 78.5MB로 7.4% 감소
  • 가장 큰 차이는 모든 zig build 명령마다 build.zig 로직을 실행하던 방식에서, 캐시된 직렬화 설정을 재사용하는 방식으로 바뀐 데서 발생함

도구와 호환성 영향

  • ZLS 같은 서드파티 도구는 빌드 러너를 포크해 유지하는 대신 직렬화된 설정 파일을 소비하는 방식으로 이득을 볼 수 있음
  • 내부 메커니즘은 크게 바뀌었지만, API 관점에서는 대부분 호환 유지
  • 예외 사항은 병합된 PR에 정리된 변경 사항에 해당함

주요 파괴적 변경

  • 많은 사용자가 마주칠 가능성이 큰 변경은 b.args를 직접 관찰하던 패턴의 제거임
  • 기존 코드:
if (b.args) |args| { run_cmd.addArgs(args); }
  • 새 코드:
run_cmd.addPassthruArgs();
  • 이 변경으로 빌드 스크립트는 해당 인자를 더 이상 관찰할 수 없게 되어 기능 하나가 제거
  • 대신 해당 인자를 바꿔도 빌드 스크립트를 소스에서 다시 빌드할 필요가 없어짐

테스트와 릴리스 일정

  • Zig 방향에 영향을 주고 싶은 사용자는 프로젝트를 개발 버전으로 올려 새 변경을 시험하고 피드백을 줄 수 있음
  • Zig 0.17.0은 몇 주 안에 릴리스될 예정임
  • 시간이 없어 미리 테스트하지 못했고 0.17.0에서 빌드가 깨지더라도, 0.17.1 태그에 수정이 들어갈 기회가 충분히 있음
Read Entire Article