mirror of https://github.com/Xhofe/alist
				
				
				
			
		
			
				
	
	
		
			213 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Bash
		
	
	
			
		
		
	
	
			213 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Bash
		
	
	
appName="alist"
 | 
						|
builtAt="$(date +'%F %T %z')"
 | 
						|
goVersion=$(go version | sed 's/go version //')
 | 
						|
gitAuthor="Xhofe <i@nn.ci>"
 | 
						|
gitCommit=$(git log --pretty=format:"%h" -1)
 | 
						|
 | 
						|
if [ "$1" = "dev" ]; then
 | 
						|
  version="dev"
 | 
						|
  webVersion="dev"
 | 
						|
else
 | 
						|
  version=$(git describe --abbrev=0 --tags)
 | 
						|
  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')
 | 
						|
fi
 | 
						|
 | 
						|
echo "backend version: $version"
 | 
						|
echo "frontend version: $webVersion"
 | 
						|
 | 
						|
ldflags="\
 | 
						|
-w -s \
 | 
						|
-X 'github.com/alist-org/alist/v3/internal/conf.BuiltAt=$builtAt' \
 | 
						|
-X 'github.com/alist-org/alist/v3/internal/conf.GoVersion=$goVersion' \
 | 
						|
-X 'github.com/alist-org/alist/v3/internal/conf.GitAuthor=$gitAuthor' \
 | 
						|
-X 'github.com/alist-org/alist/v3/internal/conf.GitCommit=$gitCommit' \
 | 
						|
-X 'github.com/alist-org/alist/v3/internal/conf.Version=$version' \
 | 
						|
-X 'github.com/alist-org/alist/v3/internal/conf.WebVersion=$webVersion' \
 | 
						|
"
 | 
						|
 | 
						|
FetchWebDev() {
 | 
						|
  curl -L https://codeload.github.com/alist-org/web-dist/tar.gz/refs/heads/dev -o web-dist-dev.tar.gz
 | 
						|
  tar -zxvf web-dist-dev.tar.gz
 | 
						|
  rm -rf public/dist
 | 
						|
  mv -f web-dist-dev/dist public
 | 
						|
  rm -rf web-dist-dev web-dist-dev.tar.gz
 | 
						|
}
 | 
						|
 | 
						|
FetchWebRelease() {
 | 
						|
  curl -L https://github.com/alist-org/alist-web/releases/latest/download/dist.tar.gz -o dist.tar.gz
 | 
						|
  tar -zxvf dist.tar.gz
 | 
						|
  rm -rf public/dist
 | 
						|
  mv -f dist public
 | 
						|
  rm -rf dist.tar.gz
 | 
						|
}
 | 
						|
 | 
						|
BuildWinArm64() {
 | 
						|
  echo building for windows-arm64
 | 
						|
  chmod +x ./wrapper/zcc-arm64
 | 
						|
  chmod +x ./wrapper/zcxx-arm64
 | 
						|
  export GOOS=windows
 | 
						|
  export GOARCH=arm64
 | 
						|
  export CC=$(pwd)/wrapper/zcc-arm64
 | 
						|
  export CXX=$(pwd)/wrapper/zcxx-arm64
 | 
						|
  export CGO_ENABLED=1
 | 
						|
  go build -o "$1" -ldflags="$ldflags" -tags=jsoniter .
 | 
						|
}
 | 
						|
 | 
						|
