Saturday, July 29, 2006

How to build Firefox

จริงๆ เรื่องนี้สามารถหาได้ง่ายๆ ในอินเทอร์เน็ต ไม่ว่าจะเป็นที่ Mozilla เองหรืออีกหลายๆ ที่ที่ได้มีการบันทึกวิธี build เอาไว้บน platform ต่างๆ เช่น การ build Firefox บน Windows ให้ตัดคำไทยโดยคุณสัมพันธ์ที่ osdev.co.th หรือของคุณพูนลาภที่เขียนไว้นานแล้ว (ซึ่งบางส่วนอาจจะ obsolete ไปแล้ว) ก็เลยขอมาบันทึกเพิ่มเติมไว้ที่นี่ อีกอย่างติดคุณ wd เอาไว้นานแล้วด้วย (แหะๆ)

  • รุ่นที่จะทำการ build -- Firefox 1.5.0.5
  • Platform -- Linux i686
  • Engine สำหรับตัดคำภาษาไทย -- ICU
  • Patches ที่ใช้ สามารถดาวน์โหลดได้ ที่นี่
    • Mozilla ICU Thai patch 2.8 -- เพื่อให้เรียก icu สำหรับตัดคำไทย
    • Mozilla with-icu patch 0.6 -- เพื่อให้คำสั่ง configure สามารถเรียก option --with-icu ได้
    • Mozilla fix CTL patch 4.12 -- เพื่อแก้ไขปัญหาแสดงผลผิดพลาดเมื่อมี justify tag ในหน้าเว็บ
  • สิ่งอื่นๆ ที่ต้องมี
    • ชุด development ของ icu, pango, X, gtk2 ฯลฯ ซึ่งถ้าหากใช้ดิสโทรที่มี apt-get หรือ smart น่าจะหาได้ไม่ยาก
    • Compiler (GCC นั่นแหละ)
    • ชุด autoconf >= 2.13 เพราะต้องทำการปรับปรุง configure script ใหม่
    • พวก utilities อื่นๆ อย่างเช่น gzip, tar, textutils ซึ่งมันก็ควรจะมีอยู่แล้ว



ทีนี้ก็มาเริ่มกันได้...

ก่อนอื่น ขั้นแรกต้องไปดาวน์โหลดต้นรหัสหรือ source code มาก่อน ซึ่งสามารถดาวน์โหลดได้จากftp ของ mozilla เสร็จแล้วก็แตกไฟล์ออกด้วยคำสั่ง
tar -jxvf firefox-1.5.0.5-source.tar.bz2


จะได้ไดเร็คทอรี mozilla ออกมา ขั้นต่อมาก็ให้ทำการก็อปปีไฟล์ patches เข้าไปไว้ในไดเร็คทอรี mozilla แล้วก็ทำการ patch จากภายในไดเร็คทอรีดังนี้

#patch สำหรับแก้ไข justify tag
patch -p1 < deerpark-cvs-rtl-v4.12.patch

#patch สำหรับเรียก icu ให้ตัดคำไทย
patch -p1 < mozilla-icuthai-2.8.patch

#patch สำหรับแก้ให้ script configure สามารถเรียกใช้ option --with-icu ได้
patch -p1 < mozilla-withicu-0.6.patch

#เรียกโปรแกรม autoconf เพื่อสร้าง configure
autoconf-2.13


จากนั้นเราก็ใกล้จะได้เริ่มทำการ build แล้วครับ (แหะๆ ) แต่เดี๋ยวก่อน! สำหรับการ build โปรแกรมจาก mozilla นั้น มีขั้นตอนพิเศษอยู่อีกนิดนึง นั่นคือ options สำหรับ configure script จะถูกเก็บเอาไว้ในแฟ้ม .mozconfig ซึ่งเนื้อหาภายในก็จะเกี่ยวข้องกับการสร้าง buildroot directory และ switches สำหรับการ build firefox ให้มีความสามารถต่างๆ เช่น ให้รองรับ canvas, ให้ใช้ชุดคำสั่ง pango เป็นต้น ส่วนอันนี้เป็นตัวอย่างของ .mozconfig ที่ผมใช้


. $topsrcdir/browser/config/mozconfig

mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/firefox_build
ac_add_options --enable-static --disable-shared
ac_add_options --disable-tests
ac_add_options --enable-optimize
ac_add_options --disable-debug
ac_add_options --with-icu
ac_add_options --enable-default-toolkit=gtk2
ac_add_options --enable-pango
ac_add_options --enable-svg
ac_add_options --enable-xinerama
ac_add_options --enable-xft
ac_add_options --enable-ctl
ac_add_options --enable-canvas


