Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(85)

Side by Side Diff: experimental/fiddle/fiddler.go

Issue 1349163003: experiment/fiddle (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: changes for jcgregorio@ Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « experimental/fiddle/fiddle_test ('k') | experimental/fiddle/parse-fiddle-output » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7 package main
8
9 // Example use:
10 // git clone https://skia.googlesource.com/skia.git
11 // cd skia
12 // SKIA=$PWD
13 // cd experimental/fiddle
14 // go build fiddler.go
15 // # compile prerequisites
16 // ./fiddler "$SKIA"
17 // # compile and run a fiddle
18 // ./fiddler "$SKIA" draw.cpp | ./parse-fiddle-output
19 // # compile and run a different fiddle
20 // ./fiddler "$SKIA" ANOTHER_FIDDLE.cpp | ./parse-fiddle-output
21
22 import (
23 "bytes"
24 "fmt"
25 "io"
26 "io/ioutil"
27 "os"
28 "os/exec"
29 "path"
30 "syscall"
31
32 "github.com/skia-dev/glog"
33 )
34
35 func setResourceLimits() error {
36 const maximumTimeInSeconds = 5
37 limit := syscall.Rlimit{maximumTimeInSeconds, maximumTimeInSeconds}
38 if err := syscall.Setrlimit(syscall.RLIMIT_CPU, &limit); err != nil {
39 return err
40 }
41 const maximumMemoryInBytes = 1 << 28
42 limit = syscall.Rlimit{maximumMemoryInBytes, maximumMemoryInBytes}
43 return syscall.Setrlimit(syscall.RLIMIT_AS, &limit)
44 }
45
46 // execCommand runs command and returns an error if it fails. If there is no
47 // error, all output is discarded.
48 func execCommand(input io.Reader, dir string, name string, arg ...string) error {
49 var buffer bytes.Buffer
50 cmd := exec.Command(name, arg...)
51 cmd.Dir = dir
52 cmd.Stdout = &buffer
53 cmd.Stderr = &buffer
54 cmd.Stdin = input
55 if err := cmd.Run(); err != nil {
56 return fmt.Errorf("execution failed:\n\n%s\n[%v]", buffer.String (), err)
57 }
58 return nil
59 }
60
61 func compileArgs(skiaSrc string) string {
62 return "@" + path.Join(skiaSrc, "cmake", "skia_compile_arguments.txt")
63 }
64
65 func linkArgs(skiaSrc string) string {
66 return "@" + path.Join(skiaSrc, "cmake", "skia_link_arguments.txt")
67 }
68
69 // fiddler compiles the input, links against skia, and runs the executable.
70 // @param skiaSrc: the base directory of the Skia repository
71 // @param inputReader: C++ fiddle source
72 // @param output: stdout of executable sent here
73 // @param tempDir: where to place the compiled executable
74 func fiddler(skiaSrc string, inputReader io.Reader, output io.Writer, tempDir st ring) error {
75 binarypath := path.Join(tempDir, "fiddle")
76 fiddle_dir := path.Join(skiaSrc, "experimental", "fiddle")
77 if err := execCommand(inputReader, fiddle_dir,
78 "c++",
79 compileArgs(skiaSrc),
80 "-I", fiddle_dir,
81 "-o", binarypath,
82 "-x", "c++", "-", "-x", "none",
83 "fiddle_main.o",
84 "-lOSMesa",
85 linkArgs(skiaSrc),
86 ); err != nil {
87 return err
88 }
89 var buffer bytes.Buffer
90 runCmd := exec.Cmd{Path: binarypath, Stdout: output, Stderr: &buffer}
91 if err := runCmd.Run(); err != nil {
92 return fmt.Errorf("execution failed:\n\n%s\n[%v]", buffer.String (), err)
93 }
94 return nil
95 }
96
97 // Compile Skia library and fiddle_main.cpp
98 // @param skiaSrc: the base directory of the Skia repository.
99 func fiddlerPrerequisites(skiaSrc string) error {
100 cmakeDir := path.Join(skiaSrc, "cmake")
101 if err := execCommand(nil, cmakeDir, "cmake", "-G", "Ninja", "."); err ! = nil {
102 return err
103 }
104 if err := execCommand(nil, cmakeDir, "ninja", "skia"); err != nil {
105 return err
106 }
107 fiddle_dir := path.Join(skiaSrc, "experimental", "fiddle")
108 if err := execCommand(nil, fiddle_dir, "c++", compileArgs(skiaSrc),
109 "fiddle_main.h"); err != nil {
110 return err
111 }
112 return execCommand(nil, fiddle_dir, "c++", compileArgs(skiaSrc),
113 "-c", "-o", "fiddle_main.o", "fiddle_main.cpp")
114 }
115
116 func main() {
117 if len(os.Args) < 2 {
118 glog.Fatalf("usage: %s SKIA_SRC_PATH [PATH_TO_DRAW.CPP]", os.Arg s[0])
119 }
120 skiaSrc := os.Args[1]
121 if len(os.Args) < 3 {
122 // execCommand(nil, skiaSrc, "git", "fetch")
123 // execCommand(nil, skiaSrc, "git", "checkout", "origin/master")
124 if err := fiddlerPrerequisites(skiaSrc); err != nil {
125 glog.Fatal(err)
126 }
127 } else {
128 if err := setResourceLimits(); err != nil {
129 glog.Fatal(err)
130 }
131 tempDir, err := ioutil.TempDir("", "fiddle_")
132 if err != nil {
133 glog.Fatal(err)
134 }
135 defer func() {
136 err = os.RemoveAll(tempDir)
137 if err != nil {
138 glog.Fatalf("os.RemoveAll(tempDir) failed: %v", err)
139 }
140 }()
141 if os.Args[2] == "-" {
142 if err := fiddler(skiaSrc, os.Stdin, os.Stdout, tempDir) ; err != nil {
143 glog.Fatal(err)
144 }
145 } else {
146 inputFile, err := os.Open(os.Args[2])
147 if err != nil {
148 glog.Fatalf("unable to open \"%s\": %v", os.Args [2], err)
149 }
150 defer func(closer io.Closer) {
jcgregorio 2015/12/10 14:44:57 util.Close(inputFile)
151 err := closer.Close()
152 if err != nil {
153 glog.Fatalf("Close() failed: %v", err)
154 }
155 }(inputFile)
156 if err = fiddler(skiaSrc, inputFile, os.Stdout, tempDir) ; err != nil {
157 glog.Fatal(err)
158 }
159 }
160 }
161 }
OLDNEW
« no previous file with comments | « experimental/fiddle/fiddle_test ('k') | experimental/fiddle/parse-fiddle-output » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698