2017년 5월 8일 월요일

Python & Qt book 소개

Python 및 Qt를 study하는 분들을 위해 참고할 만한 book 및 관련 web site 정보를 소개해 보고자 한다. 아래 내용은 어디까지나 본 blogger의 개인적인 견해일 뿐, 내용 중 일부는 사실과 다를 수 있음을 미리 밝힌다.  책 내용이 좋고 나쁨을 언급하고자 하는 것이 목적이므로, 저자나 출판사 정보는 별도로 정리하지 않기로 한다.

<Python programming>

Python의 활용도는 무궁무진하다. 그 중에서도 본 blogger가 특히 관심을 가지고 앞으로 몇 차례에 걸쳐 소개할 내용을 요약해 보면 다음과 같다.
a) 각종 장치 제어용(embedded system에서 python을 사용하여 장치 제어) programming
b) system programming(daemon, thread, socket ...)
c) 웹서버 연동용(CGI, DB 연동 ...) programming
d) Qt programming(= PySide)
e) PyGame programming
f) ROS(Robot Operating System) programming
g) ..

1. Python 기초 books
Python 초심자를 위한 책을 소개해 보면 다음과 같다.

a) Python crash course [번역서 있음] - 파이썬 단기 특강




주) 복잡한 내용은 모두 제거한 상태에서 초심자에 맞게 쉽게 설명되어 있음. 또한 책 후반부에는 유용한 활용 예제를 소개해주고 있음.

b) 점프 투 파이썬


주) 복잡한 내용은 모두 제거한 상태에서 초심자에 맞게 쉽게 설명되어 있음. 위의 site에 책의 내용이 모두(?) 담겨 있음(저자의 mind가 훌륭해 보임).


c) 뇌를 자극하는 파이썬 3


주) 복잡한 내용은 모두 제거한 상태에서 초심자에 맞게 쉽게 설명되어 있음. 후반부에 약간의 응용 예제를 소개하고 있음.


2. Python advanced books
Python은 배우기가 매우 쉬운 language로 잘 알려져 있다. 하지만, 내용을 깊이 들여다 보면 볼 수록 꼭 그렇지만은 않다는 사실을 알게 된다. 아래 내용은 개발자가 읽어 보아야 할 책들을 정리해 본 것이다.

a) Python essential reference, 4th edition[번역서 있음]


주) 저자가 Python에 정통한 분임(아래 Python cookbook의 저자이기도 함). pdf 문서를 인터넷에서 찾을 수 있음.

b) Python cookbook, 3rd edition[번역서 있음]


주) 다양한 예제를 소개하고 있음. pdf 문서를 인터넷에서 찾을 수 있음.

c) Fluent python: clear, concise, and effective programming[번역서 있음]



주) python에만 있는 독특한 특징을 위주로 소개하는 책임(초심자가 보기에는 어려울 수 있음). pdf 문서를 인터넷에서 찾을 수 있음.

d) ...
그 밖에도 개발자 취양 및 필요성에 맞는 책은 너무도 많다.


3. PySide 관련 book & site
이번 절에서는 Python과 Qt 사용자를 위한 PySide programming에 관한 책 및 web site를 소개해 보고자 한다. 더불어 PySide 관련하여 간단한 예제를 소개해 보도록 하겠다.


a) https://wiki.qt.io/PySide2
  => PySide wiki page
  => http://code.qt.io/cgit/pyside/examples.git/tree/examples

b) PySide GUI Application Development
 => PySide 관련 서적 

주) 내용은 빈약한 편이나 PySide를 다룬 유일한 책. pdf 문서(1st edtion)를 인터넷에서 찾을 수 있음.

c) 사물인터넷을 품은 라즈베리파이(사물인터넷 프로그래밍의 모든 것)
  => PySide 관련 내용 언급(5장) 


주) 초/중급 개발자를 위해 필요한 정보가 알차게 정리되어 있음.

d) http://blog.colab.kr/12
  => PySide 관련 기초 지식 정리 blog 

