Skip to content

Commit 4c37d02

Browse files
committed
feat: Add msi quite installer
1 parent 2ee61a0 commit 4c37d02

File tree

2 files changed

+136
-1
lines changed

2 files changed

+136
-1
lines changed

deploy/build_windows.bat

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,19 @@ set PATH=%QT_BIN_DIR:"=%;%PATH%
88

99
echo "Using Qt in %QT_BIN_DIR%"
1010
echo "Using QIF in %QIF_BIN_DIR%"
11+
echo "Using WiX in %WIX_BIN_DIR%"
12+
13+
if "%WIX_BIN_DIR%"=="" (
14+
echo "WIX_BIN_DIR is not set"
15+
exit /b 1
16+
)
17+
18+
set WIX_BIN_DIR_UNQUOTED=%WIX_BIN_DIR:"=%
19+
20+
if not exist "%WIX_BIN_DIR_UNQUOTED%\heat.exe" (
21+
echo "WiX Toolset binaries were not found in %WIX_BIN_DIR%"
22+
exit /b 1
23+
)
1124

1225
REM Hold on to current directory
1326
set PROJECT_DIR=%cd%
@@ -22,6 +35,22 @@ set PREBILT_DEPLOY_DATA_DIR=%PROJECT_DIR:"=%\client\3rd-prebuilt\deploy-prebuilt
2235
set DEPLOY_DATA_DIR=%SCRIPT_DIR:"=%\data\windows\x%BUILD_ARCH:"=%
2336
set INSTALLER_DATA_DIR=%WORK_DIR:"=%\installer\packages\%APP_DOMAIN:"=%\data
2437
set TARGET_FILENAME=%PROJECT_DIR:"=%\%APP_NAME:"=%_x%BUILD_ARCH:"=%.exe
38+
set TARGET_MSI_FILENAME=%PROJECT_DIR:"=%\%APP_NAME:"=%_x%BUILD_ARCH:"=%.msi
39+
40+
set APP_VERSION=
41+
for /f "tokens=2 delims= " %%i in ('findstr /R /C:"^set(AMNEZIAVPN_VERSION" "%PROJECT_DIR%\CMakeLists.txt"') do set APP_VERSION=%%i
42+
set APP_VERSION=%APP_VERSION:)=%
43+
set APP_VERSION=%APP_VERSION:"=%
44+
45+
if "%APP_VERSION%"=="" (
46+
set APP_VERSION=1.0.0
47+
)
48+
49+
if "%BUILD_ARCH%"=="32" (
50+
set WIX_PLATFORM=x86
51+
) else (
52+
set WIX_PLATFORM=x64
53+
)
2554

2655
echo "Environment:"
2756
echo "WORK_DIR: %WORK_DIR%"
@@ -32,10 +61,14 @@ echo "OUT_APP_DIR: %OUT_APP_DIR%"
3261
echo "DEPLOY_DATA_DIR: %DEPLOY_DATA_DIR%"
3362
echo "INSTALLER_DATA_DIR: %INSTALLER_DATA_DIR%"
3463
echo "TARGET_FILENAME: %TARGET_FILENAME%"
64+
echo "TARGET_MSI_FILENAME: %TARGET_MSI_FILENAME%"
65+
echo "APP_VERSION: %APP_VERSION%"
66+
echo "WIX_PLATFORM: %WIX_PLATFORM%"
3567

3668
echo "Cleanup..."
3769
rmdir /Q /S %WORK_DIR%
3870
del %TARGET_FILENAME%
71+
del %TARGET_MSI_FILENAME%
3972

4073
mkdir %WORK_DIR%
4174

@@ -56,6 +89,8 @@ mkdir "%OUT_APP_DIR%"
5689
copy "%WORK_DIR%\service\server\release\%APP_NAME%-service.exe" "%OUT_APP_DIR%"
5790
rem copy "%WORK_DIR%\client\%APP_FILENAME%" "%OUT_APP_DIR%"
5891

92+
copy /Y "%PROJECT_DIR%\client\images\app.ico" "%OUT_APP_DIR%\AmneziaVPN.ico" >nul
93+
5994

6095
echo "Signing exe"
6196
cd %OUT_APP_DIR%
@@ -89,5 +124,31 @@ timeout 5
89124
cd %PROJECT_DIR%
90125
signtool sign /v /n "Privacy Technologies OU" /fd sha256 /tr http://timestamp.comodoca.com/?td=sha256 /td sha256 "%TARGET_FILENAME%"
91126

