一, 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 各个库之间的依赖关系