From 99874eeb34d6b3f4f891a9bf110eaa1b8f7a403d Mon Sep 17 00:00:00 2001
From: Allen Byrne <byrn@hdfgroup.org>
Date: Mon, 20 May 2024 08:28:00 -0500
Subject: [PATCH] Add the app image builds

---
 .github/workflows/ant-app.yml       | 504 ++++++++++++++++++++++++++++
 .github/workflows/ant.yml           |  12 +-
 .github/workflows/daily-build.yml   |  15 +-
 .github/workflows/release-files.yml |  43 ++-
 .github/workflows/release.yml       |  16 +-
 5 files changed, 576 insertions(+), 14 deletions(-)
 create mode 100644 .github/workflows/ant-app.yml

diff --git a/.github/workflows/ant-app.yml b/.github/workflows/ant-app.yml
new file mode 100644
index 00000000..71f37b1f
--- /dev/null
+++ b/.github/workflows/ant-app.yml
@@ -0,0 +1,504 @@
+name: hdfview ci runs
+
+# Controls when the action will run. Triggers the workflow on a schedule
+on:
+  workflow_call:
+    inputs:
+      use_hdf:
+        description: "The hdf4 base name of the binaries"
+        required: true
+        type: string
+      use_hdf5:
+        description: "The hdf5 base name of the binaries"
+        required: true
+        type: string
+      snap_name:
+        description: 'The version name of the binaries'
+        type: string
+        required: false
+        default: HDFView-99.99.99
+      file_base:
+        description: "The common base name of the source tarballs"
+        required: true
+        type: string
+      use_environ:
+        description: 'Environment to locate files'
+        type: string
+        required: true
+        default: snapshots
+    secrets:
+        APPLE_CERTS_BASE64:
+            required: true
+        APPLE_CERTS_BASE64_PASSWD:
+            required: true
+        KEYCHAIN_PASSWD:
+            required: true
+
+permissions:
+  contents: read
+
+jobs:
+  build_and_test_win:
+  # Windows w/ MSVC + CMake
+  #
+    name: "Windows MSVC CTest"
+    runs-on: windows-latest
+    steps:
+    - uses: actions/checkout@v3
+
+    - name: Set up JDK 21
+      uses: actions/setup-java@v3
+      with:
+        java-version: '21'
+        distribution: 'temurin'
+
+    - name: Enable Developer Command Prompt
+      uses: ilammy/msvc-dev-cmd@v1.13.0
+
+    - name: Get hdf4 snapshot
+      uses: dsaltares/fetch-gh-release-asset@master
+      with:
+        repo: 'HDFGroup/hdf4'
+        version: 'tags/snapshot'
+        file: '${{ inputs.use_hdf }}-win-vs2022_cl.zip'
+
+    - name: Uncompress gh binary (Win)
+      run: 7z x ${{ github.workspace }}/${{ inputs.use_hdf }}-win-vs2022_cl.zip
+
+    - name: Uncompress hdf4 binary (Win)
+      working-directory: ${{ github.workspace }}/hdf4
+      run: 7z x HDF-*-win64.zip
+      shell: bash
+
+    - name: List files for the space (Win)
+      run: |
+            ls -l ${{ github.workspace }}/hdf4
+            #ls ${{ runner.workspace }}/hdfview
+
+    - name: create hdf4 location (Win)
+      working-directory: ${{ github.workspace }}/hdf4
+      run: |
+        New-Item -Path "${{ github.workspace }}/HDF_Group/HDF" -ItemType Directory
+        Copy-Item -Path "${{ github.workspace }}/hdf4/HDF*/*" -Destination "${{ github.workspace }}/HDF_Group/HDF" -Recurse
+      shell: pwsh
+
+    - name: List files for the space (Win)
+      run: ls -l ${{ github.workspace }}/HDF_Group/HDF
+
+    - name: set hdflib name
+      id: set-hdflib-name
+      run: |
+        HDFDIR="${{ github.workspace }}/HDF_Group/HDF"
+        echo "HDFLIB_ENV=$HDFDIR" >> $GITHUB_OUTPUT
+      shell: bash
+
+    - name: Get hdf5 snapshot
+      uses: dsaltares/fetch-gh-release-asset@master
+      with:
+        repo: 'HDFGroup/hdf5'
+        version: 'tags/snapshot'
+        file: '${{ inputs.use_hdf5 }}-win-vs2022_cl.zip'
+
+    - name: Uncompress gh binary (Win)
+      run: 7z x ${{ github.workspace }}/${{ inputs.use_hdf5 }}-win-vs2022_cl.zip
+
+    - name: Uncompress hdf5 binary (Win)
+      working-directory: ${{ github.workspace }}/hdf5
+      run: 7z x HDF5-*-win64.zip
+      shell: bash
+
+    - name: List files for the space (Win)
+      run: |
+            ls -l ${{ github.workspace }}/hdf5
+            #ls ${{ runner.workspace }}/hdfview
+
+    - name: create hdf5 location (Win)
+      working-directory: ${{ github.workspace }}/hdf5
+      run: |
+        New-Item -Path "${{ github.workspace }}/HDF_Group/HDF5" -ItemType Directory
+        Copy-Item -Path "${{ github.workspace }}/hdf5/HDF*/*" -Destination "${{ github.workspace }}/HDF_Group/HDF5" -Recurse
+      shell: pwsh
+
+    - name: List files for the space (Win)
+      run: ls -l ${{ github.workspace }}/HDF_Group/HDF5
+
+    - name: set hdf5lib name
+      id: set-hdf5lib-name
+      run: |
+        HDF5DIR="${{ github.workspace }}/HDF_Group/HDF5"
+        echo "HDF5LIB_ENV=$HDF5DIR" >> $GITHUB_OUTPUT
+      shell: bash
+
+    - name: List files for the binaries (Win)
+      run: |
+            ls -l ${{ github.workspace }}/HDF_Group/HDF
+            ls -l ${{ github.workspace }}/HDF_Group/HDF5
+
+    - name: Set file base name (Windows)
+      id: set-file-base
+      run: |
+          FILE_NAME_BASE=$(echo "${{ inputs.file_base }}")
+          echo "FILE_BASE=$FILE_NAME_BASE" >> $GITHUB_OUTPUT
+          if [[ '${{ inputs.use_environ }}' == 'release' ]]
+          then
+            SOURCE_NAME_BASE=$(echo "${{ inputs.snap_name }}")
+          else
+            SOURCE_NAME_BASE=$(echo "hdfsrc")
+          fi
+          echo "SOURCE_BASE=$SOURCE_NAME_BASE" >> $GITHUB_OUTPUT
+      shell: bash
+
+      # Get files created by release script
+    - name: Get zip-tarball (Windows)
+      uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4
+      with:
+              name: zip-tarball
+              path: ${{ github.workspace }}
+
+    - name: using powershell
+      shell: pwsh
+      run: Get-Location
+
+    - name: List files for the space (Windows)
+      run: |
+              Get-ChildItem -Path ${{ github.workspace }}
+              Get-ChildItem -Path ${{ runner.workspace }}
+      shell: pwsh
+
+    - name: Uncompress source (Windows)
+      working-directory: ${{ github.workspace }}
+      run: 7z x ${{ steps.set-file-base.outputs.FILE_BASE }}.zip
+      shell: bash
+
+    - name: Build with Ant
+      env:
+        HDFLIBS: ${{ steps.set-hdflib-name.outputs.HDFLIB_ENV }}
+        HDF5LIBS: ${{ steps.set-hdf5lib-name.outputs.HDF5LIB_ENV }}
+      run: |
+        ant -noinput -buildfile build.xml binaryAppPackage
+      shell: bash
+
+    - name: Rename snapshot binary base name
+      id: ren-basename
+      if: ${{ (inputs.use_environ == 'snapshots') }}
+      run: |
+        cd build/dist
+        mv ${{ inputs.snap_name }}-win64.zip ${{ steps.set-file-base.outputs.FILE_BASE }}App-win64.zip
+      shell: bash
+
+    - name: List files for the space (Windows)
+      run: |
+            Get-ChildItem -Path ${{ github.workspace }}/build/dist
+            Get-ChildItem -Path ${{ github.workspace }}
+      shell: pwsh
+
+    # Save files created by ctest script
+    - name: Save published binary (Win)
+      uses: actions/upload-artifact@v4
+      with:
+            name: zip-win-vs2022-app-binary
+            path: ${{ github.workspace }}/build/dist/${{ steps.set-file-base.outputs.FILE_BASE }}App-win64.zip
+            if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn`
+
+    - name: Test with Ant
+      env:
+        HDFLIBS: ${{ steps.set-hdflib-name.outputs.HDFLIB_ENV }}
+        HDF5LIBS: ${{ steps.set-hdf5lib-name.outputs.HDF5LIB_ENV }}
+      run: ant -noinput -buildfile build.xml junit
+
+  build_and_test_linux:
+  # Linux (Ubuntu) w/ gcc + CMake
+  #
+    name: "Ubuntu gcc CMake"
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@v3
+
+    - name: Set up JDK 21
+      uses: actions/setup-java@v3
+      with:
+        java-version: '21'
+        distribution: 'temurin'
+
+    - name: Get hdf4 snapshot
+      uses: dsaltares/fetch-gh-release-asset@master
+      with:
+        repo: 'HDFGroup/hdf4'
+        version: 'tags/snapshot'
+        file: '${{ inputs.use_hdf }}-ubuntu-2204_gcc.tar.gz'
+
+    - name: List files for the space (Linux)
+      run: |
+            ls -l ${{ github.workspace }}
+            ls ${{ runner.workspace }}
+
+    - name: Uncompress gh binary (Linux)
+      run: tar -zxvf ${{ github.workspace }}/${{ inputs.use_hdf }}-ubuntu-2204_gcc.tar.gz
+
+    - name: Uncompress hdf4 binary (Linux)
+      run: |
+          cd "${{ github.workspace }}/hdf4"
+          tar -zxvf ${{ github.workspace }}/hdf4/HDF-*-Linux.tar.gz --strip-components 1
+
+    - name: set hdflib name
+      id: set-hdflib-name
+      run: |
+        HDFDIR=${{ github.workspace }}/hdf4/HDF_Group/HDF/
+        FILE_NAME_HDF=$(ls ${{ github.workspace }}/hdf4/HDF_Group/HDF)
+        echo "HDFLIB_ENV=$HDFDIR$FILE_NAME_HDF" >> $GITHUB_OUTPUT
+
+    - name: Get hdf5 release
+      uses: dsaltares/fetch-gh-release-asset@master
+      with:
+        repo: 'HDFGroup/hdf5'
+        version: 'tags/snapshot'
+        file: '${{ inputs.use_hdf5 }}-ubuntu-2204_gcc.tar.gz'
+
+    - name: List files for the space (Linux)
+      run: |
+            ls -l ${{ github.workspace }}
+            ls ${{ runner.workspace }}
+
+    - name: Uncompress gh binary (Linux)
+      run: tar -zxvf ${{ github.workspace }}/${{ inputs.use_hdf5 }}-ubuntu-2204_gcc.tar.gz
+
+    - name: Uncompress hdf5 binary (Linux)
+      run:  |
+          cd "${{ github.workspace }}/hdf5"
+          tar -zxvf ${{ github.workspace }}/hdf5/HDF5-*-Linux.tar.gz --strip-components 1
+
+    - name: set hdf5lib name
+      id: set-hdf5lib-name
+      run: |
+        HDF5DIR=${{ github.workspace }}/hdf5/HDF_Group/HDF5/
+        FILE_NAME_HDF5=$(ls ${{ github.workspace }}/hdf5/HDF_Group/HDF5)
+        echo "HDF5LIB_ENV=$HDF5DIR$FILE_NAME_HDF5" >> $GITHUB_OUTPUT
+
+    - name: List files for the binaries (Linux)
+      run: |
+            ls -l ${{ github.workspace }}/hdf4/HDF_Group/HDF
+            ls -l ${{ github.workspace }}/hdf5/HDF_Group/HDF5
+
+    - name: Set file base name (Linux)
+      id: set-file-base
+      run: |
+          FILE_NAME_BASE=$(echo "${{ inputs.file_base }}")
+          echo "FILE_BASE=$FILE_NAME_BASE" >> $GITHUB_OUTPUT
+          if [[ '${{ inputs.use_environ }}' == 'release' ]]
+          then
+            SOURCE_NAME_BASE=$(echo "${{ inputs.snap_name }}")
+          else
+            SOURCE_NAME_BASE=$(echo "hdfsrc")
+          fi
+          echo "SOURCE_BASE=$SOURCE_NAME_BASE" >> $GITHUB_OUTPUT
+
+      # Get files created by release script
+    - name: Get tgz-tarball (Linux)
+      uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4
+      with:
+            name: tgz-tarball
+            path: ${{ github.workspace }}
+
+    - name: List files for the space (Linux)
+      run: |
+            ls -l ${{ github.workspace }}
+            ls ${{ runner.workspace }}
+
+    - name: Uncompress source (Linux)
+      run: tar -zxvf ${{ github.workspace }}/${{ steps.set-file-base.outputs.FILE_BASE }}.tar.gz
+
+    - name: Build with Ant
+      env:
+        HDFLIBS: ${{ steps.set-hdflib-name.outputs.HDFLIB_ENV }}
+        HDF5LIBS: ${{ steps.set-hdf5lib-name.outputs.HDF5LIB_ENV }}
+      run: ant -noinput -buildfile build.xml binaryAppPackage
+
+    - name: Rename snapshot binary base name
+      id: ren-basename
+      if: ${{ (inputs.use_environ == 'snapshots') }}
+      run: |
+        cd build/dist
+        mv ${{ inputs.snap_name }}-Linux-x86_64.tar.gz ${{ steps.set-file-base.outputs.FILE_BASE }}App-Linux-x86_64.tar.gz
+      shell: bash
+
+    - name: List files in the space (Linux)
+      run: |
+            ls ${{ github.workspace }}/build/dist
+            ls -l ${{ runner.workspace }}
+
+    # Save files created by ctest script
+    - name: Save published binary (Linux)
+      uses: actions/upload-artifact@v4
+      with:
+            name: tgz-ubuntu-2204-app-binary
+            path: ${{ github.workspace }}/build/dist/${{ steps.set-file-base.outputs.FILE_BASE }}App-Linux-x86_64.tar.gz
+            if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn`
+
+    - name: Test with Ant
+      env:
+        HDFLIBS: ${{ steps.set-hdflib-name.outputs.HDFLIB_ENV }}
+        HDF5LIBS: ${{ steps.set-hdf5lib-name.outputs.HDF5LIB_ENV }}
+      run: ant -noinput -buildfile build.xml junit 
+
+  build_and_test_mac:
+  # mac (osx) w/ clang + ant
+  #
+    name: "mac clang CMake"
+    runs-on: macos-13
+    #if: false
+    steps:
+    - uses: actions/checkout@v3
+
+    - name: Install the Apple certificate and provisioning profile
+      shell: bash
+      env:
+        BUILD_CERTIFICATE_BASE64: ${{ secrets.APPLE_CERTS_BASE64 }}
+        P12_PASSWORD: ${{ secrets.APPLE_CERTS_BASE64_PASSWD }}
+        KEYCHAIN_PASSWD: ${{ secrets.KEYCHAIN_PASSWD }}
+      run: |
+          # create variables
+          CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
+          KEYCHAIN_FILE=app-signing
+          # import certificate from secrets
+          echo $BUILD_CERTIFICATE_BASE64 | base64 --decode > $CERTIFICATE_PATH
+          security -v create-keychain -p $KEYCHAIN_PASSWD $KEYCHAIN_FILE
+          security -v list-keychain -d user -s $KEYCHAIN_FILE
+          security -v list-keychains
+          security -v set-keychain-settings -lut 21600 $KEYCHAIN_FILE
+          security -v unlock-keychain -p $KEYCHAIN_PASSWD $KEYCHAIN_FILE
+          # import certificate to keychain
+          security -v import $CERTIFICATE_PATH -P $P12_PASSWORD -A -t cert -f pkcs12 -k $KEYCHAIN_FILE
+          security -v set-key-partition-list -S apple-tool:,codesign:,apple: -k $KEYCHAIN_PASSWD $KEYCHAIN_FILE
+
+    - name: Set up JDK 21
+      uses: actions/setup-java@v3
+      with:
+        java-version: '21'
+        distribution: 'temurin'
+
+    - name: Get hdf4 release
+      uses: dsaltares/fetch-gh-release-asset@master
+      with:
+        repo: 'HDFGroup/hdf4'
+        version: 'tags/snapshot'
+        file: '${{ inputs.use_hdf }}-osx.tar.gz'
+
+    - name: List files for the space (mac)
+      run: |
+            ls -l ${{ github.workspace }}
+            ls ${{ runner.workspace }}
+
+    - name: Uncompress gh binary (mac)
+      run: tar -zxvf ${{ github.workspace }}/${{ inputs.use_hdf }}-osx.tar.gz
+
+    - name: Uncompress hdf4 binary (mac)
+      run: |
+          cd "${{ github.workspace }}/hdf4"
+          tar -zxvf ${{ github.workspace }}/hdf4/HDF-*-Darwin.tar.gz --strip-components 1
+
+    - name: set hdflib name
+      id: set-hdflib-name
+      run: |
+        HDFDIR=${{ github.workspace }}/hdf4/HDF_Group/HDF/
+        FILE_NAME_HDF=$(ls ${{ github.workspace }}/hdf4/HDF_Group/HDF)
+        echo "HDFLIB_ENV=$HDFDIR$FILE_NAME_HDF" >> $GITHUB_OUTPUT
+
+    - name: Get hdf5 release
+      uses: dsaltares/fetch-gh-release-asset@master
+      with:
+        repo: 'HDFGroup/hdf5'
+        version: 'tags/snapshot'
+        file: '${{ inputs.use_hdf5 }}-osx.tar.gz'
+
+    - name: List files for the space (mac)
+      run: |
+            ls -l ${{ github.workspace }}
+            ls ${{ runner.workspace }}
+
+    - name: Uncompress gh binary (mac)
+      run: tar -zxvf ${{ github.workspace }}/${{ inputs.use_hdf5 }}-osx.tar.gz
+
+    - name: Uncompress hdf5 binary (mac)
+      run:  |
+          cd "${{ github.workspace }}/hdf5"
+          tar -zxvf ${{ github.workspace }}/hdf5/HDF5-*-Darwin.tar.gz --strip-components 1
+
+    - name: set hdf5lib name
+      id: set-hdf5lib-name
+      run: |
+        HDF5DIR=${{ github.workspace }}/hdf5/HDF_Group/HDF5/
+        FILE_NAME_HDF5=$(ls ${{ github.workspace }}/hdf5/HDF_Group/HDF5)
+        echo "HDF5LIB_ENV=$HDF5DIR$FILE_NAME_HDF5" >> $GITHUB_OUTPUT
+
+    - name: List files for the binaries (mac)
+      run: |
+            ls -l ${{ github.workspace }}/hdf4/HDF_Group/HDF
+            ls -l ${{ github.workspace }}/hdf5/HDF_Group/HDF5
+
+    - name: Set file base name (mac)
+      id: set-file-base
+      run: |
+          FILE_NAME_BASE=$(echo "${{ inputs.file_base }}")
+          echo "FILE_BASE=$FILE_NAME_BASE" >> $GITHUB_OUTPUT
+          if [[ '${{ inputs.use_environ }}' == 'release' ]]
+          then
+            SOURCE_NAME_BASE=$(echo "${{ inputs.snap_name }}")
+          else
+            SOURCE_NAME_BASE=$(echo "hdfsrc")
+          fi
+          echo "SOURCE_BASE=$SOURCE_NAME_BASE" >> $GITHUB_OUTPUT
+
+      # Get files created by release script
+    - name: Get tgz-tarball (mac)
+      uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4
+      with:
+            name: tgz-tarball
+            path: ${{ github.workspace }}
+
+    - name: List files for the space (mac)
+      run: |
+            ls -l ${{ github.workspace }}
+            ls ${{ runner.workspace }}
+
+    - name: Uncompress source (mac)
+      run: tar -zxvf ${{ github.workspace }}/${{ steps.set-file-base.outputs.FILE_BASE }}.tar.gz
+
+    - name: Build with Ant
+      env:
+        HDFLIBS: ${{ steps.set-hdflib-name.outputs.HDFLIB_ENV }}
+        HDF5LIBS: ${{ steps.set-hdf5lib-name.outputs.HDF5LIB_ENV }}
+        KEYCHAIN_PASSWD: ${{ secrets.KEYCHAIN_PASSWD }}
+        KEYCHAIN_NAME: app-signing
+        SIGNER: ${{ vars.SIGNER }}
+        NOTARY_USER: ${{ vars.NOTARY_USER }}
+        NOTARY_KEY: ${{ vars.NOTARY_KEY }}
+      run: ant -noinput -buildfile build.xml binaryAppPackage
+
+    - name: Rename snapshot binary base name
+      id: ren-basename
+      if: ${{ (inputs.use_environ == 'snapshots') }}
+      run: |
+        cd build/dist
+        mv ${{ inputs.snap_name }}-Darwin.tar.gz ${{ steps.set-file-base.outputs.FILE_BASE }}App-Darwin.tar.gz
+      shell: bash
+
+    - name: List files in the space (mac)
+      run: |
+            ls ${{ github.workspace }}/build/dist
+            ls -l ${{ runner.workspace }}
+
+    # Save files created by ctest script
+    - name: Save published App-binary (mac)
+      uses: actions/upload-artifact@v4
+      with:
+            name: tgz-osx-app-binary
+            path: ${{ github.workspace }}/build/dist/${{ steps.set-file-base.outputs.FILE_BASE }}App-Darwin.tar.gz
+            if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn`
+
+    - name: Test with Ant
+      env:
+        HDFLIBS: ${{ steps.set-hdflib-name.outputs.HDFLIB_ENV }}
+        HDF5LIBS: ${{ steps.set-hdf5lib-name.outputs.HDF5LIB_ENV }}
+      run: ant -noinput -buildfile build.xml junit 
+
+
diff --git a/.github/workflows/ant.yml b/.github/workflows/ant.yml
index c1fa56e9..9270a720 100644
--- a/.github/workflows/ant.yml
+++ b/.github/workflows/ant.yml
@@ -341,7 +341,7 @@ jobs:
       run: ant -noinput -buildfile build.xml junit 
 
   build_and_test_mac:
-  # mac (osx12) w/ clang + ant
+  # mac (osx) w/ clang + ant
   #
     name: "mac clang CMake"
     runs-on: macos-13
@@ -381,7 +381,7 @@ jobs:
       with:
         repo: 'HDFGroup/hdf4'
         version: 'tags/snapshot'
-        file: '${{ inputs.use_hdf }}-osx12.tar.gz'
+        file: '${{ inputs.use_hdf }}-osx.tar.gz'
 
     - name: List files for the space (mac)
       run: |
@@ -389,7 +389,7 @@ jobs:
             ls ${{ runner.workspace }}
 
     - name: Uncompress gh binary (mac)
-      run: tar -zxvf ${{ github.workspace }}/${{ inputs.use_hdf }}-osx12.tar.gz
+      run: tar -zxvf ${{ github.workspace }}/${{ inputs.use_hdf }}-osx.tar.gz
 
     - name: Uncompress hdf4 binary (mac)
       run: |
@@ -408,7 +408,7 @@ jobs:
       with:
         repo: 'HDFGroup/hdf5'
         version: 'tags/snapshot'
-        file: '${{ inputs.use_hdf5 }}-osx12.tar.gz'
+        file: '${{ inputs.use_hdf5 }}-osx.tar.gz'
 
     - name: List files for the space (mac)
       run: |
@@ -416,7 +416,7 @@ jobs:
             ls ${{ runner.workspace }}
 
     - name: Uncompress gh binary (mac)
-      run: tar -zxvf ${{ github.workspace }}/${{ inputs.use_hdf5 }}-osx12.tar.gz
+      run: tar -zxvf ${{ github.workspace }}/${{ inputs.use_hdf5 }}-osx.tar.gz
 
     - name: Uncompress hdf5 binary (mac)
       run:  |
@@ -491,7 +491,7 @@ jobs:
     - name: Save published binary (mac)
       uses: actions/upload-artifact@v4
       with:
-            name: tgz-osx12-binary
+            name: tgz-osx-binary
             path: ${{ github.workspace }}/build/dist/${{ steps.set-file-base.outputs.FILE_BASE }}-Darwin.tar.gz
             if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn`
 
