design/freeze-syscall: new copy of syscall freeze proposal
This is a copy of the original text from a Google Doc.
Change-Id: If5ff705124ba36a5d73789b7e6e419f0dc72fc7c
Reviewed-on: https://go-review.googlesource.com/c/proposal/+/402415
Run-TryBot: Ian Lance Taylor <iant@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: Rob Pike <r@golang.org>
Auto-Submit: Ian Lance Taylor <iant@google.com>
diff --git a/design/freeze-syscall.md b/design/freeze-syscall.md
new file mode 100644
index 0000000..13fd9d4
--- /dev/null
+++ b/design/freeze-syscall.md
@@ -0,0 +1,89 @@
+# The syscall package
+
+Author: Rob Pike
+Date: 2014
+
+Status: this proposal was [adopted for the Go 1.4 release]
+(https://go.dev/doc/go1.4#major_library_changes).
+
+## Problem
+
+The `syscall` package as it stands today has several problems:
+
+1. Bloat. It contains definitions of many system calls and constants
+ for a large and growing set of architectures and operating systems.
+2. Testing. Little of the interface has explicit tests, and
+ cross-platform testing is impossible.
+3. Curation. Many change lists arrive, in support of wide-ranging
+ packages and systems. The merit of these changes is hard to judge,
+ so essentially anything goes. The package is the worst maintained,
+ worst tested, and worst documented package in the standard
+ repository, and continues to worsen.
+4. Documentation. The single package, called `syscall`, is different
+ for every system, but godoc only shows the variant for its own
+ native environment. Moreover, the documentation is sorely lacking
+ anyway. Most functions have no doc comment at all.
+5. Compatibility. Despite best intentions, the package does not meet
+ the Go 1 compatibility guarantee because operating systems change
+ in ways that are beyond our control. The recent changes to FreeBSD
+ are one example.
+
+This proposal is an attempt to ameliorate these issues.
+
+## Proposal
+
+The proposal has several components. In no particular order:
+
+1. The Go 1 compatibility rules mean that we cannot fix the problem
+ outright, say by making the package internal. We therefore propose
+ to freeze the package as of Go 1.3, which will mean backing out
+ some changes that have gone in since then.
+2. Any changes to the system call interface necessary to support
+ future versions of Go will be done through the internal package
+ mechanism proposed for Go 1.4.
+3. The `syscall` package will not be updated in future releases, not
+ even to keep pace with changes in operating systems it
+ references. For example, if the value of a kernel constant changes
+ in a future NetBSD release, package `syscall` will not be updated
+ to reflect that.
+4. A new subrepository, `go.sys`, will be created.
+5. Inside `go.sys`, there will be three packages, independent of
+ syscall, called `plan9`, `unix`, and `windows`, and the current
+ `syscall` package's contents will be broken apart as appropriate
+ and installed in those packages. (This split expresses the
+ fundamental interface differences between the systems, permitting
+ some source-level portability, but within the packages build tags
+ will still be needed to separate out architectures and variants
+ (darwin, linux)). These are the packages we expect all external Go
+ packages to migrate to when they need support for system
+ calls. Because they are distinct, they are easier to curate, easier
+ to examine with godoc, and may be easier to keep well
+ documented. This layout also makes it clearer how to write
+ cross-platform code: by separating system-dependent elements into
+ separately imported components.
+6. The `go.sys` repositories will be updated as operating systems
+ evolve.
+7. The documentation for the standard `syscall` package will direct
+ users to the new repository. Although the `syscall` package will
+ continue to exist and work as well as feasible, all new public
+ development will occur in `go.sys`.
+8. The core repository will not depend on the `go.sys` packages,
+ although it is likely some of the subrepositories, such as
+ `go.net`, will.
+9. As with any standard repository, the `go.sys` repository will be
+ curated by the Go team. Separating it out of the main repository
+ makes it more practical to automate some of the maintenance, for
+ example to create packages automatically by exhaustive processing
+ of system include files.
+10. Any non-essential changes at tip that have occurred in the
+ `syscall` package since 1.3 will be migrated to the `go.sys`
+ subrepository.
+
+Note that we cannot clean up the existing `syscall` package to any
+meaningful extent because of the compatibility guarantee. We can
+freeze and, in effect, deprecate it, however.
+
+## Timeline
+
+We propose to complete these changes before the September 1, 2014
+deadline for Go 1.4.