7
votes

Distribution simple et efficace du code source C ++ / Boost (amalgamation)

Mon travail consiste principalement en une analyse de l'ingénierie, mais je me trouve la distribution de code de plus en plus fréquemment parmi mes collègues. Une grosse douleur est que tous les utilisateurs ne maîtrisent pas dans les excivrances du code source de compilation et je ne peux pas distribuer des exécutables.

Je travaille avec C ++ en utilisant Boost et que le problème est que je ne peux pas demander à chaque sysadmin de chaque réseau d'installer les bibliothèques. Au lieu de cela, je souhaite distribuer un fichier source unique (ou aussi peu que possible) afin que l'utilisateur puisse g ++ source.c -o programme . .

Donc, la question est la suivante: pouvez-vous pack les bibliothèques de boost avec votre code et retrouvez-vous avec un seul fichier? Je parle des bibliothèques de boost qui sont des "en-têtes uniquement" ou "modèles seulement".

Comme inspiration, veuillez consulter la distribution de SQLite ou le Générateur d'analyseurs de citron ; L'auteur amalgamate les choses dans un seul fichier source qui est trivial à compiler.

merci.

Modifier :

a Question connexe à SO est pour l'environnement Windows. Je travaille à Linux.


1 commentaires

Jusqu'où voulez-vous descendre ce chemin? Qu'en est-il des autres bibliothèques qu'ils n'auraient peut-être pas installées. Vous voulez probablement regarder une sorte de gestionnaire de paquets ou un mécanisme de compilation automatisé (peut-être une archive Shar?).


5 Réponses :


0
votes

Pourquoi ne pas simplement vérifier dans tous les fichiers nécessaires à SVN et vous envoyer des collègues de l'URL du référentiel? Ensuite, ils peuvent consulter le code chaque fois qu'ils le souhaitent, faire un «svn up» à tout moment, ils souhaitent mettre à jour la dernière version, etc.


2 commentaires

Cela fonctionnerait pour vous et pour moi, mais pour certains de mes collègues, cela nécessiterait une plus grande sophistication qu'autrement disposé / ait le temps de supporter.


Vous pourriez probablement conclure la complexité dans un script ou une extrémité frontale d'interface graphique. C'est vraiment une question d'une seule commande «SVN CO» (ou «SVN UP»), suivie de la configuration; faites ou autre chose. Avec un petit travail, il pourrait tous être lancé en double-cliquant sur une icône.



3
votes

Avez-vous envisagé d'écrire simplement un script de construction pour un système de construction comme SCONS ?
Vous pouvez écrire un script Python pour télécharger Boost, décompressez-le compiler les fichiers nécessaires (vous pouvez même exécuter BJAM si nécessaire) et compiler votre propre code.
La seule dépendance dont vos collègues auront besoin sont Python et Scons.


0 commentaires

11
votes

Il y a un utilitaire fourni avec boost appelé bcp code>, qui peut analyser votre source et extraire tous les fichiers d'en-tête Boost utilisés à partir de la source Boost. J'ai configuré un script qui fait cette extraction dans notre arborescence source, de sorte que nous puissions emballer la source dont nous avons besoin avec notre code. Il copiera également les fichiers source de boost pour quelques bibliothèques de boost que nous utilisons qui ne sont pas une en-tête uniquement, qui sont ensuite compilées directement dans nos applications.

Ceci est fait une fois, puis n'importe qui qui utilise le code n'a même pas besoin de savoir que cela dépend de la boost. Voici ce que nous utilisons. Il construira également Bjam et BCP, s'ils n'ont pas été construits déjà. P>

#!/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 commentaires

Merci. C'est très proche de ce que je finirai par faire.



2
votes

Exécutez le pré-processeur sur votre code et enregistrez la sortie. Si vous avez commencé avec un MAIN.CPP avec un tas d'inclure, vous vous retrouverez avec un fichier dans lequel toutes les inclinations ont été aspirées. Si vous avez plusieurs fichiers CPP, vous devrez les concater ensemble, puis exécuter Le préprocesseur du fichier concaté, cela devrait fonctionner aussi longtemps que vous n'avez aucun nom de symbole global en double.

Pour une méthode plus portable, faites ce que SQLite effectue et écrivez votre propre script pour combiner et conciser ensemble les fichiers que vous avez créés + boost et ne pas obtenir le système inclut. Voir mksqlite3c.tcl dans le code SQLite
http://www2.sqlite.org/src/finfo?name= Outil / mksqlite3c.tcl


1 commentaires

Certes, mais je réponds à la question qu'il a posée, ce qui était comment en faire un fichier.



0
votes

Si vous êtes sur une variété dérivée de Debian de Linux, des problèmes de puits, comme celui-ci ne devraient tout simplement pas arriver: laissez le système d'emballage et le manuel de stratégie faire le travail. Il suffit de préciser que le libboost-dev ou quel que soit le package une dépendance de votre code de votre code et qu'il doit être installé à l'avance, puis / usr / include / boost devrait être juste là où votre code s'attend à ce que votre code attend. pour le trouver. Si vous utilisez une version plus récente de Boost que les navires de distribution, il est probablement intéressant de déterminer comment l'emballer vous-même et de travailler dans le cadre d'emballage / de dépendances existant plutôt que de réinventer un autre.

Je ne suis pas assez familier avec des distributions basées sur .RPM pour commenter comment les choses fonctionnent là-bas. Mais sachant que je peux facilement configurer exactement l'environnement de construction dont j'ai besoin est, pour moi, l'un des principaux avantages du développement basé sur Debian sur Windows.


0 commentaires