Implemented ability to scan an additional directory for Java files to include in the jar.

This commit is contained in:
Tyler Sommer
2016-04-11 09:34:41 -06:00
parent 2ea1efcbb0
commit ba1a7e0845

View File

@ -108,6 +108,30 @@ func bindPackages(bindDir, javaDir string, pkgs []*types.Package) ([]string, err
return javaFiles, nil return javaFiles, nil
} }
func addExtraFiles(javaDir, scanDir string) error {
if scanDir == "" {
return nil
}
var files []filePair
filepath.Walk(scanDir+"/", func(path string, info os.FileInfo, walkErr error) error {
if walkErr != nil {
return walkErr
}
if info.IsDir() {
return nil
}
fileName, err := filepath.Rel(scanDir, path)
if err != nil {
return err
}
if strings.HasSuffix(fileName, ".java") {
files = append(files, filePair{filepath.Join(javaDir, fileName), path})
}
return nil
})
return copyFiles(files)
}
func createSupportFiles(bindDir, javaDir, mainFile string) error { func createSupportFiles(bindDir, javaDir, mainFile string) error {
bindPkg, err := build.Import(reflect.TypeOf(bind.ErrorList{}).PkgPath(), "", build.FindOnly) bindPkg, err := build.Import(reflect.TypeOf(bind.ErrorList{}).PkgPath(), "", build.FindOnly)
if err != nil { if err != nil {
@ -164,6 +188,7 @@ func createJar(target, jarDir string) error {
return err return err
} }
w := zip.NewWriter(t) w := zip.NewWriter(t)
fmt.Printf("Building %s\n", target)
if err := filepath.Walk(jarDir, func(path string, info os.FileInfo, walkErr error) error { if err := filepath.Walk(jarDir, func(path string, info os.FileInfo, walkErr error) error {
if walkErr != nil { if walkErr != nil {
return walkErr return walkErr
@ -172,6 +197,7 @@ func createJar(target, jarDir string) error {
return nil return nil
} }
fileName, err := filepath.Rel(jarDir, path) fileName, err := filepath.Rel(jarDir, path)
fmt.Printf("Adding %s\n", fileName)
if err != nil { if err != nil {
return err return err
} }
@ -196,11 +222,11 @@ func createJar(target, jarDir string) error {
if err := t.Close(); err != nil { if err := t.Close(); err != nil {
return err return err
} }
fmt.Println("created", target) fmt.Printf("Finished building %s\n", target)
return nil return nil
} }
func bindToJar(target string, pkgs ...string) error { func bindToJar(target string, scanDir string, pkgs ...string) error {
tmpDir, cleanup, err := initBuild() tmpDir, cleanup, err := initBuild()
if err != nil { if err != nil {
return err return err
@ -227,6 +253,9 @@ func bindToJar(target string, pkgs ...string) error {
if err != nil { if err != nil {
return err return err
} }
if err := addExtraFiles(javaDir, scanDir); err != nil {
return err
}
if err := createSupportFiles(bindDir, javaDir, mainFile); err != nil { if err := createSupportFiles(bindDir, javaDir, mainFile); err != nil {
return err return err
} }
@ -307,23 +336,24 @@ const usage = `gojava is a tool for creating Java bindings to Go
Usage: Usage:
gojava build [-o <jar>] [<pkg1>, [<pkg2>...]] gojava [-o <jar>] [-s <dir>] build [<pkg1>, [<pkg2>...]]
This generates a jar containing Java bindings to the specified Go packages. This generates a jar containing Java bindings to the specified Go packages.
` `
func main() { func main() {
o := flag.String("o", "libgojava.jar", "Path to the generated jar file") o := flag.String("o", "libgojava.jar", "Path to the generated jar file")
s := flag.String("s", "", "Additional path to scan for Java files")
flag.Usage = func() { flag.Usage = func() {
fmt.Fprintln(os.Stderr, usage) fmt.Fprintln(os.Stderr, usage)
flag.PrintDefaults() flag.PrintDefaults()
} }
flag.Parse() flag.Parse()
if len(flag.Args()) < 2 || flag.Args()[0] != "build" { if flag.NArg() < 2 || flag.Args()[0] != "build" {
flag.Usage() flag.Usage()
os.Exit(1) os.Exit(1)
} }
if err := bindToJar(*o, flag.Args()[1:]...); err != nil { if err := bindToJar(*o, *s, flag.Args()[1:]...); err != nil {
fmt.Fprintln(os.Stderr, err) fmt.Fprintln(os.Stderr, err)
os.Exit(1) os.Exit(1)
} }