build.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "os"
  6. "path/filepath"
  7. "runtime"
  8. "github.com/v2ray/v2ray-core/tools/git"
  9. )
  10. var (
  11. flagTargetOS = flag.String("os", runtime.GOOS, "Target OS of this build.")
  12. flagTargetArch = flag.String("arch", runtime.GOARCH, "Target CPU arch of this build.")
  13. flagArchive = flag.Bool("zip", false, "Whether to make an archive of files or not.")
  14. binPath string
  15. )
  16. func createTargetDirectory(version string, goOS GoOS, goArch GoArch) (string, error) {
  17. suffix := getSuffix(goOS, goArch)
  18. targetDir := filepath.Join(binPath, "v2ray-"+version+suffix)
  19. if version != "custom" {
  20. os.RemoveAll(targetDir)
  21. }
  22. err := os.MkdirAll(targetDir, os.ModeDir|0777)
  23. return targetDir, err
  24. }
  25. func getTargetFile(goOS GoOS) string {
  26. suffix := ""
  27. if goOS == Windows {
  28. suffix += ".exe"
  29. }
  30. return "v2ray" + suffix
  31. }
  32. func getBinPath() string {
  33. GOPATH := os.Getenv("GOPATH")
  34. return filepath.Join(GOPATH, "bin")
  35. }
  36. func main() {
  37. flag.Parse()
  38. binPath = getBinPath()
  39. build(*flagTargetOS, *flagTargetArch, *flagArchive, "")
  40. }
  41. func build(targetOS, targetArch string, archive bool, version string) {
  42. v2rayOS := parseOS(targetOS)
  43. v2rayArch := parseArch(targetArch)
  44. if len(version) == 0 {
  45. v, err := git.RepoVersionHead()
  46. if v == git.VersionUndefined {
  47. v = "custom"
  48. }
  49. if err != nil {
  50. fmt.Println("Unable to detect V2Ray version: " + err.Error())
  51. return
  52. }
  53. version = v
  54. }
  55. fmt.Printf("Building V2Ray (%s) for %s %s\n", version, v2rayOS, v2rayArch)
  56. targetDir, err := createTargetDirectory(version, v2rayOS, v2rayArch)
  57. if err != nil {
  58. fmt.Println("Unable to create directory " + targetDir + ": " + err.Error())
  59. }
  60. targetFile := getTargetFile(v2rayOS)
  61. err = buildV2Ray(filepath.Join(targetDir, targetFile), version, v2rayOS, v2rayArch)
  62. if err != nil {
  63. fmt.Println("Unable to build V2Ray: " + err.Error())
  64. }
  65. err = copyConfigFiles(targetDir, v2rayOS)
  66. if err != nil {
  67. fmt.Println("Unable to copy config files: " + err.Error())
  68. }
  69. if archive {
  70. err := os.Chdir(binPath)
  71. if err != nil {
  72. fmt.Printf("Unable to switch to directory (%s): %v\n", binPath, err)
  73. }
  74. suffix := getSuffix(v2rayOS, v2rayArch)
  75. zipFile := "v2ray" + suffix + ".zip"
  76. root := filepath.Base(targetDir)
  77. err = zipFolder(root, zipFile)
  78. if err != nil {
  79. fmt.Println("Unable to create archive (%s): %v\n", zipFile, err)
  80. }
  81. }
  82. }