[Drba-devs] building a waf plugin for drba (french sorry:)
Status: Inactive
Brought to you by:
tallion
|
From: fabien c. <ta...@us...> - 2008-11-29 17:58:13
|
Francois, puisque j'avais l'impression que tu avais un peu de mal a avancer,
j'ai faits quelques tests pour toi sur le xmlscripting
Bon pour moi ca marche et j'ai regardé pourquoi...
En fait le principe est plutôt simple (tout d'abord ca ne marche pas
correctement sans une petite modif : il ne fait que créer le fichier python
et le mettre enémoire mais il 'appelle pas le reste du programme)
Le fonctionnement de waf est waf appel scripting.prepare qui n'est en
fait qu'une simple recherche du fichier xml dans les différents répertoire
que voit waf (path, le rep courant,rep install etc), une fois trouvé il
prend le fichier est en fait un script python qu'il monte en mémoire (le nom
du module étant donné en paramètre/ tu peux voir la source c'est
Utils.load_module) puis fait des traitements dessus que nous ne toucherons
pas... Le plus simple semble donc de définir ce même module à la main soit
en écrivant dynamiquement le python soit tout simplement en écrivant les
fonctions dans un module qui sera monté par nos soins(init configure and co)
qui récupèrerons les paramètres dans projectProperties...
Attention tout de même car après le preprare de scripting, le main dans
scripting est appelé et ce dernier regarde les paramètre utilisateur passé a
waf ( en utilisant command dans le module options qui n'est juste qu'un
parser de argv en fait) donc il faudra soir redéfinir le main aussi soit
wrapper le module options et/ou main soit le réécrire
(ce que je ne conseil pas du tout le plus propre serait de faire qque chose
du genre a exécuter après l'import et avant l'appel :
Options.cmds.append('test')
oldmain = Scripting.main
def main():
if Options.commands['test']:
Options.commands['build'] = True
oldmain()
Scripting.main = main
def shutdown():
if Options.commands['test']:
# run scripts, etc
pass
comme ça on ne touche pas du tout le code de waf donc pour patcher et
changer de version c'est beaucoup plus simple...)
Donc en gros: il suffit juste de changer scripting.prepar_impl pour qu'il
charge notre nouveau module et scripting.main pour qu'il execute sans se
soucier du argv et c'est dans la poche.
Je ne vois plus aucun problème technique maintenant mais si tu en trouves
n'hésite pas à me contacter
Bon week end |