嗨,我叫李绍。我是C++测试团队的软件设计工程师。在我之前 博客 “VisualStudio 2010 C++项目升级指南”中,我提到了VS2010中自定义生成规则的更改。在本文中,我将更详细地解释定制构建规则的新格式及其在VS2010中的一些限制。
自定义生成规则是VS2005中引入的生成功能。它为用户提供了方便地插入第三方工具以在其构建过程中使用的能力。自定义生成规则由“.rules”文件定义。对于VS2005和VS2008,MASM(Microsoft Micro Assembler)和LIC(License Compiler)的规则在包装箱中提供。
在VS2010中,由于迁移到MSBuild,规则文件中的信息由以下三个文件表示:.XML、.props和.targets文件。XML文件定义属性和开关映射。props文件初始化属性值,目标文件基于XML文件生成任务并具有构建逻辑。MASM和LIC自定义构建规则也随此新格式在VS2010中提供。在接下来的几段中,我将以MASM规则为例来解释新的自定义生成规则格式的一些重要部分,并希望在需要时提供一些有关如何读取自定义生成规则文件的想法。
MASM自定义生成规则在x64计算机上的%%ProgramFiles%%MSBuildMicrosoft.Cppv4.0BuildCustomizations或%%ProgramFiles(x86)%%MSBuildMicrosoft.Cppv4.0BuildCustomizations处可用。您在 MASM.XML文件 文件。
< 布尔属性
姓名 = “ 生成错误信息 “
帮助URL = “ http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmasm/html/vclrfml.asp “
显示名称 = “ 生成调试信息 “
说明 = “ 生成调试信息。 (/字) “
开关 = “ /子 “ />
通过这个XML文件定义,“GenerateDebugInformation”被映射到/Zi
在文件中 马斯姆道具 ,“GenerateDebugInformation”初始化为“True”(见下面突出显示的行)
< 项目定义组 >
< 马斯姆 >
< 诺洛戈 > 是的 不标志 >
< 生成错误信息 > 是的 生成错误信息 >
< 对象文件名 > $(IntDir)%%(文件名).obj 对象文件名 >
< 保存识别酶 > 0 保存识别酶 >
< 警告级别 > 三 警告级别 >
< 包对齐边界 > 0 包对齐边界 >
< 电话会议 > 0 电话会议 >
< 错误报告 > 0 错误报告 >
< 命令行模板 条件 = “ “$(平台)”==“Win32” “ > ml.exe/c[AllOptions][AdditionalOptions]/Ta[输入] 命令行模板 >
< 命令行模板 条件 = “ “$(平台)”==“X64” “ > ml64.exe/c[AllOptions][AdditionalOptions]/Ta[输入] 命令行模板 >
< 命令行模板 条件 = “ ‘$(平台)’!=’Win32’和’$(平台)’!=’X64英寸 “ > 此平台不支持echo MASM 命令行模板 >
< 执行说明 > 正在组装[输入]… 执行说明 >
马斯姆 >
项目定义组 >
MASM.XML文件由 MASM目标 文件。MSBuild依赖于任务生成器为自定义生成规则生成任务。
< 使用任务
任务名称 = “ 马斯姆 “
任务工厂 = “ XamlTaskFactory公司 “
程序集名称 = “ Microsoft.Build.Tasks.v4.0版 “ >
< 任务 > $(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml 任务 >
使用任务 >
MASM.props文件中初始化的值也会传递给目标:
< 马斯姆
生成错误信息 = “ %%(MASM.generatedebug信息) “
输入 = “ %%(MASM.标识) “ />
构建逻辑也在.targets文件中。例如,这些行定义了MASM的输入和输出:
输出 = “ %%(MASM.ObjectFileName) “
输入 = “ %%(MASM.Identity);%%(MASM.额外依赖性)$(MSBuildProjectFile(项目文件) “
这定义了MASM的哪些输出需要传递到链接器/Lib:
< 目标
姓名 = “ 计算ASMOUTPUT “
条件 = “ ‘@(MASM)’“=” “ >
< 项目组 >
< 链接 包括 = “ @(MASM->Metadata(’ObjectFileName’)->Distinct()->clearmadata()) “ 条件 = “ “%%(MASM.ExcludedFromBuild)”!=’是的’ “ />
< 库 包括 = “ @(MASM->Metadata(’ObjectFileName’)->Distinct()->clearmadata()) “ 条件 = “ “%%(MASM.ExcludedFromBuild)”!=’是的’ “ />
项目组 >
目标 >
如果启用了MASM的自定义生成规则,则项目文件(.vcxproj)将导入MASM.props和MASM.targets文件。
< 导入组 标签 = “ 扩展设置 “ >
<