# HG changeset patch # User herrick # Date 1568304180 14400 # Node ID 69465ef51b0c5a7b2b7d3bbca819d44fc428f241 # Parent 93b8c1305de2486acdd0b5ee803be66d9ee6304d 8230653: jpackage error on macOS system without xcode Submitted-by: almatvee Reviewed-by: herrick, asemenyuk diff -r 93b8c1305de2 -r 69465ef51b0c src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacAppBundler.java --- a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacAppBundler.java Thu Sep 12 10:46:10 2019 -0400 +++ b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacAppBundler.java Thu Sep 12 12:03:00 2019 -0400 @@ -29,8 +29,6 @@ import java.io.IOException; import java.math.BigInteger; import java.text.MessageFormat; -import java.util.Arrays; -import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Optional; @@ -278,6 +276,20 @@ I18N.getString("error.explicit-sign-no-cert"), I18N.getString("error.explicit-sign-no-cert.advice")); } + + // Signing will not work without Xcode with command line developer tools + try { + ProcessBuilder pb = new ProcessBuilder("xcrun", "--help"); + Process p = pb.start(); + int code = p.waitFor(); + if (code != 0) { + throw new ConfigException( + I18N.getString("error.no.xcode.signing"), + I18N.getString("error.no.xcode.signing.advice")); + } + } catch (IOException | InterruptedException ex) { + throw new ConfigException(ex); + } } return true; diff -r 93b8c1305de2 -r 69465ef51b0c src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacDmgBundler.java --- a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacDmgBundler.java Thu Sep 12 10:46:10 2019 -0400 +++ b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacDmgBundler.java Thu Sep 12 12:03:00 2019 -0400 @@ -217,13 +217,32 @@ String typicalPaths[] = {"/Developer/Tools/SetFile", "/usr/bin/SetFile", "/Developer/usr/bin/SetFile"}; + String setFilePath = null; for (String path: typicalPaths) { File f = new File(path); if (f.exists() && f.canExecute()) { - return path; + setFilePath = path; + break; } } + // Validate SetFile, if Xcode is not installed it will run, but exit with error + // code + if (setFilePath != null) { + try { + ProcessBuilder pb = new ProcessBuilder(setFilePath, "-h"); + Process p = pb.start(); + int code = p.waitFor(); + if (code == 0) { + return setFilePath; + } + } catch (Exception ignored) {} + + // No need for generic find attempt. We found it, but it does not work. + // Probably due to missing xcode. + return null; + } + // generic find attempt try { ProcessBuilder pb = new ProcessBuilder("xcrun", "-find", "SetFile"); @@ -340,8 +359,7 @@ Log.verbose("Cannot enable custom icon using SetFile utility"); } } else { - Log.verbose( - "Skip enabling custom icon as SetFile utility is not found"); + Log.verbose(I18N.getString("message.setfile.dmg")); } // Detach the temporary image diff -r 93b8c1305de2 -r 69465ef51b0c src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources.properties --- a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources.properties Thu Sep 12 10:46:10 2019 -0400 +++ b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources.properties Thu Sep 12 12:03:00 2019 -0400 @@ -42,6 +42,8 @@ error.no-pkg-signing-key=No Mac App Store Installer Signing Key error.no-pkg-signing-key.advice=Install your app signing keys into your Mac Keychain using XCode. error.certificate.expired=Error: Certificate expired {0} +error.no.xcode.signing=Xcode with command line developer tools is required for signing +error.no.xcode.signing.advice=Install Xcode with command line developer tools. resource.bundle-config-file=Bundle config file resource.app-info-plist=Application Info.plist @@ -86,4 +88,4 @@ message.preparing-scripts=Preparing package scripts. message.preparing-distribution-dist=Preparing distribution.dist: {0}. message.signing.pkg=Warning: For signing PKG, you might need to set "Always Trust" for your certificate using "Keychain Access" tool. - +message.setfile.dmg=Setting custom icon on DMG file skipped because 'SetFile' utility was not found. Installing Xcode with Command Line Tools should resolve this issue. diff -r 93b8c1305de2 -r 69465ef51b0c src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_ja.properties --- a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_ja.properties Thu Sep 12 10:46:10 2019 -0400 +++ b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_ja.properties Thu Sep 12 12:03:00 2019 -0400 @@ -42,6 +42,8 @@ error.no-pkg-signing-key=No Mac App Store Installer Signing Key error.no-pkg-signing-key.advice=Install your app signing keys into your Mac Keychain using XCode. error.certificate.expired=Error: Certificate expired {0} +error.no.xcode.signing=Xcode with command line developer tools is required for signing +error.no.xcode.signing.advice=Install Xcode with command line developer tools. resource.bundle-config-file=Bundle config file resource.app-info-plist=Application Info.plist @@ -86,4 +88,4 @@ message.preparing-scripts=Preparing package scripts. message.preparing-distribution-dist=Preparing distribution.dist: {0}. message.signing.pkg=Warning: For signing PKG, you might need to set "Always Trust" for your certificate using "Keychain Access" tool. - +message.setfile.dmg=Setting custom icon on DMG file skipped because 'SetFile' utility was not found. Installing Xcode with Command Line Tools should resolve this issue. diff -r 93b8c1305de2 -r 69465ef51b0c src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_zh_CN.properties --- a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_zh_CN.properties Thu Sep 12 10:46:10 2019 -0400 +++ b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_zh_CN.properties Thu Sep 12 12:03:00 2019 -0400 @@ -42,6 +42,8 @@ error.no-pkg-signing-key=No Mac App Store Installer Signing Key error.no-pkg-signing-key.advice=Install your app signing keys into your Mac Keychain using XCode. error.certificate.expired=Error: Certificate expired {0} +error.no.xcode.signing=Xcode with command line developer tools is required for signing +error.no.xcode.signing.advice=Install Xcode with command line developer tools. resource.bundle-config-file=Bundle config file resource.app-info-plist=Application Info.plist @@ -86,4 +88,4 @@ message.preparing-scripts=Preparing package scripts. message.preparing-distribution-dist=Preparing distribution.dist: {0}. message.signing.pkg=Warning: For signing PKG, you might need to set "Always Trust" for your certificate using "Keychain Access" tool. - +message.setfile.dmg=Setting custom icon on DMG file skipped because 'SetFile' utility was not found. Installing Xcode with Command Line Tools should resolve this issue.