2010-04-26 7 views
5

J'ai essayé de lire la documentation, mais il est assez impénétrable, donc je suis en espérant que quelqu'un peut avoir une réponse simple. Je veux définir une nouvelle 'variante', basée sur 'debug', qui ajoute juste quelques définitions de macro à la ligne de commande du compilateur, par exemple "-DSOMEMACRO". Je pense que je peux être capable de faire cela comme une "sous-variante" de débogage, ou bien simplement définir une nouvelle variante de copie 'debug', mais je ne suis même pas sûr de savoir où faire cela. Il ressemble à feature.jam dans $ BOOST_BUILD_DIR/build peut être l'endroit. Peut-être que ce que je veux vraiment est simplement une nouvelle fonctionnalité, mais je ne sais toujours pas exactement ce que je dois faire et où, et je ne sais pas si une fonctionnalité me permet de diriger les produits de construction vers un autre répertoire à la version 'debug'.comment créer une nouvelle variante dans bjam

Toutes les suggestions seront appréciées. (Au cas où vous vous demandez, je dois utiliser bjam car il a été adopté comme norme d'entreprise.)

Répondre

7

Je ne suis pas tout à fait sûr de ce que vous voulez, mais il y a un certain nombre de possibilités.

A. Vous voulez toujours compiler avec la macro unemacro définie. Dans ce cas, dans le Jamfile pour votre projet ajouter

project 
    : requirements # These are requirements for this project 
     # If compiling debug, define SOMEMACRO 
     <variant>debug:<define>SOMEMACRO 
    : usage-requirements 
     # These are requirements projects using this project must have 
     <variant>debug:<define>SOMEMACRO 
    ; 

Si vous avez besoin unemacro toujours défini, vous pouvez supprimer la condition <variant>debug:. Si vous devez définir d'autres indicateurs, vous pouvez utiliser <cflags>, <cxxflags> et selon le cas.

B. Vous voulez un commutateur rapide pour allumer vos drapeaux/définir, peut-être par défaut, peut-être pas, et construit avec elle sur ne sont pas compatibles avec construit avec elle au large. Dans ce cas, vous voulez une fonctionnalité.

import feature ; 
feature.feature steves-feature : off on 
    : composite propagated link-incompatible ; 
feature.compose <steves-feature>on : <define>SOMEMACRO ; 

La règle feature.feature définit une fonction appelée <steves-feature> avec deux valeurs possibles et trois propriétés. composite signifie que c'est une fonctionnalité composée d'autres caractéristiques (dans ce cas <define>SOMEMACRO). propagated signifie que toutes les cibles qui incluent une cible avec cet ensemble de fonctionnalités auront également cet ensemble de fonctionnalités. et link-incompatible signifie que les cibles avec <steves-feature>on ne peuvent pas être combinées avec des cibles avec <steves-feature>off. (En conséquence, bjam mettra les fichiers créés dans un répertoire nommé steves-feature-on ou steves-feature-off si cette fonction est définie par une cible.)

Cette fonction peut être utilisée comme la fonction <define> utilisée dans la règle de projet ci-dessus section. (Vous pouvez même l'ajouter à une section default-build de la règle de projet.)

Notez que vous pouvez également définir des entités à partir de la ligne de commande: bjam steves-feature=on.

C. Vous voulez une variante complète. Je pense que l'idée est de savoir si vous avez quelques configurations de construction communes avec un tas de fonctionnalités différentes qui devraient être définies ensemble. Eh bien, si vous avez déjà créé la fonctionnalité comme ci-dessus, c'est maintenant facile.

variant steves-debug : debug : <steves-feature>on ; 

Cette variante sera la même que la variante debug mais avec la caractéristique supplémentaire <steves-feature>on.

Je ne l'ai jamais utilisé la règle variant, il faudra peut-être importé de quelque part.En outre, vous pourriez être en mesure de faire

variant steves-debug : debug : <define>SOMEMACRO ; 

mais je ne sais pas si bjam va créer la structure de répertoire ou non. (Ce sera probablement le cas.)

+0

Merci, cas B ou peut-être que C est ce que je cherche, je vais d'abord essayer B car c'est le plus simple. Merci pour une explication très détaillée. –

+0

Si cela fonctionne, vous devez cliquer sur la coche à côté de la réponse pour marquer comme réponse. De cette façon, d'autres savent que la question est répondue. Et j'ai un peu de crédit. :-) (Vous n'avez pas non plus fait de réponses acceptées à vos questions précédentes.) – AFoglia

+0

Excuses, je l'ai maintenant sélectionné, je m'habitue toujours au protocole. –

Questions connexes