nodejs/node · error · GypError

Missing 'target_name' field in target.

Error message

Missing 'target_name' field in target.

What it means

While traversing the target dependency graph to compute link/dependency sets (DependencyGraphNode), every referenced target dict MUST contain a 'target_name' key. The guard at input.py:1842 inside the link-dependency computation aborts when targets[self.ref] has no 'target_name', because the node cannot be meaningfully identified or reported without it.

Source

Thrown at tools/gyp/pylib/gyp/input.py:1842

        If |include_shared_libraries| is False, the resulting dependencies will not
        include shared_library targets that are linked into this target.
        """
        if dependencies is None:
            # Using a list to get ordered output and a set to do fast "is it
            # already added" checks.
            dependencies = OrderedSet()

        # Check for None, corresponding to the root node.
        if self.ref is None:
            return dependencies

        # It's kind of sucky that |targets| has to be passed into this function,
        # but that's presently the easiest way to access the target dicts so that
        # this function can find target types.

        if "target_name" not in targets[self.ref]:
            raise GypError("Missing 'target_name' field in target.")

        if "type" not in targets[self.ref]:
            raise GypError(
                "Missing 'type' field in target %s" % targets[self.ref]["target_name"]
            )

        target_type = targets[self.ref]["type"]

        is_linkable = target_type in linkable_types

        if initial and not is_linkable:
            # If this is the first target being examined and it's not linkable,
            # return an empty list of link dependencies, because the link
            # dependencies are intended to apply to the target itself (initial is
            # True) and this target won't be linked.
            return dependencies

        # Don't traverse 'none' targets if explicitly excluded.

View on GitHub (pinned to 1b2de5e052)

Solutions

  1. Add 'target_name' to every target dict in the offending .gyp file's targets array.
  2. Locate the target via the partial context in the error/stack trace and inspect targets[self.ref] keys.
  3. Run gyp with --check to surface the offending file before link-time.
  4. If generated programmatically, audit the generator to always emit target_name.

Example fix

// before
{ 'type': 'static_library', 'sources': ['a.cc'] }

// after
{ 'target_name': 'foo', 'type': 'static_library', 'sources': ['a.cc'] }
Defensive patterns

Strategy: validation

Validate before calling

for t in spec.get('targets', []):
    assert 'target_name' in t, 'target missing target_name: %r' % t

Type guard

def has_target_name(t): return isinstance(t, dict) and 'target_name' in t

Try / catch

try:
    gyp.main(args)
except gyp.input.GypError as e:
    if 'target_name' in str(e): print('Add target_name to the offending target'); raise

Prevention

When it happens

Trigger: During dependency-set computation, targets[self.ref] (the spec dict for the node currently being examined) lacks the 'target_name' key. This is reached for both initial and non-initial nodes that participate in dependency walking.

Common situations: A programmatic .gyp generator or a hand-written target dict that omits target_name; a malformed/partial target produced by a bad merge or variable expansion; a third-party .gypi include that defines an incomplete target skeleton; corruption from an aborted dict-merge pass.

Related errors


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