mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-04 11:07:46 +00:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 375033a6bb | |||
| 2dfc32dde9 | |||
| d7341cf7cc | |||
| 0fca2ae8c8 | |||
| cee97e6d97 | |||
| 26f3b70304 |
@@ -119,7 +119,7 @@ commands:
|
|||||||
- lib/wasi-libc/sysroot
|
- lib/wasi-libc/sysroot
|
||||||
- run: go test -v -tags=llvm<<parameters.llvm>> ./cgo ./compileopts ./compiler ./interp ./transform .
|
- run: go test -v -tags=llvm<<parameters.llvm>> ./cgo ./compileopts ./compiler ./interp ./transform .
|
||||||
- run: make gen-device -j4
|
- run: make gen-device -j4
|
||||||
- run: make smoketest XTENSA=0
|
- run: make smoketest XTENSA=0 RUN_SMOKETEST_JOBS=4
|
||||||
- run: make tinygo-test
|
- run: make tinygo-test
|
||||||
- run: make wasmtest
|
- run: make wasmtest
|
||||||
- save_cache:
|
- save_cache:
|
||||||
@@ -195,7 +195,7 @@ commands:
|
|||||||
- ~/.cache/go-build
|
- ~/.cache/go-build
|
||||||
- /go/pkg/mod
|
- /go/pkg/mod
|
||||||
- run: make gen-device -j4
|
- run: make gen-device -j4
|
||||||
- run: make smoketest TINYGO=build/tinygo
|
- run: make smoketest TINYGO=build/tinygo RUN_SMOKETEST_JOBS=4
|
||||||
build-linux:
|
build-linux:
|
||||||
steps:
|
steps:
|
||||||
- checkout
|
- checkout
|
||||||
@@ -278,7 +278,7 @@ commands:
|
|||||||
tar -C ~/lib -xf /tmp/tinygo.linux-amd64.tar.gz
|
tar -C ~/lib -xf /tmp/tinygo.linux-amd64.tar.gz
|
||||||
ln -s ~/lib/tinygo/bin/tinygo /go/bin/tinygo
|
ln -s ~/lib/tinygo/bin/tinygo /go/bin/tinygo
|
||||||
tinygo version
|
tinygo version
|
||||||
- run: make smoketest
|
- run: make smoketest RUN_SMOKETEST_JOBS=4
|
||||||
build-macos:
|
build-macos:
|
||||||
steps:
|
steps:
|
||||||
- checkout
|
- checkout
|
||||||
@@ -357,7 +357,7 @@ commands:
|
|||||||
tar -C /usr/local/opt -xf /tmp/tinygo.darwin-amd64.tar.gz
|
tar -C /usr/local/opt -xf /tmp/tinygo.darwin-amd64.tar.gz
|
||||||
ln -s /usr/local/opt/tinygo/bin/tinygo /usr/local/bin/tinygo
|
ln -s /usr/local/opt/tinygo/bin/tinygo /usr/local/bin/tinygo
|
||||||
tinygo version
|
tinygo version
|
||||||
- run: make smoketest AVR=0
|
- run: make smoketest AVR=0 RUN_SMOKETEST_JOBS=4
|
||||||
- save_cache:
|
- save_cache:
|
||||||
key: go-cache-macos-v3-{{ checksum "go.mod" }}-{{ .Environment.CIRCLE_BUILD_NUM }}
|
key: go-cache-macos-v3-{{ checksum "go.mod" }}-{{ .Environment.CIRCLE_BUILD_NUM }}
|
||||||
paths:
|
paths:
|
||||||
|
|||||||
@@ -202,8 +202,11 @@ tinygo-test:
|
|||||||
$(TINYGO) test text/scanner
|
$(TINYGO) test text/scanner
|
||||||
$(TINYGO) test unicode/utf8
|
$(TINYGO) test unicode/utf8
|
||||||
|
|
||||||
.PHONY: smoketest
|
.PHONY: smoketest smoketest-commands
|
||||||
smoketest:
|
smoketest:
|
||||||
|
@go run ./src/cmd/run-smoketest make smoketest-commands
|
||||||
|
|
||||||
|
smoketest-commands:
|
||||||
$(TINYGO) version
|
$(TINYGO) version
|
||||||
# test all examples (except pwm)
|
# test all examples (except pwm)
|
||||||
$(TINYGO) build -size short -o test.hex -target=pca10040 examples/blinky1
|
$(TINYGO) build -size short -o test.hex -target=pca10040 examples/blinky1
|
||||||
|
|||||||
+7
-1
@@ -300,7 +300,13 @@ func Build(pkgName, outpath string, config *compileopts.Config, action func(Buil
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return os.Rename(f.Name(), bitcodePath)
|
|
||||||
|
// Rename may fail if another process is trying to write to
|
||||||
|
// the same file. However, in this case, the failure is
|
||||||
|
// acceptable because the result of the other process can be
|
||||||
|
// used.
|
||||||
|
os.Rename(f.Name(), bitcodePath)
|
||||||
|
return nil
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
jobs = append(jobs, job)
|
jobs = append(jobs, job)
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ func copyFile(src, dst string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer inf.Close()
|
defer inf.Close()
|
||||||
outpath := dst + ".tmp"
|
outpath := src + ".tmp"
|
||||||
outf, err := os.Create(outpath)
|
outf, err := os.Create(outpath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -101,5 +101,10 @@ func copyFile(src, dst string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return os.Rename(dst+".tmp", dst)
|
// Rename may fail if another process is trying to write to
|
||||||
|
// the same file. However, in this case, the failure is
|
||||||
|
// acceptable because the result of the other process can be
|
||||||
|
// used.
|
||||||
|
os.Rename(outpath, dst)
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-4
@@ -167,10 +167,7 @@ func compileAndCacheCFile(abspath, tmpdir string, cflags []string, printCommands
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
err = os.Rename(f.Name(), depfileCachePath)
|
os.Rename(f.Name(), depfileCachePath)
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Move temporary object file to final location.
|
// Move temporary object file to final location.
|
||||||
outpath, err := makeCFileCachePath(dependencySlice, depfileNameHash)
|
outpath, err := makeCFileCachePath(dependencySlice, depfileNameHash)
|
||||||
|
|||||||
@@ -9,7 +9,9 @@ require (
|
|||||||
github.com/google/shlex v0.0.0-20181106134648-c34317bd91bf
|
github.com/google/shlex v0.0.0-20181106134648-c34317bd91bf
|
||||||
github.com/marcinbor85/gohex v0.0.0-20200531091804-343a4b548892
|
github.com/marcinbor85/gohex v0.0.0-20200531091804-343a4b548892
|
||||||
github.com/mattn/go-colorable v0.1.8
|
github.com/mattn/go-colorable v0.1.8
|
||||||
|
github.com/sago35/ochan v0.0.0-20200313013834-e0f46da4579f // indirect
|
||||||
go.bug.st/serial v1.1.2
|
go.bug.st/serial v1.1.2
|
||||||
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
|
||||||
golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78
|
golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78
|
||||||
golang.org/x/tools v0.0.0-20200216192241-b320d3a0f5a2
|
golang.org/x/tools v0.0.0-20200216192241-b320d3a0f5a2
|
||||||
tinygo.org/x/go-llvm v0.0.0-20210325115028-e7b85195e81c
|
tinygo.org/x/go-llvm v0.0.0-20210325115028-e7b85195e81c
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope
|
|||||||
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
|
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
|
||||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/sago35/ochan v0.0.0-20200313013834-e0f46da4579f h1:bHOcIl3AODQMzleLeSGs3xbIvAzhcgLTUwd8IUKqLMI=
|
||||||
|
github.com/sago35/ochan v0.0.0-20200313013834-e0f46da4579f/go.mod h1:55Pg0jnassdnFxlhS8HIU5pdYhEBYftGaknIP4bBUq8=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
go.bug.st/serial v1.0.0 h1:ogEPzrllCsnG00EqKRjeYvPRsO7NJW6DqykzkdD6E/k=
|
go.bug.st/serial v1.0.0 h1:ogEPzrllCsnG00EqKRjeYvPRsO7NJW6DqykzkdD6E/k=
|
||||||
@@ -41,6 +43,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB
|
|||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
|
||||||
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9 h1:ZBzSG/7F4eNKz2L3GE9o300RX0Az1Bw5HF7PDraD+qU=
|
golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9 h1:ZBzSG/7F4eNKz2L3GE9o300RX0Az1Bw5HF7PDraD+qU=
|
||||||
|
|||||||
@@ -0,0 +1,219 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"bytes"
|
||||||
|
"crypto/md5"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/sago35/ochan"
|
||||||
|
"golang.org/x/sync/errgroup"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
threads := runtime.NumCPU()
|
||||||
|
if j, ok := os.LookupEnv(`RUN_SMOKETEST_JOBS`); ok {
|
||||||
|
n, err := strconv.ParseInt(j, 0, 0)
|
||||||
|
if err == nil {
|
||||||
|
threads = int(n)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
flag.IntVar(&threads, "threads", threads, "threads of make smoketest")
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
if len(os.Args) < 2 {
|
||||||
|
fmt.Printf("usage: %s make smoketest\n", filepath.Base(os.Args[0]))
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
commands, err := getMakeCommands(flag.Args())
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
err = run(commands, threads)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf(err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func getMakeCommands(args []string) ([]string, error) {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
cmd := exec.Command(args[0], args[1:]...)
|
||||||
|
cmd.Args = append(cmd.Args, "-n")
|
||||||
|
cmd.Stdout = &buf
|
||||||
|
cmd.Stderr = &buf
|
||||||
|
err := cmd.Run()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
commands := []string{}
|
||||||
|
scanner := bufio.NewScanner(&buf)
|
||||||
|
|
||||||
|
for scanner.Scan() {
|
||||||
|
line := scanner.Text()
|
||||||
|
|
||||||
|
fields := strings.Fields(line)
|
||||||
|
if filepath.Base(fields[0]) == "tinygo" && (fields[1] == "build" || fields[1] == "version") {
|
||||||
|
commands = append(commands, line)
|
||||||
|
} else if strings.HasPrefix(line, "#") {
|
||||||
|
commands = append(commands, line)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return commands, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func run(commands []string, threads int) error {
|
||||||
|
ch := make(chan string, 1000)
|
||||||
|
o := ochan.NewOchan(ch, 100)
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
limit := make(chan struct{}, threads)
|
||||||
|
var eg errgroup.Group
|
||||||
|
|
||||||
|
for _, command := range commands {
|
||||||
|
command := command
|
||||||
|
select {
|
||||||
|
case limit <- struct{}{}:
|
||||||
|
och := o.GetCh()
|
||||||
|
eg.Go(func() error {
|
||||||
|
var err error
|
||||||
|
|
||||||
|
if runtime.GOOS == `windows` {
|
||||||
|
command = convertToWindowsPath(command)
|
||||||
|
}
|
||||||
|
|
||||||
|
fields := strings.Fields(command)
|
||||||
|
if filepath.Base(fields[0]) == "tinygo" && fields[1] == "build" {
|
||||||
|
err = buildAndmd5sum(command, och)
|
||||||
|
} else if strings.HasPrefix(command, "#") {
|
||||||
|
och <- fmt.Sprintf("%s\n", command)
|
||||||
|
} else {
|
||||||
|
err = runCommand(command, och)
|
||||||
|
}
|
||||||
|
close(och)
|
||||||
|
<-limit
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := eg.Wait(); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
o.Wait()
|
||||||
|
close(ch)
|
||||||
|
}()
|
||||||
|
|
||||||
|
for s := range ch {
|
||||||
|
fmt.Print(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func runCommand(command string, ch chan string) error {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
|
||||||
|
fmt.Fprintf(&buf, "%s\n", command)
|
||||||
|
|
||||||
|
args := strings.Fields(command)
|
||||||
|
cmd := exec.Command(args[0], args[1:]...)
|
||||||
|
cmd.Stdout = &buf
|
||||||
|
cmd.Stderr = &buf
|
||||||
|
|
||||||
|
err := cmd.Run()
|
||||||
|
if err != nil {
|
||||||
|
ch <- buf.String()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
ch <- buf.String()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildAndmd5sum(command string, ch chan string) error {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
|
||||||
|
fmt.Fprintf(&buf, "%s\n", command)
|
||||||
|
|
||||||
|
args := strings.Fields(command)
|
||||||
|
|
||||||
|
output := ""
|
||||||
|
tmpOutput := ""
|
||||||
|
tmpdir, err := ioutil.TempDir("", "")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for i := range args {
|
||||||
|
if args[i] == "-o" {
|
||||||
|
output = args[i+1]
|
||||||
|
ext := filepath.Ext(output)
|
||||||
|
tmpOutput = filepath.Join(tmpdir, fmt.Sprintf("%s.%s", filepath.Base(output), ext))
|
||||||
|
args[i+1] = tmpOutput
|
||||||
|
} else if strings.HasPrefix(args[i], "-o=") {
|
||||||
|
output = args[i][3:]
|
||||||
|
ext := filepath.Ext(output)
|
||||||
|
tmpOutput = filepath.Join(tmpdir, fmt.Sprintf("%s.%s", filepath.Base(output), ext))
|
||||||
|
args[i] = fmt.Sprintf("-o=%s", tmpOutput)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd := exec.Command(args[0], args[1:]...)
|
||||||
|
cmd.Stdout = &buf
|
||||||
|
cmd.Stderr = &buf
|
||||||
|
|
||||||
|
err = cmd.Run()
|
||||||
|
if err != nil {
|
||||||
|
ch <- buf.String()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
md5str, err := calcMD5(tmpOutput)
|
||||||
|
if err != nil {
|
||||||
|
ch <- buf.String()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
fmt.Fprintf(&buf, "%s %s\n", md5str, output)
|
||||||
|
|
||||||
|
ch <- buf.String()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func calcMD5(f string) (string, error) {
|
||||||
|
r, err := os.Open(f)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
defer r.Close()
|
||||||
|
|
||||||
|
h := md5.New()
|
||||||
|
if _, err := io.Copy(h, r); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Sprintf("%x", h.Sum(nil)), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func convertToWindowsPath(command string) string {
|
||||||
|
if !strings.HasPrefix(command, `/`) {
|
||||||
|
return command
|
||||||
|
}
|
||||||
|
|
||||||
|
command = fmt.Sprintf("%c:%s", command[1], command[2:])
|
||||||
|
return command
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user