1. 程式人生 > >linux下protobuf 下載並cmake編譯安裝全過程指令碼

linux下protobuf 下載並cmake編譯安裝全過程指令碼

protobuf原始碼下載

github上下載最新版本的protobuf原始碼zip包,並解壓縮到本地
fetch_protobuf.sh

#!/bin/bash

shell_folder=$(cd "$(dirname "$0")";pwd)
pushd $shell_folder
#如果指定的檔案/資料夾存在則刪除,刪除失敗則中止指令碼
remove_if_exist(){
    if [ $# -eq 1 ]
    then
        if [ -e $1 ]
        then
            rm $1 -fr
            if [ ! $? -eq
0 ] then exit -1 fi fi return 0 else echo invalid argument: echo $* exit -1 fi } exit_on_error(){ if [ ! $? -eq 0 ] then exit -1 fi } # 如果檔案存在且checksum與$2指定的md5相等則返回 1,否則返回0 # $1 待檢查的檔案路徑 # $2 md5校驗碼 need_download
(){ if [ $# -eq 2 ] then if [ -f $1 ]; then echo "File already exists. Checking md5..." os=`uname -s` if [ "$os" = "Linux" ]; then checksum=`md5sum $1 | awk '{ print $1 }'` elif [ "$os" = "Darwin" ]; then checksum=`cat $1 | md5` fi
if [ "$checksum" = "$2" ]; then echo "Checksum is correct. No need to download $1." return 1 else echo "Checksum is incorrect. Need to download again $1" fi else return 0 fi else echo invalid argument: echo $* exit -1 fi } # 從github上下載原始碼,如果本地不存在指定的zip包,或md5校驗碼不匹配則從github下載 # $1 專案名稱 # $2 版本號 # $3 zip檔案的md5 # $4 專案所有者名稱 # $5 zip包檔名字首 download_from_github(){ if [ $# -eq 5 ] then project_folder="$1-$2" project_package="$project_folder.zip" if need_download $project_package $3 then echo "(下載原始碼)downloading $1 $2 source" wget --no-check-certificate https://github.com/$4/$1/archive/$5$2.zip -O $project_package exit_on_error fi remove_if_exist $project_folder unzip $project_package exit_on_error else echo invalid argument: echo $* exit -1 fi } download_from_github "protobuf" "3.3.1" "9377e414994fa6165ecb58a41cca3b40" "google" "v" popd

protobuf編譯安裝

對下載的protobuf原始碼編譯並安裝到release/protobuf_linux_x86_64資料夾下
build_protobuf.sh

#!/bin/bash
GXX_PATH="-DCMAKE_BUILD_TYPE:STRING=RELEASE"
INSTALL_FOLDER=$(dirname $(readlink -f $0))/release/protobuf_linux_x86_64
pushd protobuf-3.3.1
echo INSTALL_FOLDER:$INSTALL_FOLDER
if [ -d build.gcc ]
then 
    rm -fr build.gcc/*
else 
    mkdir build.gcc
fi
pushd build.gcc
cmake ../cmake $GXX_PATH -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=$INSTALL_FOLDER  -Dprotobuf_BUILD_TESTS=off
# 編譯並安裝protobuf到指定的資料夾
make install
popd
rm -fr build.gcc
popd

上面的指令碼中在呼叫cmake生成Makefile時定義了protobuf_BUILD_TESTS=off,這是因為protobuf的CMakeLists.txt中預設定義protobuf_BUILD_TESTS=on
而當protobuf_BUILD_TESTS=on時,需要gmock支援(https://github.com/google/googlemock),否則cmake會報如下錯誤:

CMake Error at tests.cmake:2 (message):
Cannot find gmock directory.

gmock是google公司推出的一款開源的白盒測試工具,對於我們一般的應用來說,不需要gmock提供的功能,所以這裡可以將protobuf_BUILD_TESTS=off,避免麻煩。