diff --git a/.github/workflows/daily-build.yml b/.github/workflows/daily-build.yml
index c9a32e2e..eb0cb83f 100644
--- a/.github/workflows/daily-build.yml
+++ b/.github/workflows/daily-build.yml
@@ -86,8 +86,21 @@ jobs:
       APPLE_CERTS_BASE64_PASSWD: ${{ secrets.APPLE_CERTS_BASE64_PASSWD }}
       KEYCHAIN_PASSWD: ${{ secrets.KEYCHAIN_PASSWD }}
 
+  call-workflow-ant-app:
+    needs: [get-base-names, call-workflow-tarball]
+    uses: ./.github/workflows/ant-app.yml
+    with:
+      file_base: ${{ needs.call-workflow-tarball.outputs.file_base }}
+      use_hdf: ${{ needs.get-base-names.outputs.hdf4-name }}
+      use_hdf5: ${{ needs.get-base-names.outputs.hdf5-name }}
+      use_environ: snapshots
+    secrets:      
+      APPLE_CERTS_BASE64: ${{ secrets.APPLE_CERTS_BASE64 }}
+      APPLE_CERTS_BASE64_PASSWD: ${{ secrets.APPLE_CERTS_BASE64_PASSWD }}
+      KEYCHAIN_PASSWD: ${{ secrets.KEYCHAIN_PASSWD }}
+
   call-workflow-release:
