spiegel-keyman/developer/src/inst/build.sh
Eberhard Beilharz bc7499a3e1
maint(developer): consolidate creating KMC_ZIP file
Previously we created the KMC_ZIP file twice, and one of them was
outdated. This change moves creating the zip file to
`developer/src/inst/build.sh` so that the TC build script only does the
upload.

Fixes: #14263
Test-bot: skip
2025-07-07 19:14:40 +02:00

287 lines
11 KiB
Bash
Executable file

#!/usr/bin/env bash
## START STANDARD BUILD SCRIPT INCLUDE
# adjust relative paths as necessary
THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")"
. "${THIS_SCRIPT%/*}/../../../resources/build/builder.inc.sh"
## END STANDARD BUILD SCRIPT INCLUDE
source "$KEYMAN_ROOT/resources/shellHelperFunctions.sh"
source "$KEYMAN_ROOT/resources/build/jq.inc.sh"
builder_describe "Installation files for Keyman Developer" \
@/common/windows/data \
clean configure build test publish
# NOTE: not using deps here because we will only do this in the 'publish' phase
# after all other builds complete
builder_describe_outputs \
publish /developer/src/inst/keymandeveloper-${KEYMAN_VERSION}.exe
builder_parse "$@"
. "$KEYMAN_ROOT/resources/build/win/environment.inc.sh"
. "$KEYMAN_ROOT/resources/build/win/wix.inc.sh"
. "$KEYMAN_ROOT/resources/build/win/zip.inc.sh"
# In dev environments, we'll hack the tier to alpha; CI sets this for us in real builds.
if [[ -z ${KEYMAN_TIER+x} ]]; then
KEYMAN_TIER=alpha
fi
# We use different directories so that heat generates
# different identifiers for the various folders
KEYMAN_WIX_TEMP_BASE="$TEMP/keyman_wix_build"
KEYMAN_WIX_TEMP_XML="$TEMP/keyman_wix_build/xml"
KEYMAN_WIX_TEMP_CEF="$TEMP/keyman_wix_build/cef"
KEYMAN_WIX_TEMP_TEMPLATES="$TEMP/keyman_wix_build/templates"
KEYMAN_WIX_TEMP_KMC="$TEMP/keyman_wix_build/kmc"
KEYMAN_WIX_TEMP_SERVER="$TEMP/keyman_wix_build/Server"
KEYMAN_WIX_KMDEV_SERVER="$DEVELOPER_ROOT/bin/server"
KEYMAN_DEVELOPER_TEMPLATES_ROOT="$DEVELOPER_ROOT/src/kmconvert/data"
#-------------------------------------------------------------------------------------------------------------------
function do_clean() {
rm -f *.msi *.wixobj *.log setup.inf setup.zip *.exe *.wixpdb xml.wxs cef.wxs templates.wxs kmc.wxs
rm -rf "$DEVELOPER_ROOT/src/tike/xml/osk"
}
#-------------------------------------------------------------------------------------------------------------------
function do_publish() {
builder_if_release_build_level verify-program-signatures
verify-node-installer-version
"$KEYMAN_ROOT/common/windows/cef-checkout.sh"
#
# Build the installation archive
#
candle
"$WIXLIGHT" \
-wx -nologo "${WIXLIGHTLINT[@]}" "$WIXLIGHTCOMPRESSION" \
-sice:ICE91 -sice:ICE60 -dWixUILicenseRtf=License.rtf \
-out keymandeveloper.msi -ext WixUIExtension \
kmdev.wixobj xml.wixobj cef.wixobj templates.wixobj server.wixobj kmc.wixobj
clean-heat-kmc
#
# Sign the installation archive
#
wrap-signcode //d "Keyman Developer" keymandeveloper.msi
#
# Copy the installation archive
#
copy-kmdev
builder_if_release_build_level verify-installer-signatures
}
function do_test() {
verify-node-installer-version
}
function copy-kmdev() {
builder_heading copy-kmdev
mkdir -p "$DEVELOPER_ROOT/release/${KEYMAN_VERSION}"
make-installer
make-kmc-install-zip
cp -f "$DEVELOPER_ROOT/src/inst/keymandeveloper.msi" "$DEVELOPER_ROOT/release/${KEYMAN_VERSION}/keymandeveloper.msi"
cp -f "$DEVELOPER_ROOT/src/inst/keymandeveloper-${KEYMAN_VERSION}.exe" "$DEVELOPER_ROOT/release/${KEYMAN_VERSION}/keymandeveloper-${KEYMAN_VERSION}.exe"
}
function verify-program-signatures() {
builder_heading verify-program-signatures
verify-all-executable-signatures-in-folder "$DEVELOPER_ROOT/bin"
}
function verify-installer-signatures() {
builder_heading verify-installer-signatures
verify-all-executable-signatures-in-folder "$DEVELOPER_ROOT/release/${KEYMAN_VERSION}"
}
function verify-node-installer-version() {
builder_heading verify-node-installer-version
local REQUIRED_NODE_VERSION=$("$JQ" -r .engines.node < "$KEYMAN_ROOT/package.json")
local INSTALLER_NODE_VERSION="$("$THIS_SCRIPT_PATH/node/dist/node.exe" --version)"
INSTALLER_NODE_VERSION="${INSTALLER_NODE_VERSION##v}"
if [[ "$REQUIRED_NODE_VERSION" != "$INSTALLER_NODE_VERSION" ]]; then
builder_echo error "Installer node version in /developer/src/inst/node/dist/node.exe is '$INSTALLER_NODE_VERSION',"
builder_echo error "but the expected version per /package.json is '$REQUIRED_NODE_VERSION'."
builder_die "Version mismatch for bundled node.exe version"
fi
}
function test-releaseexists() {
if [[ -d "$DEVELOPER_ROOT/release/${KEYMAN_VERSION}" ]]; then
builder_die "Release ${KEYMAN_VERSION} already exists. Delete it or update VERSION.md and try again"
fi
}
function candle() {
builder_heading candle
heat-cef
heat-xml
heat-templates
heat-server
heat-kmc
builder_heading "candle: calling WIX:candle"
"$WIXCANDLE" -wx -nologo "-dKEYMAN_VERSION=${KEYMAN_VERSION_WIN}" "-dRELEASE=${KEYMAN_VERSION_RELEASE}" kmdev.wxs
"$WIXCANDLE" -wx -nologo "-dKEYMAN_VERSION=${KEYMAN_VERSION_WIN}" "-dRELEASE=${KEYMAN_VERSION_RELEASE}" "-dXmlSourceDir=${DEVELOPER_ROOT}/src/tike/xml" xml.wxs
"$WIXCANDLE" -wx -nologo "-dKEYMAN_VERSION=${KEYMAN_VERSION_WIN}" "-dRELEASE=${KEYMAN_VERSION_RELEASE}" "-dCefSourceDir=${KEYMAN_CEF4DELPHI_ROOT}" cef.wxs
"$WIXCANDLE" -wx -nologo "-dKEYMAN_VERSION=${KEYMAN_VERSION_WIN}" "-dRELEASE=${KEYMAN_VERSION_RELEASE}" "-dTemplatesSourceDir=${KEYMAN_DEVELOPER_TEMPLATES_ROOT}" templates.wxs
"$WIXCANDLE" -wx -nologo "-dKEYMAN_VERSION=${KEYMAN_VERSION_WIN}" "-dRELEASE=${KEYMAN_VERSION_RELEASE}" "-dkmcSourceDir=${KEYMAN_WIX_TEMP_KMC}" kmc.wxs
"$WIXCANDLE" -wx -nologo "-dKEYMAN_VERSION=${KEYMAN_VERSION_WIN}" "-dRELEASE=${KEYMAN_VERSION_RELEASE}" "-dServerSourceDir=${KEYMAN_WIX_KMDEV_SERVER}" server.wxs
}
function heat-xml() {
builder_heading heat-xml
# We copy the files to a temp folder in order to exclude thumbs.db, .vs, etc from harvesting
# We also copy over the OSK files from Keyman Engine (#11199)
rm -rf "$KEYMAN_WIX_TEMP_XML"
mkdir -p "$KEYMAN_WIX_TEMP_XML"
cp -r "$KEYMAN_ROOT/windows/src/engine/xml/osk" "$DEVELOPER_ROOT/src/tike/xml/osk"
cp -r "$DEVELOPER_ROOT/src/tike/xml"/* "$KEYMAN_WIX_TEMP_XML"
rm -f "$KEYMAN_WIX_TEMP_XML/Thumbs.db"
rm -rf "$KEYMAN_WIX_TEMP_XML/app/node_modules"
find "$KEYMAN_WIX_TEMP_XML" -name '.vs' -print0 | xargs -0 rm -rf
"$WIXHEAT" dir "$KEYMAN_WIX_TEMP_XML" -o xml.wxs -ag -cg XML -dr INSTALLDIR -var var.XmlSourceDir -wx -nologo
# When we candle/light build, we can grab the source files from the proper root so go ahead and delete the temp folder again
rm -rf "$KEYMAN_WIX_TEMP_XML"
}
function heat-templates() {
builder_heading heat-templates
# We copy the files to a temp folder in order to exclude .git and README.md from harvesting
rm -rf "$KEYMAN_WIX_TEMP_TEMPLATES"
mkdir -p "$KEYMAN_WIX_TEMP_TEMPLATES"
cp -r "$KEYMAN_DEVELOPER_TEMPLATES_ROOT"/* "$KEYMAN_WIX_TEMP_TEMPLATES"
"$WIXHEAT" dir "$KEYMAN_WIX_TEMP_TEMPLATES" -o templates.wxs -ag -cg Templates -dr dirProjects -var var.TemplatesSourceDir -wx -nologo
# When we candle/light build, we can grab the source files from the proper root so go ahead and delete the temp folder again
rm -rf "$KEYMAN_WIX_TEMP_TEMPLATES"
}
function heat-cef() {
builder_heading heat-cef
# We copy the files to a temp folder in order to exclude .git and README.md from harvesting
rm -rf "$KEYMAN_WIX_TEMP_CEF"
mkdir -p "$KEYMAN_WIX_TEMP_CEF"
cp -r "$KEYMAN_CEF4DELPHI_ROOT"/* "$KEYMAN_WIX_TEMP_CEF"
"$WIXHEAT" dir "$KEYMAN_WIX_TEMP_CEF" -o cef.wxs -ag -cg CEF -dr INSTALLDIR -var var.CefSourceDir -wx -nologo
# When we candle/light build, we can grab the source files from the proper root so go ahead and delete the temp folder again
rm -rf "$KEYMAN_WIX_TEMP_CEF"
}
function heat-server() {
builder_heading heat-server
# We copy the files to a temp folder in order to exclude .git and README.md from harvesting
rm -rf "$KEYMAN_WIX_TEMP_SERVER"
mkdir -p "$KEYMAN_WIX_TEMP_SERVER"
cp -r "$KEYMAN_WIX_KMDEV_SERVER"/* "$KEYMAN_WIX_TEMP_SERVER"
"$WIXHEAT" dir "$KEYMAN_WIX_TEMP_SERVER" -o server.wxs -ag -cg Server -dr INSTALLDIR -var var.ServerSourceDir -wx -nologo
# When we candle/light build, we can grab the source files from the proper root so go ahead and delete the temp folder again
rm -rf "$KEYMAN_WIX_TEMP_SERVER"
}
function heat-kmc() {
builder_heading heat-kmc
cd "$DEVELOPER_ROOT/src/kmc"
# Build the distributable package
mkdir -p "$KEYMAN_WIX_TEMP_KMC"
# TODO: BUNDLE CORRECTLY
./build.sh bundle --build-path "$KEYMAN_WIX_TEMP_KMC"
# Build the .wxs file
cd "$THIS_SCRIPT_PATH"
"$WIXHEAT" dir "$KEYMAN_WIX_TEMP_KMC" -o kmc.wxs -ag -cg kmc -dr INSTALLDIR -var var.kmcSourceDir -wx -nologo
}
function clean-heat-kmc() {
builder_heading clean-heat-kmc
# the production build generates files that are not in source, e.g. .ps1 scripts
# When we candle/light build, we can grab the source files from the proper root so go ahead and delete the temp folder again
rm -rf "$KEYMAN_WIX_TEMP_KMC"
}
function make-installer() {
builder_heading make-installer
echo [Setup] > setup.inf
echo "Version=$KEYMAN_VERSION" >> setup.inf
echo "MSIFileName=keymandeveloper.msi" >> setup.inf
echo "Title=Keyman Developer ${KEYMAN_VERSION_WITH_TAG}" >>setup.inf
wzzip setup.zip keymandeveloper.msi setup.inf
cat "$DEVELOPER_PROGRAM/setup.exe" setup.zip > "keymandeveloper-$KEYMAN_VERSION.exe"
wrap-signcode //d "Keyman Developer" "keymandeveloper-$KEYMAN_VERSION.exe"
#
# Zip the files we distribute as part of the standalone kmc distro into release\$Version\kmcomp-$Version.zip
#
}
function make-kmc-install-zip() {
builder_heading make-kmc-install-zip
copy-schemas
cd "${DEVELOPER_ROOT}/bin"
# TODO: rename this to keyman-developer-cli-$Version.zip
local KMCOMP_ZIP="${DEVELOPER_ROOT}/release/${KEYMAN_VERSION}/kmcomp-${KEYMAN_VERSION}.zip"
# shellcheck disable=SC2154
local COMPRESS_CMD="${SEVENZ_HOME}/7z"
"${COMPRESS_CMD}" a -bd -bb0 "${KMCOMP_ZIP}" \
kmconvert.exe \
keyboard_info.schema.json \
xml/layoutbuilder/*.keyman-touch-layout \
projects/ \
server/
cd "$THIS_SCRIPT_PATH"
}
# TODO: are these required?
# kpj.schema.json kvks.schema.json \
# ldml-keyboard3.schema.json ldml-keyboardtest3.schema.json \
function copy-schemas() {
builder_heading copy-schemas
cp "$KEYMAN_ROOT/common/schemas/keyboard_info/keyboard_info.schema.json" "$DEVELOPER_ROOT/bin"
cp "$KEYMAN_ROOT/common/schemas/keyman-touch-layout/keyman-touch-layout.spec.json" "$DEVELOPER_ROOT/bin"
cp "$KEYMAN_ROOT/common/schemas/keyman-touch-layout/keyman-touch-layout.clean.spec.json" "$DEVELOPER_ROOT/bin"
cp "$KEYMAN_ROOT/common/schemas/displaymap/displaymap.schema.json" "$DEVELOPER_ROOT/bin"
cp "$KEYMAN_ROOT/common/schemas/kmp/kmp.schema.json" "$DEVELOPER_ROOT/bin"
}
#-------------------------------------------------------------------------------------------------------------------
builder_run_action clean do_clean
# builder_run_action configure do_configure
# builder_run_action build do_build
builder_run_action test do_test
builder_run_action publish do_publish