自动下载和编译在x86-64 linux操作系统上运行commonAPI+someip 进行ipc rpc 进程间通信的脚本

一, linux系统版本

我的linux系统版本为:

Ubuntu 18.04.6 LTS (GNU/Linux 4.15.0-194-generic x86_64)

二, gcc 版本为7.5 或以上

三,下面脚本保存为 build.sh,自动下载和编译所有依赖的库,boost, commonAPI, commonAPI-Someip, vsomeip3等:

#!/bin/bash
#set -x

WORK_DIR=`pwd`
BUILD_ROOT=${WORK_DIR}
RUN_ROOT=`pwd`
PROJECT_NAME=commonAPI

BOOST_NAME=boost
VSOMEIP_NAME=vsomeip
CORE_RUNTIME_NAME=capicxx-core-runtime
SOMEIP_RUNTIME_NAME=capicxx-someip-runtime
TEST_APP_NAME=E01HelloWorld

BUILD_ROOT_DIR=${BUILD_ROOT}/${PROJECT_NAME}
RUN_ROOT_DIR=${RUN_ROOT}/${PROJECT_NAME}

BUILD_BOOST_DIR=${BUILD_ROOT_DIR}/${BOOST_NAME}
RUN_BOOST_DIR=${RUN_ROOT_DIR}/${BOOST_NAME}

export BUILD_CORE_RUNTIME_DIR=${BUILD_ROOT_DIR}/${CORE_RUNTIME_NAME}
export BUILD_SOMEIP_RUNTIME_DIR=${BUILD_ROOT_DIR}/${SOMEIP_RUNTIME_NAME}
export BUILD_VSOMEIP_DIR=${BUILD_ROOT_DIR}/${VSOMEIP_NAME}
export BUILD_APP_DIR=${BUILD_ROOT_DIR}/${TEST_APP_NAME}

export RUN_CORE_RUNTIME_DIR=${RUN_ROOT_DIR}/${CORE_RUNTIME_NAME}
export RUN_SOMEIP_RUNTIME_DIR=${RUN_ROOT_DIR}/${SOMEIP_RUNTIME_NAME}
export RUN_VSOMEIP_DIR=${RUN_ROOT_DIR}/${VSOMEIP_NAME}
export RUN_APP_DIR=${RUN_ROOT_DIR}/${TEST_APP_NAME}

export SRC_CORE_RUNTIME_DIR=${WORK_DIR}/${CORE_RUNTIME_NAME}
export SRC_SOMEIP_RUNTIME_DIR=${WORK_DIR}/${SOMEIP_RUNTIME_NAME}
export SRC_VSOMEIP_DIR=${WORK_DIR}/${VSOMEIP_NAME}

