Add `starlark_deps` to gn targets.

Bug: 528225104
Change-Id: I2217cd01be15eb3ae9b00989b8f4722a6a6a6964
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/24805
Reviewed-by: Takuto Ikuta <tikuta@google.com>
Commit-Queue: Matt Stark <msta@google.com>
diff --git a/build/gen.py b/build/gen.py
index 18f5779..ce2c104 100755
--- a/build/gen.py
+++ b/build/gen.py
@@ -849,6 +849,7 @@
               'src/gn/exec_process.cc',
               'src/gn/ffi/bridge.cc',
               'src/gn/ffi/scope.cc',
+              'src/gn/ffi/target.cc',
               'src/gn/ffi/value.cc',
               'src/gn/ffi/session.cc',
               'src/gn/filesystem_utils.cc',
diff --git a/src/gn/builder.cc b/src/gn/builder.cc
index aca80d7..c472cc4 100644
--- a/src/gn/builder.cc
+++ b/src/gn/builder.cc
@@ -279,6 +279,7 @@
       !AddDeps(record, target->all_dependent_configs(), err) ||
       !AddDeps(record, target->public_configs(), err) ||
       !AddGenDeps(record, target->gen_deps(), err) ||
+      !AddDeps(record, target->starlark_deps(), err) ||
       !AddPoolDep(record, target, err) ||
       !AddToolchainDep(record, target, err) ||
       !AddValidationDeps(record, target->validations(), err))
@@ -538,6 +539,7 @@
     if (!ResolveDeps(&target->public_deps(), err) ||
         !ResolveDeps(&target->private_deps(), err) ||
         !ResolveDeps(&target->data_deps(), err) ||
+        !ResolveDeps(&target->starlark_deps(), err) ||
         !ResolveValidationDeps(&target->validations(), err) ||
         !ResolveConfigs(&target->configs(), err) ||
         !ResolveConfigs(&target->all_dependent_configs(), err) ||
diff --git a/src/gn/ffi/target.cc b/src/gn/ffi/target.cc
new file mode 100644
index 0000000..e55f765
--- /dev/null
+++ b/src/gn/ffi/target.cc
@@ -0,0 +1,23 @@
+// Copyright 2026 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "gn/ffi/target.h"
+
+#include <string_view>
+
+#include "gn/label.h"
+#include "gn/label_ptr.h"
+#include "gn/source_dir.h"
+#include "gn/target.h"
+
+void register_dependency(Target& target,
+                         rust::Str package,
+                         rust::Str name,
+                         rust::Str toolchain_package,
+                         rust::Str toolchain_name) {
+  target.starlark_deps().push_back(LabelTargetPair(
+      Label(SourceDir(std::string_view(package)), std::string_view(name),
+            SourceDir(std::string_view(toolchain_package)),
+            std::string_view(toolchain_name))));
+}
diff --git a/src/gn/ffi/target.h b/src/gn/ffi/target.h
new file mode 100644
index 0000000..c55ac81
--- /dev/null
+++ b/src/gn/ffi/target.h
@@ -0,0 +1,20 @@
+// Copyright 2026 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef TOOLS_GN_FFI_TARGET_H_
+#define TOOLS_GN_FFI_TARGET_H_
+
+#include "cxx.h"
+
+class Target;
+
+// Enforces that `target` cannot be resolved until the target for the label has
+// been resolved.
+void register_dependency(Target& target,
+                         rust::Str package,
+                         rust::Str name,
+                         rust::Str toolchain_package,
+                         rust::Str toolchain_name);
+
+#endif  // TOOLS_GN_FFI_TARGET_H_
diff --git a/src/gn/target.h b/src/gn/target.h
index 19972b3..a4ff8fa 100644
--- a/src/gn/target.h
+++ b/src/gn/target.h
@@ -303,6 +303,13 @@
   const LabelTargetVector& gen_deps() const { return gen_deps_; }
   LabelTargetVector& gen_deps() { return gen_deps_; }
 
+  // Dependencies only known to starlark.
+  // The only purpose of this field is to ensure that all of a target's starlark
+  // dependencies are resolved before itself, ensuring that starlark rule
+  // implementations run in correct order.
+  const LabelTargetVector& starlark_deps() const { return starlark_deps_; }
+  LabelTargetVector& starlark_deps() { return starlark_deps_; }
+
   // List of configs that this class inherits settings from. Once a target is
   // resolved, this will also list all-dependent and public configs.
   const UniqueVector<LabelConfigPair>& configs() const { return configs_; }
@@ -580,6 +587,7 @@
   LabelTargetVector data_deps_;
   LabelTargetVector validations_;
   LabelTargetVector gen_deps_;
+  LabelTargetVector starlark_deps_;
 
   // See getters for more info.
   UniqueVector<LabelConfigPair> configs_;