| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package main |
| |
| // deps_generator.go implements the main function of the deps generator. |
| // The deps generator generates .d files. The syntax is that which is used to |
| // specify dependencies in makefiles. |
| |
| import ( |
| "log" |
| "os" |
| "path" |
| "path/filepath" |
| |
| "mojom/generators/common" |
| ) |
| |
| func main() { |
| log.SetFlags(0) |
| config := common.GetCliConfig(os.Args) |
| common.GenerateOutput(WriteDepsFile, config) |
| } |
| |
| // WriteDepsFile writes a .d file for the specified file. |
| func WriteDepsFile(fileName string, config common.GeneratorConfig) { |
| writer := common.OutputWriterByFilePath(fileName, config, ".d") |
| dFileName := fileName[:len(fileName)-len(filepath.Ext(fileName))] + ".d" |
| writer.WriteString(path.Base(dFileName)) |
| writer.WriteString(" : ") |
| |
| imports := GetTransitiveClosure(fileName, config) |
| for _, imported := range imports { |
| writer.WriteString(imported) |
| writer.WriteString(" ") |
| } |
| writer.WriteString("\n") |
| } |
| |
| // GetTransitiveClosure gets the list of transitive imports starting with |
| // rootFile. rootFile itself is not included. |
| // The imports are specified as paths relative to the directory in which |
| // rootFile is found. |
| func GetTransitiveClosure(rootFile string, config common.GeneratorConfig) (result []string) { |
| fileGraph := config.FileGraph() |
| toVisit := []string{rootFile} |
| rootFileDir := path.Dir(rootFile) |
| |
| for len(toVisit) > 0 { |
| curFileName := toVisit[len(toVisit)-1] |
| toVisit = toVisit[1:len(toVisit)] |
| |
| curFile := fileGraph.Files[curFileName] |
| rel, err := filepath.Rel(rootFileDir, curFileName) |
| if err != nil { |
| log.Fatalln(err.Error()) |
| } |
| result = append(result, rel) |
| |
| if curFile.Imports != nil { |
| for _, importFileName := range *curFile.Imports { |
| toVisit = append(toVisit, importFileName) |
| } |
| } |
| } |
| return |
| } |