Сборка многоархитивного установщика с помощью msbuild

Я создаю мульти-архитектурный установщик для программы на C ++ с NSIS. Я использую Visual Studio 2010. Все хорошо, за исключением того, что я не знаю, как заставить установщик зависеть от сборки для всех архитектур.

Я создал проект для запуска makensis в качестве шага сборки и настроил его так, чтобы он зависел от всех других проектов в решении. В настоящее время я работаю над архитектурой Win32 и X86_64. Проект NSIS построен только как часть конфигурации X86_64. Но он упаковывает файлы, встроенные в конфигурации X86_64 и Win32. Здесь кроется проблема. Если я собираю Win32, а затем сразу X86_64, все хорошо. Если я начну с X86_64, сборка завершится неудачно, потому что не удается найти файлы Win32. Хуже того, если я изменю некоторый исходный код и пересоберу только X86_64, проект установщика с радостью подберет устаревшие файлы Win32 без каких-либо признаков проблемы.

Могу ли я заставить сборку Win32 из сборки X86_64 или сделать что-нибудь еще, чтобы это работало?

Я тип Unix, Windows для меня чуждый мир.

любой

0

Решение

Что касается «надежных» решений, если я вас правильно понимаю:

  • У вас есть решение, содержащее несколько проектов (скажем, Test.sln),
  • Вы хотите построить это решение для нескольких платформ,
  • … и используйте инструмент MakeNSIS (я понятия не имею, что это такое), чтобы создать установщик, упаковывающий двоичные файлы, созданные для всех платформ.

Пожалуйста, поправьте меня, если я ошибаюсь. Итак, для достижения этой задачи:

  • Я бы полностью отбросил проект, который вы представили (тот, на котором работает MakeNSIS),
  • Тогда бы создать Test.msbuild файл, такой как приведенный ниже,
  • Обратите внимание на <Exec> элемент, это место, где вы хотите запустить свой 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. В Менеджер конфигурации снимите флажок «Сборка» для этого нового проекта для всех комбинаций конфигурации / платформы,
  3. До сих пор внутри Менеджер конфигурации, создать новую конфигурацию, скажем Монтажники,
  4. Для этой новой конфигурации снимите флажок «Сборка» для всех проектов из решения, кроме BuildInstaller,
  5. Теперь откройте BuildInstaller.vcxproj в текстовом редакторе и добавьте следующий фрагмент прямо перед закрытием </Project> тег:
<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. Таким образом, вы эффективно переопределить цель сборки по умолчанию,
  2. А сейчас:
    • Каждый раз, когда вы собираете для конфигурации Release / Debug, установщик не будет собран, что предпочитается по многим причинам,
    • Каждый раз, когда вы собираете конфигурацию для Установщиков, ваш новый BuildInstaller.vcxproj вступит во владение, соберет двоичные файлы win32 и x64 и в конце запустит исполняемый файл пользовательской командной строки. Конечно, двоичные файлы будут создаваться с использованием конфигурации выпуска, которая должна быть желательной.

Сначала я думал, что смогу бросить <ItemGroup> элемент и использование Projects="..\Test.sln" вместо Projects="@(ProjectsToBuild)" поскольку не должно быть циклической зависимости (BuildInstaller.vcxproj не собирается для Release), но сборка длилась вечно, поэтому должна была быть какая-то проблема, странно …

Удовлетворяет ли это ваши потребности?

1

Другие решения

Я думаю, что вам нужно сначала собрать конфигурацию Win32, а затем 64-битную.

Проект makensis должен быть построен после того, как оба будут завершены (успешно!).

Например, его можно вызвать из события Post Build (для 64-битной конфигурации) или как отдельный проект.

Я не уверен, основан ли ваш макенсис проект на визуальный & монтажник (http://www.visual-installer.com — извините за небольшую саморекламу 🙂 или это чистый (текстовый) проект, включенный в VS Solution.

В обоих случаях Менеджер конфигурации в VS позволяет вам определить порядок сборки. Проект makensis всегда должен быть последним, чтобы он мог найти все зависимости от предыдущих конфигураций.

Также хорошо использовать относительный путь в проекте makensis — что-то вроде ${TARGET_PATH} который будет определен для каждой конфигурации с различным значением.

0

По вопросам рекламы [email protected]