# Copyright (C) 2015 LiveCode Ltd.
#
# This file is part of LiveCode.
#
# LiveCode is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License v3 as published by the Free
# Software Foundation.
#
# LiveCode is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# for more details.
#
# You should have received a copy of the GNU General Public License
# along with LiveCode. If not see .
# This file contains rules used by the LiveCode Buildbot installation at
#
#
# Tasks that may be run on Windows workers must be implemented in the
# buildbot.py script.
# Load version information
include version
GIT_HASH_HEXIT_COUNT=10
# Get git commit information
ifeq ($(BUILD_EDITION),commercial)
GIT_VERSION=g$(shell git --git-dir=../.git rev-parse --short=$(GIT_HASH_HEXIT_COUNT) HEAD)
else
GIT_VERSION=g$(shell git rev-parse --short=$(GIT_HASH_HEXIT_COUNT) HEAD)
endif
################################################################
# Extract built binaries
################################################################
bin-extract:
find . -maxdepth 1 -name '*-bin.tar.*' -exec tar -xvf '{}' ';'
################################################################
# Installer generation
################################################################
# BUILD_PLATFORM will be set to the platform on which the installer's being
# built. Its build artefacts will have been extracted into the
# ./$(BUILD_PLATFORM)-bin/ directory
BUILD_STABILITY ?= beta
BUILDTOOL_STACK = builder/builder_tool.livecodescript
WKHTMLTOPDF ?= $(shell which wkhtmltopdf 2>/dev/null)
BUILD_EDITION ?= community
# Those directories are given to the tool builder, and they might get passed
# (like private-dir) to engine functions, to which a path relative to this file
# becomes invalid).
top_src_dir=${PWD}
engine_dir=${top_src_dir}
output_dir=${top_src_dir}
work_dir=${top_src_dir}/_cache/builder_tool
private_dir=${top_src_dir}/..
bin_dir = ${top_src_dir}/$(BUILD_PLATFORM)-bin
docs_source_dir = ${top_src_dir}/docs
docs_private_source_dir = ${private_dir}/docs
docs_build_dir = ${top_src_dir}/_build/docs-build
ifeq ($(BUILD_PLATFORM),mac)
LIVECODE = $(bin_dir)/LiveCode-Community.app/Contents/MacOS/LiveCode-Community
buildtool_platform = mac
UPLOAD_ENABLE_CHECKSUM ?= no
UPLOAD_RELEASE_NOTES ?= no
else ifeq ($(BUILD_PLATFORM),linux-x86)
LIVECODE = $(bin_dir)/LiveCode-Community
buildtool_platform = linux
UPLOAD_ENABLE_CHECKSUM ?= yes
UPLOAD_RELEASE_NOTES ?= no
else ifeq ($(BUILD_PLATFORM),linux-x86_64)
LIVECODE = $(bin_dir)/LiveCode-Community
buildtool_platform = linux
UPLOAD_ENABLE_CHECKSUM ?= yes
ifeq ($(BUILD_EDITION),commercial)
UPLOAD_RELEASE_NOTES ?= yes
else
UPLOAD_RELEASE_NOTES ?= no
endif
endif
# FIXME add --warn-as-error
buildtool_command = $(LIVECODE) -ui $(BUILDTOOL_STACK) \
--build $(BUILD_STABILITY) \
--engine-dir ${engine_dir} --output-dir ${output_dir} --work-dir ${work_dir} \
--private-dir ${private_dir}
# Settings for upload
RSYNC ?= rsync
SHA1SUM ?= sha1sum
UPLOAD_SERVER ?= molly.livecode.com
UPLOAD_PATH = staging/$(BUILD_LONG_VERSION)/$(GIT_VERSION)
UPLOAD_MAX_RETRIES = 50
dist-docs: dist-docs-api dist-docs-guide
dist-docs-api:
mkdir -p $(docs_build_dir)
$(buildtool_command) --platform $(buildtool_platform) --stage docs \
--built-docs-dir $(docs_build_dir)
dist-notes:
WKHTMLTOPDF=$(WKHTMLTOPDF) \
$(buildtool_command) --platform $(buildtool_platform) \
--stage notes --warn-as-error \
--built-docs-dir $(docs_build_dir)
dist-docs-guide:
WKHTMLTOPDF=$(WKHTMLTOPDF) \
$(buildtool_command) --platform $(buildtool_platform) \
--stage guide --warn-as-error
ifeq ($(BUILD_EDITION),commercial)
dist-server: dist-server-communityplus dist-server-indy dist-server-business
endif
dist-server: dist-server-community
dist-server-community:
$(buildtool_command) --platform mac --platform win --platform linux \
--stage server --edition community --warn-as-error
dist-server-communityplus:
$(buildtool_command) --platform mac --platform win --platform linux \
--stage server --edition communityplus --warn-as-error
dist-server-indy:
$(buildtool_command) --platform mac --platform win --platform linux \
--stage server --edition indy --warn-as-error
dist-server-business:
$(buildtool_command) --platform mac --platform win --platform linux \
--stage server --edition business --warn-as-error
ifeq ($(BUILD_EDITION),commercial)
dist-tools: dist-tools-commercial
distmac-disk: distmac-disk-communityplus distmac-disk-indy distmac-disk-business
endif
dist-tools: dist-tools-community dist-tools-version-check
distmac-disk: distmac-disk-community
dist-tools-community:
$(buildtool_command) --platform mac --platform win --platform linux --stage tools --edition community \
--built-docs-dir $(docs_build_dir)
dist-tools-commercial:
$(buildtool_command) --platform mac --platform win --platform linux --stage tools --edition communityplus \
--built-docs-dir $(docs_build_dir)
$(buildtool_command) --platform mac --platform win --platform linux --stage tools --edition indy \
--built-docs-dir $(docs_build_dir)
$(buildtool_command) --platform mac --platform win --platform linux --stage tools --edition business \
--built-docs-dir $(docs_build_dir)
# Ensure that the version for which we're trying to build installers
# hasn't already been tagged.
dist-tools-version-check:
@git tag -l | xargs git tag -d ;\
git fetch --tags ;\
if git rev-parse refs/tags/$(BUILD_SHORT_VERSION) \
>/dev/null 2>&1 ; then \
echo; \
echo "$(BUILD_SHORT_VERSION) has already been released."; \
echo "You probably need to update the 'version' file."; \
echo; \
exit 1; \
fi
.PHONY: dist-tools-version-check
distmac-bundle-community:
$(buildtool_command) --platform mac --stage bundle --edition community
distmac-bundle-communityplus:
$(buildtool_command) --platform mac --stage bundle --edition communityplus
distmac-bundle-indy:
$(buildtool_command) --platform mac --stage bundle --edition indy
distmac-bundle-business:
$(buildtool_command) --platform mac --stage bundle --edition business
# Make a list of installers to be uploaded to the distribution server, and release notes
# If a checksum file is needed, generate it with sha1sum
# Upload the release notes if we are on Linux
dist-upload-files.txt sha1sum.txt:
set -e; \
find . -maxdepth 1 -name 'LiveCode*-*-Mac.dmg' \
-o -name 'LiveCode*Installer-*-Windows-x86.exe' \
-o -name 'LiveCode*Installer-*-Windows-x86_64.exe' \
-o -name 'LiveCode*Installer-*-Linux.*' \
-o -name 'LiveCode*Server-*-Linux*.zip' \
-o -name 'LiveCode*Server-*-Mac.zip' \
-o -name 'LiveCode*Server-*-Windows-x86.zip' \
-o -name 'LiveCode*Server-*-Windows-x86_64.zip' \
-o -name 'LiveCode*Docs-*.zip' \
-o -name '*-bin.tar.xz' \
-o -name '*-bin.tar.bz2' \
-o -name 'LiveCodeForFM-Mac-Solution.zip' \
-o -name 'LiveCodeForFM-Mac-Plugin.zip' \
-o -name 'LiveCodeForFM-Win-x86-Solution.zip' \
-o -name 'LiveCodeForFM-Win-x86-Plugin.zip' \
-o -name 'LiveCodeForFM-Win-x86_64-Solution.zip' \
-o -name 'LiveCodeForFM-Win-x86_64-Plugin.zip' \
-o -name 'LiveCodeForFM-All-Solutions.zip' \
-o -name 'LiveCodeForFM-All-Plugins.zip' \
-o -name 'LiveCodeForFM-Solution.zip' \
-o -name 'LiveCodeForFM.zip' \
> dist-upload-files.txt; \
if test "${UPLOAD_RELEASE_NOTES}" = "yes"; then \
find . -maxdepth 1 -name 'LiveCodeNotes*.pdf' >> dist-upload-files.txt; \
find . -maxdepth 1 -name 'LiveCodeNotes*.html' >> dist-upload-files.txt; \
find . -maxdepth 1 -name 'LiveCodeUpdates*.md' >> dist-upload-files.txt; \
find . -maxdepth 1 -name 'LiveCodeUpdates*.html' >> dist-upload-files.txt; \
find . -maxdepth 1 -name 'LiveCodeUserGuide*.html' >> dist-upload-files.txt; \
find . -maxdepth 1 -name 'LiveCodeUserGuide*.pdf' >> dist-upload-files.txt; \
fi; \
if test "$(UPLOAD_ENABLE_CHECKSUM)" = "yes"; then \
xargs --arg-file=dist-upload-files.txt $(SHA1SUM) > sha1sum.txt; \
echo sha1sum.txt >> dist-upload-files.txt; \
else \
touch sha1sum.txt; \
fi
# Perform the upload. This is in two steps:
# (1) Create the target directory
# (2) Transfer the files using rsync
#
# We need to do the actual transfer in a loop to deal with possible
# connection drops
dist-upload-mkdir:
ssh $(UPLOAD_SERVER) "mkdir -p \"$(UPLOAD_PATH)\""
dist-upload: dist-upload-files.txt dist-upload-mkdir
trap "echo Interrupted; exit;" SIGINT SIGTERM; \
i=0; \
false; \
while [ $$? -ne 0 -a $$i -lt $(UPLOAD_MAX_RETRIES) ] ; do \
i=$$(($$i+1)); \
rsync -v --progress --partial --chmod=ugo=rwX --executability \
--files-from=dist-upload-files.txt . $(UPLOAD_SERVER):"\"$(UPLOAD_PATH)\""; \
done; \
rc=$$?; \
if [ $$i -eq $(UPLOAD_MAX_RETRIES) ]; then \
echo "Maximum retries reached, giving up"; \
fi; \
exit $$rc
# This rule is used for packing the Mac installer contents; the
# resulting archive gets transferred to a Mac for signing and
# conversion to a DMG.
distmac-archive:
set -e; \
find . -maxdepth 1 -name 'LiveCode*Installer-*-Mac.app' -print0 \
| xargs -0 tar -cvf mac-installer.tar; \
cd mac-bin; \
find . -maxdepth 1 -name 'livecodeforfm-*.fmplugin' -print0 \
| xargs -0 tar --append --file=../mac-installer.tar; \
cd ..; \
cd win-x86-bin; \
find . -maxdepth 1 -name 'livecodeforfm-*.fmx' -print0 \
| xargs -0 tar --append --file=../mac-installer.tar; \
cd ..; \
cd win-x86_64-bin; \
find . -maxdepth 1 -name 'livecodeforfm-*.fmx64' -print0 \
| xargs -0 tar --append --file=../mac-installer.tar; \
cd ..; \
bzip2 -c mac-installer.tar > mac-installer.tar.xz
distmac-extract:
set -e; \
tar -xvf mac-installer.tar.xz; \
cp -r ${private_dir}/filemaker/solutions/LiveCodeForFM.fmp12 . ; \
$(buildtool_command) --platform mac --stage fmpackage --debug; \
$(buildtool_command) --platform win-x86 --stage fmpackage --debug; \
$(buildtool_command) --platform win-x86_64 --stage fmpackage --debug; \
$(buildtool_command) --platform universal --stage fmpackage --debug; \
find . -maxdepth 1 -name 'LiveCodeForFM-Mac-*.fmp12' -print0 \
| xargs -0 zip -r LiveCodeForFM-Mac-Solution.zip; \
find . -maxdepth 1 -name 'LiveCodeForFM-Win-x86-*.fmp12' -print0 \
| xargs -0 zip -r LiveCodeForFM-Win-x86-Solution.zip; \
find . -maxdepth 1 -name 'LiveCodeForFM-Win-x86_64-*.fmp12' -print0 \
| xargs -0 zip -r LiveCodeForFM-Win-x86_64-Solution.zip; \
find . -maxdepth 1 -name 'LiveCodeForFM-[1-9]*.fmp12' -print0 \
| xargs -0 zip -r LiveCodeForFM.zip; \
find . -maxdepth 1 -name 'livecodeforfm-*.*' -print0 \
| xargs -0 zip -r LiveCodeForFM-All-Plugins.zip; \
find . -maxdepth 1 -name 'livecodeforfm-*.fmplugin' -print0 \
| xargs -0 zip -r LiveCodeForFM-Mac-Plugin.zip; \
find . -maxdepth 1 -name 'livecodeforfm-*.fmx' -print0 \
| xargs -0 zip -r LiveCodeForFM-Win-x86-Plugin.zip; \
find . -maxdepth 1 -name 'livecodeforfm-*.fmx64' -print0 \
| xargs -0 zip -r LiveCodeForFM-Win-x86_64-Plugin.zip; \
find . -maxdepth 1 -name 'LiveCodeForFM.fmp12' -print0 \
| xargs -0 zip -r LiveCodeForFM-Solution.zip
# Final installer creation for Mac
distmac-disk-%: distmac-bundle-%
$(buildtool_command) --platform mac --stage disk --edition $*
distmac-upload: dist-upload