BuildDev() {
 | 
						|
  rm -rf .git/
 | 
						|
  mkdir -p "dist"
 | 
						|
  muslflags="--extldflags '-static -fpic' $ldflags"
 | 
						|
  BASE="https://musl.nn.ci/"
 | 
						|
  FILES=(x86_64-linux-musl-cross aarch64-linux-musl-cross)
 | 
						|
  for i in "${FILES[@]}"; do
 | 
						|
    url="${BASE}${i}.tgz"
 | 
						|
    curl -L -o "${i}.tgz" "${url}"
 | 
						|
    sudo tar xf "${i}.tgz" --strip-components 1 -C /usr/local
 | 
						|
  done
 | 
						|
  OS_ARCHES=(linux-musl-amd64 linux-musl-arm64)
 | 
						|
  CGO_ARGS=(x86_64-linux-musl-gcc aarch64-linux-musl-gcc)
 | 
						|
  for i in "${!OS_ARCHES[@]}"; do
 | 
						|
    os_arch=${OS_ARCHES[$i]}
 | 
						|
    cgo_cc=${CGO_ARGS[$i]}
 | 
						|
    echo building for ${os_arch}
 | 
						|
    export GOOS=${os_arch%%-*}
 | 
						|
    export GOARCH=${os_arch##*-}
 | 
						|
    export CC=${cgo_cc}
 | 
						|
    export CGO_ENABLED=1
 | 
						|
    go build -o ./dist/$appName-$os_arch -ldflags="$muslflags" -tags=jsoniter .
 | 
						|
  done
 | 
						|
  xgo -targets=windows/amd64,darwin/amd64,darwin/arm64 -out "$appName" -ldflags="$ldflags" -tags=jsoniter .
 | 
						|
  mv alist-* dist
 | 
						|
  cd dist
 | 
						|
  cp ./alist-windows-amd64.exe ./alist-windows-amd64-upx.exe
 | 
						|
  upx -9 ./alist-windows-amd64-upx.exe
 | 
						|
  find . -type f -print0 | xargs -0 md5sum >md5.txt
 | 
						|
  cat md5.txt
 | 
						|
}
 | 
						|
 | 
						|
BuildDocker() {
 | 
						|
  echo "replace github.com/mattn/go-sqlite3 => github.com/leso-kn/go-sqlite3 v0.0.0-20230710125852-03158dc838ed" >>go.mod
 | 
						|
  go get gorm.io/driver/sqlite@v1.4.4
 | 
						|
  go build -o ./bin/alist -ldflags="$ldflags" -tags=jsoniter .
 | 
						|
}
 | 
						|
 | 
						|
BuildRelease() {
 | 
						|
  rm -rf .git/
 | 
						|
  mkdir -p "build"
 | 
						|
  BuildWinArm64 ./build/alist-windows-arm64.exe
 | 
						|
  xgo -out "$appName" -ldflags="$ldflags" -tags=jsoniter .
 | 
						|
  # why? Because some target platforms seem to have issues with upx compression
 | 
						|
  upx -9 ./alist-linux-amd64
 | 
						|
  cp ./alist-windows-amd64.exe ./alist-windows-amd64-upx.exe
 | 
						|
  upx -9 ./alist-windows-amd64-upx.exe
 | 
						|
  mv alist-* build
 | 
						|
}
 | 
						|
 | 
						|
BuildReleaseLinuxMusl() {
 | 
						|
  rm -rf .git/
 | 
						|
  mkdir -p "build"
 | 
						|
  muslflags="--extldflags '-static -fpic' $ldflags"
 | 
						|
  BASE="https://musl.nn.ci/"
 | 
						|
  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)
 | 
						|
  for i in "${FILES[@]}"; do
 | 
						|
    url="${BASE}${i}.tgz"
 | 
						|
    curl -L -o "${i}.tgz" "${url}"
 | 
						|
    sudo tar xf "${i}.tgz" --strip-components 1 -C /usr/local
 | 
						|
    rm -f "${i}.tgz"
 | 
						|
  done
 | 
						|
  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)
 | 
						|
  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)
 | 
						|
  for i in "${!OS_ARCHES[@]}"; do
 | 
						|
    os_arch=${OS_ARCHES[$i]}
 | 
						|
    cgo_cc=${CGO_ARGS[$i]}
 | 
						|
    echo building for ${os_arch}
 | 
						|
    export GOOS=${os_arch%%-*}
 | 
						|
    export GOARCH=${os_arch##*-}
 | 
						|
    export CC=${cgo_cc}
 | 
						|
    export CGO_ENABLED=1
 | 
						|
    go build -o ./build/$appName-$os_arch -ldflags="$muslflags" -tags=jsoniter .
 | 
						|
  done
 | 
						|
}
 | 
						|
 | 
						|
