在某嵌入式平台进行蓝牙开发,发现上面居然没有btmon,hciattach,hcitool等蓝牙调试工具,无奈之下,只好移植bluez协议栈到目标嵌入式平台,建议移植5.18版本(最新的5.54版本居然hcitool等工具不是默认编译的,需要修改Makefile才可以)。
看到很多讲解移植过程的文章都是需要积分的,觉得写一篇免积分的文章还是有些意义的,欢迎同行来交流。
移植环境:
Linux ubuntu
目标平台:
sigmastar 星宸科技
配置交叉编译工具链:
export PATH=$PATH:/home/XXX/Workspace/gcc-sigmastar-XXXXXXXX-x86_64_arm-linux-gnueabihf/bin
编译zlib:
$ wget wget https://zlib.net/current/zlib.tar.gz
$ tar -xzf zlib.tar.gz
$ cd zlib/
$ ./configure --prefix=/home/XXX/arm-bluez/
修改生成的Makefile
CC=arm-linux-gnueabi-gcc
LDSHARED=arm-linux-gnueabi-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map
CPP=arm-linux-gnueabi-gcc -E
AR=arm-linux-gnueabi-ar
RANLIB=arm-linux-gnueabi-ranlib
$ make
$ make install
编译libffi:
$ wget ftp://sourceware.org/pub/libffi/libffi-3.0.13.tar.gz
$ tar -xzf libffi-3.0.13.tar.gz
$ cd libffi-3.0.13/
$ ./configure --host=arm-linux-gnueabihf --prefix=/home/XXX/arm-bluez/
$ make
$ make install
编译gettext:
$ wget http://ftp.gnu.org/pub/gnu/gettext/gettext-0.22.tar.xz
$ tar -xvf gettext-0.22.tar.xz
$ cd gettext-0.22
$ ./configure --host=arm-linux-gnueabihf --prefix=/home/XXX/arm-bluez/ CFLAGS="-fPIC"
$ make -j8
$ sudo make install
编译glib:
$ wget http://ftp.gnome.org/pub/gnome/sources/glib/2.40/glib-2.40.0.tar.xz
$ tar -xJf glib-2.40.0.tar.xz
$ cd glib-2.40.0/
$ ./configure --host=arm-linux-gnueabihf --prefix=/home/XXX/arm-bluez/ PKG_CONFIG_PATH=/home/XXX/arm-bluez/lib/pkgconfig glib_cv_stack_grows=no glib_cv_uscore=yes ac_cv_func_posix_getpwuid_r=yes ac_cv_func_posix_getgrgid_r=yes
$ make
$ make install
编译expat:
$ wget https://jaist.dl.sourceforge.net/project/expat/expat/2.3.0/expat-2.3.0.tar.xz
$ tar -xf expat-2.3.0.tar.xz
$ cd expat-2.3.0/
$ ./configure --host=arm-linux-gnueabihf --prefix=/home/XXX/arm-bluez/
$ make
$ make install
编译dbus:
$ wget http://dbus.freedesktop.org/releases/dbus/dbus-1.8.0.tar.gz
$ tar -xf dbus-1.8.0.tar.gz
$ cd dbus-1.8.0/
$ ./configure --host=arm-linux-gnueabihf --prefix=/home/XXX/arm-bluez/ CFLAGS=-I/home/XXX/arm-bluez/include CPPFLAGS=-I/home/XXX/arm-bluez/include LDFLAGS=-L/home/XXX/arm-bluez/lib GLIB_CFLAGS="-I/home/XXX/arm-bluez/include/glib-2.0 -pthread -I/home/XXX/arm-bluez/lib/glib-2.0/include/"
$ make (test模块编译不通过的话,在makefile中注释掉它,反正我们不需要)
$ make install
编译libical:
$ wget http://downloads.sourceforge.net/freeassociation/libical-1.0.tar.gz
$ tar -xzf libical-1.0.tar.gz
$ cd libical-1.0/
$ export CC=arm-linux-gnueabihf-gcc
$ arm-linux-gnueabihf-gcc
$ export CXX=arm-linux-gnueabihf-g++
$ arm-linux-gnueabihf-g++
$ ll /home/XXX/arm-bluez
$ cmake -DCMAKE_INSTALL_PREFIX=/home/XXX/arm-bluez
$ make
$ make install
编译ncurses:
$ wget http://ftp.gnu.org/pub/gnu/ncurses/ncurses-6.2.tar.gz
$ tar -xzf ncurses-6.2.tar.gz
$ cd ncurses-6.2/
$ ln -s /home/XXX/Workspace/gcc-sigmastar-XXXXXXXX-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-strip /usr/bin/strip
$ ./configure --host=arm-linux-gnueabihf --prefix=/home/XXX/arm-bluez CXX="arm-linux-gnueabihf-g++" CC="arm-linux-gnueabihf-gcc" --with-shared
$ make
$ make install
编译readline:
$ wget ftp://ftp.cwru.edu/pub/bash/readline-6.3.tar.gz
$ tar -xzf readline-6.3.tar.gz
$ cd readline-6.3/
$ ./configure --host=arm-linux-gnueabihf --prefix=/home/XXX/arm-bluez bash_cv_wcwidth_broken=yes LDFLAGS=-L/home/XXX/arm-bluez/lib
$ make SHLIB_LIBS=-lncurses
$ make install
编译bluez:
$ wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.18.tar.xz
$ tar -xJf bluez-5.18.tar.xz
$ cd bluez-5.18
$ ./configure --host=arm-linux-gnueabihf --prefix=/home/XXX/arm-bluez PKG_CONFIG_PATH=/home/XXX/arm-bluez/lib/pkgconfig --disable-systemd --disable-udev --disable-cups --disable-obex --enable-library LDFLAGS="-L/home/XXX/arm-bluez/lib -lncurses" CFLAGS=-I/home/XXX/arm-bluez/include CPPFLAGS=-I/home/XXX/arm-bluez/include CFLAGS=-I/home/XXX/arm-bluez/include
$ make
$ make install
参考:
https://wiki.beyondlogic.org/index.php?title=Cross_Compiling_BlueZ_Bluetooth_tools_for_ARM