dosbox-staging/scripts/create-package.sh

278 lines
7.7 KiB
Bash
Raw Normal View History

#!/bin/sh
set -e
# SPDX-License-Identifier: GPL-2.0-or-later
#
# Copyright (C) 2020-2021 Sherman Perry
usage()
{
printf "%s\n" "\
Usage: -p <platform> [-h -c <commit> -b <branch> -r <repo> -v <version> -f] BUILD_DIR PACKAGE_DIR
Where:
-h : Show this help message
-p : Buld platform. Can be one of linux, macos, msys2, msvc
-c : Git commit
-b : Git branch
-r : Git repository
-v : dosbox-staging version
-f : force creation if PACKAGE_DIR is not empty
BUILD_DIR : Meson build directory
PACKAGE_DIR : Package directory
Note: On macos, '-v' must be set. On msvc, the environment variable VC_REDIST_DIR must be set."
}
create_parent_dir()
{
path=$1
dir=$(dirname "$path")
if [ "$dir" != "." ]; then
case $platform in
msvc) mkdir -p "$dir" ;;
macos) install -d "${dir}/"
esac
fi
}
install_file()
{
src=$1
dest=$2
case $platform in
linux|msys2) install -DT -m 644 "$src" "$dest" ;;
msvc) create_parent_dir "$dest" && cp "$src" "$dest" ;;
macos) create_parent_dir "$dest" && install -m 644 "$src" "$dest" ;;
esac
}
install_doc()
{
# Install common documentation files
case $platform in
linux)
install_file docs/README.template "${pkg_dir}/README"
install_file COPYING "${pkg_dir}/COPYING"
install_file README "${pkg_dir}/doc/manual.txt"
install_file docs/dosbox.1 "${pkg_dir}/man/dosbox.1"
readme_tmpl="${pkg_dir}/README"
;;
macos)
install_file docs/README.template "${macos_dst_dir}/SharedSupport/README"
install_file COPYING "${macos_dst_dir}/SharedSupport/COPYING"
install_file README "${macos_dst_dir}/SharedSupport/manual.txt"
install_file docs/README.video "${macos_dst_dir}/SharedSupport/video.txt"
readme_tmpl="${macos_dst_dir}/SharedSupport/README"
;;
msys2|msvc)
install_file COPYING "${pkg_dir}/COPYING.txt"
install_file docs/README.template "${pkg_dir}/README.txt"
install_file docs/README.video "${pkg_dir}/doc/video.txt"
install_file README "${pkg_dir}/doc/manual.txt"
readme_tmpl="${pkg_dir}/README.txt"
;;
esac
# Fill template variables in README.template
if [ -n "$git_commit" ]; then
sed -i -e "s|%GIT_COMMIT%|$git_commit|" "$readme_tmpl"
fi
if [ -n "$git_branch" ]; then
sed -i -e "s|%GIT_BRANCH%|$git_branch|" "$readme_tmpl"
fi
if [ -n "$git_repo" ]; then
sed -i -e "s|%GITHUB_REPO%|$git_repo|" "$readme_tmpl"
fi
}
install_resources()
{
case "$platform" in
"macos")
local src_dir=${build_dir}/../Resources
local dest_dir=${macos_dst_dir}/Resources
;;
*)
local src_dir=${build_dir}/resources
local dest_dir=${pkg_dir}/resources
;;
esac
find $src_dir -type f |
while IFS= read -r src; do
install_file "$src" "$dest_dir/${src#*$src_dir/}"
done
}
pkg_linux()
{
# Print shared object dependencies
# ldd crashes with a malloc error on the s390x platform, so always pass
ldd "${build_dir}/dosbox" || true
install -DT "${build_dir}/dosbox" "${pkg_dir}/dosbox"
install -DT contrib/linux/dosbox-staging.desktop "${pkg_dir}/desktop/dosbox-staging.desktop"
DESTDIR="$(realpath "$pkg_dir")" make -C contrib/icons/ install datadir=
}
pkg_macos()
{
# Note, this script assumes macos builds have x86_64 and arm64 subdirectories
# Print shared object dependencies
for arch in x86_64 arm64; do
echo "Checking shared object dependencies for $arch:"
otool -L "${build_dir}/dosbox-$arch/dosbox"
python3 scripts/verify-macos-dylibs.py "${build_dir}/dosbox-$arch/dosbox"
echo ""
done
# Create universal binary from both architectures
mkdir dosbox-universal
lipo dosbox-x86_64/dosbox dosbox-arm64/dosbox -create -output dosbox-universal/dosbox
# Generate icon
make -C contrib/icons/ dosbox-staging.icns
install -d "${macos_dst_dir}/MacOS/"
install dosbox-universal/dosbox "${macos_dst_dir}/MacOS/"
install_file contrib/macos/Info.plist.template "${macos_dst_dir}/Info.plist"
install_file contrib/macos/PkgInfo "${macos_dst_dir}/PkgInfo"
install_file contrib/icons/dosbox-staging.icns "${macos_dst_dir}/Resources/"
sed -i -e "s|%VERSION%|${dbox_version}|" "${macos_dst_dir}/Info.plist"
}
pkg_msys2()
{
install -DT "${build_dir}/dosbox.exe" "${pkg_dir}/dosbox.exe"
# Discover and copy required dll files
ntldd -R "${pkg_dir}/dosbox.exe" \
| sed -e 's/^[[:blank:]]*//g' \
| cut -d ' ' -f 3 \
| grep -E -i '(mingw|clang)(32|64)' \
| sed -e 's|\\|/|g' \
| xargs cp --target-directory="${pkg_dir}/"
}
pkg_msvc()
{
# Get the release dir name from $build_dir
release_dir=$(basename -- "$(dirname -- "${build_dir}")")/$(basename -- "${build_dir}")
# Copy binary
cp "${build_dir}/dosbox.exe" "${pkg_dir}/dosbox.exe"
# Copy dll files
cp "${build_dir}"/*.dll "${pkg_dir}/"
cp "src/libs/zmbv/${release_dir}"/*.dll "${pkg_dir}/"
# Copy MSVC C++ redistributable files
cp docs/vc_redist.txt "${pkg_dir}/doc/vc_redist.txt"
cp "$VC_REDIST_DIR"/*.dll "${pkg_dir}/"
}
# Get GitHub CI environment variables if available. The CLI options
# '-c', '-b', '-r' will override these if set.
if [ -n "${GITHUB_REPOSITORY:-}" ]; then
git_commit=${GITHUB_SHA}
git_branch=${GITHUB_REF#refs/heads/}
git_repo=${GITHUB_REPOSITORY}
else
git_commit=$(git rev-parse --short HEAD || echo '')
git_branch=$(git rev-parse --abbrev-ref HEAD || echo '')
git_repo=$(basename "$(git rev-parse --show-toplevel)" || echo '')
fi
print_usage="false"
while getopts 'p:c:b:r:v:hf' c
do
case $c in
h) print_usage="true" ;;
f) force_pkg="true" ;;
p) platform=$OPTARG ;;
c) git_commit=$OPTARG ;;
b) git_branch=$OPTARG ;;
r) git_repo=$OPTARG ;;
v) dbox_version=$OPTARG ;;
*) true ;; # keep shellcheck happy
esac
done
shift "$((OPTIND - 1))"
build_dir=$1
pkg_dir=$2
if [ "$print_usage" = "true" ]; then
usage
exit 0
fi
p=$platform
case $p in
linux|macos|msys2|msvc) true ;;
*) platform="unsupported" ;;
esac
if [ "$platform" = "unsupported" ]; then
echo "Platform not set or unsupported"
usage
exit 1
fi
if [ ! -d "$build_dir" ]; then
echo "Build directory not set, or does not exist"
usage
exit 1
fi
if [ -z "$pkg_dir" ]; then
echo "Package directory not set"
usage
exit 1
fi
if [ "$platform" = "macos" ]; then
if [ -z "$dbox_version" ]; then
echo "Dosbox version required on MacOS"
usage
exit 1
fi
macos_dst_dir=${pkg_dir}/dist/dosbox-staging.app/Contents
fi
if [ "$platform" = "msvc" ] && [ -z "$VC_REDIST_DIR" ]; then
echo "VC_REDIST_DIR environment variable not set"
usage
exit 1
fi
if [ -f "$pkg_dir" ]; then
echo "PACKAGE_DIR must not be a file"
usage
exit 1
fi
mkdir -p "$pkg_dir"
if [ -z "$(find "${pkg_dir}" -maxdepth 0 -empty)" ] && [ "$force_pkg" != "true" ]; then
echo "PACKAGE_DIR must be empty. Use '-f' to force creation anyway"
usage
exit 1
fi
set -x
install_doc
install_resources
case $platform in
linux) pkg_linux ;;
macos) pkg_macos ;;
msys2) pkg_msys2 ;;
msvc) pkg_msvc ;;
*) echo "Oops."; usage; exit 1 ;;
esac