【问题标题】:Dynamically set conditional compilation symbols动态设置条件编译符号
【发布时间】:2011-04-25 22:51:39
【问题描述】:

我想要一个条件编译符号列表,可能是一个表,其中每个符号都有一个复选框,然后在构建时,编译中只包含“打开”的符号。除了在每次编译之前以编程方式更改项目文件之外,还有其他方法吗?

【问题讨论】:

  • 你想从 VS 构建还是调用 MSBuild(通过命令行)?

标签: c# visual-studio visual-studio-2010 msbuild


【解决方案1】:

首先,对于这个答案,我假设您希望从 Visual Studio IDE 中执行此操作,并且您是一个可编译的 C++ 项目。

您可以通过将属性页添加到您指定所有这些编译符号的项目中来实现。属性页很容易为您提供 UI。当用户编辑属性页时,数据存储在项目文件或用户文件中的项目/属性中。 您还需要添加一个自定义任务,该任务将实际获取属性页存储的数据并在编译文件时应用它。

所以这里有更多细节:

  • 从项目文件中导入目标文件。编辑 .vcxproj 并在末尾添加(例如,在结束元素 </Project> 之前):
    <Import Project="$(ProjectDir)MyTargets.xml" />

  • 编写 MyTargets.xml 文件。它应该导入属性页并定义自定义目标。

<?xml version="1.0" encoding="utf-8"?>

 <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">          
      <ItemGroup>
        <PropertyPageSchema Include="$(ProjectDir)MyProperties.xml"/>
      </ItemGroup>    

  <Target Name="AddMySymbols" 
          Inputs="@ClCompile"
          Outputs="__non_existent_outputs__"
          BeforeTargets="ClCompile"> 

      <ItemGroup>
        <ClCompile Include="@ClCompile">
          <PreprocessorDefinitions Condition="'$(MY_SYMBOL)'='true'">MY_SYMBOL; %(PreprocessorDefinitions)</PreprocessorDefinitions>
        </ClCompile>
      </ItemGroup>
  </Target>        
</Project>

AddMySymbols 目标在编译每个文件之前执行。对于每个文件,如果名为“MY_SYMBOL”的属性为真,我们将 MY_SYMBOL 添加到 PreprocessorDefinitions。

  • 编写 MyProperties.xml 文件。 Visual Studio 使用此文件来显示属性页 UI。它将允许用户将 MY_SYMBOL 属性设置为 true/false。 这是 MyProperties.xml 的示例:

&lt;?xml version="1.0" encoding="utf-8"?&gt;

<ProjectSchemaDefinitions xmlns="http://schemas.microsoft.com/build/2009/properties">

<Rule Name="Symbols" PageTemplate="tool" DisplayName="Symbols" SwitchPrefix="/" Order="1" xmlns="http://schemas.microsoft.com/build/2009/properties" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib">

    <Rule.Categories>
      <Category Name="MySymbols">
        <Category.DisplayName>
          <sys:String>My Symbols</sys:String>
        </Category.DisplayName>
      </Category>
    </Rule.Categories>

    <Rule.DataSource>
      <DataSource Persistence="ProjectFile" ItemType="" HasConfigurationCondition="false" />
    </Rule.DataSource>

    <BoolProperty
      Name="MY_SYMBOL"
      Category="MySymbols"
      DisplayName="MY_SYMBOL"
      Description="When enabled, MY_SYMBOL will be added to preprocessor symbols when compiling C/C++ files."/>

</ProjectSchemaDefinitions>

ItemType 为“”,因此 MY_SYMBOL 将作为属性而不是项目保存在项目文件中。您可以以不同的方式安排它并改为使用项目。 如果您希望为每个用户保存符号,您可以通过将 DataSource 更改为 &lt;DataSource Persistence="UserFile" ItemType="" HasConfigurationCondition="false" /&gt; 将其保存到用户文件中

这是some explanations about property pages的链接。

阿米尔

【讨论】:

  • 我正在编译一个 C# 项目,但是谢谢,一个很好的答案应该让我开始。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 2019-03-24
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
  • 2014-11-17
相关资源
最近更新 更多