BuildReleaseLinuxMuslArm() {
 | 
						|
  rm -rf .git/
 | 
						|
  mkdir -p "build"
 | 
						|
  muslflags="--extldflags '-static -fpic' $ldflags"
 | 
						|
  BASE="https://musl.nn.ci/"
 | 
						|
#  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)
 | 
						|
  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)
 | 
						|
  for i in "${FILES[@]}"; do
 | 
						|
    url="${BASE}${i}.tgz"
 | 
						|
    curl -L -o "${i}.tgz" "${url}"
 | 
						|
    sudo tar xf "${i}.tgz" --strip-components 1 -C /usr/local
 | 
						|
    rm -f "${i}.tgz"
 | 
						|
  done
 | 
						|
#  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)
 | 
						|
#  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)
 | 
						|
#  GOARMS=('' '' '' '' '' '' '5' '5' '6' '6' '7' '7' '7')
 | 
						|
  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)
 | 
						|
  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)
 | 
						|
  GOARMS=('' '' '' '' '5' '5' '6' '6' '7' '7' '7')
 | 
						|
  for i in "${!OS_ARCHES[@]}"; do
 | 
						|
    os_arch=${OS_ARCHES[$i]}
 | 
						|
    cgo_cc=${CGO_ARGS[$i]}
 | 
						|
    arm=${GOARMS[$i]}
 | 
						|
    echo building for ${os_arch}
 | 
						|
    export GOOS=linux
 | 
						|
    export GOARCH=arm
 | 
						|
    export CC=${cgo_cc}
 | 
						|
    export CGO_ENABLED=1
 | 
						|
    export GOARM=${arm}
 | 
						|
    go build -o ./build/$appName-$os_arch -ldflags="$muslflags" -tags=jsoniter .
 | 
						|
  done
 | 
						|
}
 | 
						|
 | 
						|
MakeRelease() {
 | 
						|
  cd build
 | 
						|
  mkdir compress
 | 
						|
  for i in $(find . -type f -name "$appName-linux-*"); do
 | 
						|
    cp "$i" alist
 | 
						|
    tar -czvf compress/"$i".tar.gz alist
 | 
						|
    rm -f alist
 | 
						|
  done
 | 
						|
  for i in $(find . -type f -name "$appName-darwin-*"); do
 | 
						|
    cp "$i" alist
 | 
						|
    tar -czvf compress/"$i".tar.gz alist
 | 
						|
    rm -f alist
 | 
						|
  done
 | 
						|
  for i in $(find . -type f -name "$appName-windows-*"); do
 | 
						|
    cp "$i" alist.exe
 | 
						|
    zip compress/$(echo $i | sed 's/\.[^.]*$//').zip alist.exe
 | 
						|
    rm -f alist.exe
 | 
						|
  done
 | 
						|
  cd compress
 | 
						|
  find . -type f -print0 | xargs -0 md5sum >"$1"
 | 
						|
  cat "$1"
 | 
						|
  cd ../..
 | 
						|
}
 | 
						|
 | 
						|
if [ "$1" = "dev" ]; then
 | 
						|
  FetchWebDev
 | 
						|
  if [ "$2" = "docker" ]; then
 | 
						|
    BuildDocker
 | 
						|
  else
 | 
						|
    BuildDev
 | 
						|
  fi
 | 
						|
elif [ "$1" = "release" ]; then
 | 
						|
  FetchWebRelease
 | 
						|
  if [ "$2" = "docker" ]; then
 | 
						|
    BuildDocker
 | 
						|
  elif [ "$2" = "linux_musl_arm" ]; then
 | 
						|
    BuildReleaseLinuxMuslArm
 | 
						|
    MakeRelease "md5-linux-musl-arm.txt"
 | 
						|
  elif [ "$2" = "linux_musl" ]; then
 | 
						|
    BuildReleaseLinuxMusl
 | 
						|
    MakeRelease "md5-linux-musl.txt"
 | 
						|
  else
 | 
						|
    BuildRelease
 | 
						|
    MakeRelease "md5.txt"
 | 
						|
  fi
 | 
						|
else
 | 
						|
  echo -e "Parameter error"
 | 
						|
fi
 |