nodejs/node · error · ValueError

Unable to determine target architecture for libffi headers

Error message

Unable to determine target architecture for libffi headers

What it means

detect_target_arch() walks a candidate list (TARGET_ARCH, npm_config_arch, VSCMD_ARG_TGT_ARCH, Platform, PROCESSOR_ARCHITECTURE, platform.machine()) and normalizes each through an aliases map. If none of the candidates map to a known architecture key, it can't decide which ffitarget to generate and aborts.

Source

Thrown at deps/libffi/generate-headers.py:256

        'arm64': 'arm64',
        'aarch64': 'arm64',
        'arm': 'arm',
        'riscv64': 'riscv64',
        'loong64': 'loong64',
        'ppc64': 'ppc64',
        'mips': 'mips',
        'mipsel': 'mipsel',
        'mips64el': 'mips64el',
    }

    for candidate in candidates:
        if not candidate:
            continue
        normalized = aliases.get(candidate.lower())
        if normalized is not None:
            return normalized

    raise ValueError('Unable to determine target architecture for libffi headers')


def main(argv=None):
    parser = argparse.ArgumentParser(description='Generate libffi headers')
    parser.add_argument('--output-dir', required=True)
    parser.add_argument('--target-arch')
    parser.add_argument('--os')
    args = parser.parse_args(argv)

    try:
        generate_headers(args.output_dir,
                         args.target_arch or detect_target_arch(),
                         args.os or detect_os_name())
    except Exception as exc:  # pylint: disable=broad-except
        print(exc, file=sys.stderr)
        return 1

    return 0

View on GitHub (pinned to 1b2de5e052)

Solutions

  1. Pass --target-arch explicitly with a recognized value (x86, x86_64, arm, arm64, mips, ...).
  2. Set TARGET_ARCH (or npm_config_arch) in the build environment to a value present in the aliases map.
  3. If your arch is legitimately supported upstream, add the missing alias in detect_target_arch().

Example fix

# before: platform.machine()='riscv64' unknown, no env set
python generate-headers.py --output-dir out
# after
python generate-headers.py --output-dir out --target-arch x86_64
Defensive patterns

Strategy: validation

Validate before calling

import os, platform
ALIASES = {'x64':'x86_64','amd64':'x86_64','x86':'x86','ia32':'x86',
           'arm':'arm','arm64':'arm64','aarch64':'arm64','mips':'mips'}
for cand in (os.environ.get('TARGET_ARCH'), os.environ.get('npm_config_arch'), platform.machine()):
    if cand and cand.lower() in ALIASES:
        arch = ALIASES[cand.lower()]; break
else:
    raise SystemExit('set --target-arch or TARGET_ARCH to a recognized value')

Type guard

def recognized_arch(value):
    aliases = {'x64':'x86_64','amd64':'x86_64','x86':'x86','arm':'arm','arm64':'arm64','aarch64':'arm64','mips':'mips'}
    return value is not None and value.lower() in aliases

Prevention

When it happens

Trigger: Raised when every candidate env var is unset/empty and platform.machine() returns something not in the aliases dict (e.g. 'aarch64' if unaliased, 'riscv64', 'ppc64le' spelled differently). Only fires when --target-arch is not given on the CLI.

Common situations: Cross-compile shells where TARGET_ARCH/npm_config_arch are unset and platform.machine() reports an unrecognized string; building on arches whose platform.machine() spelling differs from the aliases keys; CI images that don't set npm_config_arch.

Related errors


AI-assisted analysis of nodejs/node@1b2de5e052 (2026-08-13). Data as JSON: /api/errors/b908a78044df4fba. Report an issue: GitHub.