2008-10-13 11 views
2

Après plusieurs années d'utilisation de make, je viens de commencer à utiliser jam (en fait ftjam) pour mes projets.Définir les dépendances inter-répertoires dans Jam

Dans mes espaces de travail de projet, j'ai deux répertoires:

  • src où je construis executables et les bibliothèques
  • test où mes programmes de test sont

Je suis en train de mettre en place une dépendante des programmes de test pour que chaque fois que je les compile, les bibliothèques soient recompilées (si nécessaire).

Une suggestion sur la façon de le faire?

Répondre

2

Ok, cela ne semble pas être une question aussi facile que je le pensais alors j'ai travaillé sur une solution par moi-même. Il utilise un script pour atteindre le résultat final, alors j'espère toujours qu'un Jam Gourou aura une solution de confiture seulement.

  • Créez une Jamrules dans le répertoire racine du projet avec les définitions communes.

  • Créer un Jamfile dans le répertoire racine du projet avec le contenu suivant:

 

    SubDir . ; 
    SubInclude . src ; 
    SubInclude . test ; 

  • Créer une Jamfile dans le répertoire src
 

    SubDir .. src ; 
    Library mylib : mylib.c ; 

  • Créez un fichier Jamfile dans le répertoire de test
 

    SubDir .. test ; 
    Main mytest : mytest.c ; 
    Depends mytest : mylib$(SUFLIB) ; 

Avec ce réglage, tant que je suis dans le répertoire racine, chaque fois que j'essaie de construire mytest la bibliothèque sera également recompilé (si nécessaire). J'ai trouvé un vieux message sur la liste de diffusion du jammer le décrivant.

Hélas, cela ne fonctionne pas si je suis dans le sous-répertoire de test car jam ne peut que regarder vers le bas dans les sous-répertoires.

Donc, j'ai créé un script simple appelé jmk et le mettre en même temps que l'exécutable jam (de sorte que les deux sont dans le chemin):

if [ "$JMKROOT" = "" ] ; then 
    JMKROOT=`pwd` 
    export JMKROOT 
fi 
cd $JMKROOT 
jam $* 

et je mets la variable d'environnement JMKROOT à la racine de mon projet.

Car quand je compile dans un shell Windows (c'est pourquoi je veux utiliser Jam) J'utilise simplement ce petit fichier batch jmk.bat:

@echo off 
if "%JMKROOT%" EQU "" set JMKROOT=%CD% 

set OLDCD=%CD% 
cd %JMKROOT% 
jam %1 %2 %3 %4 %5 %6 %7 %8 %9 

cd %OLDCD% 
0

J'utilise Jam dans one of my projects, et je rencontrais votre situation très. J'ai mes programmes exécutables dans le sous-répertoire bin et mes bibliothèques statiques sont conservées dans le sous-répertoire lib.

Dans mon haut niveau Jamfile, je tape dans SubDir TOP ;. Ceci initialise la variable $(TOP) pour pointer vers le répertoire contenant ce fichier Jamfile. Je puis ajouter des lignes telles que SubInclude TOP bin llvm-tblgen et SubInclude TOP lib Support, qui ajoute le contenu du Jamfiles dans bin/llvm-tblgen et lib/Support à la construction.

Dans le Jamfile au bin/llvm-tblgen, je tape SubDir TOP bin llvm-tblgen ;. Je fais la même chose dans le Jamfile en lib/Support, mais j'utilise SubDir TOP lib Support ; à la place. La clé lors de la saisie des règles SubDir consiste à taper les noms de chaque sous-répertoire du TOP dans le répertoire contenant ce fichier Jamfile.

Puis, quand il est temps de définir la ligne de ma cible exécutable, je référence la bibliothèque de support comme ceci: $(TOP)/lib/Support/libLLVMSupport.a. Jam étend ce chemin à l'emplacement libLLVMSupport.a, par rapport à l'endroit où j'exécute Jam, même si je cd dans le répertoire bin/llvm-tblgen et que j'exécute le Jam manuellement à partir de là.

Cela rend très facile à gérer de grands projets qui contiennent des dépendances inter-répertoires. Cette solution, contrairement à la précédente, vous permet d'exécuter Jam directement. J'espère que cela vous aide!

Questions connexes