diff options
Diffstat (limited to 'recipes-devtools/go-cross/files/ccache.patch')
-rw-r--r-- | recipes-devtools/go-cross/files/ccache.patch | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/recipes-devtools/go-cross/files/ccache.patch b/recipes-devtools/go-cross/files/ccache.patch new file mode 100644 index 00000000..b7a64bf7 --- /dev/null +++ b/recipes-devtools/go-cross/files/ccache.patch | |||
@@ -0,0 +1,147 @@ | |||
1 | golang doesn't work with ccache. In the current state, a lot of parsing | ||
2 | happens where it'll grab the first string in CC or LD and uses that for | ||
3 | its builds. When ccache is enabled, it results in trying to do builds | ||
4 | with just ccache. | ||
5 | |||
6 | The brokeness is seen when building with apps that uses cgo, like docker. | ||
7 | To enable ccache to work, some string comparisons and changes to parsing | ||
8 | had to be made. | ||
9 | |||
10 | Signed-off-by: Amy Fong <amy.fong@windriver.com> | ||
11 | |||
12 | Index: go/src/cmd/cgo/gcc.go | ||
13 | =================================================================== | ||
14 | --- go.orig/src/cmd/cgo/gcc.go 2014-06-18 17:26:26.000000000 -0700 | ||
15 | +++ go/src/cmd/cgo/gcc.go 2015-06-18 13:19:08.908877160 -0700 | ||
16 | @@ -712,6 +712,12 @@ | ||
17 | func (p *Package) gccBaseCmd() []string { | ||
18 | // Use $CC if set, since that's what the build uses. | ||
19 | if ret := strings.Fields(os.Getenv("CC")); len(ret) > 0 { | ||
20 | + if strings.Contains(ret[0], "ccache") { | ||
21 | + base_cc := ret[0] + " " + ret[1] | ||
22 | + os.Setenv("CCACHE_CC", ret[1]) | ||
23 | + ret[1] = base_cc | ||
24 | + return ret[1:] | ||
25 | + } | ||
26 | return ret | ||
27 | } | ||
28 | // Try $GCC if set, since that's what we used to use. | ||
29 | Index: go/src/pkg/os/exec/lp_unix.go | ||
30 | =================================================================== | ||
31 | --- go.orig/src/pkg/os/exec/lp_unix.go 2014-06-18 17:26:25.000000000 -0700 | ||
32 | +++ go/src/pkg/os/exec/lp_unix.go 2015-06-18 13:19:29.464876331 -0700 | ||
33 | @@ -35,8 +35,14 @@ | ||
34 | // (only bypass the path if file begins with / or ./ or ../) | ||
35 | // but that would not match all the Unix shells. | ||
36 | |||
37 | - if strings.Contains(file, "/") { | ||
38 | - err := findExecutable(file) | ||
39 | + tmp := file | ||
40 | + if strings.Contains(file, " ") { | ||
41 | + exec_part := strings.Split(file, " ")[0] | ||
42 | + tmp = exec_part | ||
43 | + } | ||
44 | + | ||
45 | + if strings.Contains(tmp, "/") { | ||
46 | + err := findExecutable(tmp) | ||
47 | if err == nil { | ||
48 | return file, nil | ||
49 | } | ||
50 | @@ -51,7 +57,7 @@ | ||
51 | // Unix shell semantics: path element "" means "." | ||
52 | dir = "." | ||
53 | } | ||
54 | - path := dir + "/" + file | ||
55 | + path := dir + "/" + tmp | ||
56 | if err := findExecutable(path); err == nil { | ||
57 | return path, nil | ||
58 | } | ||
59 | Index: go/src/cmd/go/build.go | ||
60 | =================================================================== | ||
61 | --- go.orig/src/cmd/go/build.go 2014-06-18 17:26:26.000000000 -0700 | ||
62 | +++ go/src/cmd/go/build.go 2015-06-18 13:20:08.724874749 -0700 | ||
63 | @@ -2005,8 +2005,15 @@ | ||
64 | // strings returned are "gcc", "-I", objdir (and cuts them off). | ||
65 | |||
66 | compiler := envList(envvar, defcmd) | ||
67 | - a := []string{compiler[0], "-I", objdir} | ||
68 | - a = append(a, compiler[1:]...) | ||
69 | + | ||
70 | + a := []string{compiler[0]} | ||
71 | + if strings.Contains(compiler[0], "ccache") { | ||
72 | + a = append(a, compiler[1], "-I", objdir) | ||
73 | + a = append(a, compiler[2:]...) | ||
74 | + } else { | ||
75 | + a = append(a, "-I", objdir) | ||
76 | + a = append(a, compiler[1:]...) | ||
77 | + } | ||
78 | |||
79 | // Definitely want -fPIC but on Windows gcc complains | ||
80 | // "-fPIC ignored for target (all code is position independent)" | ||
81 | Index: go/src/cmd/ld/lib.c | ||
82 | =================================================================== | ||
83 | --- go.orig/src/cmd/ld/lib.c 2014-06-18 17:26:27.000000000 -0700 | ||
84 | +++ go/src/cmd/ld/lib.c 2015-06-18 13:18:39.564878343 -0700 | ||
85 | @@ -552,7 +552,7 @@ | ||
86 | void | ||
87 | hostlink(void) | ||
88 | { | ||
89 | - char *p, **argv; | ||
90 | + char *p, *q, **argv; | ||
91 | int c, i, w, n, argc, len; | ||
92 | Hostobj *h; | ||
93 | Biobuf *f; | ||
94 | @@ -577,6 +577,19 @@ | ||
95 | if(extld == nil) | ||
96 | extld = "gcc"; | ||
97 | argv[argc++] = extld; | ||
98 | + | ||
99 | + p = extldflags; | ||
100 | + if (strstr(argv[0], "ccache") != NULL) { | ||
101 | + while(p != nil) { | ||
102 | + while(*p == ' ') | ||
103 | + *p++ = '\0'; | ||
104 | + if(*p == '\0') | ||
105 | + break; | ||
106 | + argv[argc++] = p; | ||
107 | + p = strchr(p + 1, ' '); | ||
108 | + break; | ||
109 | + } | ||
110 | + } | ||
111 | switch(thechar){ | ||
112 | case '8': | ||
113 | argv[argc++] = "-m32"; | ||
114 | @@ -629,12 +642,12 @@ | ||
115 | errorexit(); | ||
116 | } | ||
117 | Bseek(f, h->off, 0); | ||
118 | - p = smprint("%s/%06d.o", tmpdir, i); | ||
119 | - argv[argc++] = p; | ||
120 | - w = create(p, 1, 0775); | ||
121 | + q = smprint("%s/%06d.o", tmpdir, i); | ||
122 | + argv[argc++] = q; | ||
123 | + w = create(q, 1, 0775); | ||
124 | if(w < 0) { | ||
125 | ctxt->cursym = S; | ||
126 | - diag("cannot create %s: %r", p); | ||
127 | + diag("cannot create %s: %r", q); | ||
128 | errorexit(); | ||
129 | } | ||
130 | len = h->len; | ||
131 | @@ -646,7 +659,7 @@ | ||
132 | } | ||
133 | if(close(w) < 0) { | ||
134 | ctxt->cursym = S; | ||
135 | - diag("cannot write %s: %r", p); | ||
136 | + diag("cannot write %s: %r", q); | ||
137 | errorexit(); | ||
138 | } | ||
139 | Bterm(f); | ||
140 | @@ -656,7 +669,6 @@ | ||
141 | for(i=0; i<nldflag; i++) | ||
142 | argv[argc++] = ldflag[i]; | ||
143 | |||
144 | - p = extldflags; | ||
145 | while(p != nil) { | ||
146 | while(*p == ' ') | ||
147 | *p++ = '\0'; | ||