92-
echo "Finished, see %TARGET_FILENAME%"
127+
echo "Building MSI installer..."
128+
set MSI_SOURCE_DIR=%WORK_DIR%\installer\wix
129+
set MSI_HARVEST_FILE=%MSI_SOURCE_DIR%\HarvestedFiles.wxs
130+
131+
if not exist "%MSI_SOURCE_DIR%" (
132+
echo "WiX source directory not found: %MSI_SOURCE_DIR%"
133+
exit /b 1
134+
)
135+
136+
echo " Harvesting files for MSI..."
137+
"%WIX_BIN_DIR_UNQUOTED%\heat.exe" dir "%OUT_APP_DIR%" -nologo -cg AppFiles -dr INSTALLFOLDER -sfrag -srd -var var.SourceDir -out "%MSI_HARVEST_FILE%"
138+
if %errorlevel% neq 0 exit /b %errorlevel%
139+
140+
cd "%MSI_SOURCE_DIR%"
141+
142+
echo " Compiling WiX sources..."
143+
"%WIX_BIN_DIR_UNQUOTED%\candle.exe" -nologo -ext WixUtilExtension -arch %WIX_PLATFORM% -dPlatform=%WIX_PLATFORM% -dProductVersion=%APP_VERSION% -dSourceDir="%OUT_APP_DIR%" "-dWixToolPath=%WIX_BIN_DIR_UNQUOTED%" Product.wxs HarvestedFiles.wxs
144+
if %errorlevel% neq 0 exit /b %errorlevel%
145+
146+
echo " Linking MSI..."
147+
"%WIX_BIN_DIR_UNQUOTED%\light.exe" -nologo -ext WixUtilExtension -spdb Product.wixobj HarvestedFiles.wixobj -out "%TARGET_MSI_FILENAME%"
148+
if %errorlevel% neq 0 exit /b %errorlevel%
149+
150+
cd %PROJECT_DIR%
151+
signtool sign /v /n "Privacy Technologies OU" /fd sha256 /tr http://timestamp.comodoca.com/?td=sha256 /td sha256 "%TARGET_MSI_FILENAME%"
152+
153+
echo "Finished, see %TARGET_FILENAME% and %TARGET_MSI_FILENAME%"
93154
exit 0

deploy/installer/wix/Product.wxs

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<?ifndef Platform?>
3+
<?define Platform = x64?>
4+
<?endif?>
5+
<?if $(var.Platform) = x64 ?>
6+
<?define WixQuietExecEntry = WixQuietExec64?>
7+
<?else?>
8+
<?define WixQuietExecEntry = WixQuietExec?>
9+
<?endif?>
10+
11+
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
12+
<Product Id="*"
13+
Name="AmneziaVPN"
14+
Language="1033"
15+
Version="$(var.ProductVersion)"
16+
Manufacturer="AmneziaVPN"
17+
UpgradeCode="{2D55AC62-96D6-4692-8C05-0D85BBF95485}">
18+
19+
<Package InstallerVersion="500"
20+
Compressed="yes"
21+
InstallScope="perMachine"
22+
InstallPrivileges="elevated" />
23+
24+
<MajorUpgrade AllowDowngrades="yes"
25+
Schedule="afterInstallInitialize" />
26+
27+
<MediaTemplate EmbedCab="yes" CompressionLevel="high" />
28+
29+
<Property Id="ARPPRODUCTICON" Value="AppIcon.ico" />
30+
<Property Id="ARPINSTALLLOCATION" Value="[INSTALLFOLDER]" />
31+
<Property Id="ARPNOMODIFY" Value="1" />
32+
<Property Id="ARPNOREPAIR" Value="1" />
33+
<Property Id="MSIRESTARTMANAGERCONTROL" Value="Disable" />
34+
<Property Id="MSIRMSHUTDOWN" Value="2" />
35+
<Property Id="REBOOT" Value="ReallySuppress" />
36+
37+
<Icon Id="AppIcon.ico" SourceFile="$(var.SourceDir)\AmneziaVPN.ico" />
38+
<Binary Id="WixCA" SourceFile="$(var.WixToolPath)\WixCA.dll" />
39+
40+
<Feature Id="MainFeature" Title="AmneziaVPN" Level="1">
41+
<ComponentGroupRef Id="AppFiles" />
42+
</Feature>
43+
44+
<CustomAction Id="SetKillAmneziaVPNCommand"
45+
Property="WixQuietExecCmdLine"
46+
Value="&quot;taskkill&quot; /F /IM AmneziaVPN.exe /T"
47+
Return="check" />
48+
49+
<CustomAction Id="KillAmneziaVPN"
50+
BinaryKey="WixCA"
51+
DllEntry="$(var.WixQuietExecEntry)"
52+
Execute="deferred"
53+
Return="ignore"
54+
Impersonate="no" />
55+
56+
<InstallExecuteSequence>
57+
<Custom Action="SetKillAmneziaVPNCommand" Before="InstallInitialize">NOT Installed OR REINSTALL OR REMOVE~="ALL"</Custom>
58+
<Custom Action="KillAmneziaVPN" After="SetKillAmneziaVPNCommand">NOT Installed OR REINSTALL OR REMOVE~="ALL"</Custom>
59+
</InstallExecuteSequence>
60+
</Product>
61+
62+
<Fragment>
63+
<Directory Id="TARGETDIR" Name="SourceDir">
64+
<?if $(var.Platform) = x64 ?>
65+
<Directory Id="ProgramFiles64Folder">
66+
<?else?>
67+
<Directory Id="ProgramFilesFolder">
68+
<?endif?>
69+
<Directory Id="INSTALLFOLDER" Name="AmneziaVPN" />
70+
</Directory>
71+
</Directory>
72+
</Fragment>
73+
</Wix>
74+

0 commit comments

Comments
 (0)