e) https://www.gitbook.com/book/david-estevez/tutorial-pyside-pyqt4/details
  => PySide 관련 내용 정리 site 

f) https://github.com/EricThomson/PySideSummer
  => Rapid GUI Programming with Python and Qt 서적의 예제 프로그램을 PySide로 변경한 site

g) http://zetcode.com/gui/pysidetutorial/
  => PySide tutorial 정리 site 


3.1 PySide 개발 환경 구축하기
이번 절에서는 Ubuntu 16.04 LTS(64bit) PC 에 Qt 5, Python 3.x, PySide 패키지 및 PyCharm IDE를 설치하는 방법을 소개하고자 한다.

3.1.1 Qt 5 설치하기
먼저 Ubuntu 16.04 LTS(64bit)용 Qt 5를 설치하기 위해서는 이전 blog의 내용(2절)을 참조해 주기 바란다.

3.1.2 Python 설치하기
Python(2.x or 3.x version)은 아래 site로 부터 설치 가능하다(간단한 사항이므로 추가 설명은 생략함).

3.1.3 PySide 설치하기
다음으로 pyside 관련 package를 설치하도록 하자.

sudo apt-get install python-pyside pyside-tools

Python 3.x 환경에서 PySide를 사용하고자 한다면, 아래와 같이 pyside를 설치해 주면 된다.
sudo apt-get install python3-pyside

pyside가 정상적으로 설치되었는지 확인해 보도록 하자.

<python 2.x에서 동작 확인>
python
Python 2.7.12 (default, Nov 19 2016, 06:48:10)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import PySide
>>> print(PySide.__version__)
1.2.2
>>>

<python 3.x에서 동작 확인>
python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import PySide
>>> print(PySide.__version__)
1.2.2
>>>


3.1.4 PyCharm IDE 설치하기
Python을 위한 IDE로는 여러 가지(아래 link 참조)가 있다.

이 중에서 (물론 IDLE이나 vi(m)를 사용해도 되겠지만)본 blogger가 사용하려는 IDE는 IntelliJ IDEA로 유명한 JetBrains 사에서 만든 PyCharm이다. 아래 site로 부터 PyCharm Community Edition을 download 받아 실행해 보도록 하자.


그림 3.1 PyCharm community edition download 모습

tar xvzf pycharm-community-2017.1.1.tar.gz
cd pycharm-community-2017.1.1

vi Install-Linux-tar.txt
  => pycharm을 실행하는 방법을 확인해 보자.

cd bin
./pycharm.sh &

그림 3.2 PyCharm 실행 모습 1


그림 3.3 PyCharm 실행 모습 2 - Open 선택 

PyCharm 사용 방법은 매우 직관적이므로 별도로 설명을 추가하지는 않겠다. 아래 site에 가보면 PyCharm 관련 사용법이 자세히 나와 있으니 참고하면 될 듯하다.

--------------------------------------------------------------------------------------------------------------------------------------------------
참고 사항) 위에 언급된 IDE 외에도 GTK2로 작성된 지니(http://www.geany.org)도 쓸만한 editor로 추천할만하다(PyCharm은 java로 만들어져서 그런지 좀 느린 편임).

<Ubuntu에서 설치>
$ sudo apt-get install geany


그림 3.4 Geany 실행 모습
--------------------------------------------------------------------------------------------------------------------------------------------------


3.2 PySide 예제 program 소개 
이번 절에서는 앞서 b)에서 소개한 "PySide GUI Application Development" 책에 소개되어 있는 몇가지 PySide 예제를 소개해 보는 형태로 내용을 진행해 보도록 하겠다.

3.2.1 example 1
그림 3.5 PySide example 1 - Ch1_1.py

그림 3.6 PySide example 1 - Ch1_1.py 실행 모습

<Ch1_1.py>
# 필요한 module을 import
import sys
from PySide.QtCore import Qt
from PySide.QtGui import QApplication, QLabel

