Skip to content

Commit 8b1a2e0

Browse files
committedMar 19, 2025·
Switch to Inno Setup to build the windows installer
We currently use sbt-native-packager to build the CLI Windows installer, which does so by generating wsx files and running Wix to compile them to an msi. But this has a number of complications: - Wix does not currently create reproducible MSI files - We currently maintain custom wsx files in addition to having to manually transform the wsx files that the plugin generates - The wsx files only work with Wix3--we can't easily upgrade to new versions of Wix that might fix bugs or add new features (like reproducibility) - Even if we could convert the wsx files to a newer version, Wix v6 switches to a license that is likely not ASF compatible so we are essentially stuck with older versions of Wix - In order to build Wix on Linux, we sort of hack things by replacing the Wix light.exe and candle.exe files with scripts that runs them in wine, complicating Wix setup An alternative to Wix is using wixl, a Gnome developed tool to build MSI files on Linux. This solves some of the above problems, but wixl still fairly immature and has the same reproducibility issues. However, switching to Inno Setup to build the Windows installer solves many of these problems: - It has an ASF compatible license - It creates reproducible builds - It is easy to run under wine without custom scripts - The configuration file is significantly more simple and supports things like paramaterization. The only real complication is we now need to manually modify the Path since Inno Setup has no native support for this Note that this no longer uses MSI's, so we lose some of the native install capabilities that MSI's provide, but users are unlikely to notice the differences. One drawback is that Inno Setup isn't supported by sbt-native-packager. But executing the InnoSetup CLI compiler with the necessary arguments is fairly straightforward. A new "packageWindowsBin" SBT task is created in just a handful of lines that executes the compiler, including support for running under Wine for non-Windows operation systems. With this change, instead of the old command to build windows installer: sbt daffodil-cli/Windows/packageBin we now run this: sbt daffodil-cli/packageWindowsBin The only setup for this to work is Inno Setup must be manually downloaded and installed, but this is pretty straightforward and works well in wine. The setup is also only needed when building windows installers--if you don't care about that and never run the above command then you don't need to install Inno Setup or wine. This also updates the release candidate container to install Inno Setup and build the new exe file. When we switch to the new tag-based release process, these changes will need to be copied to that infrastructure. Compatibility/Deprecation: The windows installer has switched from an MSI to an EXE. Installing the new version will not uninstall the previous version. Previously installed Daffodil MSIs should be uninstalled prior to installing new EXEs. DAFFODIL-2980
1 parent 5f38342 commit 8b1a2e0

File tree

10 files changed

+166
-401
lines changed

10 files changed

+166
-401
lines changed
 

‎containers/release-candidate/Dockerfile

+15-25
Original file line numberDiff line numberDiff line change
@@ -40,37 +40,27 @@ RUN \
4040
unzip \
4141
vim-minimal \
4242
wine \
43-
winetricks && \
43+
winetricks \
44+
xorg-x11-server-Xvfb && \
4445
dnf clean all
4546

4647
# Enable sbt-pgp plugin
4748
COPY src/plugins.sbt /root/.sbt/1.0/plugins/
4849

