build.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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. flagMetadataFile = flag.String("metadata", "metadata.txt", "File to store metadata info of released packages.")
  15. binPath string
  16. )
  17. func createTargetDirectory(version string, goOS GoOS, goArch GoArch) (string, error) {
  18. suffix := getSuffix(goOS, goArch)
  19. targetDir := filepath.Join(binPath, "v2ray-"+version+suffix)
  20. if version != "custom" {
  21. os.RemoveAll(targetDir)
  22. }
  23. err := os.MkdirAll(targetDir, os.ModeDir|0777)
  24. return targetDir, err
  25. }
  26. func getTargetFile(goOS GoOS) string {
  27. suffix := ""
  28. if goOS == Windows {
  29. suffix += ".exe"
  30. }
  31. return "v2ray" + suffix
  32. }
  33. func getBinPath() string {
  34. GOPATH := os.Getenv("GOPATH")
  35. return filepath.Join(GOPATH, "bin")
  36. }
  37. func main() {
  38. flag.Parse()
  39. binPath = getBinPath()
  40. build(*flagTargetOS, *flagTargetArch, *flagArchive, "", *flagMetadataFile)
  41. }
  42. func build(targetOS, targetArch string, archive bool, version string, metadataFile string) {
  43. v2rayOS := parseOS(targetOS)
  44. v2rayArch := parseArch(targetArch)
  45. if len(version) == 0 {
  46. v, err := git.RepoVersionHead()
  47. if v == git.VersionUndefined {
  48. v = "custom"
  49. }
  50. if err != nil {
  51. fmt.Println("Unable to detect V2Ray version: " + err.Error())
  52. return
  53. }
  54. version = v
  55. }
  56. fmt.Printf("Building V2Ray (%s) for %s %s\n", version, v2rayOS, v2rayArch)
  57. targetDir, err := createTargetDirectory(version, v2rayOS, v2rayArch)
  58. if err != nil {
  59. fmt.Println("Unable to create directory " + targetDir + ": " + err.Error())
  60. }
  61. targetFile := getTargetFile(v2rayOS)
  62. err = buildV2Ray(filepath.Join(targetDir, targetFile), version, v2rayOS, v2rayArch)
  63. if err != nil {
  64. fmt.Println("Unable to build V2Ray: " + err.Error())
  65. }
  66. err = copyConfigFiles(targetDir, v2rayOS)
  67. if err != nil {
  68. fmt.Println("Unable to copy config files: " + err.Error())
  69. }
  70. if archive {
  71. err := os.Chdir(binPath)
  72. if err != nil {
  73. fmt.Printf("Unable to switch to directory (%s): %v\n", binPath, err)
  74. }
  75. suffix := getSuffix(v2rayOS, v2rayArch)
  76. zipFile := "v2ray" + suffix + ".zip"
  77. root := filepath.Base(targetDir)
  78. err = zipFolder(root, zipFile)
  79. if err != nil {
  80. fmt.Printf("Unable to create archive (%s): %v\n", zipFile, err)
  81. }
  82. metadataWriter, err := os.OpenFile(filepath.Join(binPath, metadataFile), os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600)
  83. if err != nil {
  84. fmt.Printf("Unable to create metadata file (%s): %v\n", metadataFile, err)
  85. }
  86. defer metadataWriter.Close()
  87. err = CalcMetadata(zipFile, metadataWriter)
  88. if err != nil {
  89. fmt.Printf("Failed to calculate metadata for file (%s): %v", zipFile, err)
  90. }
  91. }
  92. }