static void clean(void) { int i, j, k; Buf b, path; Vec dir; binit(&b); binit(&path); vinit(&dir); for(i=0; i<nelem(cleantab); i++) { if((streq(cleantab[i], "cmd/prof")) && !isdir(cleantab[i])) continue; bpathf(&path, "%s/src/%s", goroot, cleantab[i]); xreaddir(&dir, bstr(&path)); // Remove generated files. for(j=0; j<dir.len; j++) { for(k=0; k<nelem(gentab); k++) { if(hasprefix(dir.p[j], gentab[k].nameprefix)) xremove(bpathf(&b, "%s/%s", bstr(&path), dir.p[j])); } } // Remove generated binary named for directory. if(hasprefix(cleantab[i], "cmd/")) xremove(bpathf(&b, "%s/%s", bstr(&path), cleantab[i]+4)); } // remove src/pkg/runtime/z* unconditionally vreset(&dir); bpathf(&path, "%s/src/pkg/runtime", goroot); xreaddir(&dir, bstr(&path)); for(j=0; j<dir.len; j++) { if(hasprefix(dir.p[j], "z")) xremove(bpathf(&b, "%s/%s", bstr(&path), dir.p[j])); } if(rebuildall) { // Remove object tree. xremoveall(bpathf(&b, "%s/pkg/obj/%s_%s", goroot, gohostos, gohostarch)); // Remove installed packages and tools. xremoveall(bpathf(&b, "%s/pkg/%s_%s", goroot, gohostos, gohostarch)); xremoveall(bpathf(&b, "%s/pkg/%s_%s", goroot, goos, goarch)); xremoveall(tooldir); // Remove cached version info. xremove(bpathf(&b, "%s/VERSION.cache", goroot)); } bfree(&b); bfree(&path); vfree(&dir); }
static void clean(void) { int i, j, k; Buf b, path; Vec dir; binit(&b); binit(&path); vinit(&dir); for(i=0; i<nelem(cleantab); i++) { bpathf(&path, "%s/src/%s", goroot, cleantab[i]); xreaddir(&dir, bstr(&path)); // Remove generated files. for(j=0; j<dir.len; j++) { for(k=0; k<nelem(gentab); k++) { if(hasprefix(dir.p[j], gentab[k].nameprefix)) xremove(bpathf(&b, "%s/%s", bstr(&path), dir.p[j])); } } // Remove generated binary named for directory. if(hasprefix(cleantab[i], "cmd/")) xremove(bpathf(&b, "%s/%s", bstr(&path), cleantab[i]+4)); } // remove src/runtime/zaexperiment.h and // except leave zgoos and zgoarch, now maintained with go generate. bpathf(&path, "%s/src/runtime", goroot); for(j=0; j<nelem(runtimegen); j++) xremove(bpathf(&b, "%s/%s", bstr(&path), runtimegen[j])); if(rebuildall) { // Remove object tree. xremoveall(bpathf(&b, "%s/pkg/obj/%s_%s", goroot, gohostos, gohostarch)); // Remove installed packages and tools. xremoveall(bpathf(&b, "%s/pkg/%s_%s", goroot, gohostos, gohostarch)); xremoveall(bpathf(&b, "%s/pkg/%s_%s", goroot, goos, goarch)); xremoveall(tooldir); // Remove cached version info. xremove(bpathf(&b, "%s/VERSION.cache", goroot)); } bfree(&b); bfree(&path); vfree(&dir); }
// rmworkdir deletes the work directory. static void rmworkdir(void) { if(vflag > 1) errprintf("rm -rf %s\n", workdir); xremoveall(workdir); }
// xremoveall removes the file or directory tree rooted at p. void xremoveall(char *p) { int i; Buf b; Vec dir; binit(&b); vinit(&dir); if(isdir(p)) { xreaddir(&dir, p); for(i=0; i<dir.len; i++) { bprintf(&b, "%s/%s", p, dir.p[i]); xremoveall(bstr(&b)); } if(vflag > 2) xprintf("rm %s\n", p); rmdir(p); } else { if(vflag > 2) xprintf("rm %s\n", p); unlink(p); } bfree(&b); vfree(&dir); }
// setup sets up the tree for the initial build. static void setup(void) { int i; Buf b; char *p; binit(&b); // Create bin directory. p = bpathf(&b, "%s/bin", goroot); if(!isdir(p)) xmkdir(p); // Create package directory. p = bpathf(&b, "%s/pkg", goroot); if(!isdir(p)) xmkdir(p); p = bpathf(&b, "%s/pkg/%s_%s", goroot, gohostos, gohostarch); if(rebuildall) xremoveall(p); xmkdirall(p); if(!streq(goos, gohostos) || !streq(goarch, gohostarch)) { p = bpathf(&b, "%s/pkg/%s_%s", goroot, goos, goarch); if(rebuildall) xremoveall(p); xmkdirall(p); } // Create object directory. // We keep it in pkg/ so that all the generated binaries // are in one tree. If pkg/obj/libgc.a exists, it is a dreg from // before we used subdirectories of obj. Delete all of obj // to clean up. bpathf(&b, "%s/pkg/obj/libgc.a", goroot); if(isfile(bstr(&b))) xremoveall(bpathf(&b, "%s/pkg/obj", goroot)); p = bpathf(&b, "%s/pkg/obj/%s_%s", goroot, gohostos, gohostarch); if(rebuildall) xremoveall(p); xmkdirall(p); // Create tool directory. // We keep it in pkg/, just like the object directory above. if(rebuildall) xremoveall(tooldir); xmkdirall(tooldir); // Remove tool binaries from before the tool/gohostos_gohostarch xremoveall(bpathf(&b, "%s/bin/tool", goroot)); // Remove old pre-tool binaries. for(i=0; i<nelem(oldtool); i++) xremove(bpathf(&b, "%s/bin/%s", goroot, oldtool[i])); // If $GOBIN is set and has a Go compiler, it must be cleaned. for(i=0; gochars[i]; i++) { if(isfile(bprintf(&b, "%s%s%c%s", gobin, slash, gochars[i], "g"))) { for(i=0; i<nelem(oldtool); i++) xremove(bprintf(&b, "%s%s%s", gobin, slash, oldtool[i])); break; } } // For release, make sure excluded things are excluded. if(hasprefix(goversion, "release.") || hasprefix(goversion, "go")) { for(i=0; i<nelem(unreleased); i++) if(isdir(bpathf(&b, "%s/%s", goroot, unreleased[i]))) fatal("%s should not exist in release build", bstr(&b)); } bfree(&b); }