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

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

Issue 1349163003: experiment/fiddle (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: 2015-12-01 (Tuesday) 15:05:27 EST 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_main.cpp ('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 "io"
25 "io/ioutil"
26 "os"
27 "os/exec"
28 "path"
29 "path/filepath"
30 "strings"
31 "syscall"
32
33 "github.com/skia-dev/glog"
34 )
35
36 func setResourceLimits() {
37 const maximumTimeInSeconds = 5
38 limit := syscall.Rlimit{maximumTimeInSeconds, maximumTimeInSeconds}
39 if err := syscall.Setrlimit(syscall.RLIMIT_CPU, &limit); err != nil {
40 glog.Fatalf("syscall.Setrlimit(RLIMIT_CPU) error: %v", err)
jcgregorio 2015/12/02 15:54:34 glog.Fatal should really be restricted to being ca
hal.canary 2015/12/02 22:34:39 done
41 }
42 const maximumMemoryInBytes = 1 << 28
43 limit = syscall.Rlimit{maximumMemoryInBytes, maximumMemoryInBytes}
44 if err := syscall.Setrlimit(syscall.RLIMIT_AS, &limit); err != nil {
45 glog.Fatalf("syscall.Setrlimit(RLIMIT_AS) error: %v", err)
46 }
47 }
48
49 func trimmedBasePath(fpath string) string {
50 basename := path.Base(fpath)
51 return strings.TrimSuffix(basename, path.Ext(basename))
52 }
53
54 func absPath(path string) string {
55 abspath, err := filepath.Abs(path)
56 if err != nil {
57 glog.Fatalf("filepath.Abs(%s) failed: %v", path, err)
58 }
59 return abspath
60 }
61
62 func closeme(closer io.Closer) {
63 err := closer.Close()
64 if err != nil {
65 glog.Fatalf("Close() failed: %v", err)
66 }
67 }
68
69 // runs command and logs a fatal error if it fails. If there is no
70 // error, all output is discarded.
71 func execCommand(input io.Reader, dir string, name string, arg ...string) {
72 var buffer bytes.Buffer
73 cmd := exec.Command(name, arg...)
74 cmd.Dir = dir
75 cmd.Stdout = &buffer
76 cmd.Stderr = &buffer
77 cmd.Stdin = input
78 if err := cmd.Run(); err != nil {
79 glog.Fatalf("command failed:\n%v\n%s\n[%v]", cmd.Args, buffer.St ring(), err)
80 }
81 }
82
83 func compileArgs(skiaSrc string) string {
84 return "@" + path.Join(skiaSrc, "cmake", "skia_compile_arguments.txt")
85 }
86
87 func linkArgs(skiaSrc string) string {
88 return "@" + path.Join(skiaSrc, "cmake", "skia_link_arguments.txt")
89 }
90
91 // Compile the input
jcgregorio 2015/12/02 15:54:34 Comments begin with the name of the thing being co
hal.canary 2015/12/02 22:34:40 done
92 // @param skiaSrc: the base directory of the Skia repository.
93 func fiddler(skiaSrc string, inputReader io.Reader, output io.Writer) {
94 tempDir, err := ioutil.TempDir("", "fiddle_")
95 if err != nil {
96 glog.Fatalf("ioutil.TempDir() failed: %v", err)
97 }
98 defer func() {
99 err = os.RemoveAll(tempDir)
100 if err != nil {
101 glog.Fatalf("os.RemoveAll(tempDir) failed: %v", err)
102 }
103 }()
104 binarypath := path.Join(tempDir, "fiddle")
105 fiddle_dir := path.Join(skiaSrc, "experimental", "fiddle")
106 execCommand(inputReader, fiddle_dir,
107 "c++",
108 compileArgs(skiaSrc),
109 "-I", fiddle_dir,
110 "-o", binarypath,
111 "-x", "c++", "-", "-x", "none",
112 "fiddle_main.o",
113 "-lOSMesa",
114 linkArgs(skiaSrc))
115 var buffer bytes.Buffer
116 runCmd := exec.Cmd{Path: binarypath, Stdout: output, Stderr: &buffer}
117 if err := runCmd.Run(); err != nil {
118 glog.Fatalf("execution failed:\n\n%s\n[%v]", buffer.String(), er r)
119 }
120 }
121
122 // Compile Skia library and fiddle_main.cpp
123 // @param skiaSrc: the base directory of the Skia repository.
124 func fiddlerPrerequisites(skiaSrc string) {
125 cmakeDir := path.Join(skiaSrc, "cmake")
126 execCommand(nil, cmakeDir, "cmake", "-G", "Ninja", ".")
127 execCommand(nil, cmakeDir, "ninja", "skia")
128 fiddle_dir := path.Join(skiaSrc, "experimental", "fiddle")
129 execCommand(nil, fiddle_dir, "c++", compileArgs(skiaSrc), "fiddle_main.h ")
130 execCommand(nil, fiddle_dir, "c++", compileArgs(skiaSrc),
131 "-c", "-o", "fiddle_main.o", "fiddle_main.cpp")
132 }
133
134 func main() {
135 if len(os.Args) < 2 {
136 glog.Fatalf("usage: %s SKIA_SRC_PATH [PATH_TO_DRAW.CPP]", os.Arg s[0])
137 }
138 skiaSrc := os.Args[1]
139 if len(os.Args) < 3 {
140 // execCommand(nil, skiaSrc, "git", "fetch")
141 // execCommand(nil, skiaSrc, "git", "checkout", "origin/master")
142 fiddlerPrerequisites(skiaSrc)
143 } else {
144 setResourceLimits()
145 if os.Args[2] == "-" {
146 fiddler(skiaSrc, os.Stdin, os.Stdout)
147 } else {
148 inputFile, err := os.Open(os.Args[2])
149 if err != nil {
150 glog.Fatalf("unable to open \"%s\": %v", os.Args [2], err)
151 }
152 defer closeme(inputFile)
153 fiddler(skiaSrc, inputFile, os.Stdout)
154 }
155 }
156 }
OLDNEW
« no previous file with comments | « experimental/fiddle/fiddle_main.cpp ('k') | experimental/fiddle/parse-fiddle-output » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698