【问题标题】:MSBuild CL Task ParametersMSBuild CL 任务参数
【发布时间】:2020-05-25 01:40:29
【问题描述】:

我正在尝试使用 MSBuild 自动编译各种开源项目。

我想在我的编译管道中添加一个自定义 CL.exe 标志:将调用约定设置为 fastcall(在 cl.exe 中,它作为 /Gr 传递)。 这意味着需要覆盖默认的 cdecl 选项 (/Gd)。

我尝试设置一个 MSBuild 属性,但这不起作用:

MSBuild.exe /p:PlatformToolset=v141​​ /p:Platform=x64 /p:Configuration=Release /p:CallingConvention=/Gr

我还想使用其他几个标志来执行此操作,因此这不会与调用约定隔离。我也希望在不编辑任何配置文件的情况下执行此操作,仅使用 CLI 执行此操作。

如何使用 MSBuild 做到这一点?

谢谢!

【问题讨论】:

    标签: visual-studio build msbuild


    【解决方案1】:

    我尝试设置 MSBuild 属性,但这不起作用。我怎样才能 使用 MSBuild 执行此操作?

    见 msbuild Global Properties,命令行只接收 msbuild 属性,而 CallingConvention 不是 msbuild 属性。

    我创建了一个 C++ 项目并在 Debug|X86 配置中将 C/C++=>Advanced 更改为 /Gd to /Gr,然后我看到如下内容:

      <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
        <ClCompile>
          ...
          <CallingConvention>FastCall</CallingConvention>
        </ClCompile>
        <Link>
          ...
        </Link>
      </ItemDefinitionGroup>
    

    很明显CallingConvention 只是Metadata 中的一个Item CLCompile。这不是 msbuild 属性。所以我们不能像这样在 msbuild 命令行中设置它:msbuild /p:xxx

    可能的解决方法

    因为使用 /Gr/Gd 之间的唯一区别是元数据行:

    所以我认为我们可以在项目文件中复制一份ItemDefinitionGroup 并将其条件设置为:

      <!--ItemDefinitionGroup when using default /Gd-->
      <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32' AND '$(UseFastCall)' == ''">
        <ClCompile>
         ...
        </ClCompile>
         ...
      </ItemDefinitionGroup>
      <!--ItemDefinitionGroup when using /Gr-->
      <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32' AND '$(UseFastCall)' != ''">
        <ClCompile>
          ...
          <CallingConvention>FastCall</CallingConvention> <!--The only difference here.-->
        </ClCompile>
          ...
      </ItemDefinitionGroup>
    

    如果我们将值传递给自定义属性UseFastCall,例如:MSBuild.exe /p:PlatformToolset=v141 /p:Platform=x86 /p:Configuration=Debug /p:UseFastCall=true。它应该使用/Gr 元数据。如果我们不向该属性传递值,它将使用默认的/Gd。所以解决方法是创建自定义属性来控制该行为。 (仅适用于Debug|win32,其他配置可能还需要编辑。)

    【讨论】:

    • 我将参数化每个 ClCompile 行,而不是将其划分为多个 ItemDefinitionGroups,我希望有一种方法可以通过 MSBuild 传递编译标志而不接触 vcproj。谢谢!
    • @Paul 抱歉,目前不支持! Msbuild.exe 是在 VS IDE 中构建大多数项目的核心构建工具。在构建期间,它为 C++ 项目调用 cl.exe,为 C# 项目调用 csc.exe,为 VB.net 项目调用 vbc.exe。但 msbuild.exe 不等于 cl.exe。所以不是每个编译标志都可以被 msbuild.exe 识别,在这种情况下,CallingConvention 是 msbuild 在命令行中无法识别的东西。所以我认为如果你不喜欢触摸 vcxproj,那么它就是不被支持的。看我的回答你就会知道 msbuild 只在命令行中接收 msbuild properties 。这是设计使然:-)
    • 不编辑vcxproj,还不支持你想要的。可能需要对 msbuild.exe 的源代码进行一些更改...希望我的评论能帮助解决您的困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2018-06-06
    • 1970-01-01
    • 2021-12-05
    • 2016-09-08
    • 1970-01-01
    • 2010-11-19
    相关资源
    最近更新 更多