Add builds for Mac OS

This commit is contained in:
Jasper Van der Jeugt 2020-01-18 11:29:01 -05:00
parent a81e647c91
commit 19c7ecb921
5 changed files with 116 additions and 89 deletions

View File

@ -4,13 +4,40 @@ workflows:
version: 2 version: 2
build-workflow: build-workflow:
jobs: jobs:
- build: - build-macos:
filters:
tags:
only: /.*/
- build-linux:
filters: filters:
tags: tags:
only: /.*/ only: /.*/
jobs: jobs:
build: build-macos:
macos:
xcode: '10.0.0'
steps:
- run:
name: 'Set up PATH'
command: echo "export PATH=$HOME/.local/bin:$PATH" >> $BASH_ENV
- checkout
- run:
name: 'Install stack'
command: 'curl -sSL https://get.haskellstack.org/ | sh'
- restore_cache:
key: 'v6-{{ arch }}'
- run:
command: 'make build test'
- save_cache:
key: 'v6-{{ arch }}'
paths:
- '~/.stack'
- run:
name: 'Upload release'
command: 'if [[ ! -z "$CIRCLE_TAG" ]]; then make release; fi'
build-linux:
# This image has most Haskell stuff preinstalled. # This image has most Haskell stuff preinstalled.
docker: docker:
- image: 'haskell:8.6' - image: 'haskell:8.6'
@ -18,20 +45,13 @@ jobs:
steps: steps:
- checkout - checkout
- restore_cache: - restore_cache:
key: 'v5-patat-{{ arch }}-{{ .Branch }}' key: 'v6-{{ arch }}'
- run: - run:
# We set jobs to 1 here because that prevents Out-Of-Memory exceptions command: 'make build test'
# while compiling dependencies.
name: 'Install'
command: '.circleci/tickle.sh stack build --pedantic --copy-bins --jobs=1 --no-terminal --test'
- run:
name: 'Run golden tests'
command: 'make test'
- save_cache: - save_cache:
key: 'v5-patat-{{ arch }}-{{ .Branch }}-{{ .Revision }}' key: 'v6-{{ arch }}'
paths: paths:
- '~/.stack-work'
- '~/.stack' - '~/.stack'
- run: - run:
name: 'Upload release' name: 'Upload release'
command: '.circleci/release.sh "$CIRCLE_TAG"' command: 'if [[ ! -z "$CIRCLE_TAG" ]]; then make release; fi'

View File

@ -1,47 +0,0 @@
#!/bin/bash
set -o nounset -o errexit -o pipefail
TAG="$1"
SUFFIX="linux-$(uname -m)"
USER="jaspervdj"
REPOSITORY="$(basename -- *.cabal ".cabal")"
BINARY="$REPOSITORY"
echo "Tag: $TAG"
echo "Suffix: $SUFFIX"
echo "Repository: $REPOSITORY"
$BINARY --version
if [[ -z "$TAG" ]]; then
echo "Not a tagged build, skipping release..."
exit 0
fi
# Install ghr
GHR_VERSION="v0.13.0"
curl --silent -L -O \
"https://github.com/tcnksm/ghr/releases/download/${GHR_VERSION}/ghr_${GHR_VERSION}_linux_386.tar.gz"
tar xf ghr_${GHR_VERSION}_linux_386.tar.gz
mv ghr_${GHR_VERSION}_linux_386/ghr .
# Install upx
UPX_VERSION="3.94"
curl --silent -L -O \
"https://github.com/upx/upx/releases/download/v${UPX_VERSION}/upx-${UPX_VERSION}-amd64_linux.tar.xz"
tar xf upx-${UPX_VERSION}-amd64_linux.tar.xz
mv upx-${UPX_VERSION}-amd64_linux/upx .
# Create tarball
PACKAGE="$REPOSITORY-$TAG-$SUFFIX"
mkdir -p "$PACKAGE"
cp "$(which "$BINARY")" "$PACKAGE"
./upx -q "$PACKAGE/$BINARY"
cp README.* "$PACKAGE"
cp CHANGELOG.* "$PACKAGE"
cp extra/patat.1 "$PACKAGE"
tar -czf "$PACKAGE.tar.gz" "$PACKAGE"
rm -r "$PACKAGE"
# Actually upload
./ghr -u "$USER" -r "$REPOSITORY" "$TAG" "$PACKAGE.tar.gz"

View File

@ -1,24 +0,0 @@
#!/bin/bash
set -o nounset -o errexit -o pipefail
function tickle() {
while [ true ]; do
echo "[$(date +%H:%M:%S)] Tickling..."
sleep 60
done
}
echo "Forking tickle process..."
tickle &
TICKLE_PID=$!
echo "Forking build process..."
eval $@ &
BUILD_PID=$!
echo "Waiting for build thread ($BUILD_PID)..."
wait $BUILD_PID
echo "Killing tickle thread ($TICKLE_PID)..."
kill $TICKLE_PID
echo "All done!"

View File

