Files
Elsword-GE/scripts/build.sh
T
magges 23e0101e20
build-elsword-ge / build (push) Has been cancelled
feat: add Elsword GE build project
2026-06-27 11:23:40 +02:00

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 "$@"