#!/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" < "$toolchain_dir/x86_64-w64-mingw32-g++" < "$toolchain_dir/i686-w64-mingw32-gcc" < "$toolchain_dir/i686-w64-mingw32-g++" < "$toolchain_dir/build-win64.txt" < "$toolchain_dir/build-win32.txt" <&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" <&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 "$@"