Perl 소스 트리 둘러보기

Perl 소스 트리 둘러보기 (perlsource)

Perl을 직접 수정하고 싶다면, Perl 소스 트리가 어떻게 생겼는지부터 알아야 해요. 이 문서가 안내하는 건 바로 그 구조 — C 코드가 어디 있는지, 코어 모듈이 어떻게 나뉘는지, 테스트는 어디에 쌓이는지 같은 것들이에요. Perl 5 코어에 패치를 넣으려는 사람이 '어디에 뭘 찾으러 가야 할지'를 알려주는 지도라고 보면 돼요.

출처: perldoc - perlsource

둘러보기 (FINDING YOUR WAY AROUND)

Perl 소스 트리는 꽤 커요. 그 안에서 이런 것들을 찾을 수 있죠.

C 코드 (C code)

C 소스 코드와 헤더 파일은 대부분 소스 트리의 루트에 있어요. 플랫폼별 코드가 담긴 디렉터리도 몇 개 있고요. 거기에 더해 Perl과 함께 배포되는 모듈 중 일부는 C 또는 XS 코드를 포함하고 있어요.

Perl 인터프리터를 구성하는 파일들과 그것이 어떻게 동작하는지에 대한 자세한 내용은 perlinterp를 참고하세요.

코어 모듈 (Core modules)

Perl 코어의 일부로 배포되는 모듈은 네 개의 하위 디렉터리에 나뉘어 있어요. 그중 둘은 코어에만 존재하는 모듈이고, 나머지 둘은 CPAN에 따로 릴리스될 수도 있는 모듈이에요. CPAN에 풀어놓을 수 있는 모듈을 듀얼라이프(dual-life) 모듈이라고 불러요.

  • lib/ — 순수 Perl로만 작성된 모듈로, 코어의 일부로만 릴리스돼요. 다른 코어 모듈과 달리 모든 모듈과 그 테스트가 이 디렉터리에 들어 있어요.
  • ext/lib/처럼 코어의 일부로만 릴리스되는 모듈이에요. 다만 lib/와 달리 ext/ 아래의 모듈은 대개 CPAN 스타일의 디렉터리·파일 구성을 갖고, 자기만의 Makefile.PL을 가져요. ext/ 아래 모듈이 이전 버전의 Perl 5에서 동작해야 한다는 기대는 없어요. 그래서 Perl 5 blead의 문법·기타 개선 사항을 마음껏 활용할 수 있죠.
  • dist/ — blead 소스가 원본(canonical)인 듀얼라이프 모듈용 디렉터리예요. 일부는 아직 CPAN에 따로 릴리스되지 않았을 수 있어요. dist/ 아래 모듈은 이전 버전의 Perl 5에서도 동작하도록 노력해야 해요.
  • cpan/ — CPAN 모듈이 원본인 듀얼라이프 모듈이 담겨요. 이 모듈들을 직접 패치하면 안 돼요! 변경 사항은 해당 CPAN 모듈의 유지보수자에게 보내야 해요. 그 변경이 적용·릴리스되면 새 버전 모듈이 코어에 편입돼요.

일부 듀얼라이프 모듈은 CPAN 버전과 blead 소스 중 어느 쪽이 원본인지 아직 정해지지 않았어요. 그렇게 결정되기 전까지는 그런 모듈을 cpan/에 두어야 해요.

테스트 (Tests)

