Я создаю мульти-архитектурный установщик для программы на 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 для меня чуждый мир.
любой
Что касается «надежных» решений, если я вас правильно понимаю:
Test.sln
),Пожалуйста, поправьте меня, если я ошибаюсь. Итак, для достижения этой задачи:
Test.msbuild
файл, такой как приведенный ниже,<Exec>
элемент, это место, где вы хотите запустить свой MakeNSIS,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
больше, но здесь вы идете:
BuildInstaller
в ваше решение,BuildInstaller
,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>
Сначала я думал, что смогу бросить <ItemGroup>
элемент и использование Projects="..\Test.sln"
вместо Projects="@(ProjectsToBuild)"
поскольку не должно быть циклической зависимости (BuildInstaller.vcxproj не собирается для Release), но сборка длилась вечно, поэтому должна была быть какая-то проблема, странно …
Удовлетворяет ли это ваши потребности?
Я думаю, что вам нужно сначала собрать конфигурацию Win32, а затем 64-битную.
Проект makensis должен быть построен после того, как оба будут завершены (успешно!).
Например, его можно вызвать из события Post Build (для 64-битной конфигурации) или как отдельный проект.
Я не уверен, основан ли ваш макенсис проект на визуальный & монтажник (http://www.visual-installer.com — извините за небольшую саморекламу 🙂 или это чистый (текстовый) проект, включенный в VS Solution.
В обоих случаях Менеджер конфигурации в VS позволяет вам определить порядок сборки. Проект makensis всегда должен быть последним, чтобы он мог найти все зависимости от предыдущих конфигураций.
Также хорошо использовать относительный путь в проекте makensis — что-то вроде ${TARGET_PATH}
который будет определен для каждой конфигурации с различным значением.