2010-05-20 61 views
7

我的工作主要包括工程分析,但我發現自己在同事之間越來越頻繁地分發代碼。一個巨大的痛苦是,並不是每個用戶都精通編譯源代碼的複雜性,而且我也不能分發可執行文件。簡單而高效的C++/Boost源代碼發佈(合併)

我一直在使用Boost來處理C++,問題是我無法請求每個網絡的每個系統管理員安裝這些庫。相反,我想分發單個源文件(或儘可能少),以便用戶可以g++ source.c -o program

所以,問題是:你可以 Boost庫與你的代碼,並最終與單個文件?我在談論Boost庫,它們是「僅標題」或「僅模板」。

作爲一個靈感,請看SQliteLemon Parser Generator的分佈;作者將這些東西合併成一個單一的源文件,這個文件很容易編譯。

謝謝。

編輯

一個related question in SO是Windows環境。我在Linux上工作。

+1

你想走多遠這條路?那麼他們可能沒有安裝的其他庫呢?您可能想要查看某種包管理器或自動編譯機制(可能是shar壓縮文件?)。 – KeithB 2010-05-20 21:12:09

回答

11

有一個實用程序帶有增強功能,名爲bcp,它可以掃描您的源代碼並提取從boost源中使用的任何boost文件頭文件。我已經設置了一個腳本,將其抽取到我們的源代碼樹中,以便我們可以打包我們需要的源代碼和我們的代碼。它還會將boost源文件複製到我們使用的幾個boost庫中,這些庫不僅僅是頭文件,而是直接編譯到我們的應用程序中。

這樣做一次,然後任何使用代碼的人甚至不需要知道它依賴於boost。這是我們使用的。它也將建立bjam和bcp,如果它們尚未建立。

#!/bin/sh 
BOOST_SRC=.../boost_1_43_0 
DEST_DIR=../src/boost 
TOOLSET= 
if (test `uname` = "Darwin") then 
    TOOLSET="--toolset=darwin" 
fi 

# make bcp if necessary 
if (! test -x $BOOST_SRC/dist/bin/bcp) then 
    if (test -x $BOOST_SRC/tools/jam/*/bin.*/bjam) then 
     BJAM=$BOOST_SRC/tools/jam/*/bin.*/bjam 
    else 
     echo "### Building bjam" 
     pushd $BOOST_SRC/tools/jam 
     ./build_dist.sh 
     popd 
     if (test -x $BOOST_SRC/tools/jam/*/bin.*/bjam) then 
      BJAM=$BOOST_SRC/tools/jam/*/bin.*/bjam 
     fi 

    fi 
    echo "BJAM: $BJAM" 
    pushd $BOOST_SRC/tools/bcp 
    echo "### Building bcp" 
    echo "$BJAM $TOOLSET" 
    $BJAM $TOOLSET 
    if [ $? == "0" ]; then 
     exit 1; 
    fi 
    popd 
fi 

if (! test -x $BOOST_SRC/dist/bin/bcp) then 
    echo "### Couldn't find bpc" 
    exit 1; 
fi 

mkdir -p $DEST_DIR 

echo "### Copying boost source" 
MAKEFILEAM=$DEST_DIR/libs/Makefile.am 
rm $MAKEFILEAM 
# Signals 
# copy source libraries 
mkdir -p $DEST_DIR/libs/signals/src 
cp $BOOST_SRC/libs/signals/src/* $DEST_DIR/libs/signals/src/. 
echo -n "boost_sources += " >> $MAKEFILEAM 
for f in `ls $DEST_DIR/libs/signals/src | fgrep .cpp`; do 
    echo -n "boost/libs/signals/src/$f " >> $MAKEFILEAM 
done 
echo >> $MAKEFILEAM 

echo "### Extracting boost includes" 
$BOOST_SRC/dist/bin/bcp --scan --boost=$BOOST_SRC ../src/*/*.[Ch] ../src/boost/libs/*/src/*.cpp ../src/smart_assert/smart_assert/priv/fwd/*.hpp $DEST_DIR 
if [ $? != "0" ]; then 
    echo "### bcp failed" 
    rm -rf $DEST_DIR 
    exit 1; 
fi 
+0

謝謝。這非常接近我將要做的事情。 – Escualo 2010-05-21 17:53:58

0

爲什麼不把所有必要的文件都檢入到SVN中,並向同事發送存儲庫的URL?然後,他們可以隨時查看代碼,在任何時候想要更新到最新版本時執行「svn up」等。

+0

這對您和我都有用,但對於我的一些同事來說,這需要比他們願意/有時間忍受的更復雜。 – Escualo 2010-05-20 18:11:23

+1

您可能可以在腳本或GUI前端爲他們包裝複雜性。它實際上只是一個單一的「svn co」(或「svn up」)命令,隨後是配置; make或其他。通過一點點工作,它可以通過雙擊圖標來啓動。 – 2010-05-20 20:54:32

3

您是否考慮過爲像SCons這樣的構建系統編寫構建腳本?
你可以編寫一個python腳本來下載boost,解壓縮它編譯所需的文件(如果需要,你甚至可以運行bjam)並編譯你自己的代碼。
你的同事需要的唯一依賴是Python和SCons。

1

在您的代碼上運行預處理器並保存輸出。如果你從一個包含一系列包含的main.cpp開始,你最終會得到一個包含所有包含的文件。如果你有多個cpp文件,你必須將它們聯合起來,然後運行concatinated文件上的預處理器,只要您沒有任何重複的全局符號名稱,這應該工作。

對於更加便攜的方法,請執行sqlite所做的事情,然後編寫自己的腳本,將剛纔創建的文件+ boost文件合併在一起,而不會包含系統。請參閱mksqlite3c。TCL在sqlite的代碼
http://www2.sqlite.org/src/finfo?name=tool/mksqlite3c.tcl

+0

的確如此,但我正在回答他所問的問題,即如何製作一個文件。 – Zanson 2010-05-20 20:34:23

+0

感謝您指出Tcl腳本。 – Escualo 2010-05-21 17:53:20

0

如果您使用的是Debian的衍生品種的Linux,以及類似這樣的問題,只是不應該拿出:讓包裝系統和政策手冊做的工作。只要說清楚libboost-dev或其他軟件包是您的代碼的依賴於構建的代碼,並且需要事先安裝,那麼/usr/include/boost應該就在您的代碼希望找到它的地方。如果您使用的是比發行版更新的boost版本,則可能需要了解如何自行打包並在現有的打包/依賴性框架中工作,而不是重新創建另一個。

我對基於.rpm的發行版不夠熟悉,無法評論事物如何工作。但是我知道我可以很容易地設置我需要的構建環境,對我來說,基於Debian的Windows開發的最大優勢之一。