[ПРИМЕЧАНИЕ: этот вопрос похож на не то же самое как Вот этот.]
Visual Studio определяет несколько десятков «макросов», которые являются своего рода смоделированными переменными среды (совершенно не связанными с макросами C++), которые содержат информацию о незавершенной сборке. Примеры:
ConfigurationName Release
TargetPath D:\work\foo\win\Release\foo.exe
VCInstallDir C:\ProgramFiles\Microsoft Visual Studio 9.0\VC\
Вот полный набор из 43 встроенных макросов, которые я вижу (ваш может отличаться в зависимости от того, какую версию VS вы используете и какие инструменты вы включили):
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
Из них только четыре (FrameworkDir, FrameworkSDKDir, VCInstallDir и VSInstallDir) установлены в среде, используемой для событий сборки.
Как упоминает Брайан, пользовательские макросы могут быть определены, например, для установки в среде, в которой выполняются задачи сборки. Моя проблема связана со встроенными макросами.
Я использую событие Visual Studio Post-Build для запуска скрипта python как части процесса сборки. Я хотел бы передать весь набор макросов (встроенных и определяемых пользователем) в свой сценарий в среде, но я не знаю как. В моем сценарии я могу получить доступ к обычным переменным среды (например, Path, SystemRoot), но НЕ к этим «макросам». Все, что я могу сделать сейчас, это передать их по очереди как именованные параметры, которые я затем обрабатываю в своем скрипте. Например, вот как выглядит моя командная строка после завершения сборки:
postbuild.py --t = "$(TargetPath)" --c = "$(ConfigurationName)"
Помимо боли в шее, существует ограничение на размер командной строки Post-Build Event, поэтому я не могу передавать десятки макросов с помощью этого метода, даже если бы я хотел, потому что командная строка усечена.
Кто-нибудь знает, есть ли способ передать весь набор имен и значений макросов команде, которая НЕ требует переключения на MSBuild (который, как я считаю, недоступен для встроенного VC++) или какой-либо другой инструмент сборки, похожий на make?






Это немного взломано, но может сработать.
Почему бы не вызвать несколько скриптов .py подряд?
Каждый скрипт может передавать небольшое подмножество параметров и значений во временный текстовый файл. Последний сценарий будет читать и обрабатывать временный текстовый файл.
Я согласен с тем, что этот метод полон опасностей и чепухи, но иногда вам нужно просто все вместе взламывать.
Возможно, вы захотите заглянуть в PropertySheets. Это файлы, содержащие настройки Visual C++, включая пользовательские макросы. Листы могут наследовать от других листов и присоединяться к проектам VC++ с помощью представления PropertyManager View в Visual Studio. Когда вы создаете один из этих листов, появляется интерфейс для создания пользовательских макросов. Когда вы добавляете макрос с помощью этого механизма, есть флажок для установки пользовательского макроса в качестве переменной среды. Мы используем этот тип механизма в нашей системе сборки для быстрой настройки проектов для выполнения нестандартных сборок. Все наши каталоги сборки определены как пользовательские макросы. На самом деле я не проверял, устанавливаются ли переменные среды во внешнем скрипте, вызываемом из пост-сборки. Я обычно использую эти макросы в качестве аргументов командной строки для моих сценариев после сборки, но я ожидаю, что доступ к ним будет, поскольку переменные среды должны работать на вас.
Я использую файлы .vsprops так же, как и вы, для каталогов сборки. Пользовательские переменные передаются нормально (при условии, что PerformEnvironmentSet = "true"), но по какой-то причине почти все встроенные переменные - нет.
Насколько я могу судить, метод, описанный в вопросе, является единственным способом передать переменные сборки в скрипт Python.
Может быть, в Visual Studio 2010 есть что-то получше?
Хорошая идея, но есть ограничение на длину командной строки, вызываемой из события сборки VisualStudio. Это что-то вроде 128 или 256 символов. Слишком коротко, чтобы вызывать N сценариев, где N = # макросов (около 43 встроенных функций плюс любые, определенные пользователем).