Asterisk Cross-Compilation for ARM Processor

    版本為 16:41, 20 Nov 2024

    到這個版本。

    返回到 版本存檔.

    查閱目前版本

    說明

    此篇再說明如何建立一個 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。

    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 
    

    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++ \
    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" \
    RANLIB=arm-none-linux-gnueabi-ranlib \
    --host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi --without-pwlib --without-curl --with-ncurses=/home/alang/ARM_Cross-Compile/build_opt/ncurses_build_by_codesourcery --disable-xmldoc
    
    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++ \
    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" \
    RANLIB=arm-none-linux-gnueabi-ranlib \
    --host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi --without-pwlib --without-curl --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。

    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
    
    Powered by MindTouch Core