49-
# WIX is a Microsoft Windows Installer creation tool kit.
50-
#
51-
# Install wix, including changes to allow WiX to run in wine on Linux. See
52-
# src/wix_wine.sh for more details on why we need to do this and how it works
53-
#
54-
# Updating WIX should be done only if there is a specific need (for security, or other compelling reason)
55-
# because it is likely things will break and the release scripts/process will have to adapt.
56-
# The WIX version 3.11.2 is hard coded into these script lines as tokens wix3112rtm and wix311.
57-
#
58-
# In order to ensure we are downloading and using the exact WIX binary we have tested and trust
59-
# we verify the sha512 is the same as the one expected. This protects us from if someone
60-
# was to get github credentials allowing them to change the wix binaries on github.
61-
# If WIX is updated to a newer version, this sha512 will need to be recomputed.
62-
ARG WIXSHA=6fd961c85e1e6adafb99ef50c9659e3eb83c84ecaf49f523e556788845b206e1857aba2c39409405d4cda1df9b30a552ce5aab808be5f8368a37a447d78d1a05
63-
#
50+
# Download and install Inno Setup via wine. Even though we provide options to
51+
# make Inno Setup a headless install, wine still thinks it wants to open a
52+
# window so we need install with a temporary virtual X server with xvfb-run.
53+
# Also ensure it is installed in the directory where the deafult Daffodil SBT
54+
# configuration expects it--different wine configurations could install it
55+
# somewhere else.
6456
RUN \
65-
curl -sS -L https://github.com/wixtoolset/wix3/releases/download/wix3112rtm/wix311-binaries.zip -o wix311-binaries.zip && \
66-
echo "$WIXSHA wix311-binaries.zip" | sha512sum --quiet -c - && \
67-
mkdir /opt/wix311 && \
68-
unzip -q wix311-binaries.zip -d /opt/wix311/ && \
69-
rm wix311-binaries.zip
70-
RUN mv /opt/wix311/{candle.exe,real-candle.exe}
71-
RUN mv /opt/wix311/{light.exe,real-light.exe}
72-
COPY src/wix_wine.sh /opt/wix311/candle.exe
73-
COPY src/wix_wine.sh /opt/wix311/light.exe
57+
INNO_SETUP_EXE="innosetup-6.4.1.exe" && \
58+
EXPECTED_SHA=5dfc9999e2feafa28754baaf80cf73ac96414228b94a1132a919554a822c892810197305d9355885b9ac408c214691cd45279fc2df3a891fbebc4f8eb86bac87 && \
59+
curl -sS -L https://files.jrsoftware.org/is/6/$INNO_SETUP_EXE -o $INNO_SETUP_EXE && \
60+
echo "$EXPECTED_SHA $INNO_SETUP_EXE" | sha512sum --quiet -c - && \
61+
winetricks -q win10 && \
62+
xvfb-run wine $INNO_SETUP_EXE /VERYSILENT /SUPPRESSMSGBOXES /TASKS= '/DIR=C:\\Program Files (x86)\\Inno Setup 6' && \
63+
rm $INNO_SETUP_EXE
7464

7565
# Install a pinned version of sbt. This is used only as a bootstrap so does not need to be updated.
7666
# This version of sbt is not used to build any Daffodil project parts, as they specify their own sbt versions.

‎containers/release-candidate/src/daffodil-release-candidate

