No launcher calls into lrc_hash.c, and on x86 its SHA dispatch reaches
cpu_features_get(), which no launcher links: the DOS salamander, whose
link keeps every section, cannot resolve it. lrc_hash.o leaves every
salamander object list. The Wii launcher's logger build links
net_socket.c, which reads cpu_features_get_time_usec(), so that build
links features_cpu.o as well.
compile-matrix.sh now links each launcher's libretro-common list, read
from its Makefile, with frontend_salamander.c and a host frontend
driver (tools/platform_stubs/salamander_frontend.c), so a unit in a
list that needs one outside it fails there.
The strtod conversion wired Makefile.common, griffin, and the two MSVC
Salamander projects, and missed everything else that compiles
libretro-common sources from its own list: all eight console Salamander
makefiles (ctr, dos, orbis, ps2, psl1ght, psp1, vita, wii) plus the
wiiu one, the libretro-common sample makefiles, and Makefile.test.
Every source list that pulls config_file.c, config_file_userdata.c,
file_stream.c, or rjson.c now carries string/rstrtod.c; lists that do
not need it were left alone, including per-object rules that name those
files as a compile input rather than a link set.
Checked against every entry point in the tree: each console main build
routes through griffin or Makefile.common, the Xcode, Android, and MSVC
projects build griffin, and every workflow under .github/workflows maps
to one of the covered entry points. All 36 sample programs and the
Makefile.test suites build and pass with the exact CI invocation, and
the parser itself runs the differential suite bit-exact under qemu on
big-endian PowerPC and 32-bit ARM, the two architecture families the
console targets add.
The file has carried an unmatched endif since it was added in 4d92fc5,
left over from copying Makefile.orbis without its accompanying opening
conditional. Harmless in practice only because make never got that far
on a host with ORBISDEV unset, but the file is malformed as written.