本篇介紹如何編譯 Deviation source code,因為我並不需要自行修改遙控器的韌體,因此重點擺在如何自行編譯模擬器,以下將以編譯我的遙控器 DEVO 10為例,說明如何分別在(Ubuntu, Mac OSX) 這兩個作業系統編譯模擬器。
一、Ubuntu 14.04 TLS
1. 下載程式碼控管軟體 mercurial
$ sudo apt-get install mercurial2. 下載程式碼
$ hg clone https://bitbucket.org/PhracturedBlue/deviation3. 編譯程式
$ cd deviation/src4. 執行程式
$ sudo apt-get install g++
$ sudo apt-get install libfltk1.3-dev
$ make TARGET=emu_devo10
$ ./emu_devo10.elf
模擬器畫面如下
5. 編譯其他版本遙控器模擬器
1. 下載程式碼控管軟體 sourcetree (Mercurial client for Mac) 並進行安裝
需先安裝 xcode command line tool
$ sudo port -v selfupdate
$ sudo xcode-select --install
接著安裝 fltk
$ cd deviation/src
$ sudo port install fltk-devel
$ ../utils/buiild-osx.sh
註:FLTK(Fast Light Toolki,讀做「fulltick")是一個跨平台的C++GUI工具集,用在UNIX/Linux(X11)、微軟Windows和Mac OS X上。
編譯執行檔
$ make TARGET=emu_devo10 LFLAGS="`fltk-config --ldflags`"
4. 錯誤處理
編譯時遇到了一些錯誤,主要原因是因為 gcc 與 clang compiler 所允許的語法不同所致,若能改用gcc compiler應該就沒問題了,針對 clang 的解決方式說明如下:
a. builtin function conflict
a.1 錯誤訊息如下:
In file included from target/emu_devo8/channels.c:15:
./common.h:189:8: error: conflicting types for '__builtin___strlcpy_chk'
/usr/include/secure/_string.h:105:3: note: expanded from macro 'strlcpy' __builtin___strlcpy_chk (dest, src, len, __darwin_obsz (dest))
^
./common.h:189:8: note: '__builtin___strlcpy_chk' is a builtin with type
'unsigned long (char *, const char *, unsigned long, unsigned long)'
/usr/include/secure/_string.h:105:3: note: expanded from macro 'strlcpy' __builtin___strlcpy_chk (dest, src, len, __darwin_obsz (dest))
^
1 error generated.a.2 修改方式
修改 src/Makefile,CFLAGS 加入 -fno-builtin
修改 /Users/liaokuohsun/deviation/src/common.h
#ifdef strlcpy
#undef strlcpy // use our own strlcpy()
size_t strlcpy(char* dst, const char* src, size_t bufsize);
#endif
b. Clang 不支援 nested function,需改寫 nested function
_putc(), _putchw(), assign_int()
c. 改寫下列巨集
- OFFSET(s,v)
- OFFSETS(s,v)
- OFFSET_SRC(s,v)
- OFFSET_BUT(s,v)
- OFFSET_COL(s,v)
- OFFSET_FON(s,v)
d. 需要定義 FLTK_ABI_VERSION
修改 /opt/local/include/FL/Enumerations.H,將下列這行程式碼的註解拿掉e. 更改過後的檔案放在此處,列表如下,有需要可以自行下載比較。
//#define FLTK_ABI_VERSION 10303
src/Makefile
src/common.h
src/std.h
src/config/display.c
src/config/model.c
src/target/common/stm32/printf.c
src/target/common/emu/fltk.h