Files
mev-beta/vendor/github.com/supranational/blst/bindings/go/generate.py

133 lines
3.6 KiB
Python

#!/usr/bin/env python3
import os
import sys
import re
import subprocess
here = re.split(r'/(?=[^/]*$)', sys.argv[0])
if len(here) > 1:
os.chdir(here[0])
for dir in re.split(r':', os.getenv("GOPATH")):
goimports = dir + "/bin/goimports"
if os.path.isfile(goimports) and os.access(goimports, os.X_OK):
break
goimports = None
if goimports is None:
version = subprocess.check_output(["go", "version"]).decode('ascii')
v = re.search(r'version go([0-9]+\.[0-9]+)', version)
if not v:
raise OSError(2, "unparseable output from 'go version'")
if float(v.group(1)) < 1.17:
advice = "'go get golang.org/x/tools/cmd/goimports'"
else:
advice = "'go install golang.org/x/tools/cmd/goimports@latest'"
print("'goimports' is not found on $GOPATH, install with", file=sys.stderr)
print(advice, file=sys.stderr)
sys.exit(1)
outFile = 'blst.go'
def concatFile(fout, fin, removeImports):
for line in fin:
if removeImports and 'import' in line:
while ')' not in line:
line = fin.readline()
continue
print(line, file=fout, end='')
def remap(fout, fin, mapping, dont_touch, removeImports):
for line in fin:
if removeImports and 'import' in line:
while ')' not in line:
line = fin.readline()
continue
for (a, b) in dont_touch:
line = line.replace(a, b)
for (a, b) in mapping:
line = line.replace(a, a+"_tmp")
line = line.replace(b, b+"_tmp")
line = line.replace(a+"_tmp", b)
line = line.replace(b+"_tmp", a)
for (a, b) in dont_touch:
line = line.replace(b, a)
print(line, file=fout, end='')
fout = open(outFile, "w")
print("// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", file=fout)
print("// DO NOT MODIFY THIS FILE!!", file=fout)
print("// The file is generated from *.tgo by " + here[-1], file=fout)
print("// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", file=fout)
fin = open('blst.tgo', "r")
concatFile(fout, fin, False)
fin.close()
# min-pk
print("//", file=fout)
print("// MIN-PK", file=fout)
print("//", file=fout)
fin = open('blst_minpk.tgo', "r")
concatFile(fout, fin, True)
fin.close()
# These are strings that overlap with the mapping names but we don't
# actually want to change. The second value should be a unique string.
dont_touch = (('Fp12', 'foo1234'),)
# We're going to swap these names to get from min-pk to min-sig
mapping = [('P1', 'P2'),
('p1', 'p2'),
('Fp', 'Fp2'),
('C.blst_fp', 'C.blst_fp2'),
('G1', 'G2'),
('g1', 'g2')
]
# min-sig
print("//", file=fout)
print("// MIN-SIG", file=fout)
print("//", file=fout)
with open('blst_minpk.tgo', "r") as fin:
remap(fout, fin, mapping, dont_touch, True)
# serdes and other functions
fin = open('blst_px.tgo', "r")
concatFile(fout, fin, True)
fin.close()
with open('blst_px.tgo', "r") as fin:
remap(fout, fin, mapping, dont_touch, True)
# final code
fin = open('blst_misc.tgo', "r")
concatFile(fout, fin, True)
fin.close()
fout.close()
# Use goimports to generate the import list
os.system(goimports + " -w blst.go")
# Generate min-sig tests
fout = open('blst_minsig_test.go', "w")
print("// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", file=fout)
print("// DO NOT EDIT THIS FILE!!", file=fout)
print("// The file is generated from blst_minpk_test.go by " + here[-1], file=fout)
print("// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", file=fout)
mapping.append(('MinPk', 'MinSig'))
with open('blst_minpk_test.go', "r") as fin:
remap(fout, fin, mapping, dont_touch, False)
fout.close()