# Main 함수
if __name__ == '__main__':

    # main application을 생성한다.
    myApp = QApplication(sys.argv)

    # Label을 만들고, 몇가지 속성을 설정한다.
    appLabel = QLabel()
    appLabel.setText("Hello, World!!!\n Look at my first app using PySide")
    appLabel.setAlignment(Qt.AlignCenter)
    appLabel.setWindowTitle("My First Application")
    appLabel.setGeometry(300, 300, 250, 175)

    # Label을 출력한다.
    appLabel.show()

    # Application을 실행하고, 종료한다.
    myApp.exec_()   #event loop 상태에서 대기한다.
    sys.exit()
-------------------------------------------------------------------------



여기서 잠깐 ! python code를 감추고자 한다면 ...
python3 -m py_compile ./Ch1_1.py
cd __pycache__/
$ ls -l
-rw-rw-r-- 1 chyi chyi  594  4월 22 19:07 Ch1_1.cpython-35.pyc
chmod 755 ./Ch1_1.cpython-35.pyc
./Ch1_1.cpython-35.pyc
-------------------------------------------------------------------------


3.2.2 example 2



그림 3.7 PySide example 2 - Ch2_10.py


그림 3.8 PySide example 2 - Ch2_10.py 실행 모습


<Ch2_10.py>
# 필요한 module을 import한다.

import sys
from PySide.QtCore import QDateTime, QTimer, SIGNAL
from PySide.QtGui import QApplication, QWidget, QLCDNumber

class MyTimer(QWidget):
    """ Main Window class for Timer
    """
    def __init__(self):
        """ 생성자 함수
        """
        QWidget.__init__(self)  #부모 class(QWidget)의 생성자 호출 
        self.setWindowTitle('My Digital Clock')  # window title 지정 
        timer = QTimer(self)  # QTimer class 생성 
        self.connect(timer, SIGNAL("timeout()"), self.updtTime)  #signal과 slot 함수 연결 
        self.myTimeDisplay = QLCDNumber(self)  #QLCDNumer class 생성 
        self.myTimeDisplay.setSegmentStyle(QLCDNumber.Filled)
        self.myTimeDisplay.setDigitCount(8)
        self.myTimeDisplay.resize(500, 150)
        timer.start(1000)  #timer 시작 - 1000 milliseconds 간격으로 timer를 갱신 

    def updtTime(self):   #timeout signal에 연결되는 slot 함수
        """ 현재 시간을 갱신하는 함수
        """
        currentTime = QDateTime.currentDateTime().toString('hh:mm:ss')
        self.myTimeDisplay.display(currentTime)   #현재 시간 값을 출력

# Main 함수
if __name__ == '__main__':
    # 예외 처리
    try:        
        myApp = QApplication(sys.argv)  #main application 생성
        myWindow = MyTimer()   #Timer 생성
        myWindow.show()  #main window 출력
        myApp.exec_()  #main application 실행
        sys.exit(0)
    except NameError:
        print("Name Error:", sys.exc_info()[1])
    except SystemExit:
        print("Closing Window...")
    except Exception:
        print(sys.exc_info()[1])
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


4. 그 밖의 참고 site
a) https://wiki.python.org/moin/PythonBooks
  => Python 관련 내용이 잘 정리되어 있음.


<Qt 5 programming>

Qt("큐트"가 맞지만, 국내에서는 보통 "큐티"라고 발음함)는 Linux에서 예쁘장한 GUI를 만들고자 할 때 가장 먼저 떠올리는 C++ 기반의 application development framework이다. 또한 Windows, Mac OS, Android, iOS, Tizen(기타 몇가지 RTOS 및 UNIX 계열에서도 동작) 등에서도 동작하므로, 한번의 노력으로 여러 platform (embedded platform 포함)에서 적용 가능한 UI를 쉽게 구현할 수 있다는 것을 motto로 하고 있다.

