scripts/headerdep.pl
Source file repositories/reference/linux-study-clean/scripts/headerdep.pl
File Facts
- System
- Linux kernel
- Corpus path
scripts/headerdep.pl- Extension
.pl- Size
- 3587 bytes
- Lines
- 194
- Domain
- Support Tooling And Documentation
- Bucket
- scripts
- Inferred role
- Support Tooling And Documentation: scripts
- Status
- atlas-only
Why This File Exists
Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
Dependency Surface
- No C-style include directives detected by the generator.
Detected Declarations
- No top-level syscall, struct, function, initcall, or export declaration detected by the generator.
Annotated Snippet
if(my($dep) = ($line =~ m/^#\s*include\s*<(.*?)>/)) {
push @queue, $dep;
push @{$deps{$header}}, [$i + 1, $dep];
}
}
}
}
sub print_cycle {
# $cycle[n] includes $cycle[n + 1];
# $cycle[-1] will be the culprit
my $cycle = shift;
# Adjust the line numbers
for my $i (0 .. $#$cycle - 1) {
$cycle->[$i]->[0] = $cycle->[$i + 1]->[0];
}
$cycle->[-1]->[0] = 0;
my $first = shift @$cycle;
my $last = pop @$cycle;
my $msg = "In file included";
printf "%s from %s,\n", $msg, $last->[1] if defined $last;
for my $header (reverse @$cycle) {
printf "%s from %s:%d%s\n",
" " x length $msg,
$header->[1], $header->[0],
$header->[1] eq $last->[1] ? ' <-- here' : '';
}
printf "%s:%d: warning: recursive header inclusion\n",
$first->[1], $first->[0];
}
# Find and print the smallest cycle starting in the specified node.
sub detect_cycles {
my @queue = map { [[0, $_]] } @_;
while(@queue) {
my $top = pop @queue;
my $name = $top->[-1]->[1];
for my $dep (@{$deps{$name}}) {
my $chain = [@$top, [$dep->[0], $dep->[1]]];
# If the dep already exists in the chain, we have a
# cycle...
if(grep { $_->[1] eq $dep->[1] } @$top) {
print_cycle($chain);
next if $opt_all;
return;
}
push @queue, $chain;
}
}
}
sub mangle {
$_ = shift;
s/\//__/g;
s/\./_/g;
s/-/_/g;
$_;
}
# Output dependency graph in GraphViz language.
sub graph {
print "digraph {\n";
Annotation
- Atlas domain: Support Tooling And Documentation / scripts.
- Implementation status: atlas-only.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.