Building SQLite on Apple M1 Fails Due to Outdated config.guess/config.sub
Build Failure on Apple M1 with "Invalid Configuration arm64-apple-darwin" Error
Issue Overview: Mismatched Architecture Detection in SQLite Build System
The core problem arises when attempting to build SQLite on Apple Silicon (M1/M2) machines using environments that rely on GNU Coreutils utilities like uname, such as Nix Shell or Homebrew. The ./configure script fails with an error indicating an unrecognized machine type arm64-apple-darwin20.6.0. This occurs because SQLite’s build system uses outdated config.guess and config.sub scripts that do not recognize the arm64 architecture identifier.
These scripts are part of the GNU Autotools framework and are responsible for detecting the host system’s architecture, operating system, and other platform-specific details. When they are outdated, they cannot map the arm64 identifier returned by uname -m (or guname -m in GNU Coreutils) to a valid machine type. This results in a broken build chain, as the configure script cannot generate a valid system configuration. The error is particularly acute in environments where GNU Coreutils tools override or supplement macOS’s native utilities, such as Nix Shell, which prioritizes GNU tools in the PATH.
The macOS native uname utility reports arm for the processor type (uname -p), while GNU Coreutils’ guname -p reports arm64. This discrepancy creates further confusion in build systems expecting consistency between these values. SQLite’s build process relies on these values to set compiler flags, link libraries, and configure platform-specific optimizations. When config.guess and config.sub cannot reconcile these values, the build aborts. The problem is exacerbated by the fact that SQLite’s included config.guess and config.sub files date to 2019, predating the release of Apple Silicon hardware (2020) and its associated software ecosystem changes.
Possible Causes: Outdated Autotools Scripts, Toolchain Conflicts, and Coreutils Discrepancies
1. Obsolete config.guess and config.sub Files in SQLite Source Tree
The config.guess and config.sub scripts distributed with SQLite are versioned from May 2019. These scripts lack support for the arm64-apple-darwin triple used by Apple Silicon. The GNU Autotools project maintains these scripts, and updates are regularly released to support new architectures. SQLite’s build system has not integrated these updates, leading to a mismatch between the detected architecture (arm64) and the known machine types in the scripts. The failure occurs because config.sub cannot normalize arm64-apple-darwin20.6.0 into a valid triple, causing configure to abort.
2. Toolchain Environment Differences: Nix Shell, Homebrew, and PATH Ordering
Environments like Nix Shell or Homebrew alter the default toolchain behavior by prioritizing GNU Coreutils (e.g., guname) over macOS’s BSD-derived utilities. macOS’s native uname reports arm for the processor type (uname -p), while GNU Coreutils’ guname reports arm64. Build systems that use GNU Coreutils tools will see inconsistent architecture detection compared to those using macOS tools. For example, Nix Shell modifies the PATH to include GNU utilities first, causing configure to use guname instead of the native uname. This creates a divergence from SQLite’s default build expectations, which are tuned for macOS’s toolchain.
3. GNU Coreutils Bug in uname for Apple Silicon
A specific bug in GNU Coreutils (fixed in late 2021) caused uname -p to report arm64 instead of arm on Apple Silicon. This bug was patched in Coreutils’ Git repository but had not been backported to stable releases at the time of the discussion. Environments using pre-patch Coreutils versions (e.g., Homebrew’s coreutils formula) inherited this bug, leading to incorrect processor type detection. SQLite’s build system, expecting arm from uname -p, instead receives arm64, which is not handled by the outdated config.sub script.
Troubleshooting Steps: Updating Autotools Scripts, Environment Workarounds, and Coreutils Patching
1. Update config.guess and config.sub to Latest Versions
The definitive fix is to replace SQLite’s outdated config.guess and config.sub files with the latest versions from the GNU Autotools repository. These files are maintained upstream and include support for Apple Silicon’s arm64 architecture.
Steps:
- Download the latest
config.guessandconfig.subfrom GNU’s Git repository:wget -O config.sub https://git.savannah.gnu.org/cgit/config.git/plain/config.sub wget -O config.guess https://git.savannah.gnu.org/cgit/config.git/plain/config.guess - Replace the existing files in SQLite’s source tree with the downloaded versions.
- Rerun
./configureto regenerate the build system with the updated architecture detection.
Validation:
After updating, running bash ./config.sub $(bash ./config.guess) should output aarch64-apple-darwin20.6.0 instead of failing. The aarch64 identifier is recognized by modern Autotools scripts as equivalent to arm64, resolving the configuration error.
2. Modify Environment to Prioritize macOS Native Tools
If updating Autotools scripts is not feasible (e.g., in a restricted build environment), reconfigure the toolchain to use macOS’s native utilities instead of GNU Coreutils. This ensures uname -p returns arm, matching SQLite’s expectations.
Steps for Nix Shell:
- Adjust the
PATHvariable to place/usr/binbefore Nix-managed paths:export PATH="/usr/bin:$PATH" - Verify tool precedence with
which uname, which should return/usr/bin/uname.
Steps for Homebrew:
- Avoid using
gnu-unameor other Coreutils formulae that override system utilities. If installed, unlink them:brew unlink coreutils - Ensure Homebrew does not add GNU utilities to the
PATHby default by modifying shell configuration files (e.g.,.zshrc,.bashrc).
3. Apply GNU Coreutils Patches for Apple Silicon Compatibility
If the environment requires GNU Coreutils, apply the upstream patch that fixes uname -p reporting on Apple Silicon. This patch corrects the processor type detection to align with macOS’s behavior.
Steps:
- Clone the GNU Coreutils Git repository:
git clone https://git.savannah.gnu.org/git/coreutils.git - Check out the commit with the Apple Silicon patch:
git checkout e3d1ff04370b3e090e4cfeb8f6cc4a63590a516f - Build and install Coreutils from source, replacing the buggy versions in Homebrew or Nix.
Note: This approach is recommended only for advanced users, as building Coreutils from source introduces maintenance overhead. Prefer using updated Autotools scripts in SQLite as the primary solution.
4. Manual Override of Configure Script Parameters
As a temporary workaround, manually specify the host system type to bypass architecture detection. This forces the build system to use known-good settings for Apple Silicon.
Steps:
- Run
./configurewith explicit host and build parameters:./configure --build=aarch64-apple-darwin --host=aarch64-apple-darwin - Verify that the configure script accepts these parameters and proceeds to generate the Makefile.
Limitations: This method assumes prior knowledge of valid configuration triples and may not handle all platform-specific optimizations correctly. It is a stopgap until config.guess and config.sub are updated.
5. Advocate for Upstream Updates to SQLite’s Build System
To prevent future issues, engage with the SQLite community to update the config.guess and config.sub files in the official source distribution. This ensures all users benefit from improved architecture detection without manual intervention.
Steps:
- File a bug report or feature request on SQLite’s Fossil repository, referencing the GNU Coreutils patch and Apple Silicon build failures.
- Submit a patch to the SQLite team with updated Autotools scripts, ensuring compatibility with their build process.
Outcome: Once accepted, SQLite’s official releases will include modern Autotools scripts, eliminating the need for manual updates on Apple Silicon systems.