2

[NOTE: Cette question est similaire mais pas la même que this one.]Comment passer toutes les "macros" de Visual Studio 2008 au script Python?

Visual Studio définit plusieurs dizaines de "macros" qui sont une sorte de simuler des variables d'environnement (sans aucun lien avec C++ macros) qui contiennent informations sur la construction en cours. Exemples:

 
    ConfigurationName Release 
    TargetPath   D:\work\foo\win\Release\foo.exe 
    VCInstallDir  C:\ProgramFiles\Microsoft Visual Studio 9.0\VC\ 

Voici l'ensemble complet de 43 macros intégrées que je vois (le vôtre peut varier en fonction de la version de VS que vous utilisez et quels outils vous ont permis):

 
    ConfigurationName IntDir   RootNamespace  TargetFileName 
    DevEnvDir   OutDir   SafeInputName  TargetFramework 
    FrameworkDir  ParentName  SafeParentName  TargetName 
    FrameworkSDKDir PlatformName  SafeRootNamespace TargetPath 
    FrameworkVersion ProjectDir  SolutionDir  VCInstallDir 
    FxCopDir   ProjectExt  SolutionExt  VSInstallDir 
    InputDir   ProjectFileName SolutionFileName WebDeployPath 
    InputExt   ProjectName  SolutionName  WebDeployRoot 
    InputFileName  ProjectPath  SolutionPath  WindowsSdkDir 
    InputName   References  TargetDir   WindowsSdkDirIA64 
    InputPath   RemoteMachine TargetExt    

Parmi ceux-ci, seulement quatre (FrameworkDir, FrameworkSDKDir, VCInstallDir et VSInstallDir) sont définis dans l'environnement utilisé pour les événements de construction. Comme le mentionne Brian, des macros définies par l'utilisateur peuvent être définies de manière à être définies dans l'environnement dans lequel les tâches de construction s'exécutent. Mon problème est avec les macros intégrées. J'utilise un événement Visual Studio Post-Build pour exécuter un script Python dans le cadre de mon processus de construction. Je voudrais passer l'ensemble des macros (intégrées et définies par l'utilisateur) à mon script dans l'environnement mais je ne sais pas comment. Dans mon script, je peux accéder aux variables d'environnement habituelles (par exemple, Path, SystemRoot) mais PAS ces "Macros". Tout ce que je peux faire maintenant, c'est de les passer un par un en tant qu'options nommées que je traite ensuite dans mon script. Par exemple, voici ce que mon post-construction ligne de commande de l'événement ressemble à:

 
    postbuild.py --t="$(TargetPath)" --c="$(ConfigurationName)" 

En plus d'être une douleur dans le cou, il y a une limite sur la taille de post-construction ligne de commande de l'événement, donc je ne peux pas passer des douzaines de macros en utilisant cette méthode même si je le voulais parce que la ligne de commande est tronquée. Est-ce que quelqu'un sait s'il existe un moyen de passer l'ensemble des noms et des valeurs de Macro à une commande qui ne nécessite pas de passer à MSBuild (qui n'est pas disponible pour VC++ natif) ou à d'autres builds? outil?

Répondre

0

Pour autant que je sache, la méthode décrite dans la question est le seul moyen de transmettre des variables de construction à un script Python.

Peut-être que Visual Studio 2010 a quelque chose de mieux?

0

Ceci est un peu hacky, mais cela pourrait fonctionner. Pourquoi ne pas appeler plusieurs scripts .py à la suite?

Chaque script peut transmettre un petit sous-ensemble de paramètres et les valeurs à un fichier texte temporaire. Le script final lira et travaillera hors du fichier texte temporaire. Je suis d'accord que cette méthode est remplie de danger et WTF, mais parfois vous devez simplement bidouiller des trucs ensemble.

+0

Bonne idée, mais il existe une limite à la longueur d'une ligne de commande pouvant être appelée à partir d'un événement de génération VisualStudio. C'est quelque chose comme 128 ou 256 caractères. Bien trop court pour appeler N scripts où N = #macros (environ 43 builtins plus tout défini par l'utilisateur.) – jwfearn

2

Vous voudrez peut-être regarder dans PropertySheets. Ce sont des fichiers contenant des paramètres Visual C++, y compris des macros utilisateur. Les feuilles peuvent hériter d'autres feuilles et sont attachées à des projets VC++ à l'aide de la vue PropertyManager dans Visual Studio. Lorsque vous créez l'une de ces feuilles, il existe une interface pour créer des macros utilisateur. Lorsque vous ajoutez une macro à l'aide de ce mécanisme, une case à cocher permet de définir la macro utilisateur en tant que variable d'environnement. Nous utilisons ce type de mécanisme dans notre système de construction pour mettre en place rapidement des projets afin d'effectuer des builds hors-site. Nos différents répertoires de construction sont tous définis comme des macros utilisateur. Je n'ai pas vérifié que les variables d'environnement sont définies dans un script externe appelé post-build. J'ai tendance à utiliser ces macros comme arguments de ligne de commande pour mes scripts de post-construction - mais je m'attendrais à y accéder en tant que variables d'environnement devraient fonctionner pour vous.

+0

J'utilise les fichiers .vsprops de la même manière que vous, pour les répertoires de construction. Les variables définies par l'utilisateur sont passées OK (tant que PerformEnvironmentSet = "true") mais pour une raison quelconque, la plupart des variables internes ne le sont pas. – jwfearn

Questions connexes