+3-4
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ case $PROJECT_REPO in
295295
"+compile" \
296296
"+$SBT_PUBLISH" \
297297
"daffodil-cli/Rpm/packageBin" \
298-
"daffodil-cli/Windows/packageBin" \
298+
"daffodil-cli/packageWindowsBin" \
299299
"daffodil-cli/Universal/packageBin" \
300300
"daffodil-cli/Universal/packageZipTarball" \
301301
"unidoc" \
@@ -306,9 +306,8 @@ case $PROJECT_REPO in
306306
cp daffodil-cli/target/universal/apache-daffodil-*.tgz $DAFFODIL_RELEASE_DIR/bin/
307307
cp daffodil-cli/target/universal/apache-daffodil-*.zip $DAFFODIL_RELEASE_DIR/bin/
308308
cp daffodil-cli/target/rpm/RPMS/noarch/apache-daffodil-*.rpm $DAFFODIL_RELEASE_DIR/bin/
309-
MSI_NAME=$(basename $DAFFODIL_RELEASE_DIR/bin/*.zip .zip).msi
310-
cp daffodil-cli/target/windows/Daffodil.msi $DAFFODIL_RELEASE_DIR/bin/$MSI_NAME
311-
chmod -x $DAFFODIL_RELEASE_DIR/bin/$MSI_NAME
309+
cp daffodil-cli/target/windows/apache-daffodil-*.exe $DAFFODIL_RELEASE_DIR/bin/
310+
chmod -x $DAFFODIL_RELEASE_DIR/bin/*.exe
312311

313312
echo "Embedding RPM Signature..."
314313
rpmsign --define "_gpg_name $PGP_SIGNING_KEY_ID" --define "_binary_filedigest_algorithm 10" --addsign $DAFFODIL_RELEASE_DIR/bin/*.rpm

‎containers/release-candidate/src/wix_wine.sh

-71
This file was deleted.

‎daffodil-cli/build.sbt

+46-182
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,21 @@
1515
* limitations under the License.
1616
*/
1717

18-
import scala.xml.Attribute
19-
import scala.xml.transform.RewriteRule
20-
import scala.xml.transform.RuleTransformer
18+
import scala.sys.process.Process
19+
20+
import sbt.internal.util.Util.isWindows
2121

2222
enablePlugins(JavaAppPackaging)
2323
enablePlugins(RpmPlugin)
24-
enablePlugins(WindowsPlugin)
24+
25+
lazy val packageWindowsBin = taskKey[Unit]("Generate windows installer")
26+
lazy val isccPath = settingKey[String]("Path to the Inno Setup ISCC.exe file")
2527

2628
executableScriptName := "daffodil"
2729

2830
Universal / packageName := "apache-daffodil-" + version.value + "-bin" //tarball name
2931
Linux / packageName := executableScriptName.value
3032
Rpm / packageName := "apache-" + executableScriptName.value
31-
Windows / packageName := executableScriptName.value
3233

3334
val optSourceDateEpoch = scala.util.Properties.envOrNone("SOURCE_DATE_EPOCH")
3435

@@ -158,184 +159,47 @@ rpmPrefix := Some(defaultLinuxInstallLocation.value)
158159
// Windows configuration
159160
//
160161

161-
//
162-
// Here we set the variables that are supported by the sbt Native Packager plug-in.
163-
// We also get fairly aggressive in editing/modifying the XML in order
164-
// to control and use some specific features that are supported by WiX
165-
// but which are not properly suported by the sbt plug-in.
166-
//
167-
168-
// Force the correct installation directory name. This overwrites
169-
// 'daffodil-cli', which is the directory that we invoke sbt in.
170-
// The sbt WiX plug-in incorrectly assumes that the directory of
171-
// invocation is the same name as the direcotry you eventually
172-
// want to install into.
173-
Windows / name := "Daffodil"
174-
175-
// The Windows packager sbt plug-in maps the packageSummary variable
176-
// into the WiX productName field. Another strange choice.
177-
Windows / packageSummary := "Daffodil"
178-
179-
// The Windows packager sbt plug-in limits the length of the packageDescription
180-
// field to a single line. Use the short packageSummary from the RPM config.
181-
Windows / packageDescription := (Rpm / packageSummary).value
182-
183-
// Use the same version number as in the rpm, which has SNAPSHOT removed if it
184-
// exists. Windows version numbers has no concept of a "snapshot build", only
185-
// major, minor, patch, and build. So Windows MSI versions do not differentiate
186-
// between snapshots and non-snapshots.
187-
Windows / version := (Rpm / version).value
188-
189-
// Required and critical GUIDs. Ironically the ProductId is unique
190-
// to a given release, but UpgradeId must NEVER change! This may
191-
// seem conter-intuitive, but the UpgradeId is actually what ties
192-
// the product to it's upgrades and the product is actually unique
193-
// each time it is released, so there is some semblance of logic
194-
// to this scheme.
195-
wixProductUpgradeId := "4C966AFF-585E-4E17-8CC2-059FD70FEC77"
196-
197-
// Light options. Bring in standard dialog boxes and localization.
198-
// The suppression of ICE61 is required as we *DO* permit
199-
// re-installation of the same version. Despite the presence of
200-
// specific XML to enable this, the WiX compiler and linker
201-
// complain about it unless you specifically suppress the warning.
202-
lightOptions ++= Seq(
203-
"-sval", // validation does not currently work under Wine, this disables that
204-
"-sice:ICE61",
205-
"-loc",
206-
((Windows / sourceDirectory).value / "Product_en-us.wxl").toString
207-
)
208-
209-
// Build an RTF version of the license file for display in the license
210-
// acceptance dialog box. This file will also be sent to the
211-
// printer when and if the user asks for hard copy via the 'print' button.
212-
wixProductLicense := {
213-
// Make sure the target direcotry exists.
214-
(Windows / target).value.mkdirs()
215-
216-
// This target file doesn't exist until placed there by the build.
217-
val targetLicense = (Windows / target).value / "LICENSE.rtf"
218-
val sourceLicense = baseDirectory.value / "bin.LICENSE"
219-
// somehow convert sourceLicense into RTF and store at targetLicense
220-
val rtfHeader = """{\rtf {\fonttbl {\f0 Arial;}} \f0\fs18"""
221-
val rtfFooter = """}"""
222-
223-
val licenseLines = scala.io.Source.fromFile(sourceLicense, "UTF-8").getLines
224-
val writer = new java.io.PrintWriter(targetLicense, "UTF-8")
225-
// windows style line endings in the license are required by the WiX toolkit
226-
writer.write(rtfHeader + "\r\n")
227-
licenseLines.foreach { line =>
228-
writer.write(line + """\line""" + "\r\n")
229-
}
230-
writer.write(rtfFooter + "\r\n")
231-
writer.close
232-
Option(targetLicense)
233-
}
234-
235-
// Use the wixFiles variable to add in the Daffodil-specific dialog
236-
// boxes and sequence.
237-
wixFiles ++= Seq(
238-
(Windows / sourceDirectory).value / "WixUI_Daffodil.wxs"
239-
)
240-
241-
// The sbt Native Packager plug-in assumes that we want to give the user
242-
// a Feature Tree to select from. One of the 'features' that the plug-in
243-
// offers up is a set of all shortcuts and menu links. Daffodil is
244-
// actually a command-line executable, so we do not include
245-
// configuration links as they are unnecessary. From a practical
246-
// standpoint the user must invoke a command shell in a window
247-
// before they can invoke Daffodil anyway.
248-
wixFeatures := {
249-
val features = wixFeatures.value
250-
features.filter { _.id != "AddConfigLinks" }
162+
/**
163+
* If building on a non-Windows machine, uses winepath to convert a Unix file path to a Windows
164+
* path that can be used with wine. If this is Windows, just return the file path as a string
165+
*/
166+
def winpath(file: File): String = {
167+
if (isWindows) file.toString
168+
else Process(Seq("winepath", "-w", file.toString)).!!
251169
}
252170

253-
// Make sure that we don't use an MSI installer that is older than
254-
// version 2.0. It also fixes the comment attribute that hangs
255-
// out on the Package keyword.
256-
wixPackageInfo := wixPackageInfo.value.copy(
257-
installerVersion = "200",
258-
comments = "!(loc.Comments)"
259-
)
260-
261-
// Fix the XML that is associated with the installable files and directories.
262-
wixProductConfig := {
263-
// Pick up the generated code.
264-
val pc = wixProductConfig.value
265-
266-
// Replace the default headline banner and Welcome/Exit screen
267-
// bitmaps with the custom ones we developed for Daffodil.
268-
val banner = <WixVariable Id="WixUIBannerBmp" Value={
269-
((Windows / sourceDirectory).value / "banner.bmp").toString
270-
} />
271-
val dialog = <WixVariable Id="WixUIDialogBmp" Value={
272-
((Windows / sourceDirectory).value / "dialog.bmp").toString
273-
} />
274-
275-
// Reference the Daffodil-specific User Interface (dialog box) sequence.
276-
val ui = <UI><UIRef Id="WixUI_Daffodil" /></UI>
277-
278-
// Make sure we abort if we are not installing on Windows 95 or later.
279-
val osCondition =
280-
<Condition Message="!(loc.OS2Old)"><![CDATA[Installed OR (VersionNT >= 400)]]></Condition>
281-
282-
// Define icons (ID should not be longer than 18 chars and must end with ".exe")
283-
val icon = Seq(
284-
<Icon Id="Daffodil.ico" SourceFile={
285-
((Windows / sourceDirectory).value / "apache-daffodil.ico").toString
286-
} />,
287-
<Property Id="ARPPRODUCTICON" Value="Daffodil.ico" />
288-
)
289-
290-
// String together the additional XML around the generated directory and file lists.
291-
val pcGroup = pc.asInstanceOf[scala.xml.Group]
292-
val newNodes = osCondition ++ icon ++ pcGroup.nodes ++ dialog ++ banner ++ ui
293-
val pcWithNewNodes = pcGroup.copy(nodes = newNodes)
294-
295-
// Change (edit) some items inside the directory/files list.
296-
val pcRewriteRule = new RewriteRule {
297-
override def transform(n: scala.xml.Node): Seq[scala.xml.Node] = n match {
298-
299-
// We want to comply with the Windows standard pattern of
300-
// installing at /Program Files/ManufacturerName/Application
301-
// This case effectively inserts the manufacturer name into
302-
// the XML as a directory to comply with the standard.
303-
case e: scala.xml.Elem if (e \ "@Name").text == "PFiles" => {
304-
val apacheDir = <Directory Id="ProgramFilesApache" Name="!(loc.ManufacturerName)" />
305-
val apacheDirWithChild = apacheDir.copy(child = e.child)
306-
e.copy(child = apacheDirWithChild)
307-
}
308-
309-
// We *ARE* going to allow the user to repair and reinstall
310-
// the same exact version, so we need to add an attribute
311-
// to the MajorUpgrade keyword. This will trigger an 'ICE61'
312-
// error that we suppress on the 'light' linker command line.
313-
case e: scala.xml.Elem if e.label == "MajorUpgrade" => {
314-
e % scala.xml.Attribute("", "AllowSameVersionUpgrades", "yes", e.attributes)
315-
}
316-
317-
// Fixup for registry key.
318-
case e: scala.xml.Elem if e.label == "RegistryValue" => {
319-
val attribs = e.attributes.remove("Key")
320-
e % scala.xml.Attribute(
321-
"",
322-
"Key",
323-
"""Software\Apache\Installed Products\Daffodil""",
324-
attribs
325-
)
326-
}
327-
328-
// The WixUI_FeatureTree reference has to be removed so that
329-
// our custom Daffodil UI can operate properly.
330-
case e: scala.xml.Elem
331-
if e.label == "UIRef" && (e \ "@Id").text == "WixUI_FeatureTree" => {
332-
scala.xml.NodeSeq.Empty
333-
}
334-
case `n` => n
171+
/**
172+
* Set the default path to the ISCC compiler to the Windows path. Since we run it with wine on
173+
* Linux, this path should work on both Windows and Linux. Depending on the wine config, windows
174+
* version, or how Inno Setup is installed, this might need to be set to a different value.
175+
*/
176+
isccPath := "C:\\Program Files (x86)\\Inno Setup 6\\ISCC.exe"
177+
178+
packageWindowsBin := {
179+
(Universal / stage).value
180+
181+
// if SOURCE_DATE_EPOCH is defined, then we use that as the TouchDate/Time settings to set
182+
// embedded timestamps, which allows for reproducible builds
183+
val (touchDate, touchTime) = optSourceDateEpoch
184+
.map { epoch =>
185+
val fmt = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
186+
fmt.setTimeZone(java.util.TimeZone.getTimeZone("UTC"))
187+
val time = fmt.format(new java.util.Date(epoch.toLong * 1000))
188+
val dateTime = time.split(" ")
189+
(dateTime(0), dateTime(1))
335190
}
336-
}
337-
338-
// Now apply all the edits in the RewriteRule defined above.
339-
val newXml = new RuleTransformer(pcRewriteRule).transform(pcWithNewNodes)
340-
<xml:group>{newXml}</xml:group>
191+
.getOrElse(("current", "current"))
192+
193+
val optWine = if (!isWindows) Some("wine") else None
194+
val isccCmd = optWine ++: Seq(
195+
isccPath.value,
196+
"/O" + winpath(target.value / "windows"),
197+
"/F" + (Universal / packageName).value,
198+
"/DVERSION=" + version.value,
199+
"/DBASEDIR=" + winpath(baseDirectory.value),
200+
"/DTOUCHDATE=" + touchDate,
201+
"/DTOUCHTIME=" + touchTime,
202+
winpath(baseDirectory.value / "src" / "windows" / "apache-daffodil.iss")
203+
)
204+
Process(isccCmd).!!
341205
}

‎daffodil-cli/src/windows/Product_en-us.wxl

-46
This file was deleted.

‎daffodil-cli/src/windows/WixUI_Daffodil.wxs

-72
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
; Licensed to the Apache Software Foundation (ASF) under one or more
2+
; contributor license agreements. See the NOTICE file distributed with
3+
; this work for additional information regarding copyright ownership.
4+
; The ASF licenses this file to You under the Apache License, Version 2.0
5+
; (the "License"); you may not use this file except in compliance with
6+
; the License. You may obtain a copy of the License at
7+
;
8+
; http://www.apache.org/licenses/LICENSE-2.0
9+
;
10+
; Unless required by applicable law or agreed to in writing, software
11+
; distributed under the License is distributed on an "AS IS" BASIS,
12+
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
; See the License for the specific language governing permissions and
14+
; limitations under the License.
15+
16+
[Setup]
17+
; Do not change the AppID, this GUID uniquely identifies Daffodil
18+
AppId={{4C966AFF-585E-4E17-8CC2-059FD70FEC77}
19+
AppName=Apache Daffodil
20+
AppPublisher=Apache Daffodil <dev@apache.daffodil.org>
21+
AppPublisherURL=https://daffodil.apache.org
22+
AppVerName=Apache Daffodil v{#VERSION}
23+
AppVersion={#VERSION}
24+
ChangesEnvironment=yes
25+
Compression=none
26+
DefaultDirName={autopf}\Apache\Daffodil
27+
DisableProgramGroupPage=yes
28+
DisableWelcomePage=no
29+
LicenseFile={#BASEDIR}\bin.LICENSE
30+
PrivilegesRequired=admin
31+
SetupIconFile={#BASEDIR}\src\windows\apache-daffodil.ico
32+
UninstallDisplayIcon={app}\apache-daffodil.ico
33+
TimeStampsInUTC=yes
34+
TouchDate={#TOUCHDATE}
35+
TouchTime={#TOUCHTIME}
36+
WizardImageFile={#BASEDIR}\src\windows\dialog.bmp
37+
WizardStyle=modern
38+
39+
[Languages]
40+
Name: "english"; MessagesFile: "compiler:Default.isl"
41+
42+
[Files]
43+
Source: "{#BASEDIR}\target\universal\stage\*"; DestDir: "{app}"; \
44+
Flags: ignoreversion recursesubdirs touch
45+
Source: "{#BASEDIR}\src\windows\apache-daffodil.ico"; DestDir: "{app}"; \
46+
Flags: ignoreversion touch
47+
48+
[InstallDelete]
49+
; Inno Setup does not delete files from previous installations when upgrading
50+
; to a new version. For most of our files this is fine since we'll just overwrite
51+
; the old files with the new files. But the Daffodil CLI adds everything in the
52+
; lib directory to the classpath, so we need to make sure to remove old jars from
53+
; previous installs. Rather than trying to list all possible old jars, just
54+
; delete the entire lib directory. Note that if users put plugin jars in this
55+
; directory, they will also be deleted, but they shouldn't do that--plugin jars
56+
; should live in a separate directory and added to DAFFODIL_CLASSPATH.
57+
Type: files; Name: "{app}\lib\*"
58+
59+
[Code]
60+
// Inno Setup does not have a built-in way to add the {app}\bin directory to
61+
// PATH. This is important since this is a CLI tool so it won't be started by
62+
// things like shortscuts or the start menu so really does want to be on the
63+
// PATH. The below code modifies PATH to add or remove the bin directory
64+
// depending on if we are installing or uninstalling, making sure not to re-add
65+
// it if a previous install already added it.
66+
procedure ModifyPath(Path: string; Installing: boolean);
67+
var
68+
CurrentPaths: string;
69+
PathList: TStringList;
70+
PathIndex: Integer;
71+
begin
72+
RegQueryStringValue(HKEY_LOCAL_MACHINE, 'System\CurrentControlSet\Control\Session Manager\Environment', 'Path', CurrentPaths);
73+
74+
PathList := TStringList.Create;
75+
PathList.Delimiter := ';';
76+
PathList.StrictDelimiter := True;
77+
PathList.CaseSensitive := False;
78+
PathList.DelimitedText := CurrentPaths;
79+
80+
PathIndex := PathList.IndexOf(Path);
81+
82+
if Installing and (PathIndex = -1) then
83+
PathList.Add(Path)
84+
else if not Installing and (PathIndex <> -1) then
85+
PathList.Delete(PathIndex);
86+
87+
RegWriteStringValue(HKEY_LOCAL_MACHINE, 'System\CurrentControlSet\Control\Session Manager\Environment', 'Path', PathList.DelimitedText);
88+
89+
PathList.Free;
90+
end;
91+
92+
procedure CurStepChanged(CurStep: TSetupStep);
93+
begin
94+
if CurStep = ssPostInstall then
95+
ModifyPath(ExpandConstant('{app}\bin'), true);
96+
end;
97+
98+
procedure CurUninstallStepChanged(CurStep: TUninstallStep);
99+
begin
100+
if CurStep = usPostUninstall then
101+
ModifyPath(ExpandConstant('{app}\bin'), false);
102+
end;

‎daffodil-cli/src/windows/banner.bmp

-112 KB
Binary file not shown.

‎daffodil-cli/src/windows/dialog.bmp

-400 KB
Binary file not shown.

‎project/Rat.scala

-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ object Rat {
3636

3737
// images used for the windows installer
3838
file("daffodil-cli/src/windows/apache-daffodil.ico"),
39-
file("daffodil-cli/src/windows/banner.bmp"),
4039
file("daffodil-cli/src/windows/dialog.bmp"),
4140

4241
// generated code examples

0 commit comments

Comments
 (0)
Please sign in to comment.