cross-compile-alexa-voice-device-sdk

声明

仅供参考,编译步骤或参数不一定还是正确的

Env

1
2
3
export PATH=$PATH:$HOME/sysroots/x86_64-linux/usr/bin/arm-oe-linux-gnueabi
export SYSROOT_PATH=$HOME/sysroots/mdm9607
export PREFIX=$SYSROOT_PATH/usr

nghttp2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cd ~/avs-device-sdk/ThirdParty/

git clone https://github.com/tatsuhiro-t/nghttp2.git

cd nghttp2/

autoreconf -i

automake

autoconf

./configure \
--prefix=$PREFIX \
--host=arm-oe-linux-gnueabi \
CFLAGS="--sysroot=$SYSROOT_PATH" \
CXXFLAGS="--sysroot=$SYSROOT_PATH"

make && make install

libcurl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cd ~/avs-device-sdk/ThirdParty

wget http://curl.haxx.se/download/curl-7.54.0.tar.bz2

tar xf curl-7.54.0.tar.bz2

cd curl-7.54.0/

# 这里的 --with-nghttp2 指向 nghttp2 的安装路径, 参考上面编译 nghttp2 的 --prefix
./configure \
--prefix=$PREFIX \
--host=arm-oe-linux-gnueabi \
CFLAGS="--sysroot=$SYSROOT_PATH" \
--with-nghttp2=$PREFIX \
--with-ssl

make && make install

OpenSSL

1
2
3
4
5
6
7
8
9
10
11
wget https://github.com/openssl/openssl/archive/OpenSSL_1_1_1b.tar.gz

./Configure \
linux-generic32 \
shared \
--prefix=$PREFIX \
--openssldir=$SYSROOT_PATH/usr/include/openssl \
--cross-compile-prefix=$SYSROOT_PATH/../x86_64-linux/usr/bin/arm-oe-linux-gnueabi/arm-oe-linux-gnueabi- \
--sysroot=$SYSROOT_PATH

make && make install

Doxygen

需要cmake 3.8+ 可手动下载编译即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
git clone https://github.com/doxygen/doxygen.git

cd doxygen

mkdir build

cd build

cmake \
-DCMAKE_C_COMPILER=arm-oe-linux-gnueabi-gcc \
-DCMAKE_CXX_COMPILER=arm-oe-linux-gnueabi-g++ \
-DCMAKE_SYSROOT=$SYSROOT_PATH \
-DCMAKE_INSTALL_PREFIX=$PREFIX \
..

make && make install

libsoup

依赖 icu4c & libpsl & krb5

icu4c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cd ~/avs-device-sdk/ThirdParty

wget http://download.icu-project.org/files/icu4c/63.1/icu4c-63_1-src.tgz

tar xf icu4c-63_1-src.tgz

# 解压两份分别为 icu_prebuild icu_realbuild
cp -rf icu icu_prebuild
mv icu icu_realbuild

cd icu_prebuild/source
./configure
make # 生成 config/icucross.mk 文件, 不用 make install 了

cd icu_realbuild/source

./configure \
--prefix=$PREFIX \
--host=arm-oe-linux-gnueabi \
CFLAGS="--sysroot=$SYSROOT_PATH" \
CXXFLAGS="--sysroot=$SYSROOT_PATH" \
--with-cross-build=$HOME/avs-device-sdk/ThirdParty/icu_prebuild/source

make && make install

libpsl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sudo apt install autopoint

cd ~/avs-device-sdk/ThirdParty

git clone https://github.com/rockdaboot/libpsl

cd libpsl/

./autogen.sh

./configure \
--prefix=$PREFIX \
--host=arm-oe-linux-gnueabi \
CFLAGS="--sysroot=$SYSROOT_PATH" \
CXXFLAGS="--sysroot=$SYSROOT_PATH"

make && make install

krb5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
cd ~/avs-device-sdk/ThirdParty

wget https://kerberos.org/dist/krb5/1.15/krb5-1.15.1.tar.gz

tar xf krb5-1.15.1.tar.gz

cd krb5-1.15.1/src

echo krb5_cv_attr_constructor_destructor=yes > linux-cache
echo ac_cv_func_regcomp=yes >> linux-cache
echo ac_cv_printf_positional=yes >> linux-cache

./configure \
--prefix=$PREFIX \
--host=arm-oe-linux-gnueabi \
CC="arm-oe-linux-gnueabi-gcc -I$SYSROOT_PATH/usr/include --sysroot=$SYSROOT_PATH -L$SYSROOT_PATH/usr/lib" \
CXX="arm-oe-linux-gnueabi-g++ -I$SYSROOT_PATH/usr/include --sysroot=$SYSROOT_PATH -L$SYSROOT_PATH/usr/lib" \
--cache-file=linux-cache

需要修改下 include/k5-platform.h 哪里报错则注释掉哪里,比如
注释
# define MAKE_FINI_FUNCTION(NAME) \
static void NAME(void) __attribute__((destructor))
注释
# error "Don't know how to do unload-time finalization for this configuration."

make && make install

libsoup

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
cd ~/avs-device-sdk/ThirdParty

sudo apt install intltool gtk-doc-tools sqlite3 libsqlite3-dev glib-networking libglib2.0 libxml2-dev

wget https://ftp.gnome.org/pub/GNOME/sources/libsoup/2.65/libsoup-2.65.1.tar.xz

tar xf libsoup-2.65.1.tar.xz

cd libsoup-2.65.1

