This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/main by this push:
     new bfdfba1f30 Add makensis as an option for building the Windows installer
bfdfba1f30 is described below

commit bfdfba1f30185bc4d41c6c3374d65dc03656b79e
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Wed Feb 12 10:14:58 2025 +0000

    Add makensis as an option for building the Windows installer
---
 build.properties.default   |   3 +
 build.xml                  | 157 +++++++++++++++++++++++----------------------
 res/install-win/tomcat.nsi |  37 +++--------
 webapps/docs/changelog.xml |   4 ++
 4 files changed, 99 insertions(+), 102 deletions(-)

diff --git a/build.properties.default b/build.properties.default
index 2eac1d0c76..0bea62d954 100644
--- a/build.properties.default
+++ b/build.properties.default
@@ -36,6 +36,9 @@ version.dev=-dev
 
 # ----- Build tools -----
 ant.version.required=1.10.2
+# Which tool to use for building Windows installer
+# on unix platform: wine or makensis.
+nsis.tool=wine
 
 # ----- Build control flags -----
 compile.debug=true
diff --git a/build.xml b/build.xml
index ec5822656a..8a22ce2d8a 100644
--- a/build.xml
+++ b/build.xml
@@ -301,6 +301,11 @@
     <filter token="JASPIC_SPEC_VERSION" value="${jaspic.spec.version}"/>
   </filterset>
 
+  <!-- Path filter set -->
+  <filterset id="path.filters">
+    <filter token="BASEDIR" value="${basedir}"/>
+  </filterset>
+
   <!-- Files to change line endings for depending on target platform -->
   <patternset id="text.files" >
     <include name="**/INSTALLLICENSE"/>
@@ -2570,19 +2575,35 @@
   <target name="-installer-pre-init">
     <property environment="env" />
     <condition property="wine.ok">
+      <or>
+        <and>
+          <equals arg1="${nsis.tool}" arg2="wine" forcestring="true"/>
+          <available file="wine" filepath="${env.PATH}" />
+        </and>
+      </or>
+    </condition>
+    <condition property="makensis.ok">
+      <or>
+        <and>
+          <equals arg1="${nsis.tool}" arg2="makensis" forcestring="true"/>
+          <available file="makensis" filepath="${env.PATH}" />
+        </and>
+      </or>
+    </condition>
+    <condition property="installer.ok">
       <or>
         <os family="windows" />
-        <available file="wine" filepath="${env.PATH}" />
-        <isset property="skip.installer"/>
+        <isset property="wine.ok"/>
+        <isset property="makensis.ok"/>
       </or>
     </condition>
   </target>
 
-  <target name="-installer-init" depends="-installer-pre-init" 
unless="${wine.ok}">
-    <fail message="The executable wine was not found on the current path.
-Wine is required to build the Windows installer when running a release build on
-a non-Windows platform. To skip building the Windows installer, set the
-skip.installer property in build.properties" />
+  <target name="-installer-init" depends="-installer-pre-init" 
unless="${installer.ok}">
+    <fail message="The executable ${nsis.tool} was not found on the current 
path.
+Either wine or makensis are required to build the Windows installer on a 
non-Windows platform.
+Choose the tool by setting property nsis.tool in build.properties.
+To skip building the Windows installer, set the skip.installer property in 
build.properties" />
   </target>
 
   <target name="-installer-prep"
@@ -2593,13 +2614,8 @@ skip.installer property in build.properties" />
         <include name="*.bmp" />
         <include name="*.ico" />
         <include name="*.xml" />
-        <include name="Uninstall.exe.sig" />
       </fileset>
     </copy>
-    <copy file="res/install-win/tomcat-installer.exe.sig"
-        tofile="${tomcat.release}/v${version}/bin/${final.name}.exe.sig"
-        failonerror="false"
-        quiet="true" />
     <copy file="${nsis.installoptions.dll}" todir="${tomcat.dist}" />
     <copy file="${nsis.nsexec.dll}" todir="${tomcat.dist}" />
     <copy file="${nsis.nsisdl.dll}" todir="${tomcat.dist}" />
@@ -2607,6 +2623,7 @@ skip.installer property in build.properties" />
     <copy file="${nsis.nsdialogs.dll}" todir="${tomcat.dist}" />
     <copy file="res/install-win/tomcat.nsi" tofile="${tomcat.dist}/tomcat.nsi" 
