mirror of
https://github.com/libretro/Libretro-Supermodel.git
synced 2026-11-10 17:23:56 -10:00
93 lines
2.1 KiB
Bash
93 lines
2.1 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
set -euo pipefail
|
|
|
|
if [[ $# -ne 2 ]]; then
|
|
echo "Usage: $0 <core> <file-description-regex>" >&2
|
|
exit 2
|
|
fi
|
|
|
|
core=$1
|
|
expected_format=$2
|
|
|
|
if [[ ! -s $core ]]; then
|
|
echo "Core is missing or empty: $core" >&2
|
|
exit 1
|
|
fi
|
|
|
|
description=$(file -b "$core")
|
|
echo "Core: $core"
|
|
echo "Format: $description"
|
|
|
|
if [[ ! $description =~ $expected_format ]]; then
|
|
echo "Unexpected core format. Expected pattern: $expected_format" >&2
|
|
exit 1
|
|
fi
|
|
|
|
case $description in
|
|
*Mach-O*)
|
|
symbols=$(nm -gU "$core")
|
|
;;
|
|
*)
|
|
symbols=$(nm -g --defined-only "$core")
|
|
;;
|
|
esac
|
|
required_symbols=(
|
|
retro_init
|
|
retro_deinit
|
|
retro_api_version
|
|
retro_get_system_info
|
|
retro_get_system_av_info
|
|
retro_set_environment
|
|
retro_set_video_refresh
|
|
retro_set_audio_sample
|
|
retro_set_audio_sample_batch
|
|
retro_set_input_poll
|
|
retro_set_input_state
|
|
retro_set_controller_port_device
|
|
retro_reset
|
|
retro_run
|
|
retro_serialize_size
|
|
retro_serialize
|
|
retro_unserialize
|
|
retro_cheat_reset
|
|
retro_cheat_set
|
|
retro_load_game
|
|
retro_load_game_special
|
|
retro_unload_game
|
|
retro_get_region
|
|
retro_get_memory_data
|
|
retro_get_memory_size
|
|
)
|
|
|
|
for symbol in "${required_symbols[@]}"; do
|
|
if ! grep -Eq "[[:space:]]_?${symbol}$" <<<"$symbols"; then
|
|
echo "Missing required Libretro symbol: $symbol" >&2
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
echo "Validated ${#required_symbols[@]} required Libretro symbols."
|
|
|
|
case $description in
|
|
*ELF*)
|
|
dependencies=$(ldd "$core")
|
|
echo "$dependencies"
|
|
if grep -q "not found" <<<"$dependencies"; then
|
|
echo "The Linux core has unresolved runtime dependencies." >&2
|
|
exit 1
|
|
fi
|
|
;;
|
|
*Mach-O*)
|
|
otool -L "$core"
|
|
;;
|
|
*PE32*)
|
|
dependencies=$(objdump -p "$core" | grep "DLL Name:" || true)
|
|
echo "$dependencies"
|
|
if grep -Eqi "(libgcc|libstdc\+\+|zlib1)\.dll" <<<"$dependencies"; then
|
|
echo "The Windows core depends on a runtime that should be statically linked." >&2
|
|
exit 1
|
|
fi
|
|
;;
|
|
esac
|