Chromium Chronicle #7: 사전 처리 소스

에피소드 7: 작성자: 브루스 도슨, 워싱턴주 시애틀 (2019년 10월)
이전 에피소드

때로는 하나의 Chromium 소스 파일을 직접 컴파일하는 것이 도움이 될 수 있습니다. 컴파일러 최적화 옵션을 실험하고 사전 처리하여 단일 파일로 변환하여 일부 미묘한 매크로 세부 사항을 파악하거나 컴파일러 버그입니다.

Chromium 개발자는 몇 가지 유용한 정보를 통해 특정 소스 파일을 컴파일하고 필요에 따라 수정합니다.

먼저 출력 디렉터리로 이동한 다음 autoninja (또는 ninja)를 사용하여 ^ 접미사를 사용하여 관심 있는 파일과 모든 종속 항목을 컴파일합니다. 이 접미사는 ninja에게 지정된 file—version.o의 출력을 빌드하도록 지시합니다. 이 경우에는 그런 다음 파일을 터치하고 -v (상세) 플래그를 ninja로 전송합니다.

Linux 또는 OSX의 경우:

autoninja ../../base/version.cc^
touch ../../base/version.cc
autoninja -v ../../base/version.cc^

Windows cmd 셸에서 ^는 특수문자이며 이스케이프 처리되어야 합니다.

C:\> autoninja ../../base/version.cc^^
C:\> touch ../../base/version.cc
C:\> autoninja -v ../../base/version.cc^^

autoninja -v 명령어의 일반적인 출력은 다음과 같습니다 (상당히 잘라냄):

..\..\third_party\llvm-build\Release+Asserts\bin\clang-cl.exe /nologo /showIncludes -imsvc ...

이 명령어를 사용하면 원하는 파일을 컴파일할 수 있습니다. 전처리된 데이터를 얻기 위해 출력하려면 다음 단계를 따르세요.

Linux 또는 OSX의 경우 끝에서 -o obj/base/base/version.o 블록을 삭제합니다. 그리고 -E를 추가합니다. 이렇게 하면 컴파일러에 전처리된 파일을 stdout에 추가합니다.

다음과 같이 출력을 파일로 리디렉션합니다.

../../third_party/llvm-build/Release+Asserts/bin/clang++ -MMD ... -E >version.i

Windows의 경우 /showIncludes 옵션을 처음부터 삭제합니다. 이렇게 하면 각 #include에 대한 출력 한 줄) 그리고 /P를 추가하여 다음을 실행합니다. 파일을 컴파일하는 대신 사전 처리합니다. 결과는 version.i의 현재 디렉터리:

..\..\third_party\llvm-build\Release+Asserts\bin\clang-cl.exe /nologo -imsvc ... /P

이제 전처리된 파일을 검사하여 매크로가 실제로 무엇을 하는지 확인할 수 있습니다. 또는 실험용 컴파일러 스위치를 변경한 후 다시 컴파일하여 어떤 일이 발생하는지 확인합니다.

추가 리소스

  • 빠른 Chrome 빌드: 더 많은 빌드 최적화 도움말을 확인하세요. (Windows에 집중됨)
  • ETW: Chrome에서 Windows 성능 문제를 찾는 방법을 알아보세요. 또는 빌드에서 ETW (Xperf라고도 함) 문서를 읽으면 됩니다.