Asterisk Cross-Compilation for ARM Processor

    說明

    此篇再說明如何建立一個 Cross-Compile 的 Linux x86 編譯環境,透過相對應 CPU 及作業系統的 toolchain,就可編譯適合嵌入系統的 Asterisk 套件。

    重點項目如下:

    • 選擇一個好用的 Linux x86 系統,可運作在實體機器或虛擬機,本次使用 Ubuntu 10 32-bit 於 VMware ESXi 下。
    • 下載合適的 toolchain 檔案(應該要包含所需的編譯器程式等),並建立 Cross-Compile 執行環境。
    • 先 Cross-Compile ncurses 套件,這是編譯 Asterisk 時所需要的。
    • 開始 Cross-Compile Asterisk 套件

    安裝 Ubuntu 10 x86 Linux

    • 選擇一般安裝即可。
    • 可安裝在實體機或虛擬機。

    建立 Cross-Compile 編譯環境

    • 依照 embedded system 所用的處理器,找尋並下載 toolchain 的檔案,內含有需要的各種編譯器程式檔。本次以這個 toolchain: arm-2011.03-41-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 為例。
    • Cross-Compile 不需要 root 權限,所以在 /home 目錄下作業即可。
    • 手動建立幾個作業目錄
      • ~/ARM_Cross-Compile/toolchain : 用來放各種不同的 toolchain 檔。
      • ~/ARM_Cross-Compile/build_source : 要編譯套件的原始檔
      • ~/ARM_Cross-Compile/build_opt : 已作完 Cross-Compile 的套件執行目錄。
      • ~/ARM_Cross-Compile/build_start : 實際作 Cross-Compile 的工作目錄。
    • 修改 PATH
      編輯 ~/.profile,加上 toolchain 的編譯器執行檔路徑

      export PATH="$PATH:/home/alang/ARM_Cross-Compile/toolchain/CodeSourcery/bin/
      export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/home/alang/ARM_Cross-Compile/toolchain/CodeSourcery/lib"

      注意:如果要更換不同的 toolchain 作 cross-compile,必須先修改 PATH 以及在作 cross-compile 過程中的 CC, CXX 等變數。

    Cross-Compile ncurses

    cd /home/alang/ARM_Cross-Compile/build_start/ncurses-5.9/
    
    CC=arm-none-linux-gnueabi-gcc \
    CXX=arm-none-linux-gnueabi-g++ \
    ./configure arm-linux --host=arm-none-linux-gnueabi --with-shared --without-ada --with-build-cc=gcc --with-build-cpp=arm-none-linux-gnueabi-g++ --enable-termcap  --prefix=/home/alang/ARM_Cross-Compile/build_opt/ncurses_build_by_codesourcery
    
    make
    make install
    

    Cross-Compile OpenSSL

    NOTEs:如果要使用 IAX2 必須在編譯 Asterisk 啟用這兩個模組。

    Channel Drivers > [*] chan_iax2

    Resource Modules > [*] res_crypto

    然而,模組 res_crypto 要啟用必須先編譯 openssl,詳細可參閱FAQ  Install Asterisk 1.4/1.6/1.8 on Debian

    wget http://www.openssl.org/source/openssl-1.0.1.tar.gz
    
    ./Configure linux-generic32 --prefix=/home/alang/ARM_Cross-Compile/build_opt/openssl_build_by_codesourcery --openssldir=/home/alang/ARM_Cross-Compile/build_opt/openssl_build_by_codesourcery shared 
    

    TIPs:

    Configure,C 是大寫。

    參數要加上 shared,才能編譯成 shared libraries(*.so)。

    編輯 Makefile

    ...
    CC= arm-none-linux-gnueabi-gcc
    AR= arm-none-linux-gnueabi-ar $(ARFLAGS) r
    RANLIB= arm-none-linux-gnueabi-ranlib
    ... 
    

    TIPs:

    AR 指令後要加 $(ARFLAGS) r。

    開始編譯

    make
    make install 
    

    TIPs

    在編譯 Asterisk 時要加上這兩個參數

    --with-crypto=<openssl安裝目錄> --with-ssl=<openssl安裝目錄>

    Cross-Compile SQLite3

    僅適用於 Asterisk 10.x

    ./configure CC=arm-none-linux-gnueabi-gcc CXX=arm-none-linux-gnueabi-g++ --host=arm-none-linux-gnueabi --prefix=/home/alang/ARM_Cross-Compile/build_opt/sqlite3_build_by_codesourcery
    make
    make install
    

    Cross-Compile Astrisk

    for Asterisk 1.8.x

    cd /home/alang/ARM_Cross-Compile/build_start/asterisk-1.8.10.1
    
    ./configure \
    CC=arm-none-linux-gnueabi-gcc \
    AR=arm-none-linux-gnueabi-ar \
    CXX=arm-none-linux-gnueabi-g++ \
    RANLIB=arm-none-linux-gnueabi-ranlib \
    CPPFLAGS="-I/home/alang/ARM_Cross-Compile/build_opt/ncurses_build_by_codesourcery/include/ncurses" \
    LDFLAGS="-L/home/alang/ARM_Cross-Compile/build_opt/ncurses_build_by_codesourcery/lib" \
    --host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi --without-pwlib --with-ncurses=/home/alang/ARM_Cross-Compile/build_opt/ncurses_build_by_codesourcery --disable-xmldoc --with-crypto=/home/alang/ARM_Cross-Compile/build_opt/openssl_build_by_codesourcery --with-ssl=/home/alang/ARM_Cross-Compile/build_opt/openssl_build_by_codesourcery
    
    make menuselect
    make
    make install DESTDIR=/home/alang/ARM_Cross-Compile/build_opt/asterisk18_arm
    make samples DESTDIR=/home/alang/ARM_Cross-Compile/build_opt/asterisk18_arm
    

    for Asterisk 10.x
    註:Asterisk 10 已經將內建的 AST DB 改成 SQLite3,所以必須先編譯 SQLite3。

    cd /home/alang/ARM_Cross-Compile/build_start/asterisk-10.2.1
    
    ./configure \
    CC=arm-none-linux-gnueabi-gcc \
    AR=arm-none-linux-gnueabi-ar \
    CXX=arm-none-linux-gnueabi-g++ \
    RANLIB=arm-none-linux-gnueabi-ranlib \
    CPPFLAGS="-I/home/alang/ARM_Cross-Compile/build_opt/ncurses_build_by_codesourcery/include/ncurses/" \
    LDFLAGS="-L/home/alang/ARM_Cross-Compile/build_opt/ncurses_build_by_codesourcery/lib" \
    --host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi --without-pwlib --with-ncurses=/home/alang/ARM_Cross-Compile/build_opt/ncurses_build_by_codesourcery --with-sqlite3=/home/alang/ARM_Cross-Compile/build_opt/sqlite3_build_by_codesourcery --disable-xmldoc
    
    make menuselect
    make
    make install DESTDIR=/home/alang/ARM_Cross-Compile/build_opt/asterisk10_arm_build_by_codesourcery
    make samples DESTDIR=/home/alang/ARM_Cross-Compile/build_opt/asterisk10_arm_build_by_codesourcery 
    

    TIPs

    - CPPFLAGS 用法是 -I<非標準的 include 目錄>

    - LDFLAGS 用法是 -L<非標準的 library 目錄>

    - 不要使用 --prefix=非標準目錄,這會使編譯後的 Asterisk 在啟動時找不到設定檔 /etc/asterisk/asterisk.conf。

    - DESTDIR 為 Asterisk 的安裝目錄。

    F.A.Q

    Q: 錯誤:cc1: warning: include location "/usr/include/SDL" is unsafe for cross-compilation
    console_board.c:46:21: fatal error: SDL/SDL.h: No such file or directory

    Ans:移除 SDL 函式庫

    sudo apt-get remove libsdl1.2-dev
    
    Q: cross-compile OpenSSL 時發生錯誤

    checking for mandatory modules:  NCURSES OPENSSL... fail
    configure: ***
    configure: *** The OPENSSL installation appears to be missing or broken.

    Ans:

    1. 檢查 <openssl 安裝目錄>/lib 是否有 *.so (shared libraries),如果沒有,請重新檢查 openssl 編譯過程。
    2. 編譯 Asterisk 時,必須同時加上 --with-crypto=<openssl安裝目錄> --with-ssl=<openssl安裝目錄>。
    Q: 編譯 Asterisk 出現錯誤

    fatal error: openssl/ssl.h: No such file or directory

    Ans:在 toolchian 主目錄下的 include 加上 openssl 的 include 連結

    cd <toolchain 安裝目錄>/arm-none-linux-gnueabi/include
    ln -s <openssl 安裝目錄>/include/openssl ./ 
    
    Q: 執行 configure Asterisk 出現錯誤

    configure: error: *** termcap support not found (on modern systems, this typically means the ncurses development package is missing)

    Ans:在 configure 時加上參數。

    CPPFLAGS="-I<ncurses 安裝目錄>/include/ncurses"
    
    Q: 執行 make Asterisk 出現錯誤

    configure: error: termcap support not found
    make[1]: *** [editline/libedit.a] Error 1
    make: *** [main] Error 2

    Ans:在 configure 時加上參數

    LDFLAGS="-L<ncurses 安裝目錄>/lib"
    
    標籤 (Edit tags)
    • No tags
    您必須 登入 才能發佈評論。
    Powered by MindTouch Core