최근에는 Python과 연동하는 PyQt 및 PySide도 배포하고 있으며, QML declarative language를 이용한 Qt Quick(2)을 통해 새로운 가능성을 제시하고 있다.

   - Qt C++ programming
   - Qt + Python programming
   - Qt Quick(QML) progamming

국내에서는 Navigation, Blackbox, AVN, Mobile 기기 등의 다양한 영역에서 Qt가 적극 활용되면서 그 세를 넓혀가고 있는 추세이다.

주:  Windows 환경의 Visual C++, C# programming과 Android Java, iPhone Swift & Objective-C 등과는 여전히 경쟁 관계에 있는게 사실이다.

1. Qt study site - bogotobogo(보고 또 보고)
K.Hong 이라는 분이 운용하는 site(http://www.bogotobogo.com)로 AngluarJS, Python, C++, DevOps 등과 관련하여 아주 훌륭한 예제 및 tutorial을 제공하고 있다. 뿐만아니라 Qt 관련 예제도 함께 소개하고 있는데, 초심자들이 따라가면서 해보면 쉽게 이해할 수 있도록 구성되어 있어, 여기에 소개해 본다(책을 읽는 거에 알레르기가 있으신 분들에게 강추^^).


2. Qt 기초 books
Qt 초심자를 위한 책을 소개해 보면 다음과 같다.

a) C++ GUI Programming with Qt 4[번역서 있음]
  => Qt 4를 주제로 하는 책이지만, Qt 5에서도 여전히 활용 가능한 책임(예제가 훌륭하고, 예제에 대한 설명이 아주 상세함). 단, QML 관련 내용은 없음.
  => 이 책의 예제 코드를 Qt 5용으로 porting한 github도 쉽게 찾을 수 있음.
  => 초심자 용이라고는 하지만, 실제로는 초심자에게 조금 어렵게 느껴질 수도 있겠음(Qt company 이전 시절 즉, Trolltech 사에서 신입사원을 위한 기본 교제로 사용할 정도로 정평이 나있는 책임)


b) Game Programming Using Qt
  => Graphic/Graphic View/Network/Qt Quick 등에 관하여 상세히 소개되어 있음.
  => 예제 코드는 해당 출판사 web site에서 찾을 수 있는 내용이라 별도로 소개하지 않았음.


c) 사물인터넷을 위한 리눅스 프로그래밍 with 라즈베리파이
  => 많은 내용은 아니지만 8장에 Qt 관련 내용(기초를 이해하는데 도움을 줄 수 있음)이 소개되어 있음.
  => Qt의 인기를 감안해 볼 때, 왜 국내에 쓸만한 Qt 관련 책이 아직까지 없는지 이해가 안됨^^.


d) 그 밖의 site
기초를 확인하기에는 아래 site도 나름 괜찮다(한글로 정리되어 있음 - Qt Widget programming 관련 기초 내용이 잘 정리되어 있음).


3. Qt advanced books
<TBD> 아래 site 참조 - 아직 어느 녀석이 best인지는 좀 더 확인이 필요해 보임.

Qt는 책이 필요 없을 정도로 document(예제 코드 포함) site가 아주 훌륭한데, 책을 구입하는 것이 부담되는 분들에게는 아래 site를 추천한다.

Qt Quick(QML) application과 관련해서는 아래 link를 참조하기 바란다.

주: Qt Creator 내에도 많은 예제 코드와 상세한 설명이 실려 있으니, 이를 적극 활용하면 된다.



Slowboot

2017년 1월 30일 월요일

Embedded Qt Programming 시작

이번 blog에서는 Atmel SAMA5D3 Xplained board에 LCD를 연결하고, 그 위에서 간단한 Qt application을 돌려 보는 과정을 소개해보고자 한다.

SAMA5D3 Xplained board + Yocto Project + LCD + Qt application


<목차>
1. Yocto project로 Qt를 포함한 부팅 이미지 만들기
2. Host PC에 Qt5 설치하기
3. Target Board에서 Qt application 돌려 보기
4. Qt application을 Yocto Project에 추가하기


