Skip to content

Commit

Permalink
tools, build: refactor macOS installer
Browse files Browse the repository at this point in the history
Creates macOS pkg installer by using `pkgbuild` and `productbuild`.
Removes previous npm installation before installing npm.
Packages carry correct version attributes.
Support for intl installer features, defaults to `en`.
Fancy formatted license.
Renamed `osx` references to `macOS`.
Optional installation of npm.

PR-URL: #15179
Fixes: #15012
Refs: #5656
Refs: #2571
Refs: #7097
Reviewed-By: Lance Ball <lball@redhat.com>
Reviewed-By: Daijiro Wachi <daijiro.wachi@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
  • Loading branch information
jpwesselink authored and MylesBorins committed Oct 3, 2017
1 parent 5b21109 commit 7e8c0fd
Show file tree
Hide file tree
Showing 12 changed files with 119 additions and 122 deletions.
3 changes: 1 addition & 2 deletions .gitignore
Expand Up @@ -69,11 +69,9 @@ ipch/
/config_fips.gypi
*-nodegyp*
/gyp-mac-tool
/dist-osx
/npm.wxs
/tools/msvs/npm.wixobj
/tools/msvs/genfiles/
/tools/osx-pkg.pmdoc/index.xml
/test/addons/??_*/
email.md
deps/v8-*
Expand Down Expand Up @@ -101,6 +99,7 @@ deps/npm/node_modules/.bin/

# build/release artifacts
/*.tar.*
/*.pkg
/SHASUMS*.txt*

# test artifacts
Expand Down
57 changes: 43 additions & 14 deletions Makefile
Expand Up @@ -673,8 +673,7 @@ BINARYTAR=$(BINARYNAME).tar
XZ=$(shell which xz > /dev/null 2>&1; echo $$?)
XZ_COMPRESSION ?= 9e
PKG=$(TARNAME).pkg
PACKAGEMAKER ?= /Developer/Applications/Utilities/PackageMaker.app/Contents/MacOS/PackageMaker
PKGDIR=out/dist-osx
MACOSOUTDIR=out/macos

release-only:
@if [ "$(DISTTYPE)" != "nightly" ] && [ "$(DISTTYPE)" != "next-nightly" ] && \
Expand Down Expand Up @@ -709,24 +708,54 @@ release-only:
fi

$(PKG): release-only
$(RM) -r $(PKGDIR)
$(RM) -r out/deps out/Release
$(RM) -r $(MACOSOUTDIR)
mkdir -p $(MACOSOUTDIR)/installer/productbuild
cat tools/macos-installer/productbuild/distribution.xml.tmpl \
| sed -E "s/\\{nodeversion\\}/$(FULLVERSION)/g" \
| sed -E "s/\\{npmversion\\}/$(NPMVERSION)/g" \
>$(MACOSOUTDIR)/installer/productbuild/distribution.xml ; \

@for dirname in tools/macos-installer/productbuild/Resources/*/; do \
lang=$$(basename $$dirname) ; \
mkdir -p $(MACOSOUTDIR)/installer/productbuild/Resources/$$lang ; \
printf "Found localization directory $$dirname\n" ; \
cat $$dirname/welcome.html.tmpl \
| sed -E "s/\\{nodeversion\\}/$(FULLVERSION)/g" \
| sed -E "s/\\{npmversion\\}/$(NPMVERSION)/g" \
>$(MACOSOUTDIR)/installer/productbuild/Resources/$$lang/welcome.html ; \
cat $$dirname/conclusion.html.tmpl \
| sed -E "s/\\{nodeversion\\}/$(FULLVERSION)/g" \
| sed -E "s/\\{npmversion\\}/$(NPMVERSION)/g" \
>$(MACOSOUTDIR)/installer/productbuild/Resources/$$lang/conclusion.html ; \
done
$(PYTHON) ./configure \
--dest-cpu=x64 \
--tag=$(TAG) \
--release-urlbase=$(RELEASE_URLBASE) \
$(CONFIG_FLAGS) $(BUILD_RELEASE_FLAGS)
$(MAKE) install V=$(V) DESTDIR=$(PKGDIR)
SIGN="$(CODESIGN_CERT)" PKGDIR="$(PKGDIR)/usr/local" bash \
$(MAKE) install V=$(V) DESTDIR=$(MACOSOUTDIR)/dist/node
SIGN="$(CODESIGN_CERT)" PKGDIR="$(MACOSOUTDIR)/dist/node/usr/local" bash \
tools/osx-codesign.sh
cat tools/osx-pkg.pmdoc/index.xml.tmpl \
| sed -E "s/\\{nodeversion\\}/$(FULLVERSION)/g" \
| sed -E "s/\\{npmversion\\}/$(NPMVERSION)/g" \
> tools/osx-pkg.pmdoc/index.xml
$(PACKAGEMAKER) \
--id "org.nodejs.pkg" \
--doc tools/osx-pkg.pmdoc \
--out $(PKG)
mkdir -p $(MACOSOUTDIR)/dist/npm/usr/local/lib/node_modules
mkdir -p $(MACOSOUTDIR)/pkgs
mv $(MACOSOUTDIR)/dist/node/usr/local/lib/node_modules/npm \
$(MACOSOUTDIR)/dist/npm/usr/local/lib/node_modules
unlink $(MACOSOUTDIR)/dist/node/usr/local/bin/npm
unlink $(MACOSOUTDIR)/dist/node/usr/local/bin/npx
$(NODE) tools/license2rtf.js < LICENSE > \
$(MACOSOUTDIR)/installer/productbuild/Resources/license.rtf
cp doc/osx_installer_logo.png $(MACOSOUTDIR)/installer/productbuild/Resources
pkgbuild --version $(FULLVERSION) \
--identifier org.nodejs.node.pkg \
--root $(MACOSOUTDIR)/dist/node $(MACOSOUTDIR)/pkgs/node-$(FULLVERSION).pkg
pkgbuild --version $(NPMVERSION) \
--identifier org.nodejs.npm.pkg \
--root $(MACOSOUTDIR)/dist/npm \
--scripts ./tools/macos-installer/pkgbuild/npm/scripts \
$(MACOSOUTDIR)/pkgs/npm-$(NPMVERSION).pkg
productbuild --distribution $(MACOSOUTDIR)/installer/productbuild/distribution.xml \
--resources $(MACOSOUTDIR)/installer/productbuild/Resources \
--package-path $(MACOSOUTDIR)/pkgs ./$(PKG)
SIGN="$(PRODUCTSIGN_CERT)" PKG="$(PKG)" bash tools/osx-productsign.sh

