build.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "os"
  6. "path/filepath"
  7. "runtime"
  8. )
  9. var (
  10. flagTargetDir = flag.String("dir", "", "Directory to put generated files.")
  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. flagMetadataFile = flag.String("metadata", "metadata.txt", "File to store metadata info of released packages.")
  15. flagSignBinary = flag.Bool("sign", false, "Whether or not to sign the binaries.")
  16. binPath string
  17. )
  18. func createTargetDirectory(version string, goOS GoOS, goArch GoArch) (string, error) {
  19. var targetDir string
  20. if len(*flagTargetDir) > 0 {
  21. targetDir = *flagTargetDir
  22. } else {
  23. suffix := getSuffix(goOS, goArch)
  24. targetDir = filepath.Join(binPath, "v2ray-"+version+suffix)
  25. if version != "custom" {
  26. os.RemoveAll(targetDir)
  27. }
  28. }
  29. err := os.MkdirAll(targetDir, os.ModeDir|0777)
  30. return targetDir, err
  31. }
  32. func getTargetFile(goOS GoOS) string {
  33. suffix := ""
  34. if goOS == Windows {
  35. suffix += ".exe"
  36. }
  37. return "v2ray" + suffix
  38. }
  39. func getBinPath() string {
  40. GOPATH := os.Getenv("GOPATH")
  41. return filepath.Join(GOPATH, "bin")
  42. }
  43. func main() {
  44. flag.Parse()
  45. binPath = getBinPath()
  46. build(*flagTargetOS, *flagTargetArch, *flagArchive, "", *flagMetadataFile)
  47. }
  48. func build(targetOS, targetArch string, archive bool, version string, metadataFile string) {
  49. v2rayOS := parseOS(targetOS)
  50. v2rayArch := parseArch(targetArch)
  51. if len(version) == 0 {
  52. version = os.Getenv("TRAVIS_TAG")
  53. }
  54. if len(version) == 0 {
  55. version = "custom"
  56. }
  57. fmt.Printf("Building V2Ray (%s) for %s %s\n", version, v2rayOS, v2rayArch)
  58. targetDir, err := createTargetDirectory(version, v2rayOS, v2rayArch)
  59. if err != nil {
  60. fmt.Println("Unable to create directory " + targetDir + ": " + err.Error())
  61. }
  62. targetFile := getTargetFile(v2rayOS)
  63. targetFileFull := filepath.Join(targetDir, targetFile)
  64. err = buildV2Ray(targetFileFull, version, v2rayOS, v2rayArch, "")
  65. if err != nil {
  66. fmt.Println("Unable to build V2Ray: " + err.Error())
  67. }
  68. if v2rayOS == Windows {
  69. err = buildV2Ray(filepath.Join(targetDir, "w"+targetFile), version, v2rayOS, v2rayArch, "-H windowsgui")
  70. if err != nil {
  71. fmt.Println("Unable to build V2Ray no console: " + err.Error())
  72. }
  73. }
  74. if *flagSignBinary {
  75. err := signFile(targetFileFull)
  76. if err != nil {
  77. fmt.Println("Unable to sign V2Ray binary: " + err.Error())
  78. }
  79. if v2rayOS == Windows {
  80. err = signFile(filepath.Join(targetDir, "w"+targetFile))
  81. if err != nil {
  82. fmt.Println("Unable to sign V2Ray no console: " + err.Error())
  83. }
  84. }
  85. }
  86. err = copyConfigFiles(targetDir, v2rayOS)
  87. if err != nil {
  88. fmt.Println("Unable to copy config files: " + err.Error())
  89. }
  90. if archive {
  91. err := os.Chdir(binPath)
  92. if err != nil {
  93. fmt.Printf("Unable to switch to directory (%s): %v\n", binPath, err)
  94. }
  95. suffix := getSuffix(v2rayOS, v2rayArch)
  96. zipFile := "v2ray" + suffix + ".zip"
  97. root := filepath.Base(targetDir)
  98. err = zipFolder(root, zipFile)
  99. if err != nil {
  100. fmt.Printf("Unable to create archive (%s): %v\n", zipFile, err)
  101. }
  102. metadataWriter, err := os.OpenFile(filepath.Join(binPath, metadataFile), os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600)
  103. if err != nil {
  104. fmt.Printf("Unable to create metadata file (%s): %v\n", metadataFile, err)
  105. }
  106. defer metadataWriter.Close()
  107. err = CalcMetadata(zipFile, metadataWriter)
  108. if err != nil {
  109. fmt.Printf("Failed to calculate metadata for file (%s): %v", zipFile, err)
  110. }
  111. }
  112. }