239 lines
6.7 KiB
Bash
Executable File
239 lines
6.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
source "$SCRIPT_DIR/common.sh"
|
|
|
|
usage() {
|
|
cat <<'EOF'
|
|
Usage:
|
|
./scripts/build.sh stable
|
|
./scripts/build.sh dxvk-git
|
|
./scripts/build.sh all
|
|
|
|
Builds one or both Elsword Proton-GE compatibility tool directories in dist/
|
|
and validates them before packaging.
|
|
EOF
|
|
}
|
|
|
|
prepare_toolchain_wrappers() {
|
|
local workdir="$1"
|
|
local toolchain_dir="$workdir/toolchain"
|
|
local pthread_dir="$workdir/mingw-pthread"
|
|
local mcfg32 mcfg64
|
|
|
|
mkdir -p "$toolchain_dir" "$pthread_dir/x32" "$pthread_dir/x64"
|
|
|
|
if [[ -n "$MINGW_PTHREAD_ROOT" \
|
|
&& -f "$MINGW_PTHREAD_ROOT/x32/libpthread.a" \
|
|
&& -f "$MINGW_PTHREAD_ROOT/x64/libpthread.a" ]]; then
|
|
ln -sf "$MINGW_PTHREAD_ROOT/x32/libpthread.a" "$pthread_dir/x32/libpthread.a"
|
|
ln -sf "$MINGW_PTHREAD_ROOT/x64/libpthread.a" "$pthread_dir/x64/libpthread.a"
|
|
else
|
|
mcfg32="$(NIXPKGS_ALLOW_UNSUPPORTED_SYSTEM=1 nix path-info --impure nixpkgs#pkgsCross.mingw32.windows.mcfgthreads)"
|
|
mcfg64="$(NIXPKGS_ALLOW_UNSUPPORTED_SYSTEM=1 nix path-info --impure nixpkgs#pkgsCross.mingwW64.windows.mcfgthreads)"
|
|
ln -sf "$mcfg32/lib/libmcfgthread.a" "$pthread_dir/x32/libpthread.a"
|
|
ln -sf "$mcfg64/lib/libmcfgthread.a" "$pthread_dir/x64/libpthread.a"
|
|
fi
|
|
|
|
cat > "$toolchain_dir/x86_64-w64-mingw32-gcc" <<EOF
|
|
#!/usr/bin/env bash
|
|
exec "$(command -v x86_64-w64-mingw32-gcc)" "\$@" -L"$pthread_dir/x64" -lmcfgthread -lpthread
|
|
EOF
|
|
cat > "$toolchain_dir/x86_64-w64-mingw32-g++" <<EOF
|
|
#!/usr/bin/env bash
|
|
exec "$(command -v x86_64-w64-mingw32-g++)" "\$@" -L"$pthread_dir/x64" -lmcfgthread -lpthread
|
|
EOF
|
|
cat > "$toolchain_dir/i686-w64-mingw32-gcc" <<EOF
|
|
#!/usr/bin/env bash
|
|
exec "$(command -v i686-w64-mingw32-gcc)" "\$@" -L"$pthread_dir/x32" -lmcfgthread -lpthread
|
|
EOF
|
|
cat > "$toolchain_dir/i686-w64-mingw32-g++" <<EOF
|
|
#!/usr/bin/env bash
|
|
exec "$(command -v i686-w64-mingw32-g++)" "\$@" -L"$pthread_dir/x32" -lmcfgthread -lpthread
|
|
EOF
|
|
chmod +x \
|
|
"$toolchain_dir/x86_64-w64-mingw32-gcc" \
|
|
"$toolchain_dir/x86_64-w64-mingw32-g++" \
|
|
"$toolchain_dir/i686-w64-mingw32-gcc" \
|
|
"$toolchain_dir/i686-w64-mingw32-g++"
|
|
|
|
cat > "$toolchain_dir/build-win64.txt" <<EOF
|
|
[binaries]
|
|
c = '$toolchain_dir/x86_64-w64-mingw32-gcc'
|
|
cpp = '$toolchain_dir/x86_64-w64-mingw32-g++'
|
|
ar = '$(command -v x86_64-w64-mingw32-ar)'
|
|
strip = '$(command -v x86_64-w64-mingw32-strip)'
|
|
windres = '$(command -v x86_64-w64-mingw32-windres)'
|
|
|
|
[properties]
|
|
needs_exe_wrapper = true
|
|
|
|
[host_machine]
|
|
system = 'windows'
|
|
cpu_family = 'x86_64'
|
|
cpu = 'x86_64'
|
|
endian = 'little'
|
|
EOF
|
|
|
|
cat > "$toolchain_dir/build-win32.txt" <<EOF
|
|
[binaries]
|
|
c = '$toolchain_dir/i686-w64-mingw32-gcc'
|
|
cpp = '$toolchain_dir/i686-w64-mingw32-g++'
|
|
ar = '$(command -v i686-w64-mingw32-ar)'
|
|
strip = '$(command -v i686-w64-mingw32-strip)'
|
|
windres = '$(command -v i686-w64-mingw32-windres)'
|
|
|
|
[properties]
|
|
needs_exe_wrapper = true
|
|
|
|
[host_machine]
|
|
system = 'windows'
|
|
cpu_family = 'x86'
|
|
cpu = 'x86'
|
|
endian = 'little'
|
|
EOF
|
|
|
|
printf "%s\n" "$toolchain_dir"
|
|
}
|
|
|
|
build_dxvk_variant() {
|
|
local variant="$1"
|
|
local dxvk_src="$2"
|
|
local workdir="$3"
|
|
local toolchain_dir="$4"
|
|
local dxvk_build_dir="$workdir/dxvk-out/$variant"
|
|
|
|
mkdir -p "$dxvk_build_dir"
|
|
|
|
say "Build DXVK for $variant"
|
|
(
|
|
cd "$dxvk_src"
|
|
meson setup --cross-file "$toolchain_dir/build-win64.txt" \
|
|
--buildtype release \
|
|
--prefix "$dxvk_build_dir" \
|
|
--strip \
|
|
--bindir x64 \
|
|
--libdir x64 \
|
|
-Db_ndebug=if-release \
|
|
"$dxvk_build_dir/build.64" >&2
|
|
ninja -C "$dxvk_build_dir/build.64" install >&2
|
|
|
|
meson setup --cross-file "$toolchain_dir/build-win32.txt" \
|
|
--buildtype release \
|
|
--prefix "$dxvk_build_dir" \
|
|
--strip \
|
|
--bindir x32 \
|
|
--libdir x32 \
|
|
-Db_ndebug=if-release \
|
|
"$dxvk_build_dir/build.32" >&2
|
|
ninja -C "$dxvk_build_dir/build.32" install >&2
|
|
)
|
|
|
|
rm -f "$dxvk_build_dir"/x64/*.a "$dxvk_build_dir"/x32/*.a
|
|
rm -rf "$dxvk_build_dir/build.64" "$dxvk_build_dir/build.32"
|
|
|
|
printf "%s\n" "$dxvk_build_dir"
|
|
}
|
|
|
|
finalize_tool_tree() {
|
|
local variant="$1"
|
|
local tool_root="$2"
|
|
local tool_name="$3"
|
|
local dxvk_build_dir="$4"
|
|
local build_time="$5"
|
|
local dxvk_src="$6"
|
|
local tool_dir="$DIST_DIR/$tool_name"
|
|
local metadata_log="$tool_root/runtime-deps.log"
|
|
local dxvk_channel dxvk_tag dxvk_commit dxvk_describe
|
|
|
|
dxvk_channel="$(dxvk_channel_for_variant "$variant")"
|
|
dxvk_tag="$(dxvk_tag_for_variant "$variant")"
|
|
dxvk_commit="$(git -C "$dxvk_src" rev-parse HEAD)"
|
|
dxvk_describe="$(git -C "$dxvk_src" describe --always --tags --dirty)"
|
|
|
|
say "Patch tool tree for $tool_name"
|
|
ensure_tool_tree_writable "$tool_root"
|
|
replace_dxvk_payload "$dxvk_build_dir" "$tool_root"
|
|
mkdir -p "$tool_dir"
|
|
copy_required_runtime_dlls "$tool_root" "$dxvk_build_dir" "$metadata_log"
|
|
inject_wrapper_defaults "$tool_root/proton"
|
|
patch_tool_manifests "$tool_root" "$tool_name"
|
|
printf "%s dxvk (%s)\n" "$dxvk_commit" "$dxvk_describe" > "$tool_root/files/lib/wine/dxvk/version"
|
|
|
|
cat > "$tool_root/BUILD-INFO.txt" <<EOF
|
|
Tool name: ${tool_name}
|
|
Proton base: ${PROTON_TAG}
|
|
Wine series: ${WINE_SERIES}
|
|
Runtime appid: ${RUNTIME_APPID}
|
|
DXVK channel: ${dxvk_channel}
|
|
DXVK tag: ${dxvk_tag}
|
|
DXVK commit: ${dxvk_commit}
|
|
DXVK describe: ${dxvk_describe}
|
|
Build time: ${build_time}
|
|
EOF
|
|
|
|
rm -rf "$tool_dir"
|
|
mv "$tool_root" "$tool_dir"
|
|
|
|
write_build_metadata \
|
|
"$variant" \
|
|
"$tool_name" \
|
|
"$tool_dir" \
|
|
"$dxvk_channel" \
|
|
"$dxvk_tag" \
|
|
"$dxvk_commit" \
|
|
"$dxvk_describe" \
|
|
"$build_time" \
|
|
"$(archive_name_for_variant "$variant")" \
|
|
"$(archive_alias_for_variant "$variant")"
|
|
|
|
"$SCRIPT_DIR/validate-build.sh" "$tool_dir" "$tool_name"
|
|
}
|
|
|
|
build_variant() {
|
|
local variant="$1"
|
|
local workdir proton_tarball proton_root dxvk_src toolchain_dir dxvk_build_dir tool_name build_time
|
|
|
|
tool_name="$(tool_name_for_variant "$variant")"
|
|
build_time="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
|
workdir="$(workdir_for_variant "$variant")"
|
|
trap "cleanup_workdir '$workdir'" RETURN
|
|
|
|
proton_tarball="$(download_proton_tarball)"
|
|
proton_root="$(extract_proton_tool "$workdir" "$proton_tarball")"
|
|
dxvk_src="$(prepare_dxvk_source "$variant" "$workdir")"
|
|
toolchain_dir="$(prepare_toolchain_wrappers "$workdir")"
|
|
dxvk_build_dir="$(build_dxvk_variant "$variant" "$dxvk_src" "$workdir" "$toolchain_dir")"
|
|
finalize_tool_tree "$variant" "$proton_root" "$tool_name" "$dxvk_build_dir" "$build_time" "$dxvk_src"
|
|
}
|
|
|
|
main() {
|
|
local mode="${1:-all}"
|
|
|
|
case "$mode" in
|
|
stable|dxvk-git|all) ;;
|
|
-h|--help)
|
|
usage
|
|
exit 0
|
|
;;
|
|
*)
|
|
usage >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
require_toolchain_commands
|
|
ensure_repo_layout
|
|
|
|
if [[ "$mode" == "all" ]]; then
|
|
build_variant stable
|
|
build_variant dxvk-git
|
|
else
|
|
build_variant "$mode"
|
|
fi
|
|
}
|
|
|
|
main "$@"
|