overwrite="true" encoding="ISO-8859-1">
       <filterset refid="version.filters"/>
+      <filterset refid="path.filters"/>
     </copy>
     <fixcrlf srcdir="${tomcat.dist}" eol="crlf"
         encoding="ISO-8859-1" fixlast="false" >
@@ -2618,81 +2635,77 @@ skip.installer property in build.properties" />
     </touch>
   </target>
 
-  <target name="-installer-create-tempinstaller"
-      unless="skip.installer" depends="-installer-prep">
-    <exec dir="${tomcat.dist}" executable="${nsis.exe}" osfamily="windows">
-      <arg value="/DUNINSTALLONLY" />
-      <arg value="/DNSISDIR=${nsis.home}" />
-      <arg value="/V2" />
-      <arg value="tomcat.nsi" />
-    </exec>
-    <exec dir="${tomcat.dist}" executable="wine" osfamily="unix">
+  <target name="-installer-wine" if="${wine.ok}">
+     <exec dir="${tomcat.dist}" executable="wine" osfamily="unix">
       <arg value="${nsis.exe}" />
-      <arg value="/DUNINSTALLONLY" />
       <arg value="/DNSISDIR=${nsis.home}" />
       <arg value="/V2" />
       <arg value="tomcat.nsi" />
     </exec>
   </target>
 
-  <target name="-installer-create-uninstaller"
-      unless="skip.installer" depends="-installer-create-tempinstaller">
-    <!-- Execute the temporary installer to create the uninstaller -->
-    <exec dir="${tomcat.dist}" executable="${tomcat.dist}/tempinstaller.exe"
-        osfamily="windows"  />
-    <exec dir="${tomcat.dist}" executable="wine" osfamily="unix">
-      <arg value="${tomcat.dist}/tempinstaller.exe" />
+  <target name="-installer-makensis" if="${makensis.ok}">
+    <exec dir="${tomcat.dist}" executable="makensis" osfamily="unix">
+      <arg value="-DNSISDIR=${nsis.home}" />
+      <arg value="-V2" />
+      <arg value="tomcat.nsi" />
     </exec>
-    <!-- Reproducible builds: consistent timestamps for installer files -->
-    <touch datetime="${tstamp.file}" pattern="yyyy-MM-dd HH:mm:ss">
-      <fileset dir="${tomcat.dist}"/>
-    </touch>
-  </target>
-
-  <target name="-installer-sign-uninstaller"
-      unless="skip.installer" 
depends="-installer-create-uninstaller,setup-jsign"
-      if="${do.codesigning}">
-    <!-- If the detached signature doesn't exist, this will sign the file    
-->
-    <!-- and create the detached signature. If the detached signature does   
-->
-    <!-- exist it will be attached to the file.                              
-->
-    <jsign file="${tomcat.dist}/Uninstall.exe"
-        storepass="${codesigning.storepass}"
-        storetype="${codesigning.storetype}"
-        keypass="${codesigning.keypass}"
-        alias="${codesigning.alias}"
-        alg="${codesigning.digest}"
-        tsaurl="http://ts.ssl.com";
-        tsmode="RFC3161"
-        detached="true"/>
-    <!-- Copy detached signature to source tree -->
-    <copy file="${tomcat.dist}/Uninstall.exe.sig" todir="res/install-win"/>
-    <!-- Reproducible builds: consistent timestamps for installer files -->
-    <touch datetime="${tstamp.file}" pattern="yyyy-MM-dd HH:mm:ss">
-      <fileset dir="${tomcat.dist}"/>
-    </touch>
   </target>
 
   <target name="-installer" unless="skip.installer"
-      depends="-installer-sign-uninstaller">
+      depends="-installer-prep,-installer-wine,-installer-makensis">
     <exec dir="${tomcat.dist}" executable="${nsis.exe}" osfamily="windows">
       <arg value="/DNSISDIR=${nsis.home}" />
       <arg value="/V2" />
       <arg value="tomcat.nsi" />
     </exec>
