如何将所有Visual Studio 2008的“宏”传递给Python脚本?

2 投票
3 回答
3276 浏览
提问于 2025-04-11 09:24

[注意:这个问题和这个问题相似,但并不相同。]

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             

在这些宏中,只有四个(FrameworkDirFrameworkSDKDirVCInstallDirVSInstallDir)是在构建事件的环境中设置的。

正如Brian提到的,用户可以定义自己的宏,这些宏可以在构建任务执行的环境中设置。我的问题是关于内置宏的。

我在Visual Studio的构建后事件中运行一个Python脚本,作为构建过程的一部分。我想把所有的宏(包括内置和用户定义的)传递给我的脚本,但我不知道怎么做。在我的脚本中,我可以访问普通的环境变量(比如Path、SystemRoot),但无法访问这些“宏”。现在我只能一个一个地作为命名选项传递给脚本,然后在脚本中处理它们。例如,我的构建后事件命令行看起来是这样的:

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

除了麻烦之外,构建后事件命令行的大小是有限制的,所以即使我想用这种方法传递很多宏,也不行,因为命令行会被截断。

有没有人知道有没有办法将所有宏的名称和值传递给一个命令,而不需要切换到MSBuild(我认为这在原生VC++中不可用)或其他类似的构建工具?

3 个回答

0

这个方法有点儿不太正规,但可能有效。

为什么不把多个 .py 脚本一个接一个地调用呢?

每个脚本可以传入一小部分参数和一些值到一个临时的文本文件里。最后一个脚本会读取这个临时文本文件并进行处理。

我同意这种方法有很多风险和让人困惑的地方,但有时候你就是得把东西拼凑在一起。

2

你可能想了解一下“属性表”(PropertySheets)。这些是包含Visual C++设置的文件,其中包括用户宏。属性表可以从其他属性表继承,并通过Visual Studio中的属性管理器视图与VC++项目关联。当你创建这样的属性表时,会有一个界面让你创建用户宏。当你通过这个方式添加宏时,会有一个复选框可以将用户宏设置为环境变量。我们在构建系统中使用这种机制,快速设置项目以进行不在原地的构建。我们各种构建目录都是作为用户宏定义的。我实际上还没有验证在构建后调用的外部脚本中是否设置了环境变量。我通常将这些宏作为命令行参数传递给我的构建后脚本,但我认为将它们作为环境变量访问应该对你有效。

0

根据我的了解,问题中提到的方法是将构建变量传递给Python脚本的唯一方式。

也许Visual Studio 2010有更好的方法?

撰写回答