ltapilot commented on a change in pull request #178: Created Windows MSI 
installer package.
URL: https://github.com/apache/incubator-daffodil/pull/178#discussion_r255679191
 
 

 ##########
 File path: daffodil-cli/build.sbt
 ##########
 @@ -71,3 +78,188 @@ rpmRelease := {
 rpmLicense := Some(licenses.value.map { case (n: String, _) => n }.mkString(" 
and "))
 
 rpmPrefix := Some(defaultLinuxInstallLocation.value)
+
+//
+// Windows configuration
+//
+
+//
+// Here we set the variables that are supported by the SBT Native Packager 
plug-in.
+// We also get fairly aggressive in editing/modifying the XML in order
+// to control and use some specific features that are supported by WiX
+// but which are not properly suported by the SBT plug-in.
+//
+
+// Force the correct installation directory name. This overwrites
+// 'daffodil-cli', which is the directory that we invoke sbt in.
+// The SBT WiX plug-in incorrectly assumes that the directory of
+// invocation is the same name as the direcotry you eventually
+// want to install into.
+name in Windows := "Daffodil" 
+
+// The Windows packager SBT plug-in maps the maintainer variable into
+// the WiX ManufacturerFullName field. This is a very strange choice.
+// It also maps it to the manufacturer name in the installation
+// directory heirarchy. Among other things, this means it needs to be
+// short so as to not blow out the path length.
+maintainer in Windows := "Apache Daffodil Developers <dev@daffodil.apache.org>"
+
+// The Windows packager SBT plug-in maps the packageSummary variable
+// into the WiX productName field. Another strange choice. 
+packageSummary in Windows := "Daffodil"
+
+// The Windows packager SBT plug-in limits the length of the
+// packageDescription field to a single line. Originally this was a
+// full paragraph, as seen in the RPM section, above.
+packageDescription in Windows := """Apache Daffodil (incubating) is the open 
source implementation of the Data Format Description Language (DFDL)""".trim
+
+// Calculate the version number dynamically and pass it in.
+// Windows permits up to four numeric values (e.g. 2.1.5.1820)
+// where the numbers represent major, minor, patch and build
+// respectively. In RPM packaging we add 'incubating', but
+// Windows will barf on this. Here we suffix a zero (0) build
+// number for snapshot/development/debug builds. A one (1)
+// in the build number could be used to differentiate official
+// production builds that are destined for release. 
+version in Windows := {
+  val parts = version.value.split("-", 2)
+  val ver = parts(0) // removes snapshot if it exists
+  ver + ".0"
+}
+
+// Required and critical GUIDs. Ironically the ProductId is unique
+// to a given release, but UpgradeId must NEVER change! This may
+// seem conter-intuitive, but the UpgradeId is actually what ties
+// the product to it's upgrades and the product is actually unique
+// each time it is released, so there is some semblance of logic
+// to this scheme.
+wixProductUpgradeId := "4C966AFF-585E-4E17-8CC2-059FD70FEC77"
+
+// Light options. Bring in standard dialog boxes and localization.
+// The suppression of ICE61 is required as we *DO* permit
+// re-installation of the same version. Despite the presence of
+// specific XML to enable this, the WiX compiler and linker
+// complain about it unless you specifically suppress the warning.
+lightOptions := Seq(
+       "-sice:ICE61",
+       "-ext", "WixUIExtension",
+       "-cultures:en-us",
+       "-loc", ((sourceDirectory in Windows).value / 
"Product_en-us.wxl").toString
+       )
+
+// Point to the RTF license file so it will appear in the license
+// acceptance dialog box. BTW, this file was hand-sweetened to permit
+// flexible line/word wrap in support of variable display width as the
+// file will be rendered in both the (relatively narrow) dialog box
+// and ()optionally) sent to the (relatively wide) printer when the
+// user asks for hard copy.
+wixProductLicense := {
+  // Note: this target file doesn't exist until placed there by the build.
+  val targetLicense = (target in Windows).value / "LICENSE.rtf" 
+  val sourceLicense = baseDirectory.value / "bin.LICENSE"
+  // somehow convert sourceLicense into RTF and store at targetLicense
+  val rtfHeader = """{\rtf {\fonttbl {\f0 Arial;}} \f0\fs18"""
+  val rtfFooter = """}"""
+
+  val licenseLines = scala.io.Source.fromFile(sourceLicense, "UTF-8").getLines
+  val writer = new java.io.PrintWriter(targetLicense, "UTF-8")
+  writer.println(rtfHeader)
+  licenseLines.foreach { line =>
+    writer.println(line + """\line""")
+  }
+  writer.println(rtfFooter)
+  writer.close
+  Option(targetLicense)
+}
+// Use the wixFiles variable to add in the Daffodil-specific dialog
+// boxes and sequence.
+wixFiles ++= Seq(
+  (sourceDirectory in Windows).value / "WixUI_Daffodil.wxs",
+  (sourceDirectory in Windows).value / "DisclaimerDlg_Daffodil.wxs"
+)  
+
+// The SBT Native Packager plug-in assumes that we want to give the user
+// a Feature Tree to select from. One of the 'features' that the plug-in
+// offers up is a set of all shortcuts and menu links. Daffodil is
+// actually a command-line executable, so we do not include
+// configuration links as they are unnecessary. From a practical
+// standpoint the user must invoke a command shell in a window
+// before they can invoke Daffodil anyway.
+wixFeatures := {
+  val features = wixFeatures.value
+  features.filter { _.id != "AddConfigLinks"}
+}
+
+// Make sure that we don't use an MSI installer that is older than
+// version 2.0. It also fixes the comment attribute that hangs
+// out on the Package keyword. 
+wixPackageInfo := wixPackageInfo.value.copy(installerVersion = "200", comments 
= "!(loc.Comments)")
+
+// Fix the XML that is associated with the installable files and directories.
+wixProductConfig := {
+  // Pick up the generated code.
+  val pc = wixProductConfig.value
+  
+  // Replace the default headline banner and Welcome/Exit screen
+  // bitmaps with the custom ones we developed for Daffodil. 
+  val banner = <WixVariable Id="WixUIBannerBmp" Value={ ((sourceDirectory in 
Windows).value / "banner.bmp").toString } />
+  val dialog = <WixVariable Id="WixUIDialogBmp" Value={ ((sourceDirectory in 
Windows).value / "dialog.bmp").toString } />
+  
+  // Reference the Daffodil-specific User Interface (dialog box) sequence.
+  val ui = <UI><UIRef Id="WixUI_Daffodil" /></UI>
+  
+  // Make sure we abort if we are not installing on Windows 95 or later.
+  val osCondition = <Condition Message="!(loc.OS2Old)"><![CDATA[Installed OR 
(VersionNT >= 400)]]></Condition>
+
+  // Define icons (ID should not be longer than 18 chars and must end with 
".exe")
+  val icon = Seq(
+    <Icon Id="Icon.exe" SourceFile={ ((sourceDirectory in Windows).value / 
"apache-daffodil.ico").toString } />,
+       <Property Id="ARPPRODUCTICON" Value="Icon.exe" />
 
 Review comment:
   Corrected.

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


With regards,
Apache Git Services

Reply via email to