-    <exec dir="${tomcat.dist}" executable="wine" osfamily="unix">
-      <arg value="${nsis.exe}" />
-      <arg value="/DNSISDIR=${nsis.home}" />
-      <arg value="/V2" />
-      <arg value="tomcat.nsi" />
-    </exec>
-    <move file="${tomcat.dist}/tomcat-installer.exe" 
tofile="${tomcat.release}/v${version}/bin/${final.name}.exe" />
-    <hashAndSign file="${tomcat.release}/v${version}/bin/${final.name}.exe" />
   </target>
 
   <target name="installer-sign"
       description="Builds and optionally signs the Windows installer"
-      depends="-installer,setup-jsign" if="${do.codesigning}" >
-    <jsign file="${tomcat.release}/v${version}/bin/${final.name}.exe"
+      depends="-installer"  unless="skip.installer" >
+      <move file="${tomcat.dist}/tomcat-installer.exe" 
tofile="${tomcat.release}/v${version}/bin/${final.name}.exe" />
+      <!-- .exe has changed so need to redo checksums and OpenPGP signature -->
+      <delete file="${tomcat.release}/v${version}/bin/${final.name}.exe.asc" />
+      <delete 
file="${tomcat.release}/v${version}/bin/${final.name}.exe.sha512" />
+      <hashAndSign file="${tomcat.release}/v${version}/bin/${final.name}.exe" 
/>
+  </target>
+
+  <!-- Called via a callback in the NSIS installer script -->
+  <target name="-jsign-installer"
+      depends="setup-jsign" if="${do.codesigning}" >
+      <echo>Signing ${tomcat.dist}/tomcat-installer.exe</echo>
+      <!-- Copy pre-existing detachced signature to signing directory -->
+      <copy file="res/install-win/tomcat-installer.exe.sig"
+          tofile="${tomcat.dist}/tomcat-installer.exe.sig"
+          failonerror="false" />
+      <!-- If the detached signature doesn't exist, this will sign the file  
-->
+      <!-- and create the detached signature. If the detached signature does 
-->
+      <!-- exist it will be attached to the file.                            
-->
+      <jsign file="${tomcat.dist}/tomcat-installer.exe"
+        storepass="${codesigning.storepass}"
+        storetype="${codesigning.storetype}"
+        alias="${codesigning.alias}"
+        alg="${codesigning.digest}"
+        tsaurl="http://timestamp.digicert.com";
+        tsmode="RFC3161"
+        detached="true"/>
+      <!-- Move detached signature to source tree -->
+      <move file="${tomcat.dist}/tomcat-installer.exe.sig" 
tofile="res/install-win/tomcat-installer.exe.sig"/>
+  </target>
+
+  <!-- Called via a callback in the NSIS installer script -->
+  <target name="-jsign-uninstaller"
+      depends="setup-jsign" if="${do.codesigning}" >
+      <echo>Signing ${codesigning.file_to_sign}</echo>
+      <!-- Copy pre-existing detachced signature to signing directory -->
+      <copy file="res/install-win/Uninstall.exe.sig"
+          tofile="${codesigning.file_to_sign}.sig"
+          failonerror="false" />
+      <!-- If the detached signature doesn't exist, this will sign the file  
-->
+      <!-- and create the detached signature. If the detached signature does 
-->
+      <!-- exist it will be attached to the file.                            
-->
+      <jsign file="${codesigning.file_to_sign}"
         storepass="${codesigning.storepass}"
         storetype="${codesigning.storetype}"
         keypass="${codesigning.keypass}"
@@ -2701,14 +2714,8 @@ skip.installer property in build.properties" />
         tsaurl="http://ts.ssl.com";
         tsmode="RFC3161"
         detached="true" />
-    <!-- Copy detached signature to source tree -->
-    <copy file="${tomcat.release}/v${version}/bin/${final.name}.exe.sig"
-        tofile="res/install-win/tomcat-installer.exe.sig"/>
-    <delete file="${tomcat.release}/v${version}/bin/${final.name}.exe.sig" />
-    <!-- .exe has changed so need to redo checksums and OpenPGP signature -->
-    <delete file="${tomcat.release}/v${version}/bin/${final.name}.exe.asc" />
-    <delete file="${tomcat.release}/v${version}/bin/${final.name}.exe.sha512" 
/>
-    <hashAndSign file="${tomcat.release}/v${version}/bin/${final.name}.exe" />
+      <!-- Move detached signature to source tree -->
+      <move file="${codesigning.file_to_sign}.sig" 
tofile="res/install-win/Uninstall.exe.sig"/>
   </target>
 
   <target name="release-version-check">
