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_;