pkg: $(PKG)
Expand Down
5 changes: 5 additions & 0 deletions tools/macos-installer/pkgbuild/npm/scripts/postinstall
@@ -0,0 +1,5 @@
#!/bin/sh

cd /usr/local/bin || exit 1
ln -sf ../lib/node_modules/npm/bin/npm-cli.js npm
ln -sf ../lib/node_modules/npm/bin/npx-cli.js npx
5 changes: 5 additions & 0 deletions tools/macos-installer/pkgbuild/npm/scripts/preinstall
@@ -0,0 +1,5 @@
#!/bin/sh

[[ -d /usr/local/lib/node_modules/npm ]] \
&& rm -rf /usr/local/lib/node_modules/npm
exit 0
@@ -0,0 +1,23 @@
<html>
<head>
<style>
body {
font-family: Helvetica;
font-size: 14px;
}
li:last-child {
margin-bottom: 16px;
}
</style>
</head>
<body>
<div>
<p>This package has installed:</p>
<ul>
<li>Node.js {nodeversion} to <code>/usr/local/bin/node</code></li>
<li>npm {npmversion} to <code>/usr/local/bin/npm</code></li>
</ul>
<p>Make sure that <code>/usr/local/bin</code> is in your <code>$PATH</code>.</p>
</div>
</body>
</html>
@@ -0,0 +1,19 @@
<html>
<head>
<style>
body {
font-family: Helvetica;
font-size: 14px;
}
</style>
</head>
<body>
<div>
<p>This package will install:</p>
<ul>
<li>Node.js {nodeversion} to <code>/usr/local/bin/node</code></li>
<li>npm {npmversion} to <code>/usr/local/bin/npm</code></li>
</ul>
</div>
</body>
</html>
23 changes: 23 additions & 0 deletions tools/macos-installer/productbuild/distribution.xml.tmpl
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<installer-gui-script minSpecVersion="1">
<title>Node.js</title>
<welcome file="welcome.html"/>
<conclusion file="conclusion.html"/>
<background alignment="topleft" file="osx_installer_logo.png"/>
<pkg-ref id="org.nodejs.node.pkg" auth="root"/>
<pkg-ref id="org.nodejs.npm.pkg" auth="root"/>
<options customize="allow" require-scripts="false"/>
<license file="license.rtf"/>
<choices-outline>
<line choice="org.nodejs.node.pkg" />
<line choice="org.nodejs.npm.pkg"/>
</choices-outline>
<choice id="org.nodejs.node.pkg" visible="true" title="Node.js {nodeversion}">
<pkg-ref id="org.nodejs.node.pkg"/>
</choice>
<pkg-ref id="org.nodejs.node.pkg" version="{nodeversion}" onConclusion="none">node-{nodeversion}.pkg</pkg-ref>
<choice id="org.nodejs.npm.pkg" visible="true" title="npm {npmversion}">
<pkg-ref id="org.nodejs.npm.pkg"/>
</choice>
<pkg-ref id="org.nodejs.npm.pkg" version="{npmversion}" onConclusion="none">npm-{npmversion}.pkg</pkg-ref>
</installer-gui-script>
1 change: 0 additions & 1 deletion tools/osx-pkg.pmdoc/01local-contents.xml

This file was deleted.

25 changes: 0 additions & 25 deletions tools/osx-pkg.pmdoc/01local.xml

This file was deleted.

1 change: 0 additions & 1 deletion tools/osx-pkg.pmdoc/02npm-contents.xml

This file was deleted.

24 changes: 0 additions & 24 deletions tools/osx-pkg.pmdoc/02npm.xml

This file was deleted.

55 changes: 0 additions & 55 deletions tools/osx-pkg.pmdoc/index.xml.tmpl

This file was deleted.

0 comments on commit 7e8c0fd

Please sign in to comment.