# 这里注意不要加 PKG_CONFIG_PATH 变量或者环境变量, 否则 make 报错
./configure \
--prefix=$PREFIX \
--host=arm-oe-linux-gnueabi \
--with-sysroot=$SYSROOT_PATH \
CFLAGS="--sysroot=$SYSROOT_PATH" \
CXXFLAGS="--sysroot=$SYSROOT_PATH" \
LDFLAGS="-L$SYSROOT_PATH/usr/lib" \
--disable-tls-check

make && make install

libfaad-dev

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cd ~/avs-device-sdk/ThirdParty

git clone https://github.com/dsvensson/faad2.git

cd faad2/

git checkout xmms2

./bootstrap

./configure \
--prefix=$PREFIX \
--host=arm-oe-linux-gnueabi \
CFLAGS="--sysroot=$SYSROOT_PATH"

make && make install

GStreamer

依赖 libffi
编译了 GStreamer 之后还需要编译 gst-plugins-base & gst-plugins-bad 等插件,目前未编译成功

libffi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cd ~/avs-device-sdk/ThirdParty

wget https://github.com/libffi/libffi/archive/v3.2.1.tar.gz

tar xf v3.2.1.tar.gz

cd libffi-3.2.1/

./autogen.sh

./configure \
--prefix=$PREFIX \
--host=arm-oe-linux-gnueabi \
CFLAGS="--sysroot=$SYSROOT_PATH"

make && make install

GStreamer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
cd ~/avs-device-sdk/ThirdParty

wget https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-1.15.2.tar.xz

tar xf gstreamer-1.15.2.tar.xz

cd gstreamer-1.15.2

./configure \
--prefix=$PREFIX \
--host=arm-oe-linux-gnueabi \
--with-sysroot=$SYSROOT_PATH \
CFLAGS="--sysroot=$SYSROOT_PATH" \
LDFLAGS="-L$SYSROOT_PATH/lib -L$SYSROOT_PATH/usr/lib" \
GLIB_CFLAGS="-I$SYSROOT_PATH/usr/include/glib-2.0 -I$SYSROOT_PATH/usr/lib/glib-2.0/include" \
GIO_CFLAGS="-I$SYSROOT_PATH/usr/include"

# configure 阶段不要添加 GLIB_LIBS/GIO_LIBS 不然导致 make 阶段编译不过
# GLIB_LIBS="-L$SYSROOT_PATH/usr/lib"
# GIO_LIBS="-L$SYSROOT_PATH/usr/lib"

make && make install

PortAudio

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cd ~/avs-device-sdk/ThirdParty

wget http://www.portaudio.com/archives/pa_stable_v190600_20161030.tgz

tar xf pa_stable_v190600_20161030.tgz

cd portaudio

./configure \
--prefix=$PREFIX \
--host=arm-oe-linux-gnueabi \
CC="arm-oe-linux-gnueabi-gcc --sysroot=$SYSROOT_PATH" \
CXX="arm-oe-linux-gnueabi-g++ --sysroot=$SYSROOT_PATH" \
--without-jack

make && make install

avs-device-sdk

1
2
# 这句要指向正确实际的 gstreamer-1.0.pc 文件路径
export PKG_CONFIG_PATH=$SYSROOT_PATH/usr/lib/pkgconfig/

vi ~/avs-device-sdk/CMakeLists.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
diff --git a/CMakeLists.txt b/CMakeLists.txt
index cb557d1cb..129b1b0a9 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,6 +2,18 @@ cmake_minimum_required(VERSION 3.1 FATAL_ERROR)

# Set project information
project(AlexaClientSDK VERSION 1.12.0 LANGUAGES CXX)
+
+include_directories(
+ "$HOME/sysroots/mdm9607/include"
+ "$HOME/sysroots/mdm9607/usr/include"
+ "$HOME/sysroots/mdm9607/usr/include/gstreamer-1.0"
+ "$HOME/sysroots/mdm9607/usr/include/glib-2.0"
+ "$HOME/sysroots/mdm9607/usr/lib/glib-2.0/include"
+)
+link_directories("$HOME/sysroots/mdm9607/lib" "$HOME/sysroots/mdm9607/usr/lib")
+
+set(CMAKE_SYSROOT "$HOME/sysroots/mdm9607")
+
set(PROJECT_BRIEF "A cross-platform, modular SDK for interacting with the Alexa Voice Service")
if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CapabilityAgents/ExternalMediaPlayer/src/ExternalMediaPlayerAdapters")
set(HAS_EXTERNAL_MEDIA_PLAYER_ADAPTERS ON)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mkdir $HOME/avs_build

cd $HOME/avs_build

cmake $HOME/avs-device-sdk \
-DSENSORY_KEY_WORD_DETECTOR=OFF \
-DGSTREAMER_MEDIA_PLAYER=ON \
-DPORTAUDIO=ON \
-DPORTAUDIO_LIB_PATH=$SYSROOT_PATH/lib/libportaudio.a \
-DPORTAUDIO_INCLUDE_DIR=$SYSROOT_PATH/include \
-DCMAKE_C_COMPILER=arm-oe-linux-gnueabi-gcc \
-DCMAKE_CXX_COMPILER=arm-oe-linux-gnueabi-g++ \
-DCMAKE_SYSROOT=$SYSROOT_PATH \
-DCMAKE_FIND_ROOT_PATH=$SYSROOT_PATH \
-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \
-DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY \
-DCMAKE_BUILD_TYPE=DEBUG

make