parent
e6063f6c33
commit
a36c6fb965
@ -1,98 +0,0 @@
|
||||
# Design Doc: `go_{library,binary,test}`
|
||||
|
||||
## Concerns
|
||||
|
||||
1. Need to build Go libraries callable from Go and from C.
|
||||
|
||||
For usual Go libraries, the bulding command line is as
|
||||
|
||||
```bash
|
||||
go build foo.go bar.go -o libfoobar.a
|
||||
```
|
||||
|
||||
For Go libraries callable from C/C++, the command line is
|
||||
|
||||
```bash
|
||||
go build -buildmode=c-archive foo.go bar.go -o libstatic.a
|
||||
```
|
||||
|
||||
or for shared libraries:
|
||||
|
||||
```bash
|
||||
go build -buildmode=c-shared foo.go bar.go -o libdynamic.so
|
||||
```
|
||||
|
||||
and `foo.go`, `bar.go`, etc must start with a line `package main`,
|
||||
which defines all symbols in special pacakge `main`. There also
|
||||
must be a `func main`, which could have empty body.
|
||||
|
||||
1. Need to support building-in-Docker.
|
||||
|
||||
We are going to support two ways to building -- (1) in Ubuntu, and
|
||||
(2) in Docker container whose base image is Ubuntu.
|
||||
|
||||
The challenge is (2), because to build in Docker, we run the
|
||||
development image as:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/PaddlePaddle/Paddle -o paddle
|
||||
cd paddle
|
||||
docker run -v $PWD:/paddle paddle:dev
|
||||
```
|
||||
|
||||
which maps the local repo to `/paddle` in the container.
|
||||
|
||||
This assumes that all Go code, including third-party packages, must
|
||||
be in the local repo. Actually, it assumes that `$GOPATH` must be
|
||||
in the local repo. This would affect how we write `import`
|
||||
statemetns, and how we maintain third-party packages.
|
||||
|
||||
|
||||
## A Solution
|
||||
|
||||
This might not be the optimal solution. Comments are welcome.
|
||||
|
||||
### Directory structure
|
||||
|
||||
We propose the following directory structure:
|
||||
|
||||
```
|
||||
https://github.com/PaddlePaddle/Paddle
|
||||
↓ git clone
|
||||
~/work/paddle/go/pkg1/foo.go
|
||||
/pkg2/bar.go
|
||||
/cmd/cmd1/wee.go
|
||||
/cmd/cmd2/qux.go
|
||||
/github.com/someone/a_3rd_party_pkg (Git submodule to a 3rd-party pkg)
|
||||
/golang.org/another_3rd_party_pkg (Git submodule to another one)
|
||||
/build/go ($GOPATH, required by Go toolchain)
|
||||
/src (symlink to ~/work/paddle/go/)
|
||||
/pkg (libraries built by Go toolchain)
|
||||
/bin (binaries bulit by Go toolchain)
|
||||
```
|
||||
|
||||
Above figure explains how we organize Paddle's Go code:
|
||||
|
||||
1. Go source code in Paddle is in `/go` of the repo.
|
||||
1. Each library package is a sub-directory under `/go`.
|
||||
1. Each (executable) binary package is a sub-directory under
|
||||
`/go/cmd`. This is the source tree convention of Go itself.
|
||||
1. Each 3rd-party Go package is a Git submodule under `/go`.
|
||||
|
||||
These rules make sure that all Go source code are in `/go`.
|
||||
|
||||
At build-time, Go toolchain requires a directory structure rooted at
|
||||
`$GOPATH` and having three sub-directories: `$GOPATH/src`,
|
||||
`$GOPATH/pkg`, and `$GOPATH/bin`, where `$GOPATH/src` is the source
|
||||
tree and the root of Go's `import` paths.
|
||||
|
||||
For example, if `/go/pkg1/foo.go` contains `import
|
||||
"github.com/someone/a_3rd_party_pkg"`, the Go toolchain will find the
|
||||
package at `$GOPATH/src/github.com/someone/a_3rd_party_pkg`.
|
||||
|
||||
In order to create such a `$GOPATH`, our build system creates
|
||||
`/build/go`. Remeber that we want to make sure that all output files
|
||||
generated at build-time are place in `/build`.
|
||||
|
||||
Under `/build/go`, our build system creates a symoblic link `src`
|
||||
pointing to `/go`, where all Go source code resides.
|
Loading…
Reference in new issue