user-package.sh 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  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..."
  39. curl -s -L -o "$TMP"/geoip.dat "https://github.com/v2fly/geoip/raw/release/geoip.dat"
  40. echo ">>> Download latest geosite..."
  41. curl -s -L -o "$TMP"/geosite.dat "https://github.com/v2fly/domain-list-community/raw/release/dlc.dat"
  42. }
  43. copyconf() {
  44. echo ">>> Copying config..."
  45. cd ./release/config
  46. if [[ $GOOS == "linux" ]]; then
  47. tar c --exclude "*.dat" . | tar x -C "$TMP"
  48. else
  49. tar c --exclude "*.dat" --exclude "systemd/**" . | tar x -C "$TMP"
  50. fi
  51. }
  52. packzip() {
  53. echo ">>> Generating zip package"
  54. cd "$TMP"
  55. local PKG=${SRCDIR}/v2ray-custom-${GOARCH}-${GOOS}-${PKGSUFFIX}${NOW}.zip
  56. zip -r "$PKG" .
  57. echo ">>> Generated: $(basename "$PKG") at $(dirname "$PKG")"
  58. }
  59. packtgz() {
  60. echo ">>> Generating tgz package"
  61. cd "$TMP"
  62. local PKG=${SRCDIR}/v2ray-custom-${GOARCH}-${GOOS}-${PKGSUFFIX}${NOW}.tar.gz
  63. tar cvfz "$PKG" .
  64. echo ">>> Generated: $(basename "$PKG") at $(dirname "$PKG")"
  65. }
  66. packtgzAbPath() {
  67. local ABPATH="$1"
  68. echo ">>> Generating tgz package at $ABPATH"
  69. cd "$TMP"
  70. tar cvfz "$ABPATH" .
  71. echo ">>> Generated: $ABPATH"
  72. }
  73. pkg=zip
  74. nosource=0
  75. nodat=0
  76. noconf=0
  77. GOOS=linux
  78. GOARCH=amd64
  79. EXESUFFIX=
  80. PKGSUFFIX=
  81. for arg in "$@"; do
  82. case $arg in
  83. 386 | arm* | mips* | ppc64* | riscv64 | s390x)
  84. GOARCH=$arg
  85. ;;
  86. windows)
  87. GOOS=$arg
  88. EXESUFFIX=.exe
  89. ;;
  90. darwin | dragonfly | freebsd | openbsd)
  91. GOOS=$arg
  92. ;;
  93. nodat)
  94. nodat=1
  95. PKGSUFFIX=${PKGSUFFIX}nodat-
  96. ;;
  97. noconf)
  98. noconf=1
  99. ;;
  100. nosource)
  101. nosource=1
  102. ;;
  103. tgz)
  104. pkg=tgz
  105. ;;
  106. abpathtgz=*)
  107. pkg=${arg##abpathtgz=}
  108. ;;
  109. codename=*)
  110. CODENAME=${arg##codename=}
  111. ;;
  112. buildname=*)
  113. BUILDNAME=${arg##buildname=}
  114. ;;
  115. esac
  116. done
  117. if [[ $nosource != 1 ]]; then
  118. get_source
  119. fi
  120. export GOOS GOARCH
  121. echo "Build ARGS: GOOS=${GOOS} GOARCH=${GOARCH} CODENAME=${CODENAME} BUILDNAME=${BUILDNAME}"
  122. echo "PKG ARGS: pkg=${pkg}"
  123. build_v2
  124. if [[ $nodat != 1 ]]; then
  125. build_dat
  126. fi
  127. if [[ $noconf != 1 ]]; then
  128. copyconf
  129. fi
  130. if [[ $pkg == "zip" ]]; then
  131. packzip
  132. elif [[ $pkg == "tgz" ]]; then
  133. packtgz
  134. else
  135. packtgzAbPath "$pkg"
  136. fi
  137. cleanup