-    needs: [get-base-names, call-workflow-tarball, call-workflow-ant]
+    needs: [get-base-names, call-workflow-tarball, call-workflow-ant, call-workflow-ant-app]
     permissions:
       contents: write # In order to allow tag creation
     uses: ./.github/workflows/release-files.yml
diff --git a/.github/workflows/release-files.yml b/.github/workflows/release-files.yml
index f69e7fd4..1e4021c0 100644
--- a/.github/workflows/release-files.yml
+++ b/.github/workflows/release-files.yml
@@ -88,18 +88,18 @@ jobs:
               name: zip-tarball
               path: ${{ github.workspace }}
 
-      # Get files created by cmake-ctest script
+      # Get files created by ant script
       - name: Get published binary (Windows)
         uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4
         with:
               name: zip-win-vs2022-binary
               path: ${{ github.workspace }}
 
-#      - name: Get published binary (MacOS)
-#        uses: actions/download-artifact@v3
-#        with:
-#              name: tgz-osx12-binary
-#              path: ${{ github.workspace }}
+      - name: Get published binary (MacOS)
+        uses: actions/download-artifact@v3
+        with:
+              name: tgz-osx-binary
+              path: ${{ github.workspace }}
 
       - name: Get published binary (Linux)
         uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4
@@ -107,6 +107,25 @@ jobs:
               name: tgz-ubuntu-2204-binary
               path: ${{ github.workspace }}
 