@ -1,26 +1,104 @@
ARCH=$(shell uname -m)
UNAME=$(shell uname | tr 'A-Z' 'a-z')
PATAT_BINARY=$(HOME)/.local/bin/patat
PATAT_VERSION=$(shell sed -n 's/^Version: *//p' *.cabal)
PATAT_PACKAGE=patat-v$(PATAT_VERSION)-$(UNAME)-$(ARCH)
GHR_VERSION=0.13.0
GHR_NAME=ghr_v$(GHR_VERSION)_$(UNAME)_amd64
GHR_BINARY=$(HOME)/.local/bin/ghr
UPX_VERSION=3.94
UPX_NAME=upx-$(UPX_VERSION)-amd64_$(UNAME)
UPX_BINARY=$(HOME)/.local/bin/upx
ifeq ($(UNAME), darwin)
ARCHIVE=zip
ARCHIVE_CREATE=zip -r
ARCHIVE_EXTRACT=unzip
else
ARCHIVE=tar.gz
ARCHIVE_CREATE=tar czf
ARCHIVE_EXTRACT=tar xvzf
endif
ifeq ($(UNAME), darwin)
# We use `?=` to set SOURCE_DATE_EPOCH only if it is not present. Unfortunately # We use `?=` to set SOURCE_DATE_EPOCH only if it is not present. Unfortunately
# we can't use `git --date=unix` since only very recent git versions support # we can't use `git --date=unix` since only very recent git versions support
# that, so we need to make a round trip through `date`. # that, so we need to make a round trip through `date`.
SOURCE_DATE_EPOCH?=$(shell git log -1 --format=%cd --date=unix)
else
SOURCE_DATE_EPOCH?=$(shell date '+%s' \ SOURCE_DATE_EPOCH?=$(shell date '+%s' \
--date="$(shell git log -1 --format=%cd --date=rfc)") --date="$(shell git log -1 --format=%cd --date=rfc)")
endif
extra/patat.1: README.md ifeq ($(UNAME), darwin)
COMPRESS_BIN_DEPS=
COMPRESS_BIN=ls
else
COMPRESS_BIN_DEPS=$(UPX_BINARY)
COMPRESS_BIN=upx
endif
# Default target.
build: $(PATAT_BINARY)
# Upload a release.
release: $(PATAT_PACKAGE).$(ARCHIVE) $(GHR_BINARY)
ghr -u jaspervdj -r patat v$(PATAT_VERSION) $(PATAT_PACKAGE).$(ARCHIVE)
$(PATAT_PACKAGE).$(ARCHIVE): $(PATAT_BINARY) extra/patat.1 $(COMPRESS_BIN_DEPS)
mkdir $(PATAT_PACKAGE)
cp $(PATAT_BINARY) $(PATAT_PACKAGE)/
$(COMPRESS_BIN) $(PATAT_PACKAGE)/patat
cp README.md $(PATAT_PACKAGE)/
cp CHANGELOG.md $(PATAT_PACKAGE)/
cp LICENSE $(PATAT_PACKAGE)/
cp extra/patat.1 $(PATAT_PACKAGE)/
$(ARCHIVE_CREATE) $(PATAT_PACKAGE).$(ARCHIVE) $(PATAT_PACKAGE)
$(PATAT_BINARY):
stack build -j1 --copy-bins --pedantic
# GHR is used to upload releases to GitHub.
$(GHR_BINARY):
curl -Lo /tmp/$(GHR_NAME).$(ARCHIVE) \
https://github.com/tcnksm/ghr/releases/download/v$(GHR_VERSION)/$(GHR_NAME).$(ARCHIVE)
cd /tmp && $(ARCHIVE_EXTRACT) $(GHR_NAME).$(ARCHIVE)
mv /tmp/$(GHR_NAME)/ghr $(GHR_BINARY)
ghr --version
# UPX is used to compress the resulting binary. We currently don't use this on
# Mac OS.
$(UPX_BINARY):
curl -Lo /tmp/$(UPX_NAME).tar.xz \
https://github.com/upx/upx/releases/download/v$(UPX_VERSION)/$(UPX_NAME).tar.xz
cd /tmp && tar xf $(UPX_NAME).tar.xz
mv /tmp/$(UPX_NAME)/upx $(UPX_BINARY)
upx --version
# Man page.
extra/patat.1: README.md $(PATAT_BINARY)
SOURCE_DATE_EPOCH="$(SOURCE_DATE_EPOCH)" patat-make-man >$@ SOURCE_DATE_EPOCH="$(SOURCE_DATE_EPOCH)" patat-make-man >$@
# Bash completion.
extra/patat.bash-completion: extra/patat.bash-completion:
patat --bash-completion-script patat >$@ patat --bash-completion-script patat >$@
.PHONY: completion
completion: extra/patat.bash-completion completion: extra/patat.bash-completion
.PHONY: man
man: extra/patat.1 man: extra/patat.1
# Also check if we can generate the manual. # Also check if we can generate the manual.
.PHONY: test
test: man test: man
bash tests/golden.sh bash tests/golden.sh
.PHONY: clean
clean: clean:
rm -f extra/patat.1 rm -f extra/patat.1
rm -f extra/make-man rm -f extra/make-man
rm -f extra/patat.bash-completion rm -f extra/patat.bash-completion
.PHONY: man completion test clean

View File

@ -62,7 +62,7 @@ Installation
- openSUSE: <https://build.opensuse.org/package/show/openSUSE:Factory:ARM/patat> - openSUSE: <https://build.opensuse.org/package/show/openSUSE:Factory:ARM/patat>
- Fedora: <https://src.fedoraproject.org/rpms/patat> - Fedora: <https://src.fedoraproject.org/rpms/patat>
You can also find generic linux binaries here: You can also find generic Linux and Mac OS binaries here:
<https://github.com/jaspervdj/patat/releases>. <https://github.com/jaspervdj/patat/releases>.
### From source ### From source