Chromium Chronicle n. 15: limitazione della visibilità dei target

Episodio 15: di Joe Mason a Montreal, PQ (novembre 2020)
Puntate precedenti

Chrome è un grande progetto con molti sottosistemi. È frequente trovare codice scritto per un componente che sarebbe utile altrove, ma che potrebbe essere stato nascosto limitazioni. Per motivi di sicurezza, limita l'accesso esterno alle funzionalità pericolose. Ad esempio, una funzione personalizzata ottimizzata per esigenze di prestazioni specifiche:

// Blazing fast for 2-char strings, O(n^3) otherwise.
std::string ConcatShortStringsFast(const std::string& a, const std::string& b);

Esistono diversi modi per limitare l'accesso. Codice di interruzione delle regole di visibilità GN all'esterno del componente, in base a un target. Per impostazione predefinita, i target sono visibile a tutti, ma che puoi modificare:

# In components/restricted_component/BUILD.gn
visibility = [
  # Applies to all targets in this file.
  # Only the given targets can depend on them.
  "//components/restricted_component:*",
  "//components/authorized_other_component:a_single_target",
]
source_set("internal") {
  # This dangerous target should be locked down even more.
  visibility = [ "//components/restricted_component:privileged_target" ]
}

Le dichiarazioni di visibilità sono convalidate con gn check, che viene eseguito come parte di ogni build GN.

Un altro meccanismo è il DEPS include_rules, che limita l'accesso ai file di intestazione. Ogni directory eredita include_rules dall'elemento padre e può modificarle nel proprio file DEPS. Tutti i file di intestazione inclusi dall'esterno devono essere consentite dall'include_rules.

# In //components/authorized_other_component/DEPS
include_rules = [
  # Common directories like //base are inherited from
  # //components/DEPS or //DEPS. Also allow includes from
  # restricted_component, but not restricted_component/internal.
  "+components/restricted_component",
  "-components/restricted_component/internal",
  # But do allow a single header from internal, for testing.
  "+components/restricted_component/internal/test_support.h",
]

Per garantire che queste dipendenze siano appropriate, le modifiche che aggiungono una directory a include_rules deve essere approvato dal OWNERS di quella directory. No è necessaria l'approvazione per limitare una directory utilizzando include_rules. Puoi assicurati che chiunque modifichi il tuo componente ricordi di non utilizzare aggiungendo un include_rule che ne impedisce le offerte.

include_rules sono selezionati prima dell'invio, quindi non vedrai nessuna errori finché non provi a caricare una modifica. Per testare include_rules senza caricamento, esegui buildtools/checkdeps/checkdeps.py <directory>.

Risorse