prebuild.sh 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. #!/bin/bash
  2. # _needgen is a helper function to tell if we need to generate files for msgp, codecgen.
  3. _needgen() {
  4. local a="$1"
  5. zneedgen=0
  6. if [[ ! -e "$a" ]]
  7. then
  8. zneedgen=1
  9. echo 1
  10. return 0
  11. fi
  12. for i in `ls -1 *.go.tmpl gen.go values_test.go`
  13. do
  14. if [[ "$a" -ot "$i" ]]
  15. then
  16. zneedgen=1
  17. echo 1
  18. return 0
  19. fi
  20. done
  21. echo 0
  22. }
  23. # _build generates fast-path.go and gen-helper.go.
  24. #
  25. # It is needed because there is some dependency between the generated code
  26. # and the other classes. Consequently, we have to totally remove the
  27. # generated files and put stubs in place, before calling "go run" again
  28. # to recreate them.
  29. _build() {
  30. if ! [[ "${zforce}" == "1" ||
  31. "1" == $( _needgen "fast-path.generated.go" ) ||
  32. "1" == $( _needgen "gen-helper.generated.go" ) ||
  33. "1" == $( _needgen "gen.generated.go" ) ||
  34. 1 == 0 ]]
  35. then
  36. return 0
  37. fi
  38. # echo "Running prebuild"
  39. if [ "${zbak}" == "1" ]
  40. then
  41. # echo "Backing up old generated files"
  42. _zts=`date '+%m%d%Y_%H%M%S'`
  43. _gg=".generated.go"
  44. [ -e "gen-helper${_gg}" ] && mv gen-helper${_gg} gen-helper${_gg}__${_zts}.bak
  45. [ -e "fast-path${_gg}" ] && mv fast-path${_gg} fast-path${_gg}__${_zts}.bak
  46. [ -e "gen${_gg}" ] && mv gen${_gg} gen${_gg}__${_zts}.bak
  47. # [ -e "safe${_gg}" ] && mv safe${_gg} safe${_gg}__${_zts}.bak
  48. # [ -e "unsafe${_gg}" ] && mv unsafe${_gg} unsafe${_gg}__${_zts}.bak
  49. fi
  50. rm -f gen-helper.generated.go fast-path.generated.go \
  51. gen.generated.go \
  52. *safe.generated.go *_generated_test.go *.generated_ffjson_expose.go
  53. cat > gen.generated.go <<EOF
  54. // Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved.
  55. // Use of this source code is governed by a MIT license found in the LICENSE file.
  56. package codec
  57. // DO NOT EDIT. THIS FILE IS AUTO-GENERATED FROM gen-dec-(map|array).go.tmpl
  58. const genDecMapTmpl = \`
  59. EOF
  60. cat >> gen.generated.go < gen-dec-map.go.tmpl
  61. cat >> gen.generated.go <<EOF
  62. \`
  63. const genDecListTmpl = \`
  64. EOF
  65. cat >> gen.generated.go < gen-dec-array.go.tmpl
  66. cat >> gen.generated.go <<EOF
  67. \`
  68. EOF
  69. cat > gen-from-tmpl.codec.generated.go <<EOF
  70. package codec
  71. import "io"
  72. func GenInternalGoFile(r io.Reader, w io.Writer, safe bool) error {
  73. return genInternalGoFile(r, w, safe)
  74. }
  75. EOF
  76. cat > gen-from-tmpl.generated.go <<EOF
  77. //+build ignore
  78. package main
  79. //import "flag"
  80. import "${zpkg}"
  81. import "os"
  82. func run(fnameIn, fnameOut string, safe bool) {
  83. fin, err := os.Open(fnameIn)
  84. if err != nil { panic(err) }
  85. defer fin.Close()
  86. fout, err := os.Create(fnameOut)
  87. if err != nil { panic(err) }
  88. defer fout.Close()
  89. err = codec.GenInternalGoFile(fin, fout, safe)
  90. if err != nil { panic(err) }
  91. }
  92. func main() {
  93. // do not make safe/unsafe variants.
  94. // Instead, depend on escape analysis, and place string creation and usage appropriately.
  95. // run("unsafe.go.tmpl", "safe.generated.go", true)
  96. // run("unsafe.go.tmpl", "unsafe.generated.go", false)
  97. run("fast-path.go.tmpl", "fast-path.generated.go", false)
  98. run("gen-helper.go.tmpl", "gen-helper.generated.go", false)
  99. }
  100. EOF
  101. go run -tags=notfastpath gen-from-tmpl.generated.go && \
  102. rm -f gen-from-tmpl.*generated.go
  103. }
  104. _codegenerators() {
  105. if [[ $zforce == "1" ||
  106. "1" == $( _needgen "values_codecgen${zsfx}" ) ||
  107. "1" == $( _needgen "values_msgp${zsfx}" ) ||
  108. "1" == $( _needgen "values_ffjson${zsfx}" ) ||
  109. 1 == 0 ]]
  110. then
  111. # codecgen creates some temporary files in the directory (main, pkg).
  112. # Consequently, we should start msgp and ffjson first, and also put a small time latency before
  113. # starting codecgen.
  114. # Without this, ffjson chokes on one of the temporary files from codecgen.
  115. if [[ $zexternal == "1" ]]
  116. then
  117. echo "ffjson ... " && \
  118. ffjson -w values_ffjson${zsfx} $zfin &
  119. zzzIdFF=$!
  120. echo "msgp ... " && \
  121. msgp -tests=false -o=values_msgp${zsfx} -file=$zfin &
  122. zzzIdMsgp=$!
  123. sleep 1 # give ffjson and msgp some buffer time. see note above.
  124. fi
  125. echo "codecgen - !unsafe ... " && \
  126. $zgobase/bin/codecgen -rt codecgen -t 'x,codecgen,!unsafe' -o values_codecgen${zsfx} -d 19780 $zfin &
  127. zzzIdC=$!
  128. echo "codecgen - unsafe ... " && \
  129. $zgobase/bin/codecgen -u -rt codecgen -t 'x,codecgen,unsafe' -o values_codecgen_unsafe${zsfx} -d 19781 $zfin &
  130. zzzIdCU=$!
  131. wait $zzzIdC $zzzIdCU $zzzIdMsgp $zzzIdFF && \
  132. # remove (M|Unm)arshalJSON implementations, so they don't conflict with encoding/json bench \
  133. if [[ $zexternal == "1" ]]
  134. then
  135. sed -i '' -e 's+ MarshalJSON(+ _MarshalJSON(+g' values_ffjson${zsfx} && \
  136. sed -i '' -e 's+ UnmarshalJSON(+ _UnmarshalJSON(+g' values_ffjson${zsfx}
  137. fi && \
  138. echo "generators done!" && \
  139. true
  140. fi
  141. }
  142. # _init reads the arguments and sets up the flags
  143. _init() {
  144. OPTIND=1
  145. while getopts "fbxp:" flag
  146. do
  147. case "x$flag" in
  148. 'xf') zforce=1;;
  149. 'xb') zbak=1;;
  150. 'xx') zexternal=1;;
  151. 'xp') zpkg="${OPTARG}" ;;
  152. *) echo "prebuild.sh accepts [-fbx] [-p basepkgname] only"; return 1;;
  153. esac
  154. done
  155. shift $((OPTIND-1))
  156. OPTIND=1
  157. }
  158. # main script.
  159. # First ensure that this is being run from the basedir (i.e. dirname of script is .)
  160. # Sample usage:
  161. if [ "." = `dirname $0` ]
  162. then
  163. zmydir=`pwd`
  164. zfin="test_values.generated.go"
  165. zsfx="_generated_test.go"
  166. # zpkg="ugorji.net/codec"
  167. zpkg=${zmydir##*/src/}
  168. zgobase=${zmydir%%/src/*}
  169. # rm -f *_generated_test.go
  170. rm -f codecgen-*.go && \
  171. _init "$@" && \
  172. _build && \
  173. cp $zmydir/values_test.go $zmydir/$zfin && \
  174. _codegenerators && \
  175. echo prebuild done successfully
  176. rm -f $zmydir/$zfin
  177. else
  178. echo "Script must be run from the directory it resides in"
  179. fi