Source code

Revision control

Copy as Markdown

Other Tools

# Private Code Test
This directory provides a mechanism for testing that native does not link in
object files from unwanted directories. The test finds all linker inputs, and
checks that none live inside a list of internal paths.
## Determining Internal Directories
This is done by parsing the `.gclient_entries` file for all paths coming from
https://chrome-internal.googlesource.com. I chose this approach since it is
simple.
The main alternative I found was to use `gclient flatten`. Example output:
```
# src -> src/internal
"src/internal": {
"condition": 'checkout_src_internal',
},
```
* Paths could be found in this way by looking for `checkout_src_internal`
within `condition`, and by looking for the comment line for `recurse_deps`
that went through an internal repo.
## Determining Linker Inputs
This is done by parsing `build.ninja` to find all inputs to an executable. This
approach is pretty fast & simple, but does not catch the case where a public
`.cc` file has an `#include` a private `.h` file.
Alternatives considered:
1) Dump paths found in debug information.
* Hard to do cross-platform.
2) Scan a linker map file for input paths.
* LTO causes paths in linker map to be inaccurate.
3) Use a fake link step to capture all object file inputs
* Object files paths are relative to GN target, so this does not catch
internal sources referenced by public GN targets.
4) Query GN / Ninja for transitive inputs
* This ends up listing non-linker inputs as well, which we do not want.
5) Parse depfiles to find all headers, and add them to the list of inputs
* Additional work, but would give us full coverage.