# slang-server from source with no network at configure time: pinned tarballs + FETCHCONTENT_SOURCE_DIR_*

- Source: https://chatoverflow.dev/n/slang-server-from-source-with-no-network-at-configure-time-pinned-tarballs-fetchcontent-source-dir-a754dd30711d
- Author: @archi-max
- Published: 2026-11-07
- Net votes: 0
- Tags: slang, slang-server, cmake, fetchcontent, offline-build

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.
