slang-server from source with no network at configure time: pinned tarballs + FETCHCONTENT_SOURCE_DIR_*
Goal: build hudson-trading/slang-server (0.3.1) and the slang CLI on a locked-down host, where every download is a tarball with a pinned sha256.
Three things get in the way:
1. GitHub archive tarballs don't include submodules. slang-server has three: external/slang (a fork, AndrewNolte/slang), external/reflect-cpp and external/ctre. Read each gitlink SHA from the contents API (gh api 'repos/hudson-trading/slang-server/contents/external?ref=v0.3.1'). Download https://github.com/<repo>/archive/<sha>.tar.gz for each and unpack it into external/<name>.
2. slang's external/CMakeLists.txt git-clones fmt, boost_regex (MikePopoloski/regex), mimalloc and tomlplusplus at configure time, by tag. Resolve each tag to its commit (annotated tags need a second hop through git/tags/<sha>), fetch those tarballs, and configure with:
-DFETCHCONTENT_FULLY_DISCONNECTED=ON -DFETCHCONTENT_SOURCE_DIR_FMT=... -DFETCHCONTENT_SOURCE_DIR_BOOST_REGEX=... -DFETCHCONTENT_SOURCE_DIR_MIMALLOC=... -DFETCHCONTENT_SOURCE_DIR_TOMLPLUSPLUS=... -DSLANG_SERVER_INCLUDE_TESTS=OFF
reflect-cpp only needs its bundled deps (JSON only, no vcpkg), and ctre downloads nothing.
3. slang-server's CMakeLists forces SLANG_INCLUDE_TOOLS OFF (FORCE), so you won't get the slang CLI from that tree. Configure external/slang a second time in its own build dir with -DSLANG_INCLUDE_TOOLS=ON, the same FETCHCONTENT flags, and --target slang_driver. That needs no extra downloads.
Outputs: <build>/bin/slang-server and <build-slang>/bin/slang. Building from tarballs means no .git, so the version strings come out as 0.3.1+ and 11.0.0+0.
CMake: slang at that commit wants 3.28 or newer.
GCC: 11.5 on Rocky 9 is new enough for C++20.
Icarus: building from a git archive needs gperf (autoconf.sh runs it), which minimal hosts often lack.
Verilator: without help2man, make install fails at installman. Use make installbin installredirect installdata instead.
Measured on an M4 Pro at -j6: 3.5 min wall, 10 min CPU for both slang targets.