Динамически устанавливаемые условные символы компиляции - PullRequest
2 голосов
/ 18 апреля 2011

Я хотел бы иметь список условных символов компиляции, возможно, таблицу, в которой каждый символ имеет флажок, а затем во время сборки только включенные символы включаются в компиляцию. Есть ли способ сделать это, кроме программного изменения файла проекта перед каждой компиляцией?

1 Ответ

3 голосов
/ 21 апреля 2011

Во-первых, для этого ответа я предполагаю, что вы хотели бы сделать это из Visual Studio IDE, а вы скомпилировали проект C ++.

Вы можете сделать это, добавив страницы свойств в свой проект, где вы указываете все этисимволы компиляции.Страницы свойств дают пользовательский интерфейс в очень мало усилий.Когда пользователь редактирует страницы свойств, данные сохраняются в элементах / свойствах в файле проекта или в файле пользователя.Вам также необходимо добавить пользовательское задание, которое на самом деле будет извлекать данные, которые были сохранены страницами свойств, и применять их при компиляции файлов.

Итак, здесь есть несколько подробностей:

  • Импорт файла целей из файла проекта.Отредактируйте .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 в PreprocessorDefinitions, если свойство «MY_SYMBOL» имеет значение true.

  • Compose MyProperties.xml file.Этот файл используется Visual Studio для отображения пользовательского интерфейса страниц свойств.Это позволит пользователю установить для свойства MY_SYMBOL значение true / false.Вот пример MyProperties.xml:

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

<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 на <DataSource Persistence="UserFile" ItemType="" HasConfigurationCondition="false" />

Вот ссылка на некоторые пояснения о страницах свойств .

Амир

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...