This repository was archived by the owner on Oct 19, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 84
/
Copy pathbuild.go
163 lines (154 loc) · 5.28 KB
/
build.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
//go:build ignore
// 一键编译脚本 `go run build.go`
package main
import (
"os"
"path/filepath"
"runtime"
"strconv"
"strings"
"github.com/ZxwyWebSite/ztool"
)
// 使用前请设置一下编译参数
var (
// 系统-架构-C编译工具
list_os_arch_cc = map[string]map[string]string{
"linux": {
"amd64": `x86_64-linux-gnu-gcc`,
"arm": `arm-linux-gnueabihf-gcc`,
},
"windows": {
"amd64": `/usr/local/x86_64-w64-mingw32-cross/bin/x86_64-w64-mingw32-gcc`,
},
}
// 架构-版本
list_arch_ver = map[string][]string{
"amd64": {`v2`}, //{`v1`, `v2`, `v3`},
"arm": {`7`}, //{`5`, `6`, `7`},
}
)
const (
// 运行参数
args_name = `lx-source` // 程序名称
args_path = `bin/` // 输出目录
args_zpak = true // 打包文件
)
var workDir string
// 编译
func doCompile(v_os, v_arch, v_archv, v_cc string) error {
// 构建 | 目标系统 | 目标架构 | 优化等级 | 不包含调试信息 | 使用外部链接器 | 输出详细操作 | 静态编译 | JSON解释器
// `go build -o bin/$1-$(go env GOOS)-$(go env GOARCH)$(go env GOAMD64)$(go env GOARM) -ldflags "-s -w -linkmode external -extldflags '-v -static'" -tags=jsoniter`
fname := func() string {
name := strings.Join([]string{args_name, v_os, v_arch}, `-`)
var wexe string
if v_os == `windows` {
wexe = `.exe`
}
return ztool.Str_FastConcat(name, v_archv, wexe)
}()
pname := filepath.Clean(ztool.Str_FastConcat(args_path, fname))
cmd := ztool.Str_FastConcat(
`go build -o `, pname,
` -gcflags=-trimpath="`, workDir, `" -asmflags=-trimpath="`, workDir, `" -trimpath -buildvcs=false`,
` -ldflags "-s -w -linkmode external" -tags "go_json"`, // go_json | json(std) | jsoniter | sonic
)
// 输出要执行的命令
ztool.Cmd_FastPrintln(ztool.Str_FastConcat(`执行命令:`, cmd))
// 设置环境&执行编译
envmap := map[string]string{
`GOOS`: v_os,
`GOARCH`: v_arch,
`AR`: `llvm-ar`, // 脚本默认使用Clang的Archiver, 没装llvm请注释掉以使用系统默认值
`CC`: v_cc,
`CGO_ENABLED`: `1`,
ztool.Str_FastConcat(`GO`, strings.ToUpper(v_arch)): v_archv, // GO{ARCH} Eg: GOARM, GOAMD64
}
setenv := func(env map[string]string) error {
var handler ztool.Err_HandleList
for k, v := range env {
handler.Do(func() error {
return os.Setenv(k, v)
})
}
return handler.Err
}
if err := setenv(envmap); err != nil {
return err
}
if err := ztool.Cmd_aSyncExec(cmd); err != nil {
return err
}
// 打包文件
if args_zpak { // DoSomeThing...
if !ztool.Fbj_IsExists(`archieve`) {
os.MkdirAll(filepath.Join(args_path, `archieve`), 0755)
}
if err := ztool.Pak_ZipFile(
pname,
filepath.Join(args_path, `archieve`, ztool.Str_LastBefore(fname, `.`))+`.zip`,
ztool.Pak_ZipConfig{UnPath: true},
); err != nil {
ztool.Cmd_FastPrintln(ztool.Str_FastConcat(`打包["`, pname, `"]出错:`, err.Error()))
} else {
ztool.Cmd_FastPrintln(ztool.Str_FastConcat(`打包["`, pname, `"]完成`))
}
}
return nil
}
func init() {
if runtime.GOOS != `linux` {
ztool.Cmd_FastPrintln("简易脚本,未对Linux以外系统做适配,请复制执行以下命令编译:\ngo build -ldflags \"-s -w\" -tags \"go_json\"\n如无报错则会在本目录生成名为lx-source的可执行文件。")
os.Exit(1)
}
workDir, _ = os.Getwd()
ztool.Cmd_FastPrintln(ztool.Str_FastConcat(`
================================
| Golang 一键编译脚本
| 程序名称:`, args_name, `
| 输出目录:`, args_path, `
| 打包文件:`, strconv.FormatBool(args_zpak), `
================================
`))
}
func main() {
var handler = ztool.Err_NewDefHandleList()
handler.Do(func() error {
// 检测入口函数是否存在
if !ztool.Fbj_IsExists(`main.go`) {
ztool.Cmd_FastPrintln(`入口函数不存在,请在源码根目录运行此程序!`)
return ztool.Err_EsContinue
}
// 检测输出目录是否存在 (已在zTool中增加相关检测)
// if !ztool.Fbj_IsExists(args_path) {
// ztool.Cmd_FastPrintln(ztool.Str_FastConcat(`输出目录 "`, args_path, `" 不存在,尝试创建`))
// return os.MkdirAll(args_path, 0755)
// }
return nil
})
for v_os, v_arch_cc := range list_os_arch_cc {
for v_arch, v_cc := range v_arch_cc {
// 检测CC是否存在
o, e := ztool.Cmd_aWaitExec(ztool.Str_FastConcat(`which `, v_cc))
if !ztool.Fbj_IsExists(v_cc) && (e != nil || o == ``) {
ztool.Cmd_FastPrintln(ztool.Str_FastConcat(`编译工具 ["`, v_cc, `"] 不存在,跳过 `, v_arch, ` 架构`))
continue
}
// 继续编译
for _, v_arch_ver := range list_arch_ver[v_arch] {
// handler.Do(func() error { return tool.ErrContinue })
handler.Do(func() error {
// (测试) 快速输出编译参数
ztool.Cmd_FastPrintln(ztool.Str_FastConcat(`开始编译:`, v_os, `/`, v_arch, `/`, v_arch_ver, `/`, `[`, v_cc, `], 任务编号 `, handler.NumStr()))
// 编译对应文件
// return nil
return doCompile(v_os, v_arch, v_arch_ver, v_cc)
}) // handler.Do(func() error { return doCompile(v_os, v_arch, v_arch_ver, v_cc) })
}
}
}
if res := handler.Result(); res != nil {
ztool.Cmd_FastPrintln(ztool.Str_FastConcat(`发生错误:`, res.Errors()))
return
}
ztool.Cmd_FastPrintln(`恭喜!所有任务成功完成`)
}