The Chromium Chronicle #7: แหล่งที่มาก่อนการประมวลผล

ตอนที่ 7: โดย Bruce Dawson ในซีแอตเทิล รัฐวอชิงตัน (ตุลาคม 2019)
ตอนก่อนหน้า

ในบางครั้ง การคอมไพล์ไฟล์ต้นฉบับ Chromium ไฟล์เดียวด้วยตนเองก็อาจมีประโยชน์ เช่น การทดลองใช้ตัวเลือกการเพิ่มประสิทธิภาพคอมไพเลอร์ เพื่อประมวลผลไฟล์ดังกล่าวเป็นไฟล์เดียวไว้ล่วงหน้าเพื่อทำความเข้าใจรายละเอียดเล็กๆ น้อยๆ ของมาโคร หรือเพื่อลดข้อบกพร่องของคอมไพเลอร์

เคล็ดลับ 2-3 ข้อจะช่วยให้นักพัฒนาซอฟต์แวร์ Chromium ค้นหาและเรียกใช้คำสั่งที่คอมไพล์ไฟล์ต้นฉบับหนึ่งๆ และแก้ไขตามที่จำเป็นได้

เริ่มต้นด้วยการไปที่ไดเรกทอรีเอาต์พุตและใช้ autoninja (หรือ ninja) เพื่อคอมไพล์ไฟล์ที่สนใจ (และการอ้างอิงใดๆ) โดยใช้คำต่อท้าย ^ คำต่อท้ายนี้จะบอกให้นินจาสร้างเอาต์พุตของ file—version.o ที่ระบุในกรณีนี้ จากนั้นแตะไฟล์ และคอมไพล์ (เฉพาะไฟล์) อีกครั้งด้วยแฟล็ก -v (แบบละเอียด) ไปยังนินจา:

ใน Linux หรือ OSX:

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

ในเชลล์ของ Windows cmd ^ เป็นอักขระพิเศษและต้องใช้ Escape:

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 ออกจากตอนต้น (ซึ่งจะพิมพ์เอาต์พุต 1 บรรทัดสำหรับ #include แต่ละรายการ) แล้วเพิ่ม /P เพื่อประมวลผลไฟล์ล่วงหน้าแทนการคอมไพล์ ผลลัพธ์จะบันทึกอยู่ในไดเรกทอรีปัจจุบันใน version.i:

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

ตอนนี้คุณสามารถตรวจสอบไฟล์ที่ประมวลผลล่วงหน้าเพื่อดูว่ามาโครทำงานอะไรอยู่จริง หรือทำการเปลี่ยนแปลงทดสอบกับสวิตช์คอมไพเลอร์และคอมไพล์อีกครั้งเพื่อดูสิ่งที่เกิดขึ้น

แหล่งข้อมูลเพิ่มเติม

  • Chrome บิลด์ที่รวดเร็ว: ดูเคล็ดลับการเพิ่มประสิทธิภาพบิลด์เพิ่มเติม (เน้นไปที่ Windows)
  • ETW: ค้นหาวิธีค้นหาปัญหาประสิทธิภาพของ Windows ใน Chrome หรือในบิลด์ด้วยการอ่านเอกสาร ETW (หรือที่เรียกว่า Xperf)