简单高效地分发C++/Boost源代码(合并)

Esc*_*alo 7 c++ boost software-distribution amalgamation

我的工作主要是工程分析,但我发现自己在同事中越来越频繁地分发代码.一个巨大的痛苦是并非每个用户都精通编译源代码的复杂性,而且我无法分发可执行文件.

我一直在使用Boost使用C++,问题是我无法请求每个网络的每个sysadmin安装库.相反,我想分发一个源文件(或尽可能少),以便用户可以g++ source.c -o program.

所以,问题是:你能用你的代码打包 Boost库,最终得到一个文件吗?我在谈论Boost库,它们只是"标题"或"仅模板".

作为灵感,请查看SQliteLemon Parser Generator的分布情况; 作者将这些东西合并为一个单独的源文件,这对于编译来说是微不足道的.

谢谢.

编辑:

SO中相关问题适用于Windows环境.我在Linux工作.

Kei*_*thB 11

有一个带有boost的实用程序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
Run Code Online (Sandbox Code Playgroud)