|
1 | 1 | #!/bin/sh
|
2 |
| -set -e |
| 2 | +set -e; |
3 | 3 |
|
4 |
| -tmp=$(mktemp -d "${TMPDIR:-/tmp}/gopherjs_playground.XXXXXXXXXX") |
| 4 | +tmp=$(mktemp -d "${TMPDIR:-/tmp}/gopherjs_playground.XXXXXXXXXX"); |
5 | 5 |
|
6 | 6 | cleanup() {
|
7 |
| - rm -rf "$tmp" |
8 |
| - exit |
| 7 | + chmod -R u+w "$tmp"; |
| 8 | + rm -rf "$tmp"; |
| 9 | + exit; |
9 | 10 | }
|
10 | 11 |
|
11 |
| -trap cleanup EXIT HUP INT TERM |
12 |
| - |
13 |
| -# This script relies on GOPATH mode. The GOPATH workspace |
14 |
| -# must contain both github.com/gopherjs/gopherjs and |
15 |
| -# github.com/gopherjs/gopherjs.github.io repositories. |
16 |
| -export GO111MODULE=off |
| 12 | +isolated_goroot() { |
| 13 | + REAL_GOROOT="$(go env GOROOT)" |
| 14 | + export GOROOT="$tmp/goroot" |
| 15 | + unset GOPHERJS_GOROOT # force $GOROOT to be used |
| 16 | + mkdir -p "$GOROOT/pkg" |
| 17 | + for f in $(ls $REAL_GOROOT | grep -v pkg); do |
| 18 | + ln -s "$REAL_GOROOT/$f" "$GOROOT/$f" |
| 19 | + done |
| 20 | + export GOPATH="$tmp/gopath" # Intentionally doesn't exist. |
| 21 | +} |
17 | 22 |
|
18 |
| -go install github.com/gopherjs/gopherjs/... |
| 23 | +trap cleanup EXIT HUP INT TERM; |
19 | 24 |
|
20 |
| -go generate github.com/gopherjs/gopherjs.github.io/playground/internal/imports |
| 25 | +export GO111MODULE=on; |
21 | 26 |
|
22 |
| -# The GOPATH workspace where the GopherJS project is. |
23 |
| -gopherjsgopath=$(go list -f '{{.Root}}' github.com/gopherjs/gopherjs) |
| 27 | +# Stage 1: Install latest released GopherJS version. |
| 28 | +go install github.com/gopherjs/gopherjs@latest; |
24 | 29 |
|
25 |
| -# Make a copy of GOROOT that is non-user-writable, |
26 |
| -# to prevent any GopherJS packages being written to it for now. |
27 |
| -echo "copying GOROOT from $(go env GOROOT) to $tmp/goroot" |
28 |
| -cp -a "$(go env GOROOT)/" "$tmp/goroot/" |
29 |
| -echo "making our copy of GOROOT non-user-writable for now" |
30 |
| -chmod -R -w "$tmp/goroot" |
31 |
| -export GOROOT="$tmp/goroot" |
32 |
| -unset GOPHERJS_GOROOT # force $GOROOT to be used |
| 30 | +# Stage 2: Regenerate stdlib API information for auto-imports. |
| 31 | +go generate github.com/gopherjs/gopherjs.github.io/playground/internal/imports; |
33 | 32 |
|
34 |
| -# Build playground itself. |
35 |
| -gopherjs build -m |
| 33 | +# Stage 3: Build playground itself. |
| 34 | +gopherjs build -m .; |
36 | 35 |
|
37 |
| -# Use an empty GOPATH workspace with just gopherjs, |
38 |
| -# so that all the standard library packages get written to GOROOT/pkg. |
39 |
| -export GOPATH="$tmp/gopath" |
40 |
| -mkdir -p "$GOPATH"/src/github.com/gopherjs/gopherjs |
41 |
| -cp -a "$gopherjsgopath"/src/github.com/gopherjs/gopherjs/* "$GOPATH"/src/github.com/gopherjs/gopherjs |
| 36 | +# Stage 4: Precompile standard library and GopherJS packages. |
42 | 37 |
|
43 |
| -rm -rf pkg/ |
| 38 | +# Stage 4.1: Set up isolated GOROOT/GOPATH directory so that we can easily |
| 39 | +# extract all compiled archives. |
| 40 | +isolated_goroot; |
44 | 41 |
|
45 |
| -gopherjs install -m github.com/gopherjs/gopherjs/js github.com/gopherjs/gopherjs/nosync |
46 |
| -mkdir -p pkg/github.com/gopherjs/gopherjs |
47 |
| -cp "$GOPATH"/pkg/*_js_min/github.com/gopherjs/gopherjs/js.a pkg/github.com/gopherjs/gopherjs/js.a |
48 |
| -cp "$GOPATH"/pkg/*_js_min/github.com/gopherjs/gopherjs/nosync.a pkg/github.com/gopherjs/gopherjs/nosync.a |
| 42 | +# Stage 4.2: Wipe out all previously built archives. |
| 43 | +rm -rf pkg/; |
49 | 44 |
|
50 |
| -# Make our GOROOT copy user-writable now, then |
51 |
| -# use it to build and copy out standard library packages. |
52 |
| -echo "making our copy of GOROOT user-writable again" |
53 |
| -chmod -R u+w "$tmp/goroot" |
| 45 | +# Stage 4.3: Precompile GopherJS libraries. |
| 46 | +mkdir -p pkg/github.com/gopherjs/gopherjs; |
| 47 | +gopherjs build -o pkg/github.com/gopherjs/gopherjs/js.a github.com/gopherjs/gopherjs/js; |
| 48 | +gopherjs build -o pkg/github.com/gopherjs/gopherjs/nosync.a github.com/gopherjs/gopherjs/nosync; |
54 | 49 |
|
55 |
| -gopherjs install -m \ |
56 |
| - archive/tar \ |
57 |
| - archive/zip \ |
58 |
| - bufio \ |
59 |
| - bytes \ |
60 |
| - compress/bzip2 \ |
61 |
| - compress/flate \ |
62 |
| - compress/gzip \ |
63 |
| - compress/lzw \ |
64 |
| - compress/zlib \ |
65 |
| - container/heap \ |
66 |
| - container/list \ |
67 |
| - container/ring \ |
68 |
| - crypto/aes \ |
69 |
| - crypto/cipher \ |
70 |
| - crypto/des \ |
71 |
| - crypto/dsa \ |
72 |
| - crypto/ecdsa \ |
73 |
| - crypto/elliptic \ |
74 |
| - crypto/hmac \ |
75 |
| - crypto/md5 \ |
76 |
| - crypto/rand \ |
77 |
| - crypto/rc4 \ |
78 |
| - crypto/rsa \ |
79 |
| - crypto/sha1 \ |
80 |
| - crypto/sha256 \ |
81 |
| - crypto/sha512 \ |
82 |
| - crypto/subtle \ |
83 |
| - database/sql/driver \ |
84 |
| - debug/gosym \ |
85 |
| - debug/pe \ |
86 |
| - encoding/ascii85 \ |
87 |
| - encoding/asn1 \ |
88 |
| - encoding/base32 \ |
89 |
| - encoding/base64 \ |
90 |
| - encoding/binary \ |
91 |
| - encoding/csv \ |
92 |
| - encoding/gob \ |
93 |
| - encoding/hex \ |
94 |
| - encoding/json \ |
95 |
| - encoding/pem \ |
96 |
| - encoding/xml \ |
97 |
| - errors \ |
98 |
| - fmt \ |
99 |
| - go/ast \ |
100 |
| - go/doc \ |
101 |
| - go/format \ |
102 |
| - go/printer \ |
103 |
| - go/token \ |
104 |
| - hash/adler32 \ |
105 |
| - hash/crc32 \ |
106 |
| - hash/crc64 \ |
107 |
| - hash/fnv \ |
108 |
| - html \ |
109 |
| - html/template \ |
110 |
| - image \ |
111 |
| - image/color \ |
112 |
| - image/draw \ |
113 |
| - image/gif \ |
114 |
| - image/jpeg \ |
115 |
| - image/png \ |
116 |
| - index/suffixarray \ |
117 |
| - io \ |
118 |
| - io/ioutil \ |
119 |
| - math \ |
120 |
| - math/big \ |
121 |
| - math/bits \ |
122 |
| - math/cmplx \ |
123 |
| - math/rand \ |
124 |
| - mime \ |
125 |
| - net/http/cookiejar \ |
126 |
| - net/http/fcgi \ |
127 |
| - net/http/httptest \ |
128 |
| - net/http/httputil \ |
129 |
| - net/mail \ |
130 |
| - net/smtp \ |
131 |
| - net/textproto \ |
132 |
| - net/url \ |
133 |
| - path \ |
134 |
| - path/filepath \ |
135 |
| - reflect \ |
136 |
| - regexp \ |
137 |
| - regexp/syntax \ |
138 |
| - runtime/internal/sys \ |
139 |
| - sort \ |
140 |
| - strconv \ |
141 |
| - strings \ |
142 |
| - sync/atomic \ |
143 |
| - syscall/js \ |
144 |
| - testing \ |
145 |
| - testing/iotest \ |
146 |
| - testing/quick \ |
147 |
| - text/scanner \ |
148 |
| - text/tabwriter \ |
149 |
| - text/template \ |
150 |
| - text/template/parse \ |
151 |
| - time \ |
152 |
| - unicode \ |
153 |
| - unicode/utf16 \ |
154 |
| - unicode/utf8 |
| 50 | +# Stage 4.4: Precompile standard library. |
| 51 | +gopherjs install $(GOOS=js GOARCH=wasm go list std | grep -v -E "internal/|vendor/|pprof|plugin") |
155 | 52 |
|
156 |
| -cp -a "$GOROOT"/pkg/*_js_min/* pkg/ |
157 |
| -cp -a "$GOROOT"/pkg/*_amd64_js_min/* pkg/ |
| 53 | +# Stage 4.5: Copy compiled archives into the repository tree. |
| 54 | +cp -a "$GOROOT"/pkg/*_js/* pkg/ |
| 55 | +cp -a "$GOROOT"/pkg/*_amd64_amd64/* pkg/ # This is for the syscall package, which is built with a different GOARCH. |
158 | 56 |
|
159 |
| -# Rename all *.a files in pkg/ to *.a.js. |
| 57 | +# Stage 4.6 Rename all *.a files in pkg/ to *.a.js. |
160 | 58 | find pkg -name "*.a" -exec sh -c 'mv $0 $0.js' {} \;
|
0 commit comments