This commit is contained in:
Executable
+238
@@ -0,0 +1,238 @@
|
||||
#!/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 "$@"
|
||||
Reference in New Issue
Block a user