You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

common.go 2.6 kB

11 months ago
11 months ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package magefiles
  2. import (
  3. "errors"
  4. "fmt"
  5. "os"
  6. "path/filepath"
  7. "strings"
  8. "github.com/magefile/mage/sh"
  9. cp "github.com/otiai10/copy"
  10. )
  11. var Global = struct {
  12. OS string
  13. Arch string
  14. BuildRoot string
  15. Debug bool
  16. }{
  17. Arch: "amd64",
  18. }
  19. type BuildArgs struct {
  20. OutputName string
  21. OutputDir string
  22. AssetsDir string
  23. EntryFile string
  24. }
  25. type goBuildArgs struct {
  26. Env map[string]string
  27. OutputExt string
  28. }
  29. func Build(args BuildArgs) error {
  30. buildRoot := Global.BuildRoot
  31. if buildRoot == "" {
  32. buildRoot = "build"
  33. }
  34. fullOutputDir, err := filepath.Abs(filepath.Join(buildRoot, args.OutputDir))
  35. if err != nil {
  36. return err
  37. }
  38. goBuildArgs, err := makeGoBuildArgs()
  39. if err != nil {
  40. return err
  41. }
  42. binPath := filepath.Join(fullOutputDir, args.OutputName+goBuildArgs.OutputExt)
  43. fmt.Printf("building to %s\n", binPath)
  44. goCmdArgs := []string{"build"}
  45. if Global.Debug {
  46. goCmdArgs = append(goCmdArgs, "-gcflags", "all=-N -l")
  47. }
  48. goCmdArgs = append(goCmdArgs, "-o", binPath)
  49. if args.EntryFile != "" {
  50. goCmdArgs = append(goCmdArgs, args.EntryFile)
  51. }
  52. err = sh.RunWith(goBuildArgs.Env, "go", goCmdArgs...)
  53. if err != nil {
  54. return err
  55. }
  56. if args.AssetsDir != "" {
  57. outputAssetsPath := fullOutputDir
  58. fmt.Printf("copying asset to %s\n", outputAssetsPath)
  59. return CopyAssets(args.AssetsDir, outputAssetsPath)
  60. }
  61. return nil
  62. }
  63. func makeGoBuildArgs() (goBuildArgs, error) {
  64. args := goBuildArgs{
  65. Env: make(map[string]string),
  66. }
  67. if Global.OS == "win" {
  68. args.OutputExt = ".exe"
  69. args.Env["CGO_ENABLED"] = "0"
  70. args.Env["GOOS"] = "windows"
  71. } else if Global.OS == "linux" {
  72. args.OutputExt = ""
  73. args.Env["CGO_ENABLED"] = "0"
  74. args.Env["GOOS"] = "linux"
  75. } else if Global.OS != "" {
  76. return goBuildArgs{}, fmt.Errorf("unknow os type: %s", Global.OS)
  77. }
  78. if Global.Arch == "amd64" {
  79. args.Env["GOARCH"] = "amd64"
  80. } else if Global.Arch == "arm64" {
  81. args.Env["GOARCH"] = "arm64"
  82. } else if Global.Arch != "" {
  83. return goBuildArgs{}, fmt.Errorf("unknow arch type: %s", Global.Arch)
  84. }
  85. var pltParts []string
  86. if Global.OS != "" {
  87. pltParts = append(pltParts, Global.OS)
  88. }
  89. if Global.Arch != "" {
  90. pltParts = append(pltParts, Global.Arch)
  91. }
  92. if len(pltParts) == 0 {
  93. fmt.Print("building platform is not set, will build for current machine.\n")
  94. } else {
  95. fmt.Printf("building for %s.\n", strings.Join(pltParts, "-"))
  96. }
  97. return args, nil
  98. }
  99. func CopyAssets(assrtDir string, targetDir string) error {
  100. info, err := os.Stat(assrtDir)
  101. if errors.Is(err, os.ErrNotExist) || !info.IsDir() {
  102. return nil
  103. }
  104. return cp.Copy(assrtDir, targetDir)
  105. }