Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/build.sh
1532 views
1
appName="alist"
2
builtAt="$(date +'%F %T %z')"
3
gitAuthor="Xhofe <[email protected]>"
4
gitCommit=$(git log --pretty=format:"%h" -1)
5
6
if [ "$1" = "dev" ]; then
7
version="dev"
8
webVersion="dev"
9
elif [ "$1" = "beta" ]; then
10
version="beta"
11
webVersion="dev"
12
else
13
git tag -d beta
14
version=$(git describe --abbrev=0 --tags)
15
webVersion=$(wget -qO- -t1 -T2 "https://api.github.com/repos/alist-org/alist-web/releases/latest" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g')
16
fi
17
18
echo "backend version: $version"
19
echo "frontend version: $webVersion"
20
21
ldflags="\
22
-w -s \
23
-X 'github.com/alist-org/alist/v3/internal/conf.BuiltAt=$builtAt' \
24
-X 'github.com/alist-org/alist/v3/internal/conf.GitAuthor=$gitAuthor' \
25
-X 'github.com/alist-org/alist/v3/internal/conf.GitCommit=$gitCommit' \
26
-X 'github.com/alist-org/alist/v3/internal/conf.Version=$version' \
27
-X 'github.com/alist-org/alist/v3/internal/conf.WebVersion=$webVersion' \
28
"
29
30
FetchWebDev() {
31
curl -L https://codeload.github.com/alist-org/web-dist/tar.gz/refs/heads/dev -o web-dist-dev.tar.gz
32
tar -zxvf web-dist-dev.tar.gz
33
rm -rf public/dist
34
mv -f web-dist-dev/dist public
35
rm -rf web-dist-dev web-dist-dev.tar.gz
36
}
37
38
FetchWebRelease() {
39
curl -L https://github.com/alist-org/alist-web/releases/latest/download/dist.tar.gz -o dist.tar.gz
40
tar -zxvf dist.tar.gz
41
rm -rf public/dist
42
mv -f dist public
43
rm -rf dist.tar.gz
44
}
45
46
BuildWinArm64() {
47
echo building for windows-arm64
48
chmod +x ./wrapper/zcc-arm64
49
chmod +x ./wrapper/zcxx-arm64
50
export GOOS=windows
51
export GOARCH=arm64
52
export CC=$(pwd)/wrapper/zcc-arm64
53
export CXX=$(pwd)/wrapper/zcxx-arm64
54
export CGO_ENABLED=1
55
go build -o "$1" -ldflags="$ldflags" -tags=jsoniter .
56
}
57
58
BuildDev() {
59
rm -rf .git/
60
mkdir -p "dist"
61
muslflags="--extldflags '-static -fpic' $ldflags"
62
BASE="https://musl.nn.ci/"
63
FILES=(x86_64-linux-musl-cross aarch64-linux-musl-cross)
64
for i in "${FILES[@]}"; do
65
url="${BASE}${i}.tgz"
66
curl -L -o "${i}.tgz" "${url}"
67
sudo tar xf "${i}.tgz" --strip-components 1 -C /usr/local
68
done
69
OS_ARCHES=(linux-musl-amd64 linux-musl-arm64)
70
CGO_ARGS=(x86_64-linux-musl-gcc aarch64-linux-musl-gcc)
71
for i in "${!OS_ARCHES[@]}"; do
72
os_arch=${OS_ARCHES[$i]}
73
cgo_cc=${CGO_ARGS[$i]}
74
echo building for ${os_arch}
75
export GOOS=${os_arch%%-*}
76
export GOARCH=${os_arch##*-}
77
export CC=${cgo_cc}
78
export CGO_ENABLED=1
79
go build -o ./dist/$appName-$os_arch -ldflags="$muslflags" -tags=jsoniter .
80
done
81
xgo -targets=windows/amd64,darwin/amd64,darwin/arm64 -out "$appName" -ldflags="$ldflags" -tags=jsoniter .
82
mv alist-* dist
83
cd dist
84
cp ./alist-windows-amd64.exe ./alist-windows-amd64-upx.exe
85
upx -9 ./alist-windows-amd64-upx.exe
86
find . -type f -print0 | xargs -0 md5sum >md5.txt
87
cat md5.txt
88
}
89
90
BuildDocker() {
91
go build -o ./bin/alist -ldflags="$ldflags" -tags=jsoniter .
92
}
93
94
PrepareBuildDockerMusl() {
95
mkdir -p build/musl-libs
96
BASE="https://github.com/go-cross/musl-toolchain-archive/releases/latest/download/"
97
FILES=(x86_64-linux-musl-cross aarch64-linux-musl-cross i486-linux-musl-cross s390x-linux-musl-cross armv6-linux-musleabihf-cross armv7l-linux-musleabihf-cross riscv64-linux-musl-cross powerpc64le-linux-musl-cross)
98
for i in "${FILES[@]}"; do
99
url="${BASE}${i}.tgz"
100
lib_tgz="build/${i}.tgz"
101
curl -L -o "${lib_tgz}" "${url}"
102
tar xf "${lib_tgz}" --strip-components 1 -C build/musl-libs
103
rm -f "${lib_tgz}"
104
done
105
}
106
107
BuildDockerMultiplatform() {
108
go mod download
109
110
# run PrepareBuildDockerMusl before build
111
export PATH=$PATH:$PWD/build/musl-libs/bin
112
113
docker_lflags="--extldflags '-static -fpic' $ldflags"
114
export CGO_ENABLED=1
115
116
OS_ARCHES=(linux-amd64 linux-arm64 linux-386 linux-s390x linux-riscv64 linux-ppc64le)
117
CGO_ARGS=(x86_64-linux-musl-gcc aarch64-linux-musl-gcc i486-linux-musl-gcc s390x-linux-musl-gcc riscv64-linux-musl-gcc powerpc64le-linux-musl-gcc)
118
for i in "${!OS_ARCHES[@]}"; do
119
os_arch=${OS_ARCHES[$i]}
120
cgo_cc=${CGO_ARGS[$i]}
121
os=${os_arch%%-*}
122
arch=${os_arch##*-}
123
export GOOS=$os
124
export GOARCH=$arch
125
export CC=${cgo_cc}
126
echo "building for $os_arch"
127
go build -o build/$os/$arch/alist -ldflags="$docker_lflags" -tags=jsoniter .
128
done
129
130
DOCKER_ARM_ARCHES=(linux-arm/v6 linux-arm/v7)
131
CGO_ARGS=(armv6-linux-musleabihf-gcc armv7l-linux-musleabihf-gcc)
132
GO_ARM=(6 7)
133
export GOOS=linux
134
export GOARCH=arm
135
for i in "${!DOCKER_ARM_ARCHES[@]}"; do
136
docker_arch=${DOCKER_ARM_ARCHES[$i]}
137
cgo_cc=${CGO_ARGS[$i]}
138
export GOARM=${GO_ARM[$i]}
139
export CC=${cgo_cc}
140
echo "building for $docker_arch"
141
go build -o build/${docker_arch%%-*}/${docker_arch##*-}/alist -ldflags="$docker_lflags" -tags=jsoniter .
142
done
143
}
144
145
BuildRelease() {
146
rm -rf .git/
147
mkdir -p "build"
148
BuildWinArm64 ./build/alist-windows-arm64.exe
149
xgo -out "$appName" -ldflags="$ldflags" -tags=jsoniter .
150
# why? Because some target platforms seem to have issues with upx compression
151
upx -9 ./alist-linux-amd64
152
cp ./alist-windows-amd64.exe ./alist-windows-amd64-upx.exe
153
upx -9 ./alist-windows-amd64-upx.exe
154
mv alist-* build
155
}
156
157
BuildReleaseLinuxMusl() {
158
rm -rf .git/
159
mkdir -p "build"
160
muslflags="--extldflags '-static -fpic' $ldflags"
161
BASE="https://musl.nn.ci/"
162
FILES=(x86_64-linux-musl-cross aarch64-linux-musl-cross mips-linux-musl-cross mips64-linux-musl-cross mips64el-linux-musl-cross mipsel-linux-musl-cross powerpc64le-linux-musl-cross s390x-linux-musl-cross)
163
for i in "${FILES[@]}"; do
164
url="${BASE}${i}.tgz"
165
curl -L -o "${i}.tgz" "${url}"
166
sudo tar xf "${i}.tgz" --strip-components 1 -C /usr/local
167
rm -f "${i}.tgz"
168
done
169
OS_ARCHES=(linux-musl-amd64 linux-musl-arm64 linux-musl-mips linux-musl-mips64 linux-musl-mips64le linux-musl-mipsle linux-musl-ppc64le linux-musl-s390x)
170
CGO_ARGS=(x86_64-linux-musl-gcc aarch64-linux-musl-gcc mips-linux-musl-gcc mips64-linux-musl-gcc mips64el-linux-musl-gcc mipsel-linux-musl-gcc powerpc64le-linux-musl-gcc s390x-linux-musl-gcc)
171
for i in "${!OS_ARCHES[@]}"; do
172
os_arch=${OS_ARCHES[$i]}
173
cgo_cc=${CGO_ARGS[$i]}
174
echo building for ${os_arch}
175
export GOOS=${os_arch%%-*}
176
export GOARCH=${os_arch##*-}
177
export CC=${cgo_cc}
178
export CGO_ENABLED=1
179
go build -o ./build/$appName-$os_arch -ldflags="$muslflags" -tags=jsoniter .
180
done
181
}
182
183
BuildReleaseLinuxMuslArm() {
184
rm -rf .git/
185
mkdir -p "build"
186
muslflags="--extldflags '-static -fpic' $ldflags"
187
BASE="https://musl.nn.ci/"
188
# FILES=(arm-linux-musleabi-cross arm-linux-musleabihf-cross armeb-linux-musleabi-cross armeb-linux-musleabihf-cross armel-linux-musleabi-cross armel-linux-musleabihf-cross armv5l-linux-musleabi-cross armv5l-linux-musleabihf-cross armv6-linux-musleabi-cross armv6-linux-musleabihf-cross armv7l-linux-musleabihf-cross armv7m-linux-musleabi-cross armv7r-linux-musleabihf-cross)
189
FILES=(arm-linux-musleabi-cross arm-linux-musleabihf-cross armel-linux-musleabi-cross armel-linux-musleabihf-cross armv5l-linux-musleabi-cross armv5l-linux-musleabihf-cross armv6-linux-musleabi-cross armv6-linux-musleabihf-cross armv7l-linux-musleabihf-cross armv7m-linux-musleabi-cross armv7r-linux-musleabihf-cross)
190
for i in "${FILES[@]}"; do
191
url="${BASE}${i}.tgz"
192
curl -L -o "${i}.tgz" "${url}"
193
sudo tar xf "${i}.tgz" --strip-components 1 -C /usr/local
194
rm -f "${i}.tgz"
195
done
196
# OS_ARCHES=(linux-musleabi-arm linux-musleabihf-arm linux-musleabi-armeb linux-musleabihf-armeb linux-musleabi-armel linux-musleabihf-armel linux-musleabi-armv5l linux-musleabihf-armv5l linux-musleabi-armv6 linux-musleabihf-armv6 linux-musleabihf-armv7l linux-musleabi-armv7m linux-musleabihf-armv7r)
197
# CGO_ARGS=(arm-linux-musleabi-gcc arm-linux-musleabihf-gcc armeb-linux-musleabi-gcc armeb-linux-musleabihf-gcc armel-linux-musleabi-gcc armel-linux-musleabihf-gcc armv5l-linux-musleabi-gcc armv5l-linux-musleabihf-gcc armv6-linux-musleabi-gcc armv6-linux-musleabihf-gcc armv7l-linux-musleabihf-gcc armv7m-linux-musleabi-gcc armv7r-linux-musleabihf-gcc)
198
# GOARMS=('' '' '' '' '' '' '5' '5' '6' '6' '7' '7' '7')
199
OS_ARCHES=(linux-musleabi-arm linux-musleabihf-arm linux-musleabi-armel linux-musleabihf-armel linux-musleabi-armv5l linux-musleabihf-armv5l linux-musleabi-armv6 linux-musleabihf-armv6 linux-musleabihf-armv7l linux-musleabi-armv7m linux-musleabihf-armv7r)
200
CGO_ARGS=(arm-linux-musleabi-gcc arm-linux-musleabihf-gcc armel-linux-musleabi-gcc armel-linux-musleabihf-gcc armv5l-linux-musleabi-gcc armv5l-linux-musleabihf-gcc armv6-linux-musleabi-gcc armv6-linux-musleabihf-gcc armv7l-linux-musleabihf-gcc armv7m-linux-musleabi-gcc armv7r-linux-musleabihf-gcc)
201
GOARMS=('' '' '' '' '5' '5' '6' '6' '7' '7' '7')
202
for i in "${!OS_ARCHES[@]}"; do
203
os_arch=${OS_ARCHES[$i]}
204
cgo_cc=${CGO_ARGS[$i]}
205
arm=${GOARMS[$i]}
206
echo building for ${os_arch}
207
export GOOS=linux
208
export GOARCH=arm
209
export CC=${cgo_cc}
210
export CGO_ENABLED=1
211
export GOARM=${arm}
212
go build -o ./build/$appName-$os_arch -ldflags="$muslflags" -tags=jsoniter .
213
done
214
}
215
216
BuildReleaseAndroid() {
217
rm -rf .git/
218
mkdir -p "build"
219
wget https://dl.google.com/android/repository/android-ndk-r26b-linux.zip
220
unzip android-ndk-r26b-linux.zip
221
rm android-ndk-r26b-linux.zip
222
OS_ARCHES=(amd64 arm64 386 arm)
223
CGO_ARGS=(x86_64-linux-android24-clang aarch64-linux-android24-clang i686-linux-android24-clang armv7a-linux-androideabi24-clang)
224
for i in "${!OS_ARCHES[@]}"; do
225
os_arch=${OS_ARCHES[$i]}
226
cgo_cc=$(realpath android-ndk-r26b/toolchains/llvm/prebuilt/linux-x86_64/bin/${CGO_ARGS[$i]})
227
echo building for android-${os_arch}
228
export GOOS=android
229
export GOARCH=${os_arch##*-}
230
export CC=${cgo_cc}
231
export CGO_ENABLED=1
232
go build -o ./build/$appName-android-$os_arch -ldflags="$ldflags" -tags=jsoniter .
233
android-ndk-r26b/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip ./build/$appName-android-$os_arch
234
done
235
}
236
237
BuildReleaseFreeBSD() {
238
rm -rf .git/
239
mkdir -p "build/freebsd"
240
OS_ARCHES=(amd64 arm64 i386)
241
GO_ARCHES=(amd64 arm64 386)
242
CGO_ARGS=(x86_64-unknown-freebsd14.1 aarch64-unknown-freebsd14.1 i386-unknown-freebsd14.1)
243
for i in "${!OS_ARCHES[@]}"; do
244
os_arch=${OS_ARCHES[$i]}
245
cgo_cc="clang --target=${CGO_ARGS[$i]} --sysroot=/opt/freebsd/${os_arch}"
246
echo building for freebsd-${os_arch}
247
sudo mkdir -p "/opt/freebsd/${os_arch}"
248
wget -q https://download.freebsd.org/releases/${os_arch}/14.3-RELEASE/base.txz
249
sudo tar -xf ./base.txz -C /opt/freebsd/${os_arch}
250
rm base.txz
251
export GOOS=freebsd
252
export GOARCH=${GO_ARCHES[$i]}
253
export CC=${cgo_cc}
254
export CGO_ENABLED=1
255
export CGO_LDFLAGS="-fuse-ld=lld"
256
go build -o ./build/$appName-freebsd-$os_arch -ldflags="$ldflags" -tags=jsoniter .
257
done
258
}
259
260
MakeRelease() {
261
cd build
262
mkdir compress
263
for i in $(find . -type f -name "$appName-linux-*"); do
264
cp "$i" alist
265
tar -czvf compress/"$i".tar.gz alist
266
rm -f alist
267
done
268
for i in $(find . -type f -name "$appName-android-*"); do
269
cp "$i" alist
270
tar -czvf compress/"$i".tar.gz alist
271
rm -f alist
272
done
273
for i in $(find . -type f -name "$appName-darwin-*"); do
274
cp "$i" alist
275
tar -czvf compress/"$i".tar.gz alist
276
rm -f alist
277
done
278
for i in $(find . -type f -name "$appName-freebsd-*"); do
279
cp "$i" alist
280
tar -czvf compress/"$i".tar.gz alist
281
rm -f alist
282
done
283
for i in $(find . -type f -name "$appName-windows-*"); do
284
cp "$i" alist.exe
285
zip compress/$(echo $i | sed 's/\.[^.]*$//').zip alist.exe
286
rm -f alist.exe
287
done
288
cd compress
289
find . -type f -print0 | xargs -0 md5sum >"$1"
290
cat "$1"
291
cd ../..
292
}
293
294
if [ "$1" = "dev" ]; then
295
FetchWebDev
296
if [ "$2" = "docker" ]; then
297
BuildDocker
298
elif [ "$2" = "docker-multiplatform" ]; then
299
BuildDockerMultiplatform
300
elif [ "$2" = "web" ]; then
301
echo "web only"
302
else
303
BuildDev
304
fi
305
elif [ "$1" = "release" -o "$1" = "beta" ]; then
306
if [ "$1" = "beta" ]; then
307
FetchWebDev
308
else
309
FetchWebRelease
310
fi
311
if [ "$2" = "docker" ]; then
312
BuildDocker
313
elif [ "$2" = "docker-multiplatform" ]; then
314
BuildDockerMultiplatform
315
elif [ "$2" = "linux_musl_arm" ]; then
316
BuildReleaseLinuxMuslArm
317
MakeRelease "md5-linux-musl-arm.txt"
318
elif [ "$2" = "linux_musl" ]; then
319
BuildReleaseLinuxMusl
320
MakeRelease "md5-linux-musl.txt"
321
elif [ "$2" = "android" ]; then
322
BuildReleaseAndroid
323
MakeRelease "md5-android.txt"
324
elif [ "$2" = "freebsd" ]; then
325
BuildReleaseFreeBSD
326
MakeRelease "md5-freebsd.txt"
327
elif [ "$2" = "web" ]; then
328
echo "web only"
329
else
330
BuildRelease
331
MakeRelease "md5.txt"
332
fi
333
elif [ "$1" = "prepare" ]; then
334
if [ "$2" = "docker-multiplatform" ]; then
335
PrepareBuildDockerMusl
336
fi
337
elif [ "$1" = "zip" ]; then
338
MakeRelease "$2".txt
339
else
340
echo -e "Parameter error"
341
fi
342
343