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

时间:2010-05-20 18:03:59

标签: c++ boost software-distribution amalgamation

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

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

所以,问题是:你可以用你的代码打包 Boost库,最终得到一个文件吗?我说的是Boost库,它们只是“标题”或“仅模板”。

作为灵感,请查看SQliteLemon Parser Generator的分布情况;作者将这些东西合并为一个简单的编译源文件。

谢谢。

修改

related question in SO适用于Windows环境。我在Linux工作。

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

您是否考虑过为SCons等构建系统编写构建脚本? 您可以编写一个python脚本来下载boost,解压缩它编译所需的文件(如果需要,您甚至可以运行bjam)并编译自己的代码。
您的同事需要的唯一依赖是Python和SCons。

答案 2 :(得分:1)

在代码上运行预处理器并保存输出。如果你从一个带有一堆包含的main.cpp开始,你将得到一个文件,其中所有的包含都被吸入。如果你有多个cpp文件,你将必须将它们连接在一起然后运行在连续文件上的预处理器,只要您没有任何重复的全局符号名称,这应该有效。

对于更便携的方法,执行sqlite所做的操作并编写自己的脚本,只需将您创建的文件组合并合并到一起,并且不会将系统包括在内。请参阅sqlite代码中的mksqlite3c.tcl http://www2.sqlite.org/src/finfo?name=tool/mksqlite3c.tcl

答案 3 :(得分:0)

为什么不直接将所有必要的文件签入SVN,并向同事发送存储库的URL?然后,他们可以随时查看代码,在他们想要更新到最新版本时进行'svn up'等。

答案 4 :(得分:0)

如果您使用的是Debian派生的各种Linux,那么这样的问题就不应该出现:让包装系统和政策手册完成工作。只需明确说明libboost-dev或任何包是代码的构建依赖项,需要事先安装,然后/usr/include/boost应该就在那里,代码期望找到它。如果您使用的是比发行版更新版本的boost,那么可能值得弄清楚如何自己打包它并在现有的打包/依赖框架内工作,而不是重新发明另一个。

我对基于.rpm的发行版不太熟悉,以评论其中的工作方式。但是,知道我可以轻松地设置我需要的构建环境,对我而言,是基于Debian的开发优于Windows的最大优势之一。