+      # Get files created by ant-app script
+      - name: Get published app binary (Windows)
+        uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4
+        with:
+              name: zip-win-vs2022-app-binary
+              path: ${{ github.workspace }}
+      
+      - name: Get published app binary (MacOS)
+        uses: actions/download-artifact@v3
+        with:
+              name: tgz-osx-app-binary
+              path: ${{ github.workspace }}
+      
+      - name: Get published app binary (Linux)
+        uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4
+        with:
+              name: tgz-ubuntu-2204-app-binary
+              path: ${{ github.workspace }}
+
       - name: List files for the space
         run: |
             ls -l ${{ github.workspace }}
@@ -118,6 +137,10 @@ jobs:
           sha256sum ${{ steps.get-file-base.outputs.FILE_BASE }}.zip >> sha256sums.txt
           sha256sum ${{ steps.get-file-base.outputs.FILE_BASE }}-Linux-x86_64.tar.gz >> sha256sums.txt
           sha256sum ${{ steps.get-file-base.outputs.FILE_BASE }}-win64.zip >> sha256sums.txt
+          sha256sum ${{ steps.get-file-base.outputs.FILE_BASE }}-osx.zip >> sha256sums.txt
+          sha256sum ${{ steps.get-file-base.outputs.FILE_BASE }}App-Linux-x86_64.tar.gz >> sha256sums.txt
+          sha256sum ${{ steps.get-file-base.outputs.FILE_BASE }}App-win64.zip >> sha256sums.txt
+          sha256sum ${{ steps.get-file-base.outputs.FILE_BASE }}App-osx.zip >> sha256sums.txt
 
       - name: Store snapshot name
         run: |