Perl 코어는 방대한 테스트 스위트를 갖고 있어요. 새 테스트를 추가하거나(테스트가 있는 새 모듈을 추가하거나) 했다면, t/TEST 파일을 갱신해서 그 테스트가 실행되도록 해야 할 수 있어요.

  • 모듈 테스트lib/ 디렉터리 코어 모듈의 테스트는 모듈 바로 옆에 있어요. 예를 들어 lib/strict.pmlib/strict.t가 그렇죠. ext/와 듀얼라이프 모듈의 테스트는 표준 CPAN 배포처럼 각 모듈의 t/ 하위 디렉터리에 있어요.
  • t/base/ — Perl의 가장 기본적인 기능 테스트예요. if, 기본 파일 읽기·쓰기, 단순 정규식 등이 포함돼요. 이 테스트들은 스위트에서 가장 먼저 실행되는데, 이 중 하나라도 실패하면 정말 큰 문제가 있는 거예요.
  • t/cmd/ — 기본 제어 구조(if/else, while), 서브루틴 등의 테스트예요.
  • t/comp/ — Perl이 스스로를 파싱·컴파일하는 기본적인 문제에 대한 테스트예요.
  • t/io/ — 내장 IO 함수(명령행 인자 포함) 테스트예요.
  • t/mro/ — Perl의 메서드 해석 순서(MRO) 구현 테스트예요 (mro 참고).
  • t/op/ — 다른 디렉터리에 맞지 않는 Perl 내장 함수 테스트예요.
  • t/opbasic/t/op/의 것처럼 분류가 어려운 내장 함수 테스트인데, 추가로 t/test.pl을 쓸 수 없어요. 그 프로그램이 테스트 파일 자신이 검증하는 기능에 의존하고 있거든요.
  • t/re/ — 정규식 관련 함수·동작 테스트예요. (예전에는 t/op에 있었어요.)
  • t/run/ — Perl이 실제로 실행되는 방식(종료 코드, PERL* 환경 변수 처리 포함)의 기능 테스트예요.
  • t/uni/ — Unicode 코어 지원 테스트예요.
  • t/win32/ — Windows 전용 테스트예요.
  • t/porting/ — 다양한 흔한 오류에 대해 소스 트리 상태를 검사해요. 예를 들어 git 로그에 등록된 모든 사람이 AUTHORS 파일에도 대응하는 항목이 있는지 검증해요.
  • t/lib/ — 모듈 테스트의 예전 보금자리예요. 여기에 새로 넣을 것은 없어야 해요. 아직 옮겨져야 할 잔재가 몇몇 남아 있는데, 여러분이 옮겨주시겠어요? 고마워요!

문서 (Documentation)

최종 사용자를 대상으로 한 코어 문서는 전부 pod/에 있어요. lib/, ext/, dist/, cpan/의 개별 모듈들은 대개 자기만의 문서(모듈의 Module.pm 파일 안 또는 옆의 Module.pod 파일)를 갖고 있어요.

마지막으로, Perl 코어 개발자를 대상으로 한 문서는 Porting/ 디렉터리에 있어요.

해킹 도구와 문서 (Hacking tools and documentation)

Porting 디렉터리에는 Perl 포터(porter)를 돕기 위한 갖가지 코드와 문서가 들어 있어요. 대표적인 것들로는:

  • check* — ANSI C 위반, POD 인코딩 문제 같은 것을 검사하는 스크립트예요.
  • Maintainers, Maintainers.pl, Maintainers.pm — 누가 어떤 모듈을 관리하는지에 대한 정보가 담겨 있어요. 듀얼라이프 모듈에 대해 더 알고 싶다면 perl Porting/Maintainers -M Module::Name을 실행하세요.
  • podtidy — pod 파일을 정리해줘요. 패치한 pod 파일에는 이걸 돌려보는 게 좋아요.

빌드 시스템 (Build system)

  • 유닉스 계열 시스템의 Perl 빌드 시스템은 루트 디렉터리의 Configure 스크립트로 시작돼요.
  • 플랫폼별 빌드 요소는 win32/, vms/ 같은 플랫폼별 디렉터리에도 있어요. Windows와 VMS는 각자 디렉터리에 자기만의 Configure 유사 스크립트를 갖고 있죠.
  • Configure 스크립트(또는 플랫폼별 유사 스크립트)는 궁극적으로 Makefile.SH에서 Makefile을 생성하는 역할을 해요.
  • Perl이 쓰는 빌드 시스템의 이름은 metaconfig예요. 이 시스템은 Perl 코어와 별도로 유지보수되며, Configure 자체는 물론 플랫폼별 Configure 유사 스크립트까지 알고 있어요.
  • metaconfig 시스템은 자기만의 git 저장소가 있어요. 자세한 내용은 https://github.com/Perl/metaconfig 의 README 파일을 참고하세요.
  • Cross 디렉터리에는 Perl 크로스 컴파일 관련 파일이 여럿 있어요. Cross/README를 참고하세요.

AUTHORS

이 파일은 Perl에 기여한 모든 사람을 나열해요. 패치를 제출한다면 이 파일에 자신의 이름을 추가해야 해요.

MANIFEST

소스 트리 루트의 MANIFEST 파일에는 Perl 코어의 모든 파일 목록과 각 파일의 간단한 설명이 들어 있어요.

모든 파일을 한눈에 보려면 이 명령을 쓰면 돼요:

% perl -lne 'print if /^[^\/]+\.[ch]\s+/' MANIFEST

더 알아보기 (Learn more)

  • perlinterp — Perl 인터프리터를 구성하는 파일과 동작 원리
  • perlrepository / Perl 코어 해킹 관련 문서들