1. Yocto Project로 Qt를 포함한 부팅 이미지 만들기 

이번 절에서는 Yocto Project를 기준으로 Qt용 demo image를 만드는 절차를 소개해 보도록 하겠다. 먼저 Atmel SAMA5D3 Xplained board용 yocto project build 절차는 이전 blog에 소개된 5절의 내용을 기본적으로 사용하도록 하겠다. 따라서 여기서는 Qt와 관련된 부분만을 별도로 추가해 보기로 하자.


$ cd yocto
$ git clone git://github.com/meta-qt5/meta-qt5.git -b krogoth
  => meta-qt5 source를 내려 받는다.

$ cd poky/build-atmel/conf
vi bblayers.conf
  => meta-qt5를 추가한다.


그림 1.1 conf/bblayers.conf 파일 수정

$ cd ..
source oe-init-build-env build-atmel
  => build-atmel을 위한 환경 설정을 한다.

bitbake atmel-qt5-demo-image
  => qt5 demo image를 만든다.
  => 실행 결과, Ubuntu 16.04에서는 아래와 같이 qtbase 관련 에러가  발생한다.
  


그림 1.2 qtbase 관련 에러 발생

그림 1.2의 내용으로 봐서는, "0001-Fix-building-without-OpenGL-support.patch" 패치 파일에 문제가 있는 듯 보이는데, 일단 (임시적으로) 아래 그림 1.3과 같이 해당 패치가 아예 적용되지 않도록 recipe를 수정해 보기로 한다.

그림 1.3 meta-atmel/qt5-layer/recipes-qt/qt5/qtbase_%.bbappend 파일 수정

