Theppitak's blog

My personal blog.

02 กุมภาพันธ์ 2552

VPATH Build

ตอนที่แล้ว build Mozilla นอก source tree ไปแล้ว คราวนี้ก็ถึงตา GNOME บ้าง แต่ก่อนจะเขียนต่อไป ขอกล่าวถึงการ build นอก source tree สักหน่อย เผื่อว่าบางคนจะยังไม่เห็นภาพ

การคอมไพล์โปรแกรมใน ระบบของ GNU นั้น โดยปกติเราอาจจะ configure, make และ make install ในไดเรกทอรีที่เก็บซอร์ส ซึ่งจะสร้างแฟ้ม object ต่าง ๆ ลงในไดเรกทอรีนั้นเลย และถ้าเราต้องการลบแฟ้ม object ดังกล่าวเพื่อให้เหลือแต่ซอร์ส ก็สามารถสั่ง make clean (หรือ make distclean หรือ make maintainer-clean ตามระดับความสะอาดที่ต้องการ รายละเอียดพูดแล้วยาว อ่าน reference ดีกว่า ถ้าสนใจ) แต่ในบางครั้ง เราต้องการจะแตะต้อง source tree น้อยกว่านั้น ด้วยเหตุผลบางประการ เช่น

  • ต้องการรักษาความสะอาดของ source tree อย่างเต็มที่ เพราะในบางกรณี Makefile ที่มีการดัดแปลงเองก็อาจจะ clean ไม่ครบ ทำให้บางครั้งนักพัฒนาไม่เข้าใจปัญหาของผู้ใช้ที่ build ไม่ผ่าน (เช่น ใน GNOME #569977) หรืออาจจะเป็นเหตุผลเรื่องการ backup ข้อมูล โดยไม่ได้ต้องการ backup แฟ้มไบนารีด้วย การ build ลงใน source tree ก็หมายความว่าต้อง clean ให้หมดก่อน backup แล้วในการ build ครั้งต่อไปก็ต้องเริ่ม build ใหม่หมด
  • ต้องการ build โปรแกรมหลายแบบ โดยใช้ configure option ที่ต่างกัน การ build ลงใน source tree ก็หมายความว่า ถ้าจะเปลี่ยน configuration ก็ต้อง configure ใหม่ แล้ว build ใหม่หมด ถ้ามีการเปลี่ยนแปลงซอร์สบางส่วน แล้วต้องการกลับไป build option เดิมใหม่ ก็ต้อง clean option ปัจจุบันก่อนแล้วไป configure ใหม่เช่นกัน ซึ่งไม่สะดวก กรณีของ multi-configuration นี้ที่พบบ่อยสำหรับผม ก็คือการ configure เพื่อ build รุ่นทดสอบในระหว่างพัฒนา กับ configure อีกแบบหนึ่งเพื่อ release และโปรแกรมที่มี configuration option เยอะ แม้แต่รุ่นทดสอบเองก็อาจต้องแยกเป็นหลายแบบ

การ build โปรแกรมนอก source tree ช่วยได้ โดยไปสั่ง build จากไดเรกทอรีอื่น ซึ่งจะอ่านซอร์สจาก source directory แต่เขียนแฟ้ม object ลงในไดเรกทอรีที่ build แทน คุณสามารถสร้างไดเรกทอรีสำหรับ build กี่ชุดก็ได้ โดยแต่ละชุดก็ใช้ configure option ต่าง ๆ กันไป โดยจะไม่มีการแตะต้อง source tree เลย

ตัวอย่างที่ 1: สร้างไดเรกทอรีย่อยใต้ source tree เพื่อ build

$ cd foo-0.1.0
$ mkdir build.debug
$ cd build.debug
$ ../configure --enable-debug
$ make
$ sudo make install

ตัวอย่างที่ 2: สร้างไดเรกทอรี build ข้างนอกต่างหากเลย

$ mkdir -p ~/build/foo.debug
$ cd ~/build/foo.debug
$ ~/src/foo-0.1.0/configure --enable-debug
$ make
$ sudo make install

การ build ลักษณะนี้ เป็นไปได้ด้วยกลไกที่เรียกว่า VPATH ของ make ซึ่ง เอกสารของ GNU make บอกว่ามีมาตั้งแต่ make ของ System V แล้ว เพียงแต่ไม่มีเอกสารอธิบายในตอนนั้น และเริ่มมีการกล่าวถึงเป็นครั้งแรกในเอกสารของ 4.3 BSD โดยอ้างว่าเป็น feature ที่คล้ายกับ VPATH ของ System V

VPATH นี้ เป็นตัวแปรที่มีความหมายพิเศษใน make คือเป็นรายการไดเรกทอรีที่จะค้นหาแฟ้ม ไม่ว่าจะเป็น source หรือ target ในลักษณะเดียวกับตัวแปรสภาพแวดล้อม PATH ของเชลล์ เช่น สมมุติว่ามีการกำหนด:

VPATH = ../src:../includes

จะทำให้กฎที่เขียนแบบนี้:

foo.o: foo.c

มีความหมายประหนึ่งว่าเขียนแบบนี้ด้วยในกรณีที่หา foo.c ไม่เจอในไดเรกทอรีปัจจุบัน:

foo.o: ../src/foo.c

หรือถ้าที่ ../src/foo.c ยังไม่เจออีก ก็จะไปหาที่ ../includes/foo.c ต่อไป

ทีนี้ ถ้าลองเปิด Makefile.in ที่สร้างจาก automake ขึ้นมาดูสักแฟ้ม ก็จะเห็นบรรทัดนี้:

VPATH = @srcdir@

ซึ่งเมื่อเรียก configure เพื่อสร้าง Makefile เทมเพลต @srcdir@ นี้ ก็จะถูกแทนที่ด้วย dirname ของ configure ที่ใส่ในบรรทัดคำสั่ง ตามด้วย subdir ที่ Makefile.in นั้น ๆ อยู่ ผลก็คือ เราเรียก configure โดยอ้างพาธไหน make ก็จะเพิ่มพาธนั้นในการค้นหาซอร์สด้วย ทำให้เราสามารถออกมา build นอก source tree โดยที่ยังสามารถอ่านซอร์สจาก source tree ได้ด้วยประการฉะนี้

ยาวซะแล้ว กลายเป็น blog เรื่อง VPATH build ไปเลย ไว้คราวหน้าค่อยเขียนถึงการ build GNOME ทั้งตัวนอก source tree ละกัน

ป้ายกำกับ: ,

0 ความเห็น:

แสดงความเห็น (มีการกลั่นกรองสำหรับ blog ที่เก่ากว่า 14 วัน)

<< กลับหน้าแรก

hacker emblem