|  |  |  | 
|---|
|  |  |  | #!/bin/bash | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #+-------------------------------------------------------------------------------------------- | 
|---|
|  |  |  | #|Description:  This shell script used download and compile libgpiod for ARM | 
|---|
|  |  |  | #|     Author:  GuoWenxue <guowenxue@gmail.com> | 
|---|
|  |  |  | #|  ChangeLog: | 
|---|
|  |  |  | #|           1, Initialize 1.0.0 on 2011.04.12 | 
|---|
|  |  |  | #| | 
|---|
|  |  |  | #|   Warnning: libgpiod configure depends on automake >= 1.14, use follow command to change it | 
|---|
|  |  |  | #|             sudo update-alternatives --config automake | 
|---|
|  |  |  | #+-------------------------------------------------------------------------------------------- | 
|---|
|  |  |  | # library name and version | 
|---|
|  |  |  | # Official: https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git | 
|---|
|  |  |  | LIB_NAME=libgpiod-2.0.1 | 
|---|
|  |  |  | PACK_SUFIX=tar.gz | 
|---|
|  |  |  |  | 
|---|
|  |  |  | PRJ_PATH=`pwd` | 
|---|
|  |  |  | PREFIX_PATH=`pwd`/../install | 
|---|
|  |  |  | # LingYun source code FTP server | 
|---|
|  |  |  | LY_FTP=http://master.weike-iot.com:2211/src/ | 
|---|
|  |  |  |  | 
|---|
|  |  |  | LYFTP_SRC=http://master.weike-iot.com:2211/src/ | 
|---|
|  |  |  | # library download URL address | 
|---|
|  |  |  | LIB_URL=$LY_FTP | 
|---|
|  |  |  |  | 
|---|
|  |  |  | CROSSTOOL=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf- | 
|---|
|  |  |  | # Cross compiler for cross compile on Linux server | 
|---|
|  |  |  | CROSS_COMPILE=arm-linux-gnueabihf- | 
|---|
|  |  |  |  | 
|---|
|  |  |  | function msg_banner() | 
|---|
|  |  |  | { | 
|---|
|  |  |  | echo "" | 
|---|
|  |  |  | echo "+-----------------------------------------------------------------------" | 
|---|
|  |  |  | echo "|  $1 " | 
|---|
|  |  |  | echo "+-----------------------------------------------------------------------" | 
|---|
|  |  |  | echo "" | 
|---|
|  |  |  | # compile jobs | 
|---|
|  |  |  | JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l` | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # this project absolute path | 
|---|
|  |  |  | PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # top project absolute path | 
|---|
|  |  |  | TOP_PATH=$(realpath $PRJ_PATH/..) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # binaries install path | 
|---|
|  |  |  | PREFIX_PATH=$TOP_PATH/install | 
|---|
|  |  |  | BIN_PATH=$PREFIX_PATH/bin | 
|---|
|  |  |  | LIB_PATH=$PREFIX_PATH/lib | 
|---|
|  |  |  | INC_PATH=$PREFIX_PATH/include | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # check installed or not file | 
|---|
|  |  |  | INST_FILE=$PREFIX_PATH/lib/libgpiod.so | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # shell script will exit once get command error | 
|---|
|  |  |  | set -e | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #+-------------------------+ | 
|---|
|  |  |  | #| Shell script functions  | | 
|---|
|  |  |  | #+-------------------------+ | 
|---|
|  |  |  |  | 
|---|
|  |  |  | function pr_error() { | 
|---|
|  |  |  | echo -e "\033[40;31m $1 \033[0m" | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | function pr_warn() { | 
|---|
|  |  |  | echo -e "\033[40;33m $1 \033[0m" | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | function pr_info() { | 
|---|
|  |  |  | echo -e "\033[40;32m $1 \033[0m" | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | function check_result() | 
|---|
|  |  |  | { | 
|---|
|  |  |  | if [ $? != 0 ] ; then | 
|---|
|  |  |  | echo "" | 
|---|
|  |  |  | echo "+-----------------------------------------------------------------------" | 
|---|
|  |  |  | echo "|  $1 " | 
|---|
|  |  |  | echo "+-----------------------------------------------------------------------" | 
|---|
|  |  |  | echo "" | 
|---|
|  |  |  | exit ; | 
|---|
|  |  |  | fi | 
|---|
|  |  |  | if [ $? != 0 ] ; then | 
|---|
|  |  |  | pr_error "$1" | 
|---|
|  |  |  | exit | 
|---|
|  |  |  | fi | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | function export_cross() | 
|---|
|  |  |  | # decompress a packet to destination path | 
|---|
|  |  |  | function do_unpack() | 
|---|
|  |  |  | { | 
|---|
|  |  |  | # export cross toolchain | 
|---|
|  |  |  | export CC=${CROSSTOOL}gcc | 
|---|
|  |  |  | export AS=${CROSSTOOL}as | 
|---|
|  |  |  | export AR=${CROSSTOOL}ar | 
|---|
|  |  |  | export LD=${CROSSTOOL}ld | 
|---|
|  |  |  | export NM=${CROSSTOOL}nm | 
|---|
|  |  |  | export RANLIB=${CROSSTOOL}ranlib | 
|---|
|  |  |  | export OBJDUMP=${CROSSTOOL}objdump | 
|---|
|  |  |  | export STRIP=${CROSSTOOL}strip | 
|---|
|  |  |  | tarball=$1 | 
|---|
|  |  |  | dstpath=`pwd` | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # export cross configure | 
|---|
|  |  |  | export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux " | 
|---|
|  |  |  | if [[ $# == 2 ]] ; then | 
|---|
|  |  |  | dstpath=$2 | 
|---|
|  |  |  | fi | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # Clear LDFLAGS and CFLAGS | 
|---|
|  |  |  | export LDFLAGS= | 
|---|
|  |  |  | export CFLAGS= | 
|---|
|  |  |  | pr_info "decompress $tarball => $dstpath" | 
|---|
|  |  |  |  | 
|---|
|  |  |  | mkdir -p $dstpath | 
|---|
|  |  |  | case $tarball in | 
|---|
|  |  |  | *.tar.gz) | 
|---|
|  |  |  | tar -xzf $tarball -C $dstpath | 
|---|
|  |  |  | ;; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | *.tar.bz2) | 
|---|
|  |  |  | tar -xjf $tarball -C $dstpath | 
|---|
|  |  |  | ;; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | *.tar.xz) | 
|---|
|  |  |  | tar -xJf $tarball -C $dstpath | 
|---|
|  |  |  | ;; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | *.tar.zst) | 
|---|
|  |  |  | tar -I zstd -xf $tarball -C $dstpath | 
|---|
|  |  |  | ;; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | *.tar) | 
|---|
|  |  |  | tar -xf $tarball -C $dstpath | 
|---|
|  |  |  | ;; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | *.zip) | 
|---|
|  |  |  | unzip -qo $tarball -d $dstpath | 
|---|
|  |  |  | ;; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | *) | 
|---|
|  |  |  | pr_error "decompress Unsupport packet: $tarball" | 
|---|
|  |  |  | return 1; | 
|---|
|  |  |  | ;; | 
|---|
|  |  |  | esac | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | function compile_libgpiod() | 
|---|
|  |  |  | function do_export() | 
|---|
|  |  |  | { | 
|---|
|  |  |  | SRC_NAME=libgpiod-2.0.1 | 
|---|
|  |  |  | PACK_SUFIX=tar.gz | 
|---|
|  |  |  | IMG_NAME=libgpiod.so.2.1.1 | 
|---|
|  |  |  | BUILD_ARCH=$(uname -m) | 
|---|
|  |  |  | if [[ $BUILD_ARCH =~ "arm" ]] ; then | 
|---|
|  |  |  | pr_warn "local($BUILD_ARCH) compile $LIB_NAME" | 
|---|
|  |  |  | return ; | 
|---|
|  |  |  | fi | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if [ -f ${PREFIX_PATH}/lib/${IMG_NAME} ] ; then | 
|---|
|  |  |  | msg_banner "$SRC_NAME already compile and installed" | 
|---|
|  |  |  | return 0; | 
|---|
|  |  |  | fi | 
|---|
|  |  |  | pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME" | 
|---|
|  |  |  |  | 
|---|
|  |  |  | msg_banner "Start cross compile $SRC_NAME " | 
|---|
|  |  |  | # export cross toolchain | 
|---|
|  |  |  | export CC=${CROSS_COMPILE}gcc | 
|---|
|  |  |  | export CXX=${CROSS_COMPILE}g++ | 
|---|
|  |  |  | export AS=${CROSS_COMPILE}as | 
|---|
|  |  |  | export AR=${CROSS_COMPILE}ar | 
|---|
|  |  |  | export LD=${CROSS_COMPILE}ld | 
|---|
|  |  |  | export NM=${CROSS_COMPILE}nm | 
|---|
|  |  |  | export RANLIB=${CROSS_COMPILE}ranlib | 
|---|
|  |  |  | export OBJDUMP=${CROSS_COMPILE}objdump | 
|---|
|  |  |  | export STRIP=${CROSS_COMPILE}strip | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then | 
|---|
|  |  |  | #wget https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git/snapshot/${SRC_NAME}.${PACK_SUFIX} | 
|---|
|  |  |  | wget $LYFTP_SRC/$SRC_NAME.$PACK_SUFIX | 
|---|
|  |  |  | check_result "ERROR: download ${SRC_NAME} failure" | 
|---|
|  |  |  | fi | 
|---|
|  |  |  | # export cross configure | 
|---|
|  |  |  | export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux " | 
|---|
|  |  |  |  | 
|---|
|  |  |  | tar -xzf ${SRC_NAME}.${PACK_SUFIX} | 
|---|
|  |  |  | cd ${SRC_NAME} | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ./autogen.sh | 
|---|
|  |  |  |  | 
|---|
|  |  |  | echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache | 
|---|
|  |  |  | ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} --cache-file=arm-linux.cache --enable-tools | 
|---|
|  |  |  | check_result "ERROR: configure ${SRC_NAME} failure" | 
|---|
|  |  |  |  | 
|---|
|  |  |  | make  && make install | 
|---|
|  |  |  | check_result "ERROR: compile ${SRC_NAME} failure" | 
|---|
|  |  |  |  | 
|---|
|  |  |  | cd - | 
|---|
|  |  |  | # Clear LDFLAGS and CFLAGS | 
|---|
|  |  |  | export LDFLAGS= | 
|---|
|  |  |  | export CFLAGS= | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | export_cross | 
|---|
|  |  |  | function do_fetch() | 
|---|
|  |  |  | { | 
|---|
|  |  |  | if [ -e ${INST_FILE} ] ; then | 
|---|
|  |  |  | pr_warn "$LIB_NAME compile and installed alredy" | 
|---|
|  |  |  | exit ; | 
|---|
|  |  |  | fi | 
|---|
|  |  |  |  | 
|---|
|  |  |  | compile_libgpiod | 
|---|
|  |  |  | if [ -d $LIB_NAME ] ; then | 
|---|
|  |  |  | pr_warn "$LIB_NAME fetch already" | 
|---|
|  |  |  | return ; | 
|---|
|  |  |  | fi | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then | 
|---|
|  |  |  | wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX} | 
|---|
|  |  |  | check_result "ERROR: download ${LIB_NAME} failure" | 
|---|
|  |  |  | fi | 
|---|
|  |  |  |  | 
|---|
|  |  |  | do_unpack ${LIB_NAME}.${PACK_SUFIX} | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | function do_build() | 
|---|
|  |  |  | { | 
|---|
|  |  |  | cd $LIB_NAME | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ./autogen.sh | 
|---|
|  |  |  |  | 
|---|
|  |  |  | do_export | 
|---|
|  |  |  |  | 
|---|
|  |  |  | echo "ac_cv_func_malloc_0_nonnull=yes" > arm-linux.cache | 
|---|
|  |  |  | ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} --enable-static \ | 
|---|
|  |  |  | --cache-file=arm-linux.cache --enable-tools | 
|---|
|  |  |  | check_result "ERROR: configure ${LIB_NAME} failure" | 
|---|
|  |  |  |  | 
|---|
|  |  |  | make -j ${JOBS} && make install | 
|---|
|  |  |  | check_result "ERROR: compile ${LIB_NAME} failure" | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | function do_clean() | 
|---|
|  |  |  | { | 
|---|
|  |  |  | rm -rf *${LIB_NAME}* | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if [[ $# == 1 && $1 == -c ]] ;then | 
|---|
|  |  |  | pr_warn "start clean ${LIB_NAME}" | 
|---|
|  |  |  | do_clean | 
|---|
|  |  |  | exit; | 
|---|
|  |  |  | fi | 
|---|
|  |  |  |  | 
|---|
|  |  |  | do_fetch | 
|---|
|  |  |  |  | 
|---|
|  |  |  | do_build | 
|---|
|  |  |  |  | 
|---|