수정 후, 다시 build를 계속 진행해 보니, 정상적으로 build가 마무리(tmp/deploy/images/sama5d3-xplained/*) 되었고, NFS booting(자세한 사항은 이전 blog 6절 참조)을 해 보니 아래와 같이 Qt 화면(Atmel demo app)이 정상적으로 출력된다.

그림 1.4 Qt demo application main 화면

다음으로 Qt application을 build하는데 필요한 cross-compiler toolchain을 준비해 보도록 하자.

bitbake -c populate_sdk atmel-qt5-demo-image
  => SDK를 만드는 작업을 한다(시간이 오래 걸림).
  => 이 내용과 관련해서는 이전 blog 1절에서 이미 소개한 바 있음.

$ cd tmp/deploy/sdk
./poky-atmel-glibc-x86_64-atmel-qt5-demo-image-cortexa5hf-vfp-toolchain-2.1.2.sh
  => toolchain을 설치한다.


그림 1.5 Qt를 위한 yocto toolchain 설치 화면

.  /opt/poky-atmel/2.1.2/environment-setup-cortexa5hf-vfp-poky-linux-gnueabi
  => 설치된 toolchain을 적용한다(실제 cross-compile 작업을 수행하기 직전에 실행해 주어야 함)
  => Qt의 경우는 Qt Creator 설정 메뉴에서 관련 내용을 지정해 줄 것(4절에서 설명할 것임)이므로, 실제로 불필요한 내용으로 볼 수도 있음.


2. Host PC에 Qt5 설치하기
이번 절에서는 Ubuntu 16.04 Linux PC에 Qt5를 설치하는 과정을 소개하고자 한다. 먼저, 아래 site의 내용을 참조하여 linux(64bit)용 qt run file을 download 받는다.
|
V
wget http://download.qt-project.org/official_releases/qt/5.6/5.6.1/qt-opensource-linux-x64-5.6.1.run


이후 모드(실행 모드) 전환 후, 아래와 같이 실행하도록 한다.

chmod +x qt-opensource-linux-x64-5.6.1.run

./qt-opensource-linux-x64-5.6.1.run
  => 설치를 시작한다(몇번의 click으로 설치 가능함).


그림 2.1 Qt5 설치 화면

설치가 완료된 후, Qt Creator를 실행해 보면 다음과 같다.

그림 2.2 Qt Creator 실행 화면

(*) 참고: 최신 버젼 Qt5.7.1을 설치했으나, qt Creater의 상단 메뉴 내용이 출력되지 않아, 5.6.2로 다시 설치함. 5.6.2을 선택한 이유는 앞서 yocto에서 사용한 Qt version이 5.6.2이기 때문임.


3. Target Board에서 Qt application 돌려 보기
이번 절에서는 Qt Creator와 Yocto cross toolchain을 이용하여, target board용 application을 생성하는 절차를 소개하고자 한다.

Qt Creator의 환경 설정에 들어가기에 앞서, 지난 1절에서 설치해 둔 yocto toolchain을 이용하여 console 상에서 간단한 Qt application을 만드는 과정을 설명하는 것이 순서일 듯 싶다.

먼저 아래와 같이 hello world program을 작성해 두었다고 가정하자.

그림 3.1 Qt Creator로 작성한 main.cpp

$ cd helloworld1/
  => 여기에 main.cpp가 있음.

source /opt/poky-atmel/2.1.2/environment-setup-cortexa5hf-vfp-poky-linux-gnueabi
  => cross-compile을 하기 위해, yocto toolchain의 환경을 설정한다.
  => 파일 내용을 보면 알 수 있듯이, 각종 cross compile을 위한 export 명령이 정의되어 있음.

qmake -project
  => .pro file을 생성한다.

qmake
  => Makefile을 생성한다.

make
  => build를 진행한다. 아래와 같은 결과가 출력된다.

$ ls -la
-rw-rw-r--  1 chyi chyi  40529  1월  5 13:05 Makefile
-rwxrwxr-x  1 chyi chyi 268356  1월  5 13:05 helloworld1
-rw-rw-r--  1 chyi chyi    286  1월  5 13:05 helloworld1.pro
-rw-rw-r--  1 chyi chyi    212  1월  5 12:59 main.cpp
-rw-rw-r--  1 chyi chyi 312796  1월  5 13:05 main.o

scp ./helloworld1 root@192.168.1.50:/usr/bin
  => helloworld1 program을 target board(192.168.1.50)로 복사한다.

이후 target board에서 helloworld1를 실행해 보니, 정상 동작한다.

<target board에서 실행>
/usr/bin/helloworld1
...

그렇다면, console 대신에, Qt Creator 상에서 직접 target board용 image를 build하고, target board 상에서 동작시키기 위해서는 어떻게 하면 될까 ?
우선 제일 먼저 해야할 작업은, 앞서 준비해 둔 yocto cross toolchain 환경 설정과 관련된 내용을 Qt5/Tools/QtCreator/bin/qtcreator.sh 파일의 맨 앞에 추가해 주는 것이다. 이는 QtCreator를 실행하는 환경 자체를 cross-compile 환경으로 바꾸기 위한 조치로 보면 된다.

source /opt/poky-atmel/2.1.2/environment-setup-cortexa5hf-vfp-poky-linux-gnueabi

그림 3.2 Tools/QtCreator/bin/qtcreator.sh 수정

주의) 반드시 #! /bin/sh 앞 라인에 위의 내용을 추가해 주기 바란다.

그런 다음, 아래와 같이 Qt Creator를 다시 구동시켜 주자.

$ cd ~/Qt5/Tools/QtCreator/
bin/qtcreator.sh &

다음으로 (QtCreator 상단의) Tools -> Options 메뉴를 선택한 후, 몇가지 환경 값을 지정해 주어야 하는데, 그 내용을 하나씩 살펴 보도록 하자.
먼저 좌측 Devices 선택 후, 우측의 Add 버튼을 눌러, 새로운 target device(Generic Linux Device 선택해야 함)를 생성해 주도록 하자. 미리 말하지만 이 설정을 추가하는 이유는 target board용으로 build한 application을 scp 등으로 target board에 자동으로 올려 테스트를 하기 위해서이다.

그림 3.3 Target board 디바이스 생성 화면 

그 다음, 좌측의 Build & Run을 선택한 상태에서, 다시 상단의 Compilers tab을 선택 한 후, Add 버튼(mouse로 Manual 선택 상태에서)을 눌러 yocto cross-compiler의 path를 아랫 값으로 지정해 주도록 한다. 눈치챘겠지만, Qt application을 build할 때 g++이 아니라, arm-poky-linux-gnueabi-g++를 사용하겠다는 것으로 보면 된다.

/opt/poky-atmel/2.1.2/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-g++

 그림 3.4 Cross compiler 지정 화면 

같은 방식으로, 이번에는 Debuggers tab을 선택하여, arm용 cross gdb path를 아래와 같이 입력해 준다.

/opt/poky-atmel/2.1.2/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gdb

 그림 3.5 cross gdb 패스 입력 화면

다음으로 상단의 Kits tab을 선택하여 sysroot path(target board용 rootfs)를 지정해 준다. 참고로 sysroot 디렉토리 내에는 Qt5를 위한 각종 library(usr/lib/libQt5*)가 존재하는데, 이는 cross-compile 과정(link)에서 사용되게 된다. 따라서 이 path를 제대로 지정하지 않을 경우, 각종 link error에 봉착하게 될 것이다.

/opt/poky-atmel/2.1.2/sysroots/cortexa5hf-vfp-poky-linux-gnueabi

 그림 3.6 sysroot path 지정 화면

주의) 위의 그림에서 한가지 주의할 점은 Qt mkspec 란에 반드시 linux-oe-g++를 입력해 주어야 한다는 점이다. 이를 누락할 경우, cross-compile시 Qt 관련 error가 발생하게 된다.

마지막으로, Qt Versions tab을 선택한 후 qmake path를 아래와 같이 입력해 준다.

/opt/poky-atmel/2.1.2/sysroots/x86_64-pokysdk-linux/usr/bin/qt5

그림 3.7 qmake path 지정 화면 

이제 Qt Creator 상에서의 cross-compile을 하기 위한 모든 준비가 마무리 되었다. 앞서 만들어 둔, hello world program을 약간 수정(버튼을 하나 추가함) 후, Qt Creator 상에서 build해 보고, build 결과로 생성된 binary file을 target board에 올려 실행해 보도록 하자.

먼저 아래 그림과 같이 helloworld1.pro 파일에 아래 내용을 추가하도록 한다. 이를 추가하는 이유는 target board의 어느 위치로 binary file을 전송(복사)할 지를 결정하기 위해서이다.

TARGET = helloworld1
     target.files = hellworld1
     target.path = /usr/bin
INSTALLS += target

그림 3.8 helloworld1.pro file 수정 

다음으로, helloworld1을  Rebuild해 준다(우측 helloworld1 source tree 위에서 마우스 우 Click -> Rebuild 메뉴 선택).

재 build에 성공했으면, 좌측의 Projects 버튼을 선택한 후, 다시 상단의 Run 메뉴(sama5d3 밑에 있음)를 선택하여 그 아래에 나오는 Run Environment 부분을 아래와 같이 수정해 주도록 한다. 참고로, 현재 build된 yocto qt image는 framebuffer를 기반으로 동작하도록 되어 있다(즉, X11 방식이 아님). 따라서, Qt application이 이 환경에서 제대로 동작하기 위해서는 framebuffer 관련 설정이 추가되어야 한다.

Run Environment
  -> Add 버튼 선택
      -> Variable: QT_QPA_PLATFORM 입력
      -> Value: linuxfb 입력

그림 3.9 Projects -> Run 설정 변경

아래 그림 3.10은 앞서 helloworld1.pro에 추가한 target 관련 내용이 Run Settings  화면에 반영된 모습이다.

그림 3.10 Projects -> Run의 내용(Local File Path 및 Remote(=target board) Directory 모습)

자, 이제 마침내 helloworld1 binary를 target 보드에서 돌려볼 차례가 되었다. Qt Creator의 좌측 Run 버튼을 눌러, 과연 어떤 일이 벌어지는지 살펴 보도록 하자.

결과는 예상대로, helloworld1 program이 target board의 LCD 화면에 출력되고 있다. Console 상에서도 ps 명령을 통해 확인(그림 4.12)해 보니, /usr/bin/helloworld1이 구동되고 있음을 알 수 있다.

그림 3.11 helloworld1 app을 target board에서 실행한 화면

그림 3.12 console 상에서 ps 명령 실행 결과

참고) 현재 framebuffer에 출력된 내용을 깨끗이 지우고자 할 때는 아래 명령을 사용하면 된다.
# cat /dev/zero > /dev/fb0


4. Qt application을 Yocto Project에 추가하기
이번 절에서는 3절에서 만든 Qt application을 Yocto project에 추가하는 방법을 소개해 보고자 한다.

$ cd yocto/meta-atmel/recipes-test
  => 이 디렉토리 아래에 qt application을 추가하기로 함(반드시 이 디렉토리일 필요는 없음).

$ mkdir qthello
$  vi qthello_1.0.bb
  => qthello package에 대한 recipe 파일을 만든다.

그림 4.1 qthello_1.0.bb 파일

$ mkdir qthello-1.0; cd qthello-1.0
  => source code가 위치할 디렉토리를 만들고, 그곳으로 이동한다.

vi qthello.pro
  => qmake project file을 하나 만든다.


그림 4.2 qthello.pro 파일

vi qthello.cpp
  => qthello.cpp file을 하나 만든다.


그림 4.3 qthello.cpp 파일

$ cd ~/poky/build-atmel
bitbake qthello
  => 앞서 작성한 recipe 및 source code에 하자가 없는지, qthello package만 build해 본다.

vi conf/local.conf
  => qthello package를 rootfs image에 포함시키기 위해 local.conf를 수정한다.

그림 4.4 conf/local.conf에 qthello 패키지 추가

bitbake atmel-qt5-demo-image
  => 전체 image를 다시 build하도록 한다.

이제 NFS booting을 시도한 후, qthello application을 수동으로 돌려 보도록 하자.

<Target board>
export QT_QPA_PLATFORM=linuxfb
  => framebuffer로 직접 display할 내용을 write하고자 할 때 사용함(linuxfb plugin 지정)

export QT_QPA_GENERIC_PLUGINS=evdevmouse,evdevtouch:/dev/input/touchscreen0,evdevkeyboard:/dev/input/event0
  => input 장치(touch, keyboard, mouse)에 대한 plugin 설정

/usr/bin/qthello

그림 4.5 qthello 실행 결과(글씨가 안보임)

참고) 위의 방법 대신, "/usr/bin/qthello -platform linuxfb" 형태로 실행해 주어도 된다.

이상으로 SAMA5D3 Xplained board에 yocto image를 올리고, 여기에 간단한 Qt application을 추가해 보는 과정을 간략히 소개해 보았다.

오늘은 Qt blog의 첫번째 시간으로 my KernelHacks blog에 게재했던 내용을 옮겨 보았으나, 다음 시간 부터는 (blog의 목적에 맞게) Qt programming의 기초 부터 하나씩 하나씩 내용 정리를 시작해 볼 계획이다.


References
1. Application Development with Qt Creator, Ray Rischpater, PACKT publishing.
2. Game Programming Using Qt, Witold Wysota/Lorenz Haas, PACKT publishing.
3. Embedded Linux Projects Using Yocto Project Cookbook, Alex Gonzalez, PACKT publishing.
4. https://github.com/gumstix/yocto-manifest/wiki/Cross-Compile-with-QtCreator
5. http://www.jumpnowtek.com/rpi/Qt-Creator-Setup-for-RPi-cross-development.html

Slowboot