user-package.sh 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #!/usr/bin/env bash
  2. set -o errexit
  3. set -o pipefail
  4. set -o nounset
  5. # set -o xtrace
  6. trap 'echo -e "Aborted, error $? in command: $BASH_COMMAND"; trap ERR; exit 1' ERR
  7. NOW=$(date '+%Y%m%d-%H%M%S')
  8. TMP=$(mktemp -d)
  9. SRCDIR=$(pwd)
  10. CODENAME="user"
  11. BUILDNAME=$NOW
  12. cleanup() { rm -rf "$TMP"; }
  13. trap cleanup INT TERM ERR
  14. get_source() {
  15. echo ">>> Clone v2fly/v2ray-core repo..."
  16. git clone https://github.com/v2fly/v2ray-core.git
  17. cd v2ray-core
  18. go mod download
  19. }
  20. build_v2() {
  21. if [[ $nosource != 1 ]]; then
  22. cd ${SRCDIR}/v2ray-core
  23. local VERSIONTAG=$(git describe --abbrev=0 --tags)
  24. else
  25. echo ">>> Use current directory as WORKDIR"
  26. local VERSIONTAG=$(git describe --abbrev=0 --tags)
  27. fi
  28. LDFLAGS="-s -w -buildid= -X github.com/v2fly/v2ray-core/v4.codename=${CODENAME} -X github.com/v2fly/v2ray-core/v4.build=${BUILDNAME} -X github.com/v2fly/v2ray-core/v4.version=${VERSIONTAG}"
  29. echo ">>> Compile v2ray ..."
  30. env CGO_ENABLED=0 go build -o "$TMP"/v2ray"${EXESUFFIX}" -ldflags "$LDFLAGS" ./main
  31. if [[ $GOOS == "windows" ]]; then
  32. env CGO_ENABLED=0 go build -o "$TMP"/wv2ray"${EXESUFFIX}" -ldflags "-H windowsgui $LDFLAGS" ./main
  33. fi
  34. echo ">>> Compile v2ctl ..."
  35. env CGO_ENABLED=0 go build -o "$TMP"/v2ctl"${EXESUFFIX}" -tags confonly -ldflags "$LDFLAGS" ./infra/control/main
  36. }
  37. build_dat() {
  38. echo ">>> Download latest geoip.dat"
  39. curl -s -L -o "$TMP"/geoip.dat "https://github.com/v2fly/geoip/raw/release/geoip.dat"
  40. echo ">>> Download latest geoip-only-cn-private.dat"
  41. curl -s -L -o "$TMP"/geoip-only-cn-private.dat "https://github.com/v2fly/geoip/raw/release/geoip-only-cn-private.dat"
  42. echo ">>> Download latest geosite.dat"
  43. curl -s -L -o "$TMP"/geosite.dat "https://github.com/v2fly/domain-list-community/raw/release/dlc.dat"
  44. }
  45. copyconf() {
  46. echo ">>> Copying config..."
  47. cd ./release/config
  48. if [[ $GOOS == "linux" ]]; then
  49. tar c --exclude "*.dat" . | tar x -C "$TMP"
  50. else
  51. tar c --exclude "*.dat" --exclude "systemd/**" . | tar x -C "$TMP"
  52. fi
  53. }
  54. packzip() {
  55. echo ">>> Generating zip package"
  56. cd "$TMP"
  57. local PKG=${SRCDIR}/v2ray-custom-${GOARCH}-${GOOS}-${PKGSUFFIX}${NOW}.zip
  58. zip -r "$PKG" .
  59. echo ">>> Generated: $(basename "$PKG") at $(dirname "$PKG")"
  60. }
  61. packtgz() {
  62. echo ">>> Generating tgz package"
  63. cd "$TMP"
  64. local PKG=${SRCDIR}/v2ray-custom-${GOARCH}-${GOOS}-${PKGSUFFIX}${NOW}.tar.gz
  65. tar cvfz "$PKG" .
  66. echo ">>> Generated: $(basename "$PKG") at $(dirname "$PKG")"
  67. }
  68. packtgzAbPath() {
  69. local ABPATH="$1"
  70. echo ">>> Generating tgz package at $ABPATH"
  71. cd "$TMP"
  72. tar cvfz "$ABPATH" .
  73. echo ">>> Generated: $ABPATH"
  74. }
  75. pkg=zip
  76. nosource=0
  77. nodat=0
  78. noconf=0
  79. GOOS=linux
  80. GOARCH=amd64
  81. EXESUFFIX=
  82. PKGSUFFIX=
  83. for arg in "$@"; do
  84. case $arg in
  85. 386 | arm* | mips* | ppc64* | riscv64 | s390x)
  86. GOARCH=$arg
  87. ;;
  88. windows)
  89. GOOS=$arg
  90. EXESUFFIX=.exe
  91. ;;
  92. darwin | dragonfly | freebsd | openbsd)
  93. GOOS=$arg
  94. ;;
  95. nodat)
  96. nodat=1
  97. PKGSUFFIX=${PKGSUFFIX}nodat-
  98. ;;
  99. noconf)
  100. noconf=1
  101. ;;
  102. nosource)
  103. nosource=1
  104. ;;
  105. tgz)
  106. pkg=tgz
  107. ;;
  108. abpathtgz=*)
  109. pkg=${arg##abpathtgz=}
  110. ;;
  111. codename=*)
  112. CODENAME=${arg##codename=}
  113. ;;
  114. buildname=*)
  115. BUILDNAME=${arg##buildname=}
  116. ;;
  117. esac
  118. done
  119. if [[ $nosource != 1 ]]; then
  120. get_source
  121. fi
  122. export GOOS GOARCH
  123. echo "Build ARGS: GOOS=${GOOS} GOARCH=${GOARCH} CODENAME=${CODENAME} BUILDNAME=${BUILDNAME}"
  124. echo "PKG ARGS: pkg=${pkg}"
  125. build_v2
  126. if [[ $nodat != 1 ]]; then
  127. build_dat
  128. fi
  129. if [[ $noconf != 1 ]]; then
  130. copyconf
  131. fi
  132. if [[ $pkg == "zip" ]]; then
  133. packzip
  134. elif [[ $pkg == "tgz" ]]; then
  135. packtgz
  136. else
  137. packtgzAbPath "$pkg"
  138. fi
  139. cleanup