source: josm/trunk/native/macosx/macos-jpackage.sh@ 19255

Last change on this file since 19255 was 19215, checked in by taylor.smock, 3 months ago

Fix #23837: Set -XX:MaxRAMPercentage to >25% of system memory

This does not currently work for WebStart, see
https://github.com/AdoptOpenJDK/IcedTea-Web/pull/954 .

As noted in the ticket, all supported MS Windows and Apple macOS machines have
4G+ of RAM. Linux machines don't have a baseline, and some have 1G or less. Where
we detect that a machine has <8G of memory in the linux start scripts, we don't
add the JVM parameters.

As a reminder to everyone reading the changelog: just because we ask for the
ability to use 75% of the system memory doesn't mean we will use all of that
memory. The JVM will free up unused memory for the rest of the system.

We additionally set the minimum memory allocation to 256m; while this can be
lower, that is for minimal amounts of data loaded. A clean JOSM install will use
99mb, for example. But once we add a minimal amount of data and a background
layer, static memory usage goes up to 161mb.

  • Property svn:executable set to *
File size: 6.9 KB
Line 
1#!/bin/bash
2
3## Expected environment, passed from GitHub secrets:
4# https://docs.github.com/en/free-pro-team@latest/actions/reference/encrypted-secrets
5# APPLE_ID_PW Password for the Apple ID
6# CERT_MACOS_P12 Certificate used for code signing, base64 encoded
7# CERT_MACOS_PW Password for that certificate
8
9set -Eeo pipefail
10
11# Don't show one time passwords
12set +x
13
14IMPORT_AND_UNLOCK_KEYCHAIN=${IMPORT_AND_UNLOCK_KEYCHAIN:-1}
15
16if [ -z "${1-}" ]
17then
18 echo "Usage: $0 josm_revision [other_arch_jdk]"
19 exit 1
20fi
21
22echo "Building JOSM.app"
23
24mkdir app
25
26if [ -z "$CERT_MACOS_P12" ] || [ -z "$CERT_MACOS_PW" ] || [ -z "$APPLE_ID_PW" ] || [ -z "$APPLE_ID_TEAM" ] || [ -z "$APPLE_ID" ]
27then
28 echo "CERT_MACOS_P12, CERT_MACOS_PW, APPLE_ID, APPLE_ID_PW, or APPLE_ID_TEAM are not set in the environment."
29 echo "A JOSM.app will be created but not signed nor notarized."
30 SIGNAPP=false
31 KEYCHAINPATH=false
32 JPACKAGEOPTIONS=""
33else
34 echo "Preparing certificates/keychain for signing…"
35
36 KEYCHAIN=build.keychain
37 KEYCHAINPATH=~/Library/Keychains/$KEYCHAIN-db
38 KEYCHAIN_PW=$(head /dev/urandom | base64 | head -c 20)
39 CERTIFICATE_P12=certificate.p12
40
41 echo "$CERT_MACOS_P12" | base64 --decode > $CERTIFICATE_P12
42 security create-keychain -p "$KEYCHAIN_PW" $KEYCHAIN
43 security default-keychain -s $KEYCHAIN
44 security unlock-keychain -p "$KEYCHAIN_PW" $KEYCHAIN
45 security import $CERTIFICATE_P12 -k $KEYCHAIN -P "$CERT_MACOS_PW" -T /usr/bin/codesign
46 security set-key-partition-list -S apple-tool:,apple: -s -k "$KEYCHAIN_PW" $KEYCHAIN
47 rm $CERTIFICATE_P12
48 SIGNAPP=true
49 echo "Signing preparation done."
50 JPACKAGEOPTIONS="--mac-sign --mac-signing-keychain $KEYCHAINPATH"
51fi
52
53set -u
54
55function do_jpackage() {
56 echo "Building app (${JAVA_HOME})"
57 # We specifically need the options to not be quoted -- we _want_ the word splitting.
58 # shellcheck disable=SC2086
59 "${JAVA_HOME}/bin/jpackage" $JPACKAGEOPTIONS -n "JOSM" --input dist --main-jar josm-custom.jar \
60 --main-class org.openstreetmap.josm.gui.MainApplication \
61 --icon ./native/macosx/JOSM.icns --type app-image --dest app \
62 --java-options "-XX:MaxRAMPercentage=75.0" \
63 --java-options "-Xms256m" \
64 --java-options "--add-modules java.scripting,java.sql,javafx.controls,javafx.media,javafx.swing,javafx.web" \
65 --java-options "--add-exports=java.base/sun.security.action=ALL-UNNAMED" \
66 --java-options "--add-exports=java.desktop/com.apple.eawt=ALL-UNNAMED" \
67 --java-options "--add-exports=java.desktop/com.sun.imageio.plugins.jpeg=ALL-UNNAMED" \
68 --java-options "--add-exports=java.desktop/com.sun.imageio.spi=ALL-UNNAMED" \
69 --java-options "--add-opens=java.base/java.lang=ALL-UNNAMED" \
70 --java-options "--add-opens=java.base/java.nio=ALL-UNNAMED" \
71 --java-options "--add-opens=java.base/jdk.internal.loader=ALL-UNNAMED" \
72 --java-options "--add-opens=java.base/jdk.internal.ref=ALL-UNNAMED" \
73 --java-options "--add-opens=java.desktop/javax.imageio.spi=ALL-UNNAMED" \
74 --java-options "--add-opens=java.desktop/javax.swing.text.html=ALL-UNNAMED" \
75 --java-options "--add-opens=java.prefs/java.util.prefs=ALL-UNNAMED" \
76 --app-version "$1" \
77 --copyright "JOSM, and all its integral parts, are released under the GNU General Public License v2 or later" \
78 --vendor "JOSM" \
79 --mac-package-identifier de.openstreetmap.josm \
80 --mac-package-signing-prefix de.openstreetmap.josm \
81 --file-associations native/file-associations/bz2.properties \
82 --file-associations native/file-associations/geojson.properties \
83 --file-associations native/file-associations/gpx.properties \
84 --file-associations native/file-associations/gz.properties \
85 --file-associations native/file-associations/jos.properties \
86 --file-associations native/file-associations/joz.properties \
87 --file-associations native/file-associations/osm.properties \
88 --file-associations native/file-associations/xz.properties \
89 --file-associations native/file-associations/zip.properties \
90 --add-modules java.compiler,java.base,java.datatransfer,java.desktop,java.logging,java.management,java.naming,java.net.http,java.prefs,java.rmi,java.scripting,java.sql,java.transaction.xa,java.xml,jdk.crypto.ec,jdk.jfr,jdk.jsobject,jdk.unsupported,jdk.unsupported.desktop,jdk.xml.dom,javafx.controls,javafx.media,javafx.swing,javafx.web
91 echo "Building done (${JAVA_HOME})."
92}
93function do_signapp() {
94 echo "Compressing app (${1})"
95 ditto -c -k --zlibCompressionLevel 9 --keepParent "app/${1}.app" "app/${1}.zip"
96 if $SIGNAPP; then
97 echo "Signing app (${1})"
98 echo "Preparing for notarization"
99 echo "Uploading to Apple"
100 xcrun notarytool submit --apple-id "$APPLE_ID" --password "$APPLE_ID_PW" --team-id "$APPLE_ID_TEAM" --wait "app/${1}.zip"
101 fi
102}
103
104function merge() {
105 if [ "$(command -v lipo)" ]; then
106 lipo -create -output "${1}" "${2}" "${3}"
107 elif [ "$(command -v llvm-lipo-15)" ]; then
108 llvm-lipo-15 -create -output "${1}" "${2}" "${3}"
109 fi
110}
111
112function copy() {
113 # Trim the root path
114 FILE="${1#*/}"
115 if [ ! -e "${2}/${FILE}" ]; then
116 # Only make directories if we aren't looking at the root files
117 if [[ "${FILE}" == *"/"* ]]; then mkdir -p "${2}/${FILE%/*}"; fi
118 if file "${1}" | grep -q 'Mach-O' ; then
119 merge "${2}/${FILE}" "${3}/${FILE}" "${4}/${FILE}"
120 if file "${1}" | grep -q 'executable'; then
121 chmod 755 "${2}/${FILE}"
122 fi
123 else
124 cp -a "${1}" "${2}/${FILE}"
125 fi
126 fi
127}
128
129function directory_iterate() {
130 while IFS= read -r -d '' file
131 do
132 copy "${file}" "${2}" "${3}" "${4}" &
133 done < <(find "${1}" -type f,l -print0)
134 wait
135}
136
137do_jpackage "${1}"
138if [ -n "${2}" ]; then
139 function get_name() {
140 echo "$("${JAVA_HOME}/bin/java" --version | head -n1 | awk '{print $2}' | awk -F'.' '{print $1}')_$(file "${JAVA_HOME}/bin/java" | awk -F' executable ' '{print $2}')"
141 }
142 first="$(get_name)"
143 JAVA_HOME="${2}" second="$(get_name)"
144 mv app/JOSM.app "app/JOSM_${first}.app"
145 JAVA_HOME="${2}" do_jpackage "${1}"
146 mv app/JOSM.app "app/JOSM_${second}.app"
147 mkdir app/JOSM.app
148 (cd app
149 directory_iterate "JOSM_${first}.app" "JOSM.app" "JOSM_${first}.app" "JOSM_${second}.app"
150 directory_iterate "JOSM_${second}.app" "JOSM.app" "JOSM_${first}.app" "JOSM_${second}.app"
151 )
152 do_signapp "JOSM_${first}"
153 do_signapp "JOSM_${second}"
154 if [ "${KEYCHAINPATH}" != "false" ]; then
155 function do_codesign() {
156 codesign --sign "FOSSGIS e.V." \
157 --force \
158 --keychain "${KEYCHAINPATH}" \
159 --timestamp \
160 --prefix "de.openstreetmap.josm" \
161 --identifier "${2}" \
162 --options runtime \
163 --entitlements "$(dirname "${BASH_SOURCE[0]}")/josm.entitlements" \
164 --verbose=4 "${1}"
165 }
166 do_codesign app/JOSM.app/Contents/runtime "com.oracle.java.de.openstreetmap.josm"
167 do_codesign app/JOSM.app/ "de.openstreetmap.josm"
168 fi
169fi
170do_signapp JOSM
Note: See TracBrowser for help on using the repository browser.