Implement ffi for settings type.

Bug: 528225104
Change-Id: I90ab329ec34c39b50d9f7fa4283b2e946a6a6964
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/23621
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 c539995..032e74c 100755
--- a/build/gen.py
+++ b/build/gen.py
@@ -644,210 +644,217 @@
                     f'/MANIFESTINPUT:{win_manifest}'])
 
   static_libraries = {
-      'base': {'sources': [
-        'src/base/command_line.cc',
-        'src/base/environment.cc',
-        'src/base/files/file.cc',
-        'src/base/files/file_enumerator.cc',
-        'src/base/files/file_path.cc',
-        'src/base/files/file_path_constants.cc',
-        'src/base/files/file_util.cc',
-        'src/base/files/scoped_file.cc',
-        'src/base/files/scoped_temp_dir.cc',
-        'src/base/json/json_parser.cc',
-        'src/base/json/json_reader.cc',
-        'src/base/json/json_writer.cc',
-        'src/base/json/string_escape.cc',
-        'src/base/logging.cc',
-        'src/base/md5.cc',
-        'src/base/memory/ref_counted.cc',
-        'src/base/memory/weak_ptr.cc',
-        'src/base/sha1.cc',
-        'src/base/sha2.cc',
-        'src/base/strings/string_number_conversions.cc',
-        'src/base/strings/string_split.cc',
-        'src/base/strings/string_util.cc',
-        'src/base/strings/string_util_constants.cc',
-        'src/base/strings/stringprintf.cc',
-        'src/base/strings/utf_string_conversion_utils.cc',
-        'src/base/strings/utf_string_conversions.cc',
-        'src/base/timer/elapsed_timer.cc',
-        'src/base/value_iterators.cc',
-        'src/base/values.cc',
-      ]},
-      'string_atom': {'sources': [
-        'src/gn/string_atom.cc',
-        'src/gn/ffi/intern_string.cc',
-      ]},
-      'gn_lib': {'sources': [
-        'src/gn/action_target_generator.cc',
-        'src/gn/action_values.cc',
-        'src/gn/analyzer.cc',
-        'src/gn/args.cc',
-        'src/gn/binary_target_generator.cc',
-        'src/gn/build_settings.cc',
-        'src/gn/builder.cc',
-        'src/gn/builder_record.cc',
-        'src/gn/bundle_data.cc',
-        'src/gn/bundle_data_target_generator.cc',
-        'src/gn/bundle_file_rule.cc',
-        'src/gn/builtin_tool.cc',
-        'src/gn/c_include_iterator.cc',
-        'src/gn/c_substitution_type.cc',
-        'src/gn/c_tool.cc',
-        'src/gn/command_analyze.cc',
-        'src/gn/command_args.cc',
-        'src/gn/command_check.cc',
-        'src/gn/command_clean.cc',
-        'src/gn/command_clean_stale.cc',
-        'src/gn/command_desc.cc',
-        'src/gn/command_format.cc',
-        'src/gn/command_gen.cc',
-        'src/gn/command_help.cc',
-        'src/gn/command_ls.cc',
-        'src/gn/command_meta.cc',
-        'src/gn/command_outputs.cc',
-        'src/gn/command_path.cc',
-        'src/gn/command_refs.cc',
-        'src/gn/command_suggest.cc',
-        'src/gn/commands.cc',
-        'src/gn/compile_commands_writer.cc',
-        'src/gn/rust_project_writer.cc',
-        'src/gn/config.cc',
-        'src/gn/config_values.cc',
-        'src/gn/config_values_extractors.cc',
-        'src/gn/config_values_generator.cc',
-        'src/gn/copy_target_generator.cc',
-        'src/gn/create_bundle_target_generator.cc',
-        'src/gn/deps_iterator.cc',
-        'src/gn/desc_builder.cc',
-        'src/gn/eclipse_writer.cc',
-        'src/gn/err.cc',
-        'src/gn/escape.cc',
-        'src/gn/exec_process.cc',
-        'src/gn/ffi/label.cc',
-        'src/gn/filesystem_utils.cc',
-        'src/gn/file_writer.cc',
-        'src/gn/frameworks_utils.cc',
-        'src/gn/function_exec_script.cc',
-        'src/gn/function_expand_directory.cc',
-        'src/gn/function_filter.cc',
-        'src/gn/function_filter_labels.cc',
-        'src/gn/function_foreach.cc',
-        'src/gn/function_forward_variables_from.cc',
-        'src/gn/function_get_label_info.cc',
-        'src/gn/function_get_path_info.cc',
-        'src/gn/function_get_target_outputs.cc',
-        'src/gn/function_label_matches.cc',
-        'src/gn/function_len.cc',
-        'src/gn/function_path_exists.cc',
-        'src/gn/function_process_file_template.cc',
-        'src/gn/function_read_file.cc',
-        'src/gn/function_rebase_path.cc',
-        'src/gn/function_set_default_toolchain.cc',
-        'src/gn/function_set_defaults.cc',
-        'src/gn/function_template.cc',
-        'src/gn/function_toolchain.cc',
-        'src/gn/function_write_file.cc',
-        'src/gn/functions.cc',
-        'src/gn/functions_target.cc',
-        'src/gn/general_tool.cc',
-        'src/gn/generated_file_target_generator.cc',
-        'src/gn/group_target_generator.cc',
-        'src/gn/header_checker.cc',
-        'src/gn/import_manager.cc',
-        'src/gn/input_conversion.cc',
-        'src/gn/input_file.cc',
-        'src/gn/input_file_manager.cc',
-        'src/gn/invoke_python.cc',
-        'src/gn/item.cc',
-        'src/gn/json_project_writer.cc',
-        'src/gn/label.cc',
-        'src/gn/label_pattern.cc',
-        'src/gn/lib_file.cc',
-        'src/gn/loader.cc',
-        'src/gn/location.cc',
-        'src/gn/metadata.cc',
-        'src/gn/metadata_walk.cc',
-        'src/gn/ninja_action_target_writer.cc',
-        'src/gn/ninja_binary_target_writer.cc',
-        'src/gn/ninja_build_writer.cc',
-        'src/gn/ninja_bundle_data_target_writer.cc',
-        'src/gn/ninja_c_binary_target_writer.cc',
-        'src/gn/ninja_copy_target_writer.cc',
-        'src/gn/ninja_create_bundle_target_writer.cc',
-        'src/gn/ninja_generated_file_target_writer.cc',
-        'src/gn/ninja_group_target_writer.cc',
-        'src/gn/ninja_module_writer_util.cc',
-        'src/gn/ninja_outputs_writer.cc',
-        'src/gn/ninja_rust_binary_target_writer.cc',
-        'src/gn/ninja_target_command_util.cc',
-        'src/gn/ninja_target_writer.cc',
-        'src/gn/ninja_toolchain_writer.cc',
-        'src/gn/ninja_tools.cc',
-        'src/gn/ninja_utils.cc',
-        'src/gn/ninja_writer.cc',
-        'src/gn/operators.cc',
-        'src/gn/output_conversion.cc',
-        'src/gn/output_file.cc',
-        'src/gn/parse_node_value_adapter.cc',
-        'src/gn/parse_tree.cc',
-        'src/gn/parser.cc',
-        'src/gn/path_output.cc',
-        'src/gn/pattern.cc',
-        'src/gn/pool.cc',
-        'src/gn/qt_creator_writer.cc',
-        'src/gn/resolved_target_data.cc',
-        'src/gn/runtime_deps.cc',
-        'src/gn/rust_substitution_type.cc',
-        'src/gn/rust_tool.cc',
-        'src/gn/rust_values.cc',
-        'src/gn/rust_values_generator.cc',
-        'src/gn/rust_variables.cc',
-        'src/gn/scheduler.cc',
-        'src/gn/scope.cc',
-        'src/gn/scope_per_file_provider.cc',
-        'src/gn/settings.cc',
-        'src/gn/setup.cc',
-        'src/gn/source_dir.cc',
-        'src/gn/source_file.cc',
-        'src/gn/standard_out.cc',
-        'src/gn/string_output_buffer.cc',
-        'src/gn/string_utils.cc',
-        'src/gn/substitution_list.cc',
-        'src/gn/substitution_pattern.cc',
-        'src/gn/substitution_type.cc',
-        'src/gn/substitution_writer.cc',
-        'src/gn/swift_values.cc',
-        'src/gn/swift_values_generator.cc',
-        'src/gn/swift_variables.cc',
-        'src/gn/switches.cc',
-        'src/gn/target.cc',
-        'src/gn/target_generator.cc',
-        'src/gn/template.cc',
-        'src/gn/token.cc',
-        'src/gn/tokenizer.cc',
-        'src/gn/tool.cc',
-        'src/gn/toolchain.cc',
-        'src/gn/trace.cc',
-        'src/gn/value.cc',
-        'src/gn/value_extractors.cc',
-        'src/gn/variables.cc',
-        'src/gn/version.cc',
-        'src/gn/visibility.cc',
-        'src/gn/visual_studio_utils.cc',
-        'src/gn/visual_studio_writer.cc',
-        'src/gn/xcode_object.cc',
-        'src/gn/xcode_writer.cc',
-        'src/gn/xml_element_writer.cc',
-        'src/util/atomic_write.cc',
-        'src/util/exe_path.cc',
-        'src/util/msg_loop.cc',
-        'src/util/semaphore.cc',
-        'src/util/sys_info.cc',
-        'src/util/ticks.cc',
-        'src/util/worker_pool.cc',
-      ]},
+      'base': {
+          'sources': [
+              'src/base/command_line.cc',
+              'src/base/environment.cc',
+              'src/base/files/file.cc',
+              'src/base/files/file_enumerator.cc',
+              'src/base/files/file_path.cc',
+              'src/base/files/file_path_constants.cc',
+              'src/base/files/file_util.cc',
+              'src/base/files/scoped_file.cc',
+              'src/base/files/scoped_temp_dir.cc',
+              'src/base/json/json_parser.cc',
+              'src/base/json/json_reader.cc',
+              'src/base/json/json_writer.cc',
+              'src/base/json/string_escape.cc',
+              'src/base/logging.cc',
+              'src/base/md5.cc',
+              'src/base/memory/ref_counted.cc',
+              'src/base/memory/weak_ptr.cc',
+              'src/base/sha1.cc',
+              'src/base/sha2.cc',
+              'src/base/strings/string_number_conversions.cc',
+              'src/base/strings/string_split.cc',
+              'src/base/strings/string_util.cc',
+              'src/base/strings/string_util_constants.cc',
+              'src/base/strings/stringprintf.cc',
+              'src/base/strings/utf_string_conversion_utils.cc',
+              'src/base/strings/utf_string_conversions.cc',
+              'src/base/timer/elapsed_timer.cc',
+              'src/base/value_iterators.cc',
+              'src/base/values.cc',
+          ]
+      },
+      'string_atom': {
+          'sources': [
+              'src/gn/string_atom.cc',
+              'src/gn/ffi/intern_string.cc',
+          ]
+      },
+      'gn_lib': {
+          'sources': [
+              'src/gn/action_target_generator.cc',
+              'src/gn/action_values.cc',
+              'src/gn/analyzer.cc',
+              'src/gn/args.cc',
+              'src/gn/binary_target_generator.cc',
+              'src/gn/build_settings.cc',
+              'src/gn/builder.cc',
+              'src/gn/builder_record.cc',
+              'src/gn/bundle_data.cc',
+              'src/gn/bundle_data_target_generator.cc',
+              'src/gn/bundle_file_rule.cc',
+              'src/gn/builtin_tool.cc',
+              'src/gn/c_include_iterator.cc',
+              'src/gn/c_substitution_type.cc',
+              'src/gn/c_tool.cc',
+              'src/gn/command_analyze.cc',
+              'src/gn/command_args.cc',
+              'src/gn/command_check.cc',
+              'src/gn/command_clean.cc',
+              'src/gn/command_clean_stale.cc',
+              'src/gn/command_desc.cc',
+              'src/gn/command_format.cc',
+              'src/gn/command_gen.cc',
+              'src/gn/command_help.cc',
+              'src/gn/command_ls.cc',
+              'src/gn/command_meta.cc',
+              'src/gn/command_outputs.cc',
+              'src/gn/command_path.cc',
+              'src/gn/command_refs.cc',
+              'src/gn/command_suggest.cc',
+              'src/gn/commands.cc',
+              'src/gn/compile_commands_writer.cc',
+              'src/gn/rust_project_writer.cc',
+              'src/gn/config.cc',
+              'src/gn/config_values.cc',
+              'src/gn/config_values_extractors.cc',
+              'src/gn/config_values_generator.cc',
+              'src/gn/copy_target_generator.cc',
+              'src/gn/create_bundle_target_generator.cc',
+              'src/gn/deps_iterator.cc',
+              'src/gn/desc_builder.cc',
+              'src/gn/eclipse_writer.cc',
+              'src/gn/err.cc',
+              'src/gn/escape.cc',
+              'src/gn/exec_process.cc',
+              'src/gn/ffi/label.cc',
+              'src/gn/ffi/settings.cc',
+              'src/gn/filesystem_utils.cc',
+              'src/gn/file_writer.cc',
+              'src/gn/frameworks_utils.cc',
+              'src/gn/function_exec_script.cc',
+              'src/gn/function_expand_directory.cc',
+              'src/gn/function_filter.cc',
+              'src/gn/function_filter_labels.cc',
+              'src/gn/function_foreach.cc',
+              'src/gn/function_forward_variables_from.cc',
+              'src/gn/function_get_label_info.cc',
+              'src/gn/function_get_path_info.cc',
+              'src/gn/function_get_target_outputs.cc',
+              'src/gn/function_label_matches.cc',
+              'src/gn/function_len.cc',
+              'src/gn/function_path_exists.cc',
+              'src/gn/function_process_file_template.cc',
+              'src/gn/function_read_file.cc',
+              'src/gn/function_rebase_path.cc',
+              'src/gn/function_set_default_toolchain.cc',
+              'src/gn/function_set_defaults.cc',
+              'src/gn/function_template.cc',
+              'src/gn/function_toolchain.cc',
+              'src/gn/function_write_file.cc',
+              'src/gn/functions.cc',
+              'src/gn/functions_target.cc',
+              'src/gn/general_tool.cc',
+              'src/gn/generated_file_target_generator.cc',
+              'src/gn/group_target_generator.cc',
+              'src/gn/header_checker.cc',
+              'src/gn/import_manager.cc',
+              'src/gn/input_conversion.cc',
+              'src/gn/input_file.cc',
+              'src/gn/input_file_manager.cc',
+              'src/gn/invoke_python.cc',
+              'src/gn/item.cc',
+              'src/gn/json_project_writer.cc',
+              'src/gn/label.cc',
+              'src/gn/label_pattern.cc',
+              'src/gn/lib_file.cc',
+              'src/gn/loader.cc',
+              'src/gn/location.cc',
+              'src/gn/metadata.cc',
+              'src/gn/metadata_walk.cc',
+              'src/gn/ninja_action_target_writer.cc',
+              'src/gn/ninja_binary_target_writer.cc',
+              'src/gn/ninja_build_writer.cc',
+              'src/gn/ninja_bundle_data_target_writer.cc',
+              'src/gn/ninja_c_binary_target_writer.cc',
+              'src/gn/ninja_copy_target_writer.cc',
+              'src/gn/ninja_create_bundle_target_writer.cc',
+              'src/gn/ninja_generated_file_target_writer.cc',
+              'src/gn/ninja_group_target_writer.cc',
+              'src/gn/ninja_module_writer_util.cc',
+              'src/gn/ninja_outputs_writer.cc',
+              'src/gn/ninja_rust_binary_target_writer.cc',
+              'src/gn/ninja_target_command_util.cc',
+              'src/gn/ninja_target_writer.cc',
+              'src/gn/ninja_toolchain_writer.cc',
+              'src/gn/ninja_tools.cc',
+              'src/gn/ninja_utils.cc',
+              'src/gn/ninja_writer.cc',
+              'src/gn/operators.cc',
+              'src/gn/output_conversion.cc',
+              'src/gn/output_file.cc',
+              'src/gn/parse_node_value_adapter.cc',
+              'src/gn/parse_tree.cc',
+              'src/gn/parser.cc',
+              'src/gn/path_output.cc',
+              'src/gn/pattern.cc',
+              'src/gn/pool.cc',
+              'src/gn/qt_creator_writer.cc',
+              'src/gn/resolved_target_data.cc',
+              'src/gn/runtime_deps.cc',
+              'src/gn/rust_substitution_type.cc',
+              'src/gn/rust_tool.cc',
+              'src/gn/rust_values.cc',
+              'src/gn/rust_values_generator.cc',
+              'src/gn/rust_variables.cc',
+              'src/gn/scheduler.cc',
+              'src/gn/scope.cc',
+              'src/gn/scope_per_file_provider.cc',
+              'src/gn/settings.cc',
+              'src/gn/setup.cc',
+              'src/gn/source_dir.cc',
+              'src/gn/source_file.cc',
+              'src/gn/standard_out.cc',
+              'src/gn/string_output_buffer.cc',
+              'src/gn/string_utils.cc',
+              'src/gn/substitution_list.cc',
+              'src/gn/substitution_pattern.cc',
+              'src/gn/substitution_type.cc',
+              'src/gn/substitution_writer.cc',
+              'src/gn/swift_values.cc',
+              'src/gn/swift_values_generator.cc',
+              'src/gn/swift_variables.cc',
+              'src/gn/switches.cc',
+              'src/gn/target.cc',
+              'src/gn/target_generator.cc',
+              'src/gn/template.cc',
+              'src/gn/token.cc',
+              'src/gn/tokenizer.cc',
+              'src/gn/tool.cc',
+              'src/gn/toolchain.cc',
+              'src/gn/trace.cc',
+              'src/gn/value.cc',
+              'src/gn/value_extractors.cc',
+              'src/gn/variables.cc',
+              'src/gn/version.cc',
+              'src/gn/visibility.cc',
+              'src/gn/visual_studio_utils.cc',
+              'src/gn/visual_studio_writer.cc',
+              'src/gn/xcode_object.cc',
+              'src/gn/xcode_writer.cc',
+              'src/gn/xml_element_writer.cc',
+              'src/util/atomic_write.cc',
+              'src/util/exe_path.cc',
+              'src/util/msg_loop.cc',
+              'src/util/semaphore.cc',
+              'src/util/sys_info.cc',
+              'src/util/ticks.cc',
+              'src/util/worker_pool.cc',
+          ]
+      },
   }
 
   executables = {
diff --git a/src/gn/ffi/settings.cc b/src/gn/ffi/settings.cc
new file mode 100644
index 0000000..f0e688b
--- /dev/null
+++ b/src/gn/ffi/settings.cc
@@ -0,0 +1,15 @@
+// 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/settings.h"
+
+#include "gn/label.h"
+
+extern "C" {
+
+const Label& GetToolchainLabelFromSettings(const Settings& settings) {
+  return settings.toolchain_label();
+}
+
+}  // extern "C"
diff --git a/src/gn/starlark/crates/ffi/src/lib.rs b/src/gn/starlark/crates/ffi/src/lib.rs
index f4abc9c..7a6ec4a 100644
--- a/src/gn/starlark/crates/ffi/src/lib.rs
+++ b/src/gn/starlark/crates/ffi/src/lib.rs
@@ -65,5 +65,7 @@
 
 pub mod label;
 pub mod opaque;
+pub mod settings;
 
 pub use label::{Label, SourceDir};
+pub use settings::Settings;
diff --git a/src/gn/starlark/crates/ffi/src/settings.rs b/src/gn/starlark/crates/ffi/src/settings.rs
new file mode 100644
index 0000000..2eae88e
--- /dev/null
+++ b/src/gn/starlark/crates/ffi/src/settings.rs
@@ -0,0 +1,17 @@
+// 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.
+
+use crate::declare_opaque_type;
+
+declare_opaque_type!(pub Settings);
+
+impl Settings {
+    /// Returns the toolchain label for the given settings.
+    pub fn toolchain(&self) -> types::LabelRef<'_> {
+        extern "C" {
+            fn GetToolchainLabelFromSettings(settings: &Settings) -> &crate::Label;
+        }
+        unsafe { GetToolchainLabelFromSettings(self).as_ref() }
+    }
+}