From 8844dedb8a780dcf96c79e7e5dc99e2a8bdaa12c Mon Sep 17 00:00:00 2001 From: Neil Alexander Date: Wed, 17 Oct 2018 11:55:01 +0100 Subject: [PATCH] Add create-pkg.sh for creating macOS installers --- .circleci/config.yml | 7 +++ contrib/macos/create-pkg.sh | 107 ++++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100755 contrib/macos/create-pkg.sh diff --git a/.circleci/config.yml b/.circleci/config.yml index 036c97e..fa5ebca 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -50,6 +50,13 @@ jobs: GOOS=darwin GOARCH=amd64 ./build && mv yggdrasil /tmp/upload/$CINAME-$CIVERSION-darwin-amd64 && mv yggdrasilctl /tmp/upload/$CINAME-$CIVERSION-yggdrasilctl-darwin-amd64; GOOS=darwin GOARCH=386 ./build && mv yggdrasil /tmp/upload/$CINAME-$CIVERSION-darwin-i386 && mv yggdrasilctl /tmp/upload/$CINAME-$CIVERSION-yggdrasilctl-darwin-i386; + - run: + name: Build for macOS (.pkg format) + command: | + rm -rf {yggdrasil,yggdrasilctl} + GOOS=darwin GOARCH=amd64 ./build && PKGARCH=amd64 sh contrib/macos/create-pkg.sh && mv *.pkg /tmp/upload/ + GOOS=darwin GOARCH=386 ./build && PKGARCH=i386 sh contrib/macos/create-pkg.sh && mv *.pkg /tmp/upload/ + - run: name: Build for OpenBSD command: | diff --git a/contrib/macos/create-pkg.sh b/contrib/macos/create-pkg.sh new file mode 100755 index 0000000..5964736 --- /dev/null +++ b/contrib/macos/create-pkg.sh @@ -0,0 +1,107 @@ +#!/bin/sh + +# Check if xar and mkbom are available +command -v xar >/dev/null 2>&1 || ( + echo "Building xar" + sudo apt-get install libxml2-dev libssl1.0-dev zlib1g-dev -y + mkdir -p /tmp/xar && cd /tmp/xar + git clone https://github.com/mackyle/xar && cd xar/xar + (sh autogen.sh && make && sudo make install) || (echo "Failed to build xar"; exit 1) +) +command -v mkbom >/dev/null 2>&1 || ( + echo "Building mkbom" + mkdir -p /tmp/mkbom && cd /tmp/mkbom + git clone https://github.com/hogliux/bomutils && cd bomutils + sudo make install || (echo "Failed to build mkbom"; exit 1) +) + +# Check if we can find the files we need - they should +# exist if you are running this script from the root of +# the yggdrasil-go repo and you have ran ./build +test -f yggdrasil || (echo "yggdrasil binary not found"; exit 1) +test -f yggdrasilctl || (echo "yggdrasilctl binary not found"; exit 1) +test -f contrib/macos/yggdrasil.plist || (echo "contrib/macos/yggdrasil.plist not found"; exit 1) +test -f contrib/semver/version.sh || (echo "contrib/semver/version.sh not found"; exit 1) + +# Delete the pkgbuild folder if it already exists +test -d pkgbuild && rm -rf pkgbuild + +# Create our folder structure +mkdir -p pkgbuild/scripts +mkdir -p pkgbuild/flat/base.pkg +mkdir -p pkgbuild/flat/Resources/en.lproj +mkdir -p pkgbuild/root/usr/local/bin +mkdir -p pkgbuild/root/Library/LaunchDaemons + +# Copy package contents into the pkgbuild root +cp yggdrasil pkgbuild/root/usr/local/bin +cp yggdrasilctl pkgbuild/root/usr/local/bin +cp contrib/macos/yggdrasil.plist pkgbuild/root/Library/LaunchDaemons + +# Create the postinstall script +cat > pkgbuild/scripts/postinstall << EOF +#!/bin/sh +test -f /etc/yggdrasil.conf || /usr/local/bin/yggdrasil -genconf > /etc/yggdrasil.conf +test -f /Library/LaunchDaemons/yggdrasil.plist && launchctl unload /Library/LaunchDaemons/yggdrasil.plist +launchctl load /Library/LaunchDaemons/yggdrasil.plist +EOF + +# Set execution permissions +chmod +x pkgbuild/scripts/postinstall +chmod +x pkgbuild/root/usr/local/bin/yggdrasil +chmod +x pkgbuild/root/usr/local/bin/yggdrasilctl + +# Pack payload and scripts +( cd pkgbuild/scripts && find . | cpio -o --format odc --owner 0:80 | gzip -c ) > pkgbuild/flat/base.pkg/Scripts +( cd pkgbuild/root && find . | cpio -o --format odc --owner 0:80 | gzip -c ) > pkgbuild/flat/base.pkg/Payload + +# Work out metadata for the package info +PKGNAME=$(sh contrib/semver/name.sh) +PKGVERSION=$(sh contrib/semver/version.sh | cut -c 2-) +PKGARCH=${PKGARCH-amd64} +PAYLOADSIZE=$(( $(wc -c pkgbuild/flat/base.pkg/Payload | awk '{ print $1 }') / 1024 )) + +# Create the PackageInfo file +cat > pkgbuild/flat/base.pkg/PackageInfo << EOF + + + + + + +EOF + +# Create the BOM +( cd pkgbuild && mkbom root flat/base.pkg/Bom ) + +# Create the Distribution file +cat > pkgbuild/flat/Distribution << EOF + + + Yggdrasil ${PKGVERSION} + + + + + + + + + + + #base.pkg + +EOF + +# Finally pack the .pkg +( cd pkgbuild/flat && xar --compression none -cf "../../${PKGNAME}-${PKGVERSION}-macos-${PKGARCH}.pkg" * )