@@ -146,6 +169,10 @@ jobs:
               ${{ steps.get-file-base.outputs.FILE_BASE }}.zip
               ${{ steps.get-file-base.outputs.FILE_BASE }}-Linux-x86_64.tar.gz
               ${{ steps.get-file-base.outputs.FILE_BASE }}-win64.zip
+              ${{ steps.get-file-base.outputs.FILE_BASE }}-osx.zip
+              ${{ steps.get-file-base.outputs.FILE_BASE }}App-Linux-x86_64.tar.gz
+              ${{ steps.get-file-base.outputs.FILE_BASE }}App-win64.zip
+              ${{ steps.get-file-base.outputs.FILE_BASE }}App-osx.zip
               if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn`
 
       - name: Release tag
@@ -160,6 +187,10 @@ jobs:
               ${{ steps.get-file-base.outputs.FILE_BASE }}.zip
               ${{ steps.get-file-base.outputs.FILE_BASE }}-Linux-x86_64.tar.gz
               ${{ steps.get-file-base.outputs.FILE_BASE }}-win64.zip
+              ${{ steps.get-file-base.outputs.FILE_BASE }}-osx.zip
+              ${{ steps.get-file-base.outputs.FILE_BASE }}App-Linux-x86_64.tar.gz
+              ${{ steps.get-file-base.outputs.FILE_BASE }}App-win64.zip
+              ${{ steps.get-file-base.outputs.FILE_BASE }}App-osx.zip
               if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn`
 
       - name: List files for the space (Linux)
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 805c5b61..9541b117 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -64,8 +64,22 @@ jobs:
       APPLE_CERTS_BASE64_PASSWD: ${{ secrets.APPLE_CERTS_BASE64_PASSWD }}
       KEYCHAIN_PASSWD: ${{ secrets.KEYCHAIN_PASSWD }}
 
+  call-workflow-ant-app:
+    needs: [log-the-inputs, call-workflow-tarball]
+    uses: ./.github/workflows/ant-app.yml
+    with:
+      use_hdf: ${{ needs.log-the-inputs.outputs.rel4_tag }}
+      use_hdf5: ${{ needs.log-the-inputs.outputs.rel5_tag }}
+      file_base: ${{ needs.create-files-ant.outputs.file_base }}
+      snap_name: hdfview-${{ needs.call-workflow-tarball.outputs.source_base }}
+      use_environ: release
+    secrets:      
+      APPLE_CERTS_BASE64: ${{ secrets.APPLE_CERTS_BASE64 }}
+      APPLE_CERTS_BASE64_PASSWD: ${{ secrets.APPLE_CERTS_BASE64_PASSWD }}
+      KEYCHAIN_PASSWD: ${{ secrets.KEYCHAIN_PASSWD }}
+
   call-workflow-release:
-    needs: [log-the-inputs, call-workflow-tarball, call-workflow-ant]
+    needs: [log-the-inputs, call-workflow-tarball, call-workflow-ant, call-workflow-ant-app]
     permissions:
       contents: write # In order to allow tag creation
     uses: ./.github/workflows/release-files.yml