function install_boost()
{
    echo "install_boost"

    BOOST_VERSION_NAME=boost_1_66_0

    cd ${WORK_DIR}
    if [ ! -d ${BOOST_VERSION_NAME} ] ;then
        if [ ! -f ${BOOST_VERSION_NAME}.7z ];then
            wget https://boostorg.jfrog.io/artifactory/main/release/1.66.0/source/boost_1_66_0.7z
        fi
        7z x ${BOOST_VERSION_NAME}.7z
        if [ $? != 0 ];then
            echo "Please install 7z: sudo apt install p7zip-full"
            exit 1
        fi
    else
        rm -rf ${BOOST_VERSION_NAME}/bin.v2
        rm -rf ${BOOST_VERSION_NAME}/stage
        ${BOOST_VERSION_NAME}/b2 clean
    fi

    cd ${BOOST_VERSION_NAME}/

    ./bootstrap.sh
    ./b2 link=shared runtime-link=shared 

    if [ $? != 0 ];then
        echo "install_boost fail!"
        exit 1
    fi

    rm -rf  ${BUILD_BOOST_DIR}
    mkdir -p ${BUILD_BOOST_DIR}
    cp -rf stage/lib ${BUILD_BOOST_DIR}
    rm -rf ${BUILD_BOOST_DIR}/lib/*.a
    mkdir -p ${BUILD_BOOST_DIR}/include
    cp -rf boost ${BUILD_BOOST_DIR}/include
}

function install_vsomeip()
{
    echo "install_vsomeip"

    RELY_LIBRARY_PATH=" -Wl,-rpath,${RUN_BOOST_DIR}/lib:${RUN_VSOMEIP_DIR}"
    RELY_LIBRARY_PATH+=" -lboost_system -lboost_filesystem -L${BUILD_BOOST_DIR}/lib"

# Boost_VERSION must match boost_1_66_0
    COMMAND="set (BOOST_ROOT \"${BUILD_BOOST_DIR}\")\n"
    COMMAND+="set (Boost_FOUND 1)\n"
    COMMAND+="set (Boost_VERSION 106600)\n"
    COMMAND+="set (BOOST_LIBRARYDIR \"${BUILD_BOOST_DIR}/lib\")\n"
    COMMAND+="set (Boost_INCLUDE_DIR \"${BUILD_BOOST_DIR}/include\")\n"
    COMMAND+="set (Boost_LIBRARIES \"${RELY_LIBRARY_PATH}\")\n"

    cd ${WORK_DIR}
    if [ ! -d ${VSOMEIP_NAME} ] ;then
        git clone https://github.com/COVESA/vsomeip.git
    else
        rm -rf ${VSOMEIP_NAME}/build
    fi

    cd ${VSOMEIP_NAME}

# Do not find boost by the cmake
    sed -i "/^set .*BOOST_ROOT/,+5d" CMakeLists.txt
    sed -i "/\(find_package.*Boost\)/a $COMMAND" CMakeLists.txt
    sed -i "s/\(^find_package.*Boost\)/#\1/" CMakeLists.txt

    mkdir build
    cd build
    cmake -DDISABLE_DLT=1 -DWITHOUT_SYSTEMD=1 ..
    make

    if [ $? != 0 ];then
        echo "install_vsomeip fail!"
        exit 1
    fi

    rm -rf ${BUILD_VSOMEIP_DIR}
    mkdir -p ${BUILD_VSOMEIP_DIR}

    tar cvf libvsomeip.tar libvsomeip*
    mv libvsomeip.tar ${BUILD_VSOMEIP_DIR}
    cd ${BUILD_VSOMEIP_DIR}
    tar xvf libvsomeip.tar
    rm libvsomeip.tar
}

function install_core_runtime()
{
    echo "install_core_runtime"

    RELY_LIBRARY_PATH="-Wl,-rpath,${RUN_APP_DIR}"
    COMMAND="target_link_libraries(CommonAPI PRIVATE ${RELY_LIBRARY_PATH})"

    cd ${WORK_DIR}
    if [ ! -d ${CORE_RUNTIME_NAME} ] ;then
        git clone https://github.com/COVESA/capicxx-core-runtime.git
    else
        rm -rf ${CORE_RUNTIME_NAME}/build
    fi

    cd ${CORE_RUNTIME_NAME}

    sed -i "s/\(^pkg_check_modules.*DLT\)/#\1/" CMakeLists.txt
    sed -i "s/\(-fvisibility=hidden\)/-fvisibility=default/" CMakeLists.txt

    sed -i "/\(^target_link_libraries.*CommonAPI PRIVATE\)/a $COMMAND"  CMakeLists.txt

    mkdir build
    cd build
    cmake ..
    make

    if [ $? != 0 ];then
        echo "install_core_runtime fail!"
        exit 1
    fi

    rm -rf ${BUILD_CORE_RUNTIME_DIR}
    mkdir -p ${BUILD_CORE_RUNTIME_DIR}

    tar cvf libCommonAPI.tar libCommonAPI*
    mv libCommonAPI.tar ${BUILD_CORE_RUNTIME_DIR}
    cd ${BUILD_CORE_RUNTIME_DIR}
    tar xvf libCommonAPI.tar
    rm libCommonAPI.tar 
}

function install_someip_runtime()
{
    echo "install_someip_runtime"

    RELY_LIBRARY_PATH="-Wl,-rpath,${RUN_VSOMEIP_DIR}"
    RELY_LIBRARY_PATH+=" -lvsomeip3 -L${BUILD_VSOMEIP_DIR}"

    COMMAND="target_link_libraries(CommonAPI-SomeIP PRIVATE ${RELY_LIBRARY_PATH})"
    COMMONAPI_INCLUDE_DIR="${SRC_CORE_RUNTIME_DIR}/include"
    VSOMEIP3_INCLUDE_DIR="${SRC_VSOMEIP_DIR}/interface"

    cd ${WORK_DIR}
    if [ ! -d ${SOMEIP_RUNTIME_NAME} ] ;then
        git clone https://github.com/COVESA/capicxx-someip-runtime.git
    else
        rm -rf ${SOMEIP_RUNTIME_NAME}/build
    fi

    cd ${SOMEIP_RUNTIME_NAME}

# Comment below command, do not add lib CommonAPI
    sed -i "/\(^target_link_libraries.*CommonAPI-SomeIP PRIVATE\)/d"  CMakeLists.txt
    sed -i "/\(target_link_libraries.*CommonAPI-SomeIP.*CommonAPI\)/a $COMMAND"  CMakeLists.txt
    sed -i "s/\(^target_link_libraries.*CommonAPI-SomeIP.*CommonAPI\)/#\1/"  CMakeLists.txt
    sed -i "s/\(-fvisibility=hidden\)/-fvisibility=default/" CMakeLists.txt

    mkdir build
    cd build
    cmake  -DCOMMONAPI_INCLUDE_DIRS=${COMMONAPI_INCLUDE_DIR} -DVSOMEIP3_INCLUDE_DIRS=${VSOMEIP3_INCLUDE_DIR} -DCMAKE_PREFIX_PATH=${SRC_VSOMEIP_DIR}/build ..
    make

    if [ $? != 0 ];then
        echo "install_someip_runtime fail!"
        exit 1
    fi

    rm -rf  ${BUILD_SOMEIP_RUNTIME_DIR}
    mkdir -p ${BUILD_SOMEIP_RUNTIME_DIR}

    tar cvf libCommonAPI-SomeIP.tar libCommonAPI-SomeIP*
    mv libCommonAPI-SomeIP.tar ${BUILD_SOMEIP_RUNTIME_DIR}
    cd ${BUILD_SOMEIP_RUNTIME_DIR}
    tar xvf libCommonAPI-SomeIP.tar
    rm libCommonAPI-SomeIP.tar 
}

function download_generator()
{
    echo "download_generator"

    CORE_GENERATOR_NAME=commonapi_core_generator
    SOMEIP_GENERATOR_NAME=commonapi_someip_generator

    cd ${WORK_DIR}
    if [ ! -d ${CORE_GENERATOR_NAME} ] ;then
        if [ ! -f ${CORE_GENERATOR_NAME}.zip ];then
            wget https://github.com/COVESA/capicxx-core-tools/releases/download/3.2.0.1/commonapi_core_generator.zip
        fi
        unzip -o -d  ${CORE_GENERATOR_NAME} ${CORE_GENERATOR_NAME}.zip
    fi

    if [ ! -d ${SOMEIP_GENERATOR_NAME} ] ;then
        if [ ! -f ${SOMEIP_GENERATOR_NAME}.zip ];then
            wget https://github.com/COVESA/capicxx-someip-tools/releases/download/3.2.0.1/commonapi_someip_generator.zip
        fi
        unzip -o -d  ${SOMEIP_GENERATOR_NAME} ${SOMEIP_GENERATOR_NAME}.zip
    fi
}

function download_testcase_and_compile()
{
    echo "download_testcase_and_compile"

    TEST_CODE_NAME=capicxx-core-tools
    MAKEFILE_NAME=E01HelloWorld_Makefile

    cd ${WORK_DIR}
    if [ ! -d ${TEST_CODE_NAME} ] ;then
        git clone https://github.com/COVESA/capicxx-core-tools.git
    fi

    cp ${MAKEFILE_NAME} ${TEST_CODE_NAME}/CommonAPI-Examples/E01HelloWorld/Makefile
    cd ${TEST_CODE_NAME}/CommonAPI-Examples/E01HelloWorld

    ${WORK_DIR}/commonapi_core_generator/commonapi-core-generator-linux-`uname -m`  -sk  ./fidl/E01HelloWorld.fidl
    ${WORK_DIR}/commonapi_someip_generator/commonapi-someip-generator-linux-`uname -m`  -ll  verbose  ./fidl/E01HelloWorld-SomeIP.fdepl

    make

    if [ $? != 0 ];then
        echo "download_testcase_and_compile fail!"
        exit 1
    fi
}

function prompt_message()
{
    echo ""
    echo "Congratulations, build ${BUILD_ROOT}/${PROJECT_NAME} done!"
    echo "Please follow below steps to run"
    echo ""
    echo "# cd ${RUN_APP_DIR}"
#   echo "# export LD_LIBRARY_PATH=${RUN_VSOMEIP_DIR}"
    echo "# export COMMONAPI_CONFIG=${RUN_APP_DIR}/commonapi4someip.ini"
#   echo "# export VSOMEIP_APPLICATION_NAME=service-sample"
#   echo "# export VSOMEIP_CONFIGURATION=${RUN_APP_DIR}/vsomeip-service.json"
    echo "# ./E01HelloWorldService &"
#   echo "# export VSOMEIP_APPLICATION_NAME=client-sample"
#   echo "# export VSOMEIP_CONFIGURATION=${RUN_APP_DIR}/vsomeip-client.json"
    echo "# ./E01HelloWorldClient"
    echo ""
}

install_boost
install_vsomeip
install_core_runtime
install_someip_runtime
download_generator
download_testcase_and_compile
prompt_message

四,下面脚本保存为 E01HelloWorld_Makefile,用于编译测试程序E01HelloWorldClient和E01HelloWorldService:

BUILD_COMMON_CORE_DIR=${BUILD_CORE_RUNTIME_DIR}
RUN_COMMON_CORE_DIR=${RUN_CORE_RUNTIME_DIR}

BUILD_COMMON_SOMEIP_DIR=${BUILD_SOMEIP_RUNTIME_DIR}
RUN_COMMON_SOMEIP_DIR=${RUN_SOMEIP_RUNTIME_DIR}

BUILD_DIR=${BUILD_APP_DIR}

ARM_SYSTEM_ROOT=${SYSTEM_ARM_ROOT}

CC=g++

CFLAG=
CFLAG+=-I${SRC_CORE_RUNTIME_DIR}/include 
CFLAG+=-I${SRC_SOMEIP_RUNTIME_DIR}/include 
CFLAG+=-isystem ${SRC_VSOMEIP_DIR}/interface 
CFLAG+=-Isrc-gen
CFLAG+= -std=c++11 -Wall -Wextra -Wformat -Wformat-security -Wconversion -g
CFLAG+=-fexceptions -fstrict-aliasing -fstack-protector -fasynchronous-unwind-tables -fno-omit-frame-pointer
CFLAG+=-DCOMMONAPI_INTERNAL_COMPILATION -DCOMMONAPI_LOGLEVEL=COMMONAPI_LOGLEVEL_DEBUG -D_GLIBCXX_USE_NANOSLEEP
CFLAG+=-DBOOST_LOG_DYN_LINK -DCOMMONAPI_SOMEIP_VERSION_MAJOR=3 -DCOMMONAPI_SOMEIP_VERSION_MINOR=2  -DNDEBUG

LIBSOMEIPLDFLAG=-lCommonAPI-SomeIP -L${BUILD_COMMON_SOMEIP_DIR} -Wl,-rpath,${RUN_COMMON_SOMEIP_DIR}
LIBSOMEIPLDFLAG+=-shared -fPIC -Wl,-soname,libE01HelloWorld-someip.so -o ${BUILD_DIR}/libE01HelloWorld-someip.so

LDFLAG=-lpthread -lCommonAPI -L${BUILD_COMMON_CORE_DIR} -Wl,-rpath,${RUN_COMMON_CORE_DIR}

LIBOBJSRC=src-gen/v0/commonapi/examples/*.cpp

CLIENT_SRC=src/E01HelloWorldClient.cpp
CLIENT_OBJ= $(CLIENT_SRC:%.cpp=%.cpp.o)

SERVER_SRC=src/E01HelloWorldService.cpp  src/E01HelloWorldStubImpl.cpp
SERVER_OBJ= $(SERVER_SRC:%.cpp=%.cpp.o)


all: clean libsomeip client service
	cp commonapi4someip.ini vsomeip-client.json vsomeip-local.json vsomeip-service.json ${BUILD_DIR}

libsomeip:
	mkdir -p ${BUILD_DIR}
	$(CC) $(CFLAG) $(LIBOBJSRC) $(LIBSOMEIPLDFLAG)

client: ${CLIENT_OBJ}
	$(CC) -o ${BUILD_DIR}/E01HelloWorldClient ${CLIENT_OBJ}  $(LDFLAG)

service: ${SERVER_OBJ}
	$(CC) -o ${BUILD_DIR}/E01HelloWorldService $(SERVER_OBJ) $(LDFLAG)

%.cpp.o:%.cpp
	@echo "-------compile cpp-----------"
	$(CC) -c $(CFLAG) -o $@ $<

clean:
	rm -rf ${BUILD_DIR}/libE01HelloWorld-someip.so ${BUILD_DIR}/E01HelloWorldClient ${BUILD_DIR}/E01HelloWorldService ${CLIENT_OBJ} ${SERVER_OBJ}

五,下面代码保存为Makefile,用于调用 make 命令,一健编译:

all:
	chmod +x build.sh
	./build.sh

六,新建一个目录,将这三个文件放在同一个目录,一个命令 make 即可全程自动化编译,最后按照提示运行即可:

七, 附上CommonAPI+someip 各个库之间的依赖关系

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值