使用msbuild构建多arch安装程序

时间:2015-02-16 11:08:12

标签: c++ windows msbuild installer nsis

我正在使用NSIS为C ++程序构建一个多架构安装程序。我正在使用Visual Studio 2010.一切都很好,但我不知道如何使安装程序依赖于所有体系结构的构建。

我创建了一个项目来运行makensis作为构建步骤,并将其配置为依赖于解决方案中的所有其他项目。我目前正在构建Win32和X86_64架构。 NSIS项目仅作为X86_64配置的一部分构建。但它包装了以X86_64和Win32配置构建的文件。这就是问题所在。如果我构建Win32然后立即X86_64,一切都很好。如果我从X86_64开始,构建失败,因为它找不到Win32文件。更糟糕的是,如果我更改一些源代码并仅重建X86_64,安装程序项目将很乐意选择过时的Win32文件而不会出现任何问题。

我可以从X86_64版本强制构建Win32,还是做其他任何事情来使其工作?

我是Unix类型,Windows对我来说是一个外星世界。

任何

2 个答案:

答案 0 :(得分:1)

至于“万无一失”的解决方案,如果我理解正确的话:

  • 您的解决方案包含多个项目(例如Test.sln),
  • 您想为多个平台构建此解决方案,
  • ...并使用MakeNSIS工具(我不知道是什么)来创建为所有平台构建的安装程序打包二进制文件。

如果我错了,请纠正我。所以,要完成这项任务:

  • 我会完全放弃您介绍的项目(运行MakeNSIS的项目),
  • 然后会创建Test.msbuild文件,例如下面的文件,
  • 请注意<Exec> element,即您想要运行MakeNSIS的地方,
  • 然后只需将msbuild作为msbuild Test.msbuild
  • 运行
  • 使用此解决方案,您可以首先为Test.sln构建Win32的所有项目,然后为x64构建项目,之后只会运行MakeNSIS。
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="Build" DependsOnTargets="Build_Win32;Build_x64">
    <!-- Run whatever command you like, such as MakeNSIS .. ? -->
    <Exec Command="notepad.exe" />
  </Target>
  <Target Name ="Build_Win32">
    <MSBuild Projects="Test.sln" Properties="Configuration=Release;Platform=Win32" />
  </Target>
  <Target Name ="Build_x64">
    <MSBuild Projects="Test.sln" Properties="Configuration=Release;Platform=x64" />
  </Target>
</Project>

如果上述内容不符合您的要求,请澄清您的实际问题。

修改

在评论中澄清您的请求后,我会提出以下解决方案。我更喜欢上面带有Test.msbuild的解决方案,但是你去了:

  1. 将新项目BuildInstaller添加到您的解决方案中
  2. Configuration Manager 中取消选中此项目的所有组合的新项目“Build”复选框,
  3. 仍在 Configuration Manager 中,创建新配置,假设安装程序
  4. 对于此新配置,取消选中解决方案中所有项目的“构建”复选框,BuildInstaller
  5. 除外
  6. 现在打开文本编辑器中的BuildInstaller.vcxproj,并在结束</Project>标记之前附加以下代码段:
  7. <ItemGroup>
      <ProjectsToBuild Include="..\**\*.vcxproj" Exclude="..\**\BuildInstaller.vcxproj"/>
    </ItemGroup>
    <Target Name="Build" DependsOnTargets="Build_Win32;Build_x64">
      <!-- Run whatever command you like, such as MakeNSIS .. ? -->
      <Exec Command="notepad.exe" />
    </Target>
    <Target Name="Build_Win32">
      <MSBuild Projects="@(ProjectsToBuild)" Properties="Configuration=Release;Platform=Win32" />
    </Target>
    <Target Name="Build_x64">
      <MSBuild Projects="@(ProjectsToBuild)" Properties="Configuration=Release;Platform=x64" />
    </Target>
    
    1. 这样就可以有效地override the default build target
    2. 现在:
      • 每次为Release / Debug配置构建时,都不会构建安装程序,这是多种原因的首选,
      • 每次为安装程序配置构建时,新的BuildInstaller.vcxproj将接管,将构建win32和x64二进制文件,最后将运行自定义命令行可执行文件。当然,二进制文件将使用Release配置构建,这应该是理想的。
    3. 最初我认为我可以放弃<ItemGroup>元素并使用Projects="..\Test.sln"而不是Projects="@(ProjectsToBuild)",因为不应该存在循环依赖(BuildInstaller.vcxproj不是为Release构建的),而是构建永远如此,所以必须有一些问题,很奇怪...

      这是否满足您的需求?

答案 1 :(得分:0)

我认为您需要首先构建Win32配置,然后再构建64位配置。

makensis项目应该在两个完成后成功(成功!)。

例如,可以从Post Build事件(对于64位配置)或作为单独的项目调用它。

我不确定您的makensis项目是否基于 Visual&amp;安装程序http://www.visual-installer.com - 抱歉小自助促销:)或者它是VS解决方案中包含的纯文本批处理项目。

在这两种情况下,VS中的配置管理器都允许您定义构建顺序。 makensis项目应该始终是最后一个,因此它可以找到以前配置中的所有依赖项。

最好在makensis项目中使用相对路径 - 类似于${TARGET_PATH},这将为每个具有不同值的配置定义。