]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: check for SWIG version that is too old to use
authorIan Lance Taylor <iant@golang.org>
Wed, 21 May 2014 17:39:23 +0000 (10:39 -0700)
committerIan Lance Taylor <iant@golang.org>
Wed, 21 May 2014 17:39:23 +0000 (10:39 -0700)
Fixes #7983.

LGTM=crawshaw
R=golang-codereviews, crawshaw
CC=golang-codereviews, rsc
https://golang.org/cl/96540044

src/cmd/go/build.go

index a6a21317e40212bb947faa0c2742d19ba43319b9..3645f1c2d5f0e5d55d4881be3021e9d33469383a 100644 (file)
@@ -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