2010-01-06 5 views
16

J'ai parcouru un certain nombre d'articles sur Stack Overflow qui répondait à la question "Comment transmettre des définitions de préprocesseur au compilateur à partir de la ligne de commande MSBuild , » et ils ont tous répondu avec une certaine variation de:MSBuild.exe n'acceptant pas non plus/p: DefineConstants ni/p: PreprocessorDefinitions

MSBuild.exe /p:DefineConstants=THING_TO_BE_DEFINED 

J'ai essayé toutes les variantes que je pouvais venir avec:

MSBuild.exe "/p:DefineConstants=THING_TO_BE_DEFINED" 
MSBuild.exe /p:DefineConstants="THING_TO_BE_DEFINED" 
MSBuild.exe "/p:DefineConstants=THING_TO_BE_DEFINED=1" 
MSBuild.exe /p:DefineConstants="THING_TO_BE_DEFINED=1" 

... et des dizaines d'autres. J'ai aussi flirté avec PreprocessorDefinitions écrasantes de manière similaire. Tous les #error ci-dessous a déclenché le:

#include "stdafx.h" 

#if !defined(THING_TO_BE_DEFINED) 
#error "THING_TO_BE_DEFINED is not defined" 
#endif 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    return 0; 
} 

J'ai essayé cela avec l'application en ligne de commande simples ci-dessus, ainsi qu'avec un énorme projet de jeu que j'ai ici. Je ne peux que deviner que Visual Studio (je vois cela avec 2005 et 2008) a une valeur par défaut dans ses entrailles qui empêche mon argument de ligne de commande d'être appliqué, mais je n'ai trouvé aucune preuve pour soutenir cette hypothèse.

Des idées sur comment je peux faire fonctionner ça? Pourquoi, au nom de FSM, ne s'en tenaient-ils pas au bon vieux -D THING_TO_BE_DEFINED?

Répondre

7

Si vous appelez MSBuild sur la ligne de commande, vous ne pouvez pas spécifier la valeur de DefineConstants. Mais si vous construisez un fichier .csproj ou un autre script MSBuild, vous pouvez le spécifier. Si vous créez un fichier msbuild pour "remplacer" votre fichier de solution, vous pouvez l'utiliser et spécifier la valeur pour cela lorsque vous construisez vos projets. Par exemple:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <!-- Default value here --> 
    <DefineConstants Condition=" '$(DefineConstants)'==''" >DEBUG;TRACE</DefineConstants> 
    </PropertyGroup> 

    <ItemGroup> 
    <Projects Include="one.csproj" /> 
    <Projects Include="two.csproj" /> 
    </ItemGroup> 

    <Target Name="Build"> 
    <MSBuild Projects="@(Projects)" 
       Properties="DefineConstants=$(DefineConstants)"/> 
    </Target> 
</Project> 

Ensuite, vous pouvez utiliser msbuild.exe buid.proj /p:DefineConstants="YourValue;Debug;Trace"

Notez l'utilisation des guillemets sur la ligne de commande.

J'ai écrit un billet de blog il y a quelque temps à propos de quelque chose à propos de ceci au http://sedodream.com/2008/05/07/MSBuildBuildingTheSameProjectMultipleTimes.aspx.

+2

Je suis coincé avec le .vcproj que le développeur me remet. Doh. – Sniggerfardimungus

6

Si vous souhaitez définir TRACE & DEBUG Constantes cela devrait fonctionner:

msbuild mysln.sln /t:Rebuild /p:Configuration=Release /p:DefineConstants="DEBUG;TRACE" 
+4

La réponse acceptée est réellement incorrecte. J'ai trouvé pour mes propres projets, que DefineConstants est ignoré, à moins que j'utilise l'option/t: Reconstruire. –

+4

Cela fonctionne, mais il OVERWRITES la variable '$ (DefineConstants)' existante - pour CHAQUE PROJET dans la solution! - Je veux juste y ajouter! – BrainSlugs83

1

Pour être complet, ce que je travaillais quand je trouvai voulais THING_TO_BE_DEFINED="VALUE WANTED", pour VB.NET et version msbuild 3.5.30729.1, dans un fichier batch:

@msbuild /t:Rebuild /p:Configuration=Release;Platform="Any CPU"; 
DefineConstants="THING_TO_BE_DEFINED=\"VALUE WANTED\"" mysln.sln 

(sur une seule ligne bien sûr)

+1

+1 Merci beaucoup! Vous êtes le seul à mentionner comment éviter les guillemets afin de définir des chaînes. – Arnaud

2

Le ci-dessous sont nécessaires modification de la vcxproj pour le/p à travailler.

mis < DefineConstants> </DefineConstants>

sous la < PropertyGroup label = Globals>

< PreprocessorDefinitions> $ (DefineConstants); WIN32; _DEBUG ; _CONSOLE; UNIT_TEST_SIM;% (PréprocesseurDefinitions)

De cette façon MSBuild saura que pour le préprocesseur dont il a besoin d'utiliser les valeurs des DefineConstants qui viennent de la Globals PropertyGroup sauf disposition de la ligne de commande par le/p: DefineConstants = « MY_DEFINE »

Questions connexes