Source file
src/go/build/deps_test.go
1
2
3
4
5
6
7
8 package build
9
10 import (
11 "bytes"
12 "fmt"
13 "go/token"
14 "internal/dag"
15 "internal/testenv"
16 "io/fs"
17 "os"
18 "path/filepath"
19 "slices"
20 "strings"
21 "testing"
22 )
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 var depsRules = `
39 # No dependencies allowed for any of these packages.
40 NONE
41 < unsafe
42 < cmp,
43 container/list,
44 container/ring,
45 internal/byteorder,
46 internal/cfg,
47 internal/coverage,
48 internal/coverage/rtcov,
49 internal/coverage/uleb128,
50 internal/coverage/calloc,
51 internal/cpu,
52 internal/goarch,
53 internal/godebugs,
54 internal/goexperiment,
55 internal/goos,
56 internal/goversion,
57 internal/nettrace,
58 internal/platform,
59 internal/profilerecord,
60 internal/runtime/pprof/label,
61 internal/simd/variants,
62 internal/syslist,
63 internal/trace/tracev2,
64 internal/trace/traceviewer/format,
65 log/internal,
66 math/bits,
67 structs,
68 unicode,
69 unicode/utf8,
70 unicode/utf16;
71
72 internal/goarch < internal/abi;
73 internal/byteorder, internal/cpu, internal/goarch < internal/chacha8rand;
74 internal/goarch, math/bits < internal/strconv;
75
76 internal/strconv < simd/internal/simdfmt;
77 internal/cpu, simd/internal/simdfmt < simd/archsimd;
78
79 # RUNTIME is the core runtime group of packages, all of them very light-weight.
80 internal/abi,
81 internal/chacha8rand,
82 internal/coverage/rtcov,
83 internal/cpu,
84 internal/goarch,
85 internal/godebugs,
86 internal/goexperiment,
87 internal/goos,
88 internal/profilerecord,
89 internal/runtime/pprof/label,
90 internal/strconv,
91 internal/trace/tracev2,
92 math/bits,
93 structs,
94 simd/archsimd
95 < internal/bytealg
96 < internal/stringslite
97 < internal/unsafeheader
98 < internal/race
99 < internal/msan
100 < internal/asan
101 < internal/runtime/sys
102 < internal/runtime/syscall/linux
103 < internal/runtime/syscall/windows
104 < internal/runtime/atomic
105 < internal/runtime/exithook
106 < internal/runtime/gc
107 < internal/runtime/math
108 < internal/runtime/maps
109 < internal/runtime/cgroup
110 < internal/runtime/gc/scan
111 < runtime
112 < runtime/secret
113 < sync/atomic
114 < internal/sync
115 < weak
116 < internal/synctest
117 < sync
118 < internal/bisect
119 < internal/godebug
120 < internal/reflectlite
121 < errors
122 < internal/oserror;
123
124 cmp, runtime, math/bits
125 < iter
126 < maps, slices;
127
128 internal/oserror, maps, slices
129 < RUNTIME;
130
131 RUNTIME
132 < sort
133 < container/heap
134 < unique;
135
136 RUNTIME
137 < io;
138
139 RUNTIME
140 < arena;
141
142 syscall !< io;
143 reflect !< sort;
144
145 RUNTIME, unicode/utf8
146 < path;
147
148 unicode !< path;
149
150 # SYSCALL is RUNTIME plus the packages necessary for basic system calls.
151 RUNTIME, unicode/utf8, unicode/utf16, internal/synctest
152 < internal/syscall/windows/sysdll, syscall/js
153 < syscall
154 < internal/syscall/unix, internal/syscall/windows, internal/syscall/windows/registry
155 < internal/syscall/execenv
156 < SYSCALL;
157
158 # TIME is SYSCALL plus the core packages about time, including context.
159 SYSCALL
160 < time/tzdata
161 < time
162 < context
163 < TIME;
164
165 TIME, io, path, slices
166 < io/fs;
167
168 # MATH is RUNTIME plus the basic math packages.
169 RUNTIME
170 < math
171 < MATH;
172
173 unicode !< math;
174
175 MATH
176 < math/cmplx;
177
178 MATH
179 < math/rand, math/rand/v2;
180
181 MATH
182 < runtime/metrics;
183
184 MATH, unicode/utf8
185 < strconv;
186
187 unicode !< strconv;
188
189 # STR is basic string and buffer manipulation.
190 RUNTIME, io, unicode/utf8, unicode/utf16, unicode
191 < bytes, strings
192 < bufio;
193
194 bufio, path, strconv
195 < STR;
196
197 # OS is basic OS access, including helpers (path/filepath, os/exec, etc).
198 # OS includes string routines, but those must be layered above package os.
199 # OS does not include reflection.
200 io/fs
201 < internal/testlog
202 < internal/poll
203 < internal/filepathlite
204 < os
205 < os/signal;
206
207 io/fs
208 < embed;
209
210 unicode, fmt !< net, os, os/signal;
211
212 os/signal, internal/filepathlite, STR
213 < path/filepath
214 < io/ioutil;
215
216 path/filepath, internal/godebug < os/exec;
217
218 io/ioutil, os/exec, os/signal
219 < OS;
220
221 reflect !< OS;
222
223 OS
224 < golang.org/x/sys/cpu;
225
226 # FMT is OS (which includes string routines) plus reflect and fmt.
227 # It does not include package log, which should be avoided in core packages.
228 arena, strconv, unicode
229 < reflect;
230
231 os, reflect
232 < internal/fmtsort
233 < fmt;
234
235 OS, fmt
236 < FMT;
237
238 log !< FMT;
239
240 # Misc packages needing only FMT.
241 FMT
242 < html,
243 internal/dag,
244 internal/goroot,
245 internal/types/errors,
246 mime/quotedprintable,
247 net/internal/socktest,
248 runtime/trace,
249 text/scanner,
250 text/tabwriter;
251
252 io, reflect
253 < internal/saferio;
254
255 # encodings
256 # core ones do not use fmt.
257 io, strconv, slices
258 < encoding, encoding/base32, encoding/base64;
259
260 encoding, reflect
261 < encoding/binary;
262
263 FMT, encoding < flag;
264
265 FMT, MATH
266 < simd/internal/spec
267 < simd/internal/simdref;
268
269 FMT, simd/archsimd < simd/internal/bridge;
270
271 simd/internal/bridge, internal/simd/variants < simd;
272
273 fmt !< encoding/base32, encoding/base64;
274
275 FMT, encoding, encoding/base32, encoding/base64, encoding/binary,
276 internal/saferio
277 < encoding/ascii85, encoding/csv, encoding/gob, encoding/hex,
278 encoding/pem, encoding/xml, mime;
279
280 STR, errors
281 < encoding/json/internal
282 < encoding/json/internal/jsonflags
283 < encoding/json/internal/jsonopts
284 < encoding/json/internal/jsonwire
285 < encoding/json/jsontext;
286
287 FMT,
288 encoding/hex,
289 encoding/base32,
290 encoding/base64,
291 encoding/binary,
292 encoding/json/jsontext,
293 encoding/json/internal,
294 encoding/json/internal/jsonflags,
295 encoding/json/internal/jsonopts,
296 encoding/json/internal/jsonwire
297 < encoding/json/v2
298 < encoding/json;
299
300 # hashes
301 io
302 < hash
303 < hash/adler32, hash/crc32, hash/crc64, hash/fnv, hash/maphash;
304
305 # math/big
306 FMT, math/rand
307 < math/big;
308
309 # compression
310 FMT, encoding/binary, hash/adler32, hash/crc32, sort
311 < compress/bzip2, compress/flate, compress/lzw, internal/zstd
312 < archive/zip, compress/gzip, compress/zlib;
313
314 # templates
315 FMT
316 < text/template/parse;
317
318 internal/bytealg, math/bits, slices, strconv, unique
319 < net/netip;
320
321 FMT, net/netip
322 < net/url;
323
324 net/url, text/template/parse
325 < text/template
326 < internal/lazytemplate;
327
328 # regexp
329 FMT, sort
330 < regexp/syntax
331 < regexp
332 < internal/lazyregexp;
333
334 encoding/json, html, text/template, regexp
335 < html/template;
336
337 # suffix array
338 encoding/binary, regexp
339 < index/suffixarray;
340
341 # executable parsing
342 FMT, encoding/binary, compress/zlib, internal/saferio, internal/zstd, sort
343 < runtime/debug
344 < debug/dwarf
345 < debug/elf, debug/gosym, debug/macho, debug/pe, debug/plan9obj, internal/xcoff
346 < debug/buildinfo
347 < DEBUG;
348
349 # go parser and friends.
350 FMT, sort
351 < internal/gover
352 < go/version
353 < go/token
354 < go/scanner
355 < go/ast
356 < go/internal/typeparams;
357
358 FMT
359 < go/build/constraint;
360
361 FMT, sort
362 < go/doc/comment;
363
364 go/internal/typeparams, go/build/constraint
365 < go/parser;
366
367 go/doc/comment, go/parser, text/tabwriter
368 < go/printer
369 < go/format;
370
371 math/big, go/token
372 < go/constant;
373
374 FMT, internal/goexperiment
375 < internal/buildcfg;
376
377 # The vast majority of standard library packages should not be resorting to regexp.
378 # go/types is a good chokepoint. It shouldn't use regexp, nor should anything
379 # that is low-enough level to be used by go/types.
380 regexp !< go/types;
381
382 go/doc/comment, go/parser, internal/lazyregexp, text/template
383 < go/doc;
384
385 go/build/constraint, go/doc, go/parser, internal/buildcfg, internal/goroot, internal/goversion, internal/platform, internal/syslist
386 < go/build;
387
388 # images
389 FMT, compress/lzw, compress/zlib
390 < image/color
391 < image, image/color/palette
392 < image/internal/imageutil
393 < image/draw
394 < image/gif, image/jpeg, image/png;
395
396 # cgo, delayed as long as possible.
397 # If you add a dependency on CGO, you must add the package
398 # to cgoPackages in cmd/dist/test.go as well.
399 RUNTIME
400 < C
401 < runtime/cgo
402 < CGO
403 < runtime/msan, runtime/asan;
404
405 # runtime/race
406 NONE < runtime/race/internal/amd64v1;
407 NONE < runtime/race/internal/amd64v3;
408 CGO, runtime/race/internal/amd64v1, runtime/race/internal/amd64v3 < runtime/race;
409
410 # Bulk of the standard library must not use cgo.
411 # The prohibition stops at net and os/user.
412 C !< fmt, go/types, CRYPTO-MATH, log/slog;
413
414 CGO, OS
415 < plugin;
416
417 CGO, FMT
418 < os/user
419 < archive/tar;
420
421 sync
422 < internal/singleflight;
423
424 os
425 < golang.org/x/net/dns/dnsmessage,
426 golang.org/x/net/lif;
427
428 os, net/netip
429 < internal/routebsd;
430
431 # net is unavoidable when doing any networking,
432 # so large dependencies must be kept out.
433 # This is a long-looking list but most of these
434 # are small with few dependencies.
435 CGO,
436 golang.org/x/net/dns/dnsmessage,
437 golang.org/x/net/lif,
438 internal/godebug,
439 internal/goversion,
440 internal/nettrace,
441 internal/poll,
442 internal/routebsd,
443 internal/singleflight,
444 net/netip,
445 os,
446 sort
447 < net;
448
449 fmt, unicode !< net;
450 math/rand !< net; # net uses runtime instead
451
452 # NET is net plus net-helper packages.
453 FMT, net
454 < net/textproto;
455
456 mime, net/textproto, net/url
457 < NET;
458
459 # logging - most packages should not import; http and up is allowed
460 FMT, log/internal
461 < log;
462
463 log, log/slog !< crypto/tls, database/sql, go/importer, testing;
464
465 FMT, log, net
466 < log/syslog;
467
468 RUNTIME
469 < log/slog/internal, log/slog/internal/buffer;
470
471 FMT,
472 encoding, encoding/json,
473 log, log/internal,
474 log/slog/internal, log/slog/internal/buffer,
475 slices
476 < log/slog
477 < log/slog/internal/slogtest, log/slog/internal/benchmarks;
478
479 NET, log
480 < net/mail;
481
482 # FIPS is the FIPS 140 module.
483 # It must not depend on external crypto packages.
484 # Package hash is ok as it's only the interface.
485 # See also fips140deps.AllowedInternalPackages.
486
487 io, math/rand/v2 < crypto/internal/randutil;
488
489 NONE < crypto/internal/constanttime;
490
491 STR < crypto/internal/impl;
492
493 OS < crypto/internal/sysrand
494 < crypto/internal/entropy;
495
496 internal/byteorder < crypto/internal/fips140deps/byteorder;
497 internal/cpu, internal/goarch < crypto/internal/fips140deps/cpu;
498 internal/godebug < crypto/internal/fips140deps/godebug;
499 time, internal/syscall/windows < crypto/internal/fips140deps/time;
500
501 crypto/internal/fips140deps/time, errors, math/bits, sync/atomic, unsafe
502 < crypto/internal/entropy/v1.0.0;
503
504 STR, hash,
505 crypto/internal/impl,
506 crypto/internal/entropy,
507 crypto/internal/randutil,
508 crypto/internal/constanttime,
509 crypto/internal/entropy/v1.0.0,
510 crypto/internal/fips140deps/byteorder,
511 crypto/internal/fips140deps/cpu,
512 crypto/internal/fips140deps/godebug
513 < crypto/internal/fips140
514 < crypto/internal/fips140/alias
515 < crypto/internal/fips140/subtle
516 < crypto/internal/fips140/sha256
517 < crypto/internal/fips140/sha512
518 < crypto/internal/fips140/sha3
519 < crypto/internal/fips140/hmac
520 < crypto/internal/fips140/check
521 < crypto/internal/fips140/pbkdf2
522 < crypto/internal/fips140/aes
523 < crypto/internal/fips140/drbg
524 < crypto/internal/fips140/aes/gcm
525 < crypto/internal/fips140/hkdf
526 < crypto/internal/fips140/mlkem
527 < crypto/internal/fips140/mldsa
528 < crypto/internal/fips140/ssh
529 < crypto/internal/fips140/tls12
530 < crypto/internal/fips140/tls13
531 < crypto/internal/fips140/bigmod
532 < crypto/internal/fips140/nistec/fiat
533 < crypto/internal/fips140/nistec
534 < crypto/internal/fips140/ecdh
535 < crypto/internal/fips140/ecdsa
536 < crypto/internal/fips140/edwards25519/field
537 < crypto/internal/fips140/edwards25519
538 < crypto/internal/fips140/ed25519
539 < crypto/internal/fips140/rsa
540 < crypto/fips140 < FIPS;
541
542 crypto !< FIPS;
543
544 # CRYPTO is core crypto algorithms - no cgo, fmt, net.
545 # Mostly wrappers around the FIPS module.
546
547 NONE < crypto/internal/boring/sig, crypto/internal/boring/syso;
548 sync/atomic < crypto/internal/boring/bcache;
549
550 FIPS, internal/godebug, embed,
551 crypto/internal/boring/sig,
552 crypto/internal/boring/syso,
553 crypto/internal/boring/bcache
554 < crypto/internal/fips140only
555 < crypto
556 < crypto/subtle
557 < crypto/sha3
558 < crypto/internal/fips140hash
559 < crypto/cipher
560 < crypto/internal/boring
561 < crypto/boring
562 < crypto/internal/rand
563 < crypto/aes,
564 crypto/des,
565 crypto/rc4,
566 crypto/md5,
567 crypto/sha1,
568 crypto/sha256,
569 crypto/sha512,
570 crypto/hmac,
571 crypto/hkdf,
572 crypto/pbkdf2,
573 crypto/ecdh,
574 crypto/mlkem,
575 crypto/mldsa
576 < CRYPTO;
577
578 CRYPTO
579 < golang.org/x/crypto/hkdf;
580
581 CGO, fmt, net !< CRYPTO;
582
583 # CRYPTO-MATH is crypto that exposes math/big APIs - no cgo, net; fmt now ok.
584
585 CRYPTO, FMT, math/big, internal/saferio
586 < crypto/internal/boring/bbig
587 < crypto/internal/fips140cache
588 < crypto/rand
589 < crypto/ed25519 # depends on crypto/rand.Reader
590 < encoding/asn1
591 < golang.org/x/crypto/cryptobyte/asn1
592 < golang.org/x/crypto/cryptobyte
593 < crypto/dsa, crypto/elliptic, crypto/rsa
594 < crypto/ecdsa
595 < CRYPTO-MATH;
596
597 CGO, net !< CRYPTO-MATH;
598
599 # uuids
600 crypto/rand, errors, encoding/binary, encoding/hex
601 < uuid;
602
603 # databases
604 FMT, uuid
605 < database/sql/internal
606 < database/sql/driver;
607
608 database/sql/driver, math/rand/v2 < database/sql;
609
610 # TLS, Prince of Dependencies.
611
612 crypto/fips140, sync/atomic < crypto/tls/internal/fips140tls;
613
614 crypto/internal/boring/sig, crypto/tls/internal/fips140tls < crypto/tls/fipsonly;
615
616 CRYPTO, golang.org/x/sys/cpu, encoding/binary, reflect
617 < golang.org/x/crypto/internal/alias
618 < golang.org/x/crypto/internal/subtle
619 < golang.org/x/crypto/chacha20
620 < golang.org/x/crypto/internal/poly1305
621 < golang.org/x/crypto/chacha20poly1305;
622
623 CRYPTO-MATH, golang.org/x/crypto/chacha20poly1305
624 < crypto/hpke;
625
626 CRYPTO-MATH, NET, container/list, encoding/hex, encoding/pem, crypto/hpke,
627 golang.org/x/crypto/chacha20poly1305, crypto/tls/internal/fips140tls
628 < crypto/x509/internal/macos
629 < crypto/x509/pkix
630 < crypto/x509
631 < crypto/tls;
632
633 # crypto-aware packages
634
635 FMT, hash/maphash
636 < container/hash;
637
638 hash/maphash, container/heap, go/constant, go/parser, internal/buildcfg, internal/goversion, internal/types/errors
639 < go/types;
640
641 # x/tools
642 # These are the only allowed dependencies of gcexportdata. Any change here
643 # must be mirrored in x/tools/go/gcexportdata/deps_test.go.
644 FMT, STR, crypto/md5, encoding/binary, encoding/json, go/build, go/token, go/types
645 < golang.org/x/tools/go/types/objectpath,
646 golang.org/x/tools/internal/pkgbits
647 < golang.org/x/tools/internal/gcimporter
648 < golang.org/x/tools/go/gcexportdata;
649
650 # x/tools analysis passes and unitchecker, for cmd/vet and cmd/fix
651 # (via internal/analysis/...). Generated from the import graph;
652 # order within x/tools is by depth.
653 archive/zip, bufio, bytes, cmp,
654 crypto/md5, crypto/sha256, embed, encoding/binary,
655 encoding/gob, encoding/json, errors, flag,
656 fmt, go/ast, go/build, go/build/constraint,
657 go/constant, go/format, go/parser, go/printer,
658 go/scanner, go/token, go/types, hash/maphash,
659 io, iter, log, maps,
660 math, math/big, net/url, os,
661 os/exec, path, path/filepath, reflect,
662 regexp, runtime, slices, sort,
663 strconv, strings, sync, time,
664 unicode, unicode/utf8, unsafe, golang.org/x/tools/go/gcexportdata,
665 golang.org/x/tools/go/types/objectpath, golang.org/x/tools/internal/gcimporter, golang.org/x/tools/internal/pkgbits
666 < golang.org/x/tools/go/analysis,
667 golang.org/x/tools/go/ast/astutil,
668 golang.org/x/tools/go/ast/edge,
669 golang.org/x/tools/go/cfg,
670 golang.org/x/tools/internal/astutil/free,
671 golang.org/x/tools/internal/diff/lcs,
672 golang.org/x/tools/internal/fmtstr,
673 golang.org/x/tools/internal/moreiters,
674 golang.org/x/tools/internal/moremaps,
675 golang.org/x/tools/internal/packagepath,
676 golang.org/x/tools/internal/stdlib,
677 golang.org/x/tools/internal/versions
678 < golang.org/x/tools/go/analysis/internal/analysisflags,
679 golang.org/x/tools/go/ast/inspector,
680 golang.org/x/tools/internal/analysis/analyzerutil,
681 golang.org/x/tools/internal/diff,
682 golang.org/x/tools/internal/facts,
683 golang.org/x/tools/internal/typeparams
684 < golang.org/x/tools/go/analysis/passes/asmdecl,
685 golang.org/x/tools/go/analysis/passes/buildtag,
686 golang.org/x/tools/go/analysis/passes/directive,
687 golang.org/x/tools/go/analysis/passes/framepointer,
688 golang.org/x/tools/go/analysis/passes/inspect,
689 golang.org/x/tools/internal/analysis/driverutil,
690 golang.org/x/tools/internal/cursorutil,
691 golang.org/x/tools/internal/typesinternal
692 < golang.org/x/tools/go/analysis/passes/cgocall,
693 golang.org/x/tools/go/analysis/passes/composite,
694 golang.org/x/tools/go/analysis/passes/httpresponse,
695 golang.org/x/tools/go/analysis/passes/ifaceassert,
696 golang.org/x/tools/go/analysis/passes/nilfunc,
697 golang.org/x/tools/go/analysis/passes/sigchanyzer,
698 golang.org/x/tools/go/analysis/passes/stdmethods,
699 golang.org/x/tools/go/analysis/passes/stdversion,
700 golang.org/x/tools/go/analysis/passes/structtag,
701 golang.org/x/tools/go/analysis/passes/unsafeptr,
702 golang.org/x/tools/go/analysis/unitchecker,
703 golang.org/x/tools/go/types/typeutil,
704 golang.org/x/tools/internal/astutil
705 < golang.org/x/tools/go/analysis/passes/appends,
706 golang.org/x/tools/go/analysis/passes/atomic,
707 golang.org/x/tools/go/analysis/passes/bools,
708 golang.org/x/tools/go/analysis/passes/copylock,
709 golang.org/x/tools/go/analysis/passes/ctrlflow,
710 golang.org/x/tools/go/analysis/passes/defers,
711 golang.org/x/tools/go/analysis/passes/internal/gofixdirective,
712 golang.org/x/tools/go/analysis/passes/loopclosure,
713 golang.org/x/tools/go/analysis/passes/shift,
714 golang.org/x/tools/go/analysis/passes/slog,
715 golang.org/x/tools/go/analysis/passes/testinggoroutine,
716 golang.org/x/tools/go/analysis/passes/tests,
717 golang.org/x/tools/go/analysis/passes/timeformat,
718 golang.org/x/tools/go/analysis/passes/unmarshal,
719 golang.org/x/tools/go/analysis/passes/unusedresult,
720 golang.org/x/tools/go/analysis/passes/waitgroup,
721 golang.org/x/tools/internal/typesinternal/typeindex,
722 golang.org/x/tools/refactor/satisfy
723 < golang.org/x/tools/go/analysis/passes/lostcancel,
724 golang.org/x/tools/go/analysis/passes/printf,
725 golang.org/x/tools/internal/analysis/typeindex,
726 golang.org/x/tools/internal/refactor
727 < golang.org/x/tools/go/analysis/passes/assign,
728 golang.org/x/tools/go/analysis/passes/errorsas,
729 golang.org/x/tools/go/analysis/passes/hostport,
730 golang.org/x/tools/go/analysis/passes/modernize,
731 golang.org/x/tools/go/analysis/passes/scannererr,
732 golang.org/x/tools/go/analysis/passes/sqlrowserr,
733 golang.org/x/tools/go/analysis/passes/unreachable,
734 golang.org/x/tools/internal/analysis/intconv,
735 golang.org/x/tools/internal/refactor/inline
736 < golang.org/x/tools/go/analysis/passes/inline,
737 golang.org/x/tools/go/analysis/passes/stringintconv
738 < golang.org/x/tools/go/analysis/suite/fix,
739 golang.org/x/tools/go/analysis/suite/vet
740 < internal/analysis/suite/fix, internal/analysis/suite/vet, internal/analysis/unitchecker;
741
742 # go/importer
743 DEBUG, crypto/sha256, go/build, go/types, text/scanner
744 < internal/exportdata, internal/pkgbits;
745
746 golang.org/x/tools/go/gcexportdata, internal/exportdata, internal/pkgbits
747 < go/internal/gcimporter;
748
749 internal/exportdata, internal/pkgbits
750 < go/internal/gccgoimporter, go/internal/srcimporter;
751
752 go/internal/gccgoimporter, go/internal/gcimporter, go/internal/srcimporter
753 < go/importer;
754
755 NET, crypto/rand, mime/quotedprintable
756 < mime/multipart;
757
758 crypto/tls
759 < net/smtp;
760
761 # HTTP, King of Dependencies.
762
763 context
764 < internal/gate;
765
766 FMT, encoding/binary
767 < golang.org/x/net/http2/hpack
768 < net/http/internal, net/http/internal/ascii, net/http/internal/testcert;
769
770 FMT, NET, container/list, encoding/binary, log
771 < golang.org/x/text/transform
772 < golang.org/x/text/unicode/norm
773 < golang.org/x/text/unicode/bidi
774 < golang.org/x/text/secure/bidirule
775 < golang.org/x/net/idna
776 < golang.org/x/net/http/httpguts, golang.org/x/net/http/httpproxy;
777
778 NET, crypto/tls
779 < net/http/httptrace;
780
781 compress/gzip,
782 golang.org/x/net/http/httpguts,
783 golang.org/x/net/http/httpproxy,
784 golang.org/x/net/http2/hpack,
785 net/http/internal,
786 net/http/internal/ascii,
787 net/http/internal/testcert,
788 net/http/httptrace,
789 mime/multipart,
790 log
791 < net/http/internal/httpcommon, net/http/internal/httpsfv
792 < net/http/internal/http2
793 < net/http;
794
795 net/http, golang.org/x/crypto/hkdf, log/slog
796 < golang.org/x/net/internal/quic/quicwire
797 < golang.org/x/net/quic
798 < net/http/internal/http3;
799
800 # HTTP-aware packages
801
802 encoding/json, net/http
803 < expvar;
804
805 net/http, net/http/internal/ascii
806 < net/http/cookiejar, net/http/httputil;
807
808 net/http, regexp
809 < net/http/cgi
810 < net/http/fcgi;
811
812 # Profiling
813 internal/runtime/pprof/label, runtime, context < internal/runtime/pprof;
814 FMT, compress/gzip, encoding/binary, sort, text/tabwriter, internal/runtime/pprof, internal/runtime/pprof/label
815 < runtime/pprof;
816
817 OS, compress/gzip, internal/lazyregexp
818 < internal/profile;
819
820 html, internal/profile, net/http, runtime/pprof, runtime/trace
821 < net/http/pprof;
822
823 # RPC
824 encoding/gob, encoding/json, go/token, html/template, net/http
825 < net/rpc
826 < net/rpc/jsonrpc;
827
828 # System Information
829 bufio, bytes, internal/cpu, io, os, strings, sync
830 < internal/sysinfo;
831
832 # Test-only
833 log
834 < testing/iotest
835 < testing/fstest;
836
837 FMT, flag, math/rand
838 < testing/quick;
839
840 FMT, DEBUG, flag, runtime/trace, internal/sysinfo, math/rand
841 < testing;
842
843 testing, math
844 < simd/archsimd/internal/test_helpers, simd/internal/test_helpers;
845
846 log/slog, testing
847 < testing/slogtest;
848
849 testing, crypto/rand
850 < testing/cryptotest;
851
852 NET, internal/gate
853 < internal/nettest;
854
855 net/http, flag, internal/nettest, testing
856 < net/http/httptest;
857
858 FMT, crypto/sha256, encoding/binary, encoding/json,
859 go/ast, go/parser, go/token,
860 internal/godebug, math/rand, encoding/hex
861 < internal/fuzz;
862
863 OS, flag, testing, internal/cfg, internal/platform, internal/goroot
864 < internal/testenv;
865
866 OS, encoding/base64
867 < internal/obscuretestdata;
868
869 CGO, OS, fmt
870 < internal/testpty;
871
872 NET, testing, math/rand
873 < golang.org/x/net/nettest;
874
875 syscall
876 < os/exec/internal/fdtest;
877
878 FMT, sort
879 < internal/diff;
880
881 FMT
882 < internal/txtar;
883
884 internal/synctest, testing
885 < testing/synctest;
886
887 testing
888 < internal/testhash;
889
890 CRYPTO-MATH
891 < crypto/mlkem/mlkemtest;
892
893 CRYPTO-MATH, testing, internal/testenv, internal/testhash, encoding/json, regexp
894 < crypto/internal/cryptotest;
895
896 crypto/internal/cryptotest, encoding/hex
897 < crypto/internal/cryptotest/wycheproof;
898
899 FMT, encoding/json, time, regexp
900 < crypto/internal/cryptotest/x509limbo;
901
902 CGO, FMT
903 < crypto/internal/sysrand/internal/seccomp;
904
905 FIPS
906 < crypto/internal/fips140/check/checktest;
907
908 # v2 execution trace parser.
909 FMT, io, internal/trace/tracev2
910 < internal/trace/version;
911
912 FMT, encoding/binary, internal/trace/version
913 < internal/trace/raw;
914
915 FMT, internal/trace/version, io, sort, encoding/binary
916 < internal/trace/internal/tracev1;
917
918 FMT, encoding/binary, internal/trace/version, internal/trace/internal/tracev1, container/heap, math/rand, regexp
919 < internal/trace;
920
921 # cmd/trace dependencies.
922 FMT,
923 embed,
924 encoding/json,
925 html/template,
926 internal/profile,
927 internal/trace,
928 internal/trace/traceviewer/format,
929 net/http
930 < internal/trace/traceviewer;
931
932 # Coverage.
933 FMT, hash/fnv, encoding/binary, regexp, sort, text/tabwriter,
934 internal/coverage, internal/coverage/uleb128
935 < internal/coverage/cmerge,
936 internal/coverage/pods,
937 internal/coverage/slicereader,
938 internal/coverage/slicewriter;
939
940 internal/coverage/slicereader, internal/coverage/slicewriter
941 < internal/coverage/stringtab
942 < internal/coverage/decodecounter, internal/coverage/decodemeta,
943 internal/coverage/encodecounter, internal/coverage/encodemeta;
944
945 internal/coverage/cmerge
946 < internal/coverage/cformat;
947
948 internal/coverage, crypto/sha256, FMT
949 < cmd/internal/cov/covcmd;
950
951 encoding/json,
952 runtime/debug,
953 internal/coverage/calloc,
954 internal/coverage/cformat,
955 internal/coverage/decodecounter, internal/coverage/decodemeta,
956 internal/coverage/encodecounter, internal/coverage/encodemeta,
957 internal/coverage/pods
958 < internal/coverage/cfile
959 < runtime/coverage;
960
961 internal/coverage/cfile, internal/fuzz, internal/testlog, runtime/pprof, regexp
962 < testing/internal/testdeps;
963
964 # Test-only packages can have anything they want
965
966 FMT, compress/gzip, embed, encoding/binary
967 < encoding/json/internal/jsontest;
968
969 CGO, internal/syscall/unix
970 < net/internal/cgotest;
971
972 FMT, testing
973 < internal/cgrouptest;
974
975 regexp, internal/testenv, internal/trace, internal/trace/raw, internal/txtar, testing
976 < internal/trace/testtrace;
977
978 C, CGO
979 < internal/runtime/cgobench;
980
981 # Generate-only packages can have anything they want.
982
983 container/heap,
984 encoding/binary,
985 fmt,
986 hash/maphash,
987 io,
988 log,
989 math/bits,
990 os,
991 reflect,
992 strings,
993 sync
994 < internal/runtime/gc/internal/gen;
995
996 regexp, internal/txtar, internal/trace, internal/trace/raw
997 < internal/trace/internal/testgen;
998
999 FMT
1000 < math/big/internal/asmgen;
1001 `
1002
1003
1004 func listStdPkgs(goroot string) ([]string, error) {
1005
1006 var pkgs []string
1007
1008 src := filepath.Join(goroot, "src") + string(filepath.Separator)
1009 walkFn := func(path string, d fs.DirEntry, err error) error {
1010 if err != nil || !d.IsDir() || path == src {
1011 return nil
1012 }
1013
1014 base := filepath.Base(path)
1015 if strings.HasPrefix(base, ".") || strings.HasPrefix(base, "_") || base == "testdata" {
1016 return filepath.SkipDir
1017 }
1018
1019 name := filepath.ToSlash(path[len(src):])
1020 if name == "builtin" || name == "cmd" {
1021 return filepath.SkipDir
1022 }
1023
1024 pkgs = append(pkgs, strings.TrimPrefix(name, "vendor/"))
1025 return nil
1026 }
1027 if err := filepath.WalkDir(src, walkFn); err != nil {
1028 return nil, err
1029 }
1030 return pkgs, nil
1031 }
1032
1033 func TestDependencies(t *testing.T) {
1034 testenv.MustHaveSource(t)
1035
1036 ctxt := Default
1037 all, err := listStdPkgs(ctxt.GOROOT)
1038 if err != nil {
1039 t.Fatal(err)
1040 }
1041 slices.Sort(all)
1042
1043 sawImport := map[string]map[string]bool{}
1044 policy := depsPolicy(t)
1045
1046 for _, pkg := range all {
1047 imports, err := findImports(pkg)
1048 if err != nil {
1049 t.Error(err)
1050 continue
1051 }
1052 if sawImport[pkg] == nil {
1053 sawImport[pkg] = map[string]bool{}
1054 }
1055 var bad []string
1056 for _, imp := range imports {
1057 sawImport[pkg][imp] = true
1058 if !policy.HasEdge(pkg, imp) {
1059 bad = append(bad, imp)
1060 }
1061 }
1062 if bad != nil {
1063 t.Errorf("unexpected dependency: %s imports %v", pkg, bad)
1064 }
1065 }
1066 }
1067
1068 var buildIgnore = []byte("\n//go:build ignore")
1069
1070 func findImports(pkg string) ([]string, error) {
1071 vpkg := pkg
1072 if strings.HasPrefix(pkg, "golang.org") {
1073 vpkg = "vendor/" + pkg
1074 }
1075 dir := filepath.Join(Default.GOROOT, "src", vpkg)
1076 files, err := os.ReadDir(dir)
1077 if err != nil {
1078 return nil, err
1079 }
1080 var imports []string
1081 var haveImport = map[string]bool{}
1082 if pkg == "crypto/internal/boring" {
1083 haveImport["C"] = true
1084 }
1085 fset := token.NewFileSet()
1086 for _, file := range files {
1087 name := file.Name()
1088 if name == "slice_go14.go" || name == "slice_go18.go" {
1089
1090 continue
1091 }
1092 if !strings.HasSuffix(name, ".go") || strings.HasSuffix(name, "_test.go") {
1093 continue
1094 }
1095 info := fileInfo{
1096 name: filepath.Join(dir, name),
1097 fset: fset,
1098 }
1099 f, err := os.Open(info.name)
1100 if err != nil {
1101 return nil, err
1102 }
1103 err = readGoInfo(f, &info)
1104 f.Close()
1105 if err != nil {
1106 return nil, fmt.Errorf("reading %v: %v", name, err)
1107 }
1108 if info.parsed.Name.Name == "main" {
1109 continue
1110 }
1111 if bytes.Contains(info.header, buildIgnore) {
1112 continue
1113 }
1114 for _, imp := range info.imports {
1115 path := imp.path
1116 if !haveImport[path] {
1117 haveImport[path] = true
1118 imports = append(imports, path)
1119 }
1120 }
1121 }
1122 slices.Sort(imports)
1123 return imports, nil
1124 }
1125
1126
1127 func depsPolicy(t *testing.T) *dag.Graph {
1128 g, err := dag.Parse(depsRules)
1129 if err != nil {
1130 t.Fatal(err)
1131 }
1132 return g
1133 }
1134
1135
1136
1137 func TestStdlibLowercase(t *testing.T) {
1138 testenv.MustHaveSource(t)
1139
1140 ctxt := Default
1141 all, err := listStdPkgs(ctxt.GOROOT)
1142 if err != nil {
1143 t.Fatal(err)
1144 }
1145
1146 for _, pkgname := range all {
1147 if strings.ToLower(pkgname) != pkgname {
1148 t.Errorf("package %q should not use upper-case path", pkgname)
1149 }
1150 }
1151 }
1152
1153
1154 func TestFindImports(t *testing.T) {
1155 imports, err := findImports("go/build")
1156 if err != nil {
1157 t.Fatal(err)
1158 }
1159 t.Logf("go/build imports %q", imports)
1160 want := []string{"bytes", "os", "path/filepath", "strings"}
1161 wantLoop:
1162 for _, w := range want {
1163 for _, imp := range imports {
1164 if imp == w {
1165 continue wantLoop
1166 }
1167 }
1168 t.Errorf("expected to find %q in import list", w)
1169 }
1170 }
1171
View as plain text