วิธีการ Cross-Compile Qt 5 สำหรับ Raspberry Pi ตอนที่ 1

วิธีการ Cross-Compile Qt 5 สำหรับ Raspberry Pi ตอนที่ 1

Basic cross compile Qt application 01

Cross-compile คืออะไร?

           Cross-compiler คือ การ Compile Code จาก Platform หนึ่งเพื่อสร้าง executable สำหรับไปใช้กับอีก Platform หนึ่งเช่น

  • ใช้ PC, Notebook (x86) compile สร้าง executable ไป Run บน Smart phone Android (ARM)
  • ใช้ Arduino IDE บน PC compile สร้าง executable นำไปโปรแกรมลงบน Arduino (RISC)

ทำไมต้อง Cross-compile ?
โดยปกติแล้ว การพัฒนาแอพพลิเคชั่นเราจะมีเครื่องมือพื้นฐานสำหรับ Compile บน Platform นั้นๆ ได้อยู่แล้วเรียกว่า Native Tool-chain เช่น บอร์ด Raspberry Pi เองก็สามารถ Compile โปรแกรมบนบอร์ดได้ แม้กระทั่ง Qt เองก็สามารถใช้ Native Tool-chain และติดตั้งตัว Qt Creator แล้วพัฒนาโปรแกรมบนบอร์ดได้เลยอย่างบน RPi 2 ตัวบอร์ดมีทรัพยากรสูงทั้ง CPU และ RAM แต่สำหรับ RPi ตัวแรกจะเห็นได้ว่าทำงานค่อนข้างช้า หรือแม้แต่ใน RPi 2 หาก Appilcation ใหญ่หรือซับซ้อนมากก็อาจรู้สึกว่าช้าหรือมีปัญหาทรัพยากรได้เช่นกัน
การ Cross-compile จึงเป็นทางเลือกหนึ่ง ที่ช่วยเพิ่มประสิทธิภาพในการพัฒนาโดยใช้เครื่อง PC ที่มีทรัพยากรและความสามารถที่มากกว่า เป็นตัว Compile แล้วจึงนำ Executable ไป Run บนบอร์ด ข้อเสียคือเราต้องเสียเวลาและมีขั้นตอนในการเซ็ตอัพ Environment ก่อน
สิ่งที่ต้องใช้สำหรับ Cross-compile:
1. เครื่อง Computer ที่ใช้ระบบปฏิบัติการ Linux (Ubuntu / Debian) ซึ่งลงบนเครื่องจริงหรืออาจใช้ Virtual Machine อย่างเช่น VMware หรือ VirtuaBox 
2. ไฟล์ Image ของ Raspberry Pi (Download >> https://www.raspberrypi.org/downloads ในที่นี้ใช้ RASPBIAN JESSIE)
3. Qt for Linux (Download >> http://qt-project.org/downloads )
4. Qt Source package & Others (Download >> http://qt-project.org/downloads )
5. Tool-chain (Download >> https://github.com/raspberrypi/tools
6. Cross-compile-tools repository (Download >> git://github.com/shahriman/cross-compile-tools.git)
ขั้นตอนการ Compile:

Basic cross compile Qt application 02

วิธีการติดตั้ง Qt บน Ubuntu:
1. Download Qt for Ubuntu (Download >> http://qt-project.org/downloads)

Basic cross compile Qt application 03

2. เปิด terminal ขึ้นมา
3. พิมพ์คำสั่ง >> sudo apt-get update เพื่ออัพเดทรายการสารบัญที่อยู่ของซอฟท์แวร์จาก repository จากนั้นรอสักครู่ให้การอัพเดทเสร็จสิ้น

4. ติดตั้ง g++ พิมพ์ >> sudo apt-get install g++

5. ติดตั้ง Graphic Library พิมพ์ >> sudo apt-get install libgl1-mesa-dev

6. ติดตั้ง Git พิมพ์ sudo apt-get install git

7. Run โปรแกรม ติดตั้ง Qt โดยพิมพ์ sudo ./qt-opensource-linux-x64-5.5.1.run

Basic cross compile Qt application 08
Basic cross compile Qt application 09

8. เลือก Path ให้ไปติดตั้งลงใน /usr/local/Qt5.5.1

Basic cross compile Qt application 11

9. กด Next ไปจนจบการติดตั้ง
10. ทดลองสร้าง Project เพื่อทดสอบว่าการติดตั้งเสร็จสมบูรณ์

วิธีการติดตั้ง OS ของ Raspberry Pi:
เริ่มต้นวิธีการติดตั้ง Image ของ RPi ลงบน SD Card ได้โดย
1. สร้างไดเรกทอรี่ ชื่อ opt ไว้ใน Home Directory พิมพ์ >> mkdir opt
2. เข้าไปในไดเรกทอรี่ opt พิมพ์ >> cd opt
3. Download Image Raspberry Pi 
4. พิมพ์ >> wget http://downloads.raspberrypi.org/raspbian_latest
5. แตก File raspbian_latest.zip พิมพ์ >> unzip raspbian_latest.zip
6. เปลี่ยนชื่อ File image raspberrypi เป็น raspbian.img 
พิมพ์ >> mv 2015-11-21-raspbian-jessie.img raspbian.img
7. เสียบ SD เข้ากับเครื่อง Computer
8. ติดตั้ง Image ของ RPi ลงใน SD Card โดย พิมพ์ >> sudo dd bs=4M if=raspbian.img of=/dev/sdb
9. ลบ Image ของ RPi ทิ้ง พิมพ์ >> rm raspbian.img
10. นำ SD Card ไปติดตั้งที่บอร์ด Raspberry Pi
วิธีการติดตั้ง Package ที่สำคัญลงบน Raspberry Pi:
1. เปิด Terminal บน Raspberry Pi ขึ้นมา
2. Expand Filesystem พิมพ์ >> sudo raspi-config แล้วเลือกหัวข้อ Expand Filesystem แล้ว Reboot
3. พิมพ์คำสั่ง >> sudo apt-get update 
4. เพื่ออัพเดทรายการสารบัญที่อยู่ของซอฟท์แวร์จาก Repository จากนั้นรอสักครู่
5. ติดตั้ง Lib xcb พิมพ์ >> sudo apt-get install “^libxcb.*” libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev
6. ติดตั้ง Lib Qt WebKit พิมพ์ >> sudo apt-get install flex bison gperf libicu-dev libxslt-dev ruby
7. ติดตั้ง Lib Qt WebEngine พิมพ์ >> sudo apt-get install libcap-dev libbz2-dev libgcrypt11-dev libpci-dev libnss3-dev build-essential libxcursor-dev libxcomposite-dev libxdamage-dev libxrandr-dev libdrm-dev libfontconfig1-dev libxtst-dev libasound2-dev gperf libcups2-dev libpulse-dev libudev-dev libssl-dev flex bison ruby libxss-dev libatkmm-1.6-dev
8. ติดตั้ง Lib Qt Multimedia พิมพ์ >> sudo apt-get install libasound2-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev
9. ติดตั้ง Git พิมพ์ >> sudo apt-get install git-core
10. ติดตั้ง WiringPi พิมพ์ 
>> git clone git://git.drogon.net/wiringPi
>> cd wiringPi
>> git pull origin
>> ./build
Dump Image กลับมาจาก SD Card:
1. ถอด SD Card ออกจากบอร์ด Raspberry Pi แล้วนำกลับมาเสียบที่ Computer
2. เข้าไปยังไดเรกทอรี่ opt ที่อยู่ใน Home ที่สร้างไว้ก่อนหน้านี้ พิมพ์ >> cd ~/opt
3. Dump ข้อมูลใน SD Card ที่เราติดตั้ง Lib ต่างๆ ไว้เรียบร้อยแล้ว กลับมาเป็น image File ชื่อว่า raspbian.img ดังนี้ 
พิมพ์ >> sudo dd if=/dev/sdb of=~/opt/raspbian.img 
4. เปลี่ยนสิทธิ์ให้กับ File raspbian.img พิมพ์ >> sudo chmod 777 raspbian.img 
Note!!! Image File ที่ได้จะมีขนาดเท่ากับความจุของ SD Card ที่ใช้
Mount Image:
1. สร้างไดเรกทอรี่ rasp-pi-rootfs ใน /mnt 
พิมพ์ >> sudo mkdir /mnt/rasp-pi-rootfs
2. ไปที่ไดเรกทอรี่ opt พิมพ์ >> cd ~/opt
3. หาค่า offset สำหรับ Mount image โดยใช้ losetup 
พิมพ์ >> sudo /sbin/losetup /dev/loop0 raspbian.img 
พิมพ์ >> sudo /sbin/fdisk -l /dev/loop0

จะเห็นว่า จุดเริ่มต้นของ offset ที่เราต้องการอยู่ที่ sector ที่ 131072 ซึ่งใน 1 sector มี 512 bytes เพราะฉะนั้นจุด offset ของเราจึงอยู่ที่ 131072 * 521 = 67108864
4. Mount image raspbian.img ขึ้นมา 
พิมพ์ >> sudo mount -o loop,offset=67108864 ~/opt/raspbian.img /mnt/rasp-pi-rootfs/
5. ทดลอง List File ใน /mnt/rasp-pi-rootfs 
พิมพ์ >> ls /mnt/rasp-pi-rootfs
จะเห็นไดเรกทอรี่ต่างๆ ของ raspbian.img

Basic cross compile Qt application 13

Download and Extract Qt Source Packages:
Source packages Qt:
1. Download Source packages ของ Qt ที่ >> http://qt-project.org/downloads 

Basic cross compile Qt application 14

2. Copy File ที่ Download (qt-everywhere-opensource-src-5.5.1.tar.gz) มาไปไว้ในไดเรกทอรี่ ~/opt ที่สร้างเอาไว้
3. Extract File ออกมา 
พิมพ์ >> cd ~/opt
พิมพ์ >> tar xvzf qt-everywhere-opensource-src-5.5.1.tar.gz 
Download and Install Toolchain:
1. Git Toolchain 
พิมพ์ >> cd ~/opt
พิมพ์ >> git clone git://github.com/raspberrypi/tools.git
2. Git cross-compile-tools repository
พิมพ์ >> git clone git://github.com/shahriman/cross-compile-tools.git
3. Fix the symbolic links
พิมพ์ >> cd ~/opt/cross-compile-tools/
พิมพ์ >> ./fixQualifiedLibraryPaths /mnt/rasp-pi-rootfs ~/opt/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gcc
Configure and Compile Qt:
1. ไปที่ไดเรกทอรี่ Source packages ของ Qt 
พิมพ์ >> cd ~/opt/qt-everywhere-opensource-src-5.5.1/
2. Export variables ของ PATH ของ System root และ Tool-chain
พิมพ์ >> export RPI_SYSROOT=/mnt/rasp-pi-rootfs/  
พิมพ์ >> export RPI_TOOLCHAIN=~/opt/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-
3. Configure Qt

พิมพ์ >> ./configure -opengl es2 \
-device linux-rasp-pi-g++ \
-device-option CROSS_COMPILE=$RPI_TOOLCHAIN \
-sysroot $RPI_SYSROOT \
-opensource \
-confirm-license \
-optimized-qmake \
-reduce-exports \
-release \
-make libs \
-prefix /usr/local/qt5pi \
-no-pch \
-skip qtwebkit \
-v
4. Make Qt
พิมพ์ >> make -jx (x = จำนวน Core CPU สำหรับ make)
5. ในขั้นตอนนี้ ใช้เวลาค่อนข้างนาน (ตัวอย่างที่ทีมทดลองคือ เริ่มสั่ง make โดยใช้ CPU จำนวน 1 core เริ่มตอน 23.30น. เสร็จตอน 03.40น.)

6. สั่ง Make install พิมพ์ >> sudo make install
7. เช็ดว่ามีไดเรกทอรี qt5pi อยู่ใน image หรือยัง 
พิมพ์ >> ls /mnt/rasp-pi-rootfs/usr/local/
8. Unmout image 
พิมพ์ >> sync
พิมพ์ >> sudo umount/mnt/rasp-pi-rootfs
ติดตั้ง Image ใหม่ลงไปยัง SD Card:
1. เชื่อมต่อ SD Card กับ PC
2. เช็ค Disk พิมพ์ >> df –h
3. ถ้ามี /dev/sdb1 และ /dev/sdb2 อยู่ให้ umount ทั้งคู่ออก
พิมพ์ >> umount /dev/sdb1 
พิมพ์ >> umount /dev/sdb2
4. เข้าไปที่ไดเรกทอรี่ opt พิมพ์ >> cd ~/opt
5. ติดตั้ง Image raspbian.img ลงใน SD Card 
พิมพ์ >> sudo dd bs=4M if=raspbian.img of=/dev/sdb
พิมพ์ >> sync
6. ถอด SD card ไปเสียบที่บอร์ดตามปกติ

>>> คลิกอ่าน ตอนที่ 2 <<