206 lines
6 KiB
Bash
Executable file
206 lines
6 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
# _needgen is a helper function to tell if we need to generate files for msgp, codecgen.
|
|
_needgen() {
|
|
local a="$1"
|
|
zneedgen=0
|
|
if [[ ! -e "$a" ]]
|
|
then
|
|
zneedgen=1
|
|
echo 1
|
|
return 0
|
|
fi
|
|
for i in `ls -1 *.go.tmpl gen.go values_test.go`
|
|
do
|
|
if [[ "$a" -ot "$i" ]]
|
|
then
|
|
zneedgen=1
|
|
echo 1
|
|
return 0
|
|
fi
|
|
done
|
|
echo 0
|
|
}
|
|
|
|
# _build generates fast-path.go and gen-helper.go.
|
|
#
|
|
# It is needed because there is some dependency between the generated code
|
|
# and the other classes. Consequently, we have to totally remove the
|
|
# generated files and put stubs in place, before calling "go run" again
|
|
# to recreate them.
|
|
_build() {
|
|
if ! [[ "${zforce}" == "1" ||
|
|
"1" == $( _needgen "fast-path.generated.go" ) ||
|
|
"1" == $( _needgen "gen-helper.generated.go" ) ||
|
|
"1" == $( _needgen "gen.generated.go" ) ||
|
|
1 == 0 ]]
|
|
then
|
|
return 0
|
|
fi
|
|
|
|
# echo "Running prebuild"
|
|
if [ "${zbak}" == "1" ]
|
|
then
|
|
# echo "Backing up old generated files"
|
|
_zts=`date '+%m%d%Y_%H%M%S'`
|
|
_gg=".generated.go"
|
|
[ -e "gen-helper${_gg}" ] && mv gen-helper${_gg} gen-helper${_gg}__${_zts}.bak
|
|
[ -e "fast-path${_gg}" ] && mv fast-path${_gg} fast-path${_gg}__${_zts}.bak
|
|
[ -e "gen${_gg}" ] && mv gen${_gg} gen${_gg}__${_zts}.bak
|
|
# [ -e "safe${_gg}" ] && mv safe${_gg} safe${_gg}__${_zts}.bak
|
|
# [ -e "unsafe${_gg}" ] && mv unsafe${_gg} unsafe${_gg}__${_zts}.bak
|
|
fi
|
|
rm -f gen-helper.generated.go fast-path.generated.go \
|
|
gen.generated.go \
|
|
*safe.generated.go *_generated_test.go *.generated_ffjson_expose.go
|
|
|
|
cat > gen.generated.go <<EOF
|
|
// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved.
|
|
// Use of this source code is governed by a MIT license found in the LICENSE file.
|
|
|
|
package codec
|
|
|
|
// DO NOT EDIT. THIS FILE IS AUTO-GENERATED FROM gen-dec-(map|array).go.tmpl
|
|
|
|
const genDecMapTmpl = \`
|
|
EOF
|
|
|
|
cat >> gen.generated.go < gen-dec-map.go.tmpl
|
|
|
|
cat >> gen.generated.go <<EOF
|
|
\`
|
|
|
|
const genDecListTmpl = \`
|
|
EOF
|
|
|
|
cat >> gen.generated.go < gen-dec-array.go.tmpl
|
|
|
|
cat >> gen.generated.go <<EOF
|
|
\`
|
|
|
|
EOF
|
|
|
|
cat > gen-from-tmpl.codec.generated.go <<EOF
|
|
package codec
|
|
import "io"
|
|
func GenInternalGoFile(r io.Reader, w io.Writer, safe bool) error {
|
|
return genInternalGoFile(r, w, safe)
|
|
}
|
|
EOF
|
|
|
|
cat > gen-from-tmpl.generated.go <<EOF
|
|
//+build ignore
|
|
|
|
package main
|
|
|
|
//import "flag"
|
|
import "${zpkg}"
|
|
import "os"
|
|
|
|
func run(fnameIn, fnameOut string, safe bool) {
|
|
fin, err := os.Open(fnameIn)
|
|
if err != nil { panic(err) }
|
|
defer fin.Close()
|
|
fout, err := os.Create(fnameOut)
|
|
if err != nil { panic(err) }
|
|
defer fout.Close()
|
|
err = codec.GenInternalGoFile(fin, fout, safe)
|
|
if err != nil { panic(err) }
|
|
}
|
|
|
|
func main() {
|
|
// do not make safe/unsafe variants.
|
|
// Instead, depend on escape analysis, and place string creation and usage appropriately.
|
|
// run("unsafe.go.tmpl", "safe.generated.go", true)
|
|
// run("unsafe.go.tmpl", "unsafe.generated.go", false)
|
|
run("fast-path.go.tmpl", "fast-path.generated.go", false)
|
|
run("gen-helper.go.tmpl", "gen-helper.generated.go", false)
|
|
}
|
|
|
|
EOF
|
|
go run -tags=notfastpath gen-from-tmpl.generated.go && \
|
|
rm -f gen-from-tmpl.*generated.go
|
|
}
|
|
|
|
_codegenerators() {
|
|
if [[ $zforce == "1" ||
|
|
"1" == $( _needgen "values_codecgen${zsfx}" ) ||
|
|
"1" == $( _needgen "values_msgp${zsfx}" ) ||
|
|
"1" == $( _needgen "values_ffjson${zsfx}" ) ||
|
|
1 == 0 ]]
|
|
then
|
|
# codecgen creates some temporary files in the directory (main, pkg).
|
|
# Consequently, we should start msgp and ffjson first, and also put a small time latency before
|
|
# starting codecgen.
|
|
# Without this, ffjson chokes on one of the temporary files from codecgen.
|
|
if [[ $zexternal == "1" ]]
|
|
then
|
|
echo "ffjson ... " && \
|
|
ffjson -w values_ffjson${zsfx} $zfin &
|
|
zzzIdFF=$!
|
|
echo "msgp ... " && \
|
|
msgp -tests=false -o=values_msgp${zsfx} -file=$zfin &
|
|
zzzIdMsgp=$!
|
|
|
|
sleep 1 # give ffjson and msgp some buffer time. see note above.
|
|
fi
|
|
|
|
echo "codecgen - !unsafe ... " && \
|
|
$zgobase/bin/codecgen -rt codecgen -t 'x,codecgen,!unsafe' -o values_codecgen${zsfx} -d 19780 $zfin &
|
|
zzzIdC=$!
|
|
echo "codecgen - unsafe ... " && \
|
|
$zgobase/bin/codecgen -u -rt codecgen -t 'x,codecgen,unsafe' -o values_codecgen_unsafe${zsfx} -d 19781 $zfin &
|
|
zzzIdCU=$!
|
|
wait $zzzIdC $zzzIdCU $zzzIdMsgp $zzzIdFF && \
|
|
# remove (M|Unm)arshalJSON implementations, so they don't conflict with encoding/json bench \
|
|
if [[ $zexternal == "1" ]]
|
|
then
|
|
sed -i '' -e 's+ MarshalJSON(+ _MarshalJSON(+g' values_ffjson${zsfx} && \
|
|
sed -i '' -e 's+ UnmarshalJSON(+ _UnmarshalJSON(+g' values_ffjson${zsfx}
|
|
fi && \
|
|
echo "generators done!" && \
|
|
true
|
|
fi
|
|
}
|
|
|
|
# _init reads the arguments and sets up the flags
|
|
_init() {
|
|
OPTIND=1
|
|
while getopts "fbxp:" flag
|
|
do
|
|
case "x$flag" in
|
|
'xf') zforce=1;;
|
|
'xb') zbak=1;;
|
|
'xx') zexternal=1;;
|
|
'xp') zpkg="${OPTARG}" ;;
|
|
*) echo "prebuild.sh accepts [-fbx] [-p basepkgname] only"; return 1;;
|
|
esac
|
|
done
|
|
shift $((OPTIND-1))
|
|
OPTIND=1
|
|
}
|
|
|
|
# main script.
|
|
# First ensure that this is being run from the basedir (i.e. dirname of script is .)
|
|
# Sample usage:
|
|
if [ "." = `dirname $0` ]
|
|
then
|
|
zmydir=`pwd`
|
|
zfin="test_values.generated.go"
|
|
zsfx="_generated_test.go"
|
|
# zpkg="ugorji.net/codec"
|
|
zpkg=${zmydir##*/src/}
|
|
zgobase=${zmydir%%/src/*}
|
|
# rm -f *_generated_test.go
|
|
rm -f codecgen-*.go && \
|
|
_init "$@" && \
|
|
_build && \
|
|
cp $zmydir/values_test.go $zmydir/$zfin && \
|
|
_codegenerators && \
|
|
echo prebuild done successfully
|
|
rm -f $zmydir/$zfin
|
|
else
|
|
echo "Script must be run from the directory it resides in"
|
|
fi
|
|
|