Bonjour!
Note: j'utilise VS2008 Pro et Python 2.5
Dans mon projet, j'ai un script python lancé avant la compilation (pre-build event) qui (ré)génère simplement un fichier cpp qui contient des constantes dont la valeur est toujours modifiée (numéro de version et timestamp).
Or apparamment il y aurait une subtilitée concernant la detection de changement de code source dans Visual Studio OU ALORS mon script python (très simple pourtant) n'est pas correct.
D'abord, le script python qui génère le fichier (le contenu est généré auparavant) :
Code python : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 # write the resulting code file resultCodeFile = open( NR_VERSION_CPP_FILE, "w" ) resultCodeFile.write( resultCode ) resultCodeFile.close()
Note: J'ai aussi essayé avec "w+" sans plus de succès.
Donc, ce script génère bien le fichier a chaque fois que je fais une build, quel que soit la façon de builder le projet (F5, build entière du projet etc) et quelque soit la configuration (Debug/Release).
J'affiche les valeures des constantes générées par le script au runtime.
Or en testant tout a l'heure plusieurs fois, je me suis rendu compte que si je fais F5 pour lancer mon projet, puis si je modifie un cpp puis refait F5 (build incrémentale ) , la valeur du timestamp (normalement changé par la régénération du cpp) n'a pas changé.
Si encore une fois je refais F5, là la valeur a changé.
En observant le log de build, je me suis rendu compte que même si le fichier est effectivement changé à toutes les build, il n'est pas forcément recompilé à chaque fois (du moins en incrémental).
A priori, on dirait bien que Visual Studio (ou alors cl seulement?) n'a pas pris en compte le changement de contenu du fichier lors de la build incrémental, mais reprends en compte le changement a la prochaine.
De loin, je dirais que soit a) Visual Studio se base sur une information pas tout a fait précise concernant mon fichier généré, soit b) mon script python ne ferme pas immediatement le fichier généré une fois terminé, laissant VS se baser sur l'ancien etat du fichier et donc VS considère qu'il n'y a pas eu de changement?
Dans tous les cas, j'ai reproduis le problème dans un petit projet (archive ci-joint).
Pour voir le bug il faut :
1) Compilez le projet une première fois. Vous noterez que le contenu de Test.cpp a changé, il contient une constante avec une valeur timestamp correspondant au moment ou le script python (pre_build.py) s'est executé;
2) Lancez l'application : elle affiche le timestamp. Comparez avec le contenu généré dans le cpp : c'est bien la même valeur;
2) Ajoutez une instruction dans main.cpp ou décommentez la ligne commentée.
3) Faites F5 pour lancer une build incrémentale et lancer l'application dans la volée : le timestamp qui s'affiche correspond au même que dans 2), pourtant le fichier cpp a bien été modifié et vous pouvez comparer les valeurs : elles sont différentes (le contenu du cpp ayant logiquement un timestamp supérieur).
Ce problème n'est pas grave en soit parceque je ne compte pas distribuer de version qui ne soit pas entièrement recompilée, mais c'est inquiétant, non?
J'espère que le problème viens du script...
Est-ce que quelqu'un sait où est le problème ou bien un moyen de le contourner? (forcer la build systématique d'un cpp par exemple?)
Partager