From: Ian Lance Taylor Date: Wed, 21 May 2014 17:39:23 +0000 (-0700) Subject: cmd/go: check for SWIG version that is too old to use X-Git-Tag: go1.3rc1~62 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=708304bea26bec83c443f7657ad1780b17c23790;p=gostls13.git cmd/go: check for SWIG version that is too old to use Fixes #7983. LGTM=crawshaw R=golang-codereviews, crawshaw CC=golang-codereviews, rsc https://golang.org/cl/96540044 --- diff --git a/src/cmd/go/build.go b/src/cmd/go/build.go index a6a21317e4..3645f1c2d5 100644 --- a/src/cmd/go/build.go +++ b/src/cmd/go/build.go @@ -2348,6 +2348,10 @@ func (b *builder) swig(p *Package, obj string, gccfiles, gxxfiles, mfiles []stri outObj = append(outObj, ofile) } + if err := b.swigVersionCheck(); err != nil { + return nil, nil, err + } + intgosize, err := b.swigIntSize(obj) if err != nil { return nil, nil, err @@ -2386,6 +2390,41 @@ func (b *builder) swig(p *Package, obj string, gccfiles, gxxfiles, mfiles []stri return outGo, outObj, nil } +// Make sure SWIG is new enough. +var ( + swigCheckOnce sync.Once + swigCheck error +) + +func (b *builder) swigDoVersionCheck() error { + out, err := b.runOut("", "", nil, "swig", "-version") + if err != nil { + return err + } + re := regexp.MustCompile(`[vV]ersion +([\d])`) + matches := re.FindSubmatch(out) + if matches == nil { + // Can't find version number; hope for the best. + return nil + } + major, err := strconv.Atoi(string(matches[1])) + if err != nil { + // Can't find version number; hope for the best. + return nil + } + if major < 3 { + return errors.New("must have SWIG version >= 3.0") + } + return nil +} + +func (b *builder) swigVersionCheck() error { + swigCheckOnce.Do(func() { + swigCheck = b.swigDoVersionCheck() + }) + return swigCheck +} + // This code fails to build if sizeof(int) <= 32 const swigIntSizeCode = ` package main @@ -2458,7 +2497,7 @@ func (b *builder) swigOne(p *Package, file, obj string, cxx bool, intgosize stri if out, err := b.runOut(p.Dir, p.ImportPath, nil, "swig", args, file); err != nil { if len(out) > 0 { if bytes.Contains(out, []byte("Unrecognized option -intgosize")) { - return "", "", "", errors.New("must have SWIG version >= 3.0\n") + return "", "", "", errors.New("must have SWIG version >= 3.0") } b.showOutput(p.Dir, p.ImportPath, b.processOutput(out)) return "", "", "", errPrintedOutput