diff --git a/res/install-win/tomcat.nsi b/res/install-win/tomcat.nsi
index 424eb949a1..0d37e87ffb 100644
--- a/res/install-win/tomcat.nsi
+++ b/res/install-win/tomcat.nsi
@@ -17,11 +17,7 @@
 
 Unicode true
 
-!ifdef UNINSTALLONLY
-  OutFile "tempinstaller.exe"
-!else
-  OutFile tomcat-installer.exe
-!endif
+OutFile tomcat-installer.exe
 
   ;Compression options
   CRCCheck on
@@ -117,11 +113,9 @@ Var ServiceInstallLog
   Page custom CheckUserType
   !insertmacro MUI_PAGE_FINISH
 
-  !ifdef UNINSTALLONLY
-    ;Uninstall Page order
-    !insertmacro MUI_UNPAGE_CONFIRM
-    !insertmacro MUI_UNPAGE_INSTFILES
-  !endif
+  ;Uninstall Page order
+  !insertmacro MUI_UNPAGE_CONFIRM
+  !insertmacro MUI_UNPAGE_INSTFILES
 
   ;Language
   !insertmacro MUI_LANGUAGE English
@@ -162,6 +156,9 @@ Var ServiceInstallLog
   InstType Minimum
   InstType Full
 
+  !finalize 'ant -f @BASEDIR@/build.xml -jsign-installer'
+  !uninstfinalize 'ant -f @BASEDIR@/build.xml -Dcodesigning.file_to_sign=%1 
-jsign-uninstaller'
+
   ReserveFile System.dll
   ReserveFile nsDialogs.dll
   ReserveFile tomcat-users_1.xml
@@ -200,6 +197,9 @@ Section "Core" SecTomcatCore
   SetOutPath $INSTDIR\webapps\ROOT
   File /r webapps\ROOT\*.*
 
+  ;Create uninstaller
+  WriteUninstaller "$INSTDIR\Uninstall.exe"
+
   Call configure
 
   DetailPrint "Using Jvm: $JavaHome"
@@ -338,12 +338,6 @@ Section -post
     Call createShortcuts
   ${EndIf}
 
-  !ifndef UNINSTALLONLY
-    SetOutPath $INSTDIR
-    ; this packages the signed uninstaller
-    File Uninstall.exe
-  !endif
-
   WriteRegStr HKLM "SOFTWARE\Apache Software 
Foundation\Tomcat\@VERSION_MAJOR_MINOR@\$TomcatServiceName" "InstallPath" 
$INSTDIR
   WriteRegStr HKLM "SOFTWARE\Apache Software 
Foundation\Tomcat\@VERSION_MAJOR_MINOR@\$TomcatServiceName" "Version" @VERSION@
   WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Apache 
Tomcat @VERSION_MAJOR_MINOR@ $TomcatServiceName" \
@@ -425,14 +419,6 @@ Function ReadFromConfigIni
 FunctionEnd
 
 Function .onInit
-  !ifdef UNINSTALLONLY
-    ; If UNINSTALLONLY is defined, then we aren't supposed to do anything 
except write out
-    ; the installer.  This is better than processing a command line option as 
it means
-    ; this entire code path is not present in the final (real) installer.
-    WriteUninstaller "$EXEDIR\Uninstall.exe"
-    Quit
-  !endif
-
   ${GetParameters} $R0
   ClearErrors
 
@@ -1140,7 +1126,6 @@ FunctionEnd
 ;--------------------------------
 ;Uninstaller Section
 
-!ifdef UNINSTALLONLY
   Section Uninstall
 
     ${If} $TomcatServiceName == ""
@@ -1270,6 +1255,4 @@ FunctionEnd
    FindClose $1
   FunctionEnd
 
-!endif
-
 ;eof
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 4cf51eaa67..da6bcab6aa 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -195,6 +195,10 @@
         Add <code>org.apache.juli.JsonFormatter</code> to format log as one
         line JSON documents. (remm)
       </add>
+      <add>
+        Add <code>makensis</code> as an option for building the Installer for
+        Windows on non-Windows platforms. (rjung)
+      </add>
     </changelog>
   </subsection>
 </section>


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to