บรรทัดบนสุดบอกว่า จะทำการ build Firefox (เทียบเท่า option --enable-application=browser)
บรรทัดถัดมาบอกให้ทำการ build ในไดเร็คทอรีต่างหาก ชื่อว่า firefox_build ซึ่งมีประโยชน์ก็คือมันจะไม่ mess up ซอร์สในไดเร็คทอรี mozilla และหากว่าคุณต้องการ build แอพพลิเคชันตัวอื่นๆ ในชุด mozilla ด้วย build root เดียวกันก็จะสามารถทำได้
ส่วน options ตัวอื่นๆ ได้แก่ ให้ทำการ build แบบ static แปลว่า ให้รวมไลบรารีทั้งหมดที่เกี่ยวข้องลงมา โดยไม่ต้องไปเรียก shared libraries อีก มีผลทำให้เร็วขึ้น และไม่มีปัญหาเวลาไป run บนดิสโทรอื่น (เพราะรวมไว้หมดแล้ว), เปิดการ optimization, ปิดการดีบัก, ใช้ icu, ใช้ pango, gtk2, xft, xinerama, เปิดการสนับสนุน svg, canvas, complex text layout (เช่นภาษาไทย)
ซึ่งตรงนี้ถ้าอยาก build แบบ conventional คือเรียก ./configure --option1 --option2 ... แล้ว make ก็ได้มั้ง แต่มันคงยุ่งมากเลย แล้วที่ mozilla ก็ไม่แนะนำให้ทำแบบนั้น

แล้วก็ได้เวลา build ... สำหรับตอนที่ผม build นั้นมันเกิดปัญหานิดหน่อย คือมันติดตรงที่ script มันไม่เรียก link libraries ที่จำเป็นอยู่ 2 ตัว คือ libXft กับ libpangoxft-1.0 ผมเลยต้องกำหนด LDFLAGS เพิ่มเข้าไปก่อนทำการ build


LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lXft -L/usr/lib -lpangoxft-1.0"
export LDFLAGS


แล้วจึงทำการเรียกคำสั่ง build

make -f client.mk build


รอ + ภาวนาให้มัน build ผ่าน หรือออกไปหาข้าวกินก่อนก็ได้ครับ ตรงนี้ขึ้นอยู่กับเครื่อง ถ้าหาก ram เยอะ processor เร็วๆ อาจใช้เวลาประมาณ 20 นาทีถึงครึ่งชั่วโมง ถ้าน้อยๆ ก็อาจจะเป็นชั่วโมงครึ่ง สำหรับผมใช้เวลา ~45 นาที

หลังจากนี้ถ้า build เรียบร้อยแล้ว ก็มาทำการรวมไฟล์ทั้งหมดแล้วสร้างเป็นตัว installer (จริงๆ คือ tarball ไม่มีอะไรมากกว่านั้น)

make -C firefox_build/browser/installer


ตรง firefox_build คือ build root ที่ผมบอกให้ .mozconfig สร้างไว้ครับ แล้วแต่ว่าคุณจะกำหนดเป็นอะไร หลังจากสั่งแล้ว คุณจะได้ไดเร็คทอรี firefox ซึ่งสามารถเรียกใช้งานได้เลย และ Firefox tarball อีก 1 ไฟล์สำหรับแจกจ่าย อยู่ใน mozilla/firefox_build/dist ครับ

สุดท้ายนี้ ถ้าไม่อยาก build เองก็เชิญ load ได้ที่นี่ครับ ผม build ไว้บน PCLOS แต่ทดสอบกับ Ubuntu แล้ว เรียบร้อยดี :D
md5sum คือ 3417dad14a5315bc4f07b5c4c31c4181 ครับ

update: ผม build 1.5.0.6 แล้วอยู่ ที่นี่ ครับ

8 comments:

Keng said...

ทำไมแค่ 45 นาทีเองอ่ะ

ผม build Universal Binary นี่สามชั่วโมงกว่า ถ้า build เฉพาะ PPC ก็ชั่วโมงกว่าแน่ะ - -"

DrRider said...

ไม่รู้สิ... แต่เครื่องก็ P4 3.06GHz Ram 768M อะ ไม่รู้มีอะไรเกี่ยวกับ GCC อีกด้วยป่าว ที่ทำให้เร็ว

ตอน build เวอร์ชัน 1.0.x เร็วกว่านี้อีก ครึ่งชั่วโมงเอง

plynoi said...

แหะๆ Step By Step ดีชอบๆ
แต่ไม่รุ้เรื่องพวกนี้เลยแฮะ - -"

Keng said...

build ของวินโดวส์สิหมวด...

DrRider said...

ของ Windows มีคน build แล้ว (ป๋าฮุ้ย) อีกอย่าง ขี้เกียจลง cygwin อะ

DrRider said...

ฮือๆ มันออก 1.5.0.6 T_T

Mr.Somjate said...

ผมเหล่ๆ จำวิชาไว้ มีโอกาสคงได้ใช้บ้างฮะ ^.^

อ่านในบล็อกของคุณเทพ เห็นว่าคิดค้นเทคนิคใหม่ได้ โดยไม่ไปยุ่งกับกับโค็ดหลัก นี่ก็น่าสนใจ ดีๆครับ ทำกันเยอะๆ จะช่วยแล็ปเทสให้ ...

wd said...

ขออนุญาตขโมยไปเก็บรอศึกษาหน่อยนะครับ :)