func main() { flag.Parse() if *outputDir == "" { log.Fatal("You must provide a non-empty --output_dir") } ext := golang.Extractor{ BuildContext: bc, Corpus: *corpus, LocalPath: *localPath, } if cleanup, err := setupCampfire(&ext); err != nil { log.Fatalf("Error enabling campfire support: %v", err) } else { defer cleanup() } locate := ext.Locate if *byDir { locate = ext.ImportDir } for _, path := range flag.Args() { pkg, err := locate(path) if err == nil { maybeLog("Found %q in %s", pkg.Path, pkg.BuildPackage.Dir) } else { maybeFatal("Error locating %q: %v", path, err) } } if err := ext.Extract(); err != nil { maybeFatal("Error in extraction: %v", err) } pack, err := indexpack.CreateOrOpen(context.Background(), *outputDir, indexpack.UnitType((*apb.CompilationUnit)(nil))) if err != nil { log.Fatalf("Unable to open %q: %v", *outputDir, err) } maybeLog("Writing %d package(s) to %q", len(ext.Packages), pack.Root()) for _, pkg := range ext.Packages { maybeLog("Package %q:\n\t// %s", pkg.Path, pkg.BuildPackage.Doc) uf, err := pkg.Store(context.Background(), pack) if err != nil { maybeFatal("Error writing %q: %v", pkg.Path, err) } else { maybeLog("Output: %v\n", strings.Join(uf, ", ")) } } }
// setupCampfire modifies the build configurations to support the Kythe // campfire build environment. It adds entries to GOPATH for generated files // in campfire-out and third_party packages, and the working directory so that // "kythe/..." import paths will work. // // On success, returns a function to clean up leftover state, which the caller // should defer so it occurs before exit. func setupCampfire(ext *golang.Extractor) (func(), error) { if !*campfireMode { return func() {}, nil } maybeLog("Enabling campfire compatibility mode") tp, err := ioutil.ReadDir("third_party/go") if err != nil { return nil, err } goPath := os.ExpandEnv(":$PWD:campfire-out/gen/go") for _, elt := range tp { if elt.IsDir() { goPath += filepath.Join(":third_party/go", elt.Name()) } } ext.BuildContext.GOPATH += goPath ext.AltInstallPath = "campfire-out/go" if err := os.Symlink(".", "src"); err != nil { if os.IsExist(err) { return func() {}, nil } return nil, err } return func() { os.Remove("src") }, nil }