go-hep.org/x/hep@v0.38.1/ci/install-cxx-root.go (about)

     1  // Copyright ©2019 The go-hep Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  //go:build ignore
     6  
     7  // Command to install a given (binary) ROOT version.
     8  package main
     9  
    10  import (
    11  	"flag"
    12  	"fmt"
    13  	"io"
    14  	"log"
    15  	"net/http"
    16  	"os"
    17  	"os/exec"
    18  	"path/filepath"
    19  )
    20  
    21  func main() {
    22  	log.SetPrefix("")
    23  	log.SetFlags(0)
    24  
    25  	var (
    26  		rvers = flag.String("root-version", "6.34.04", "ROOT version to install")
    27  		odir  = flag.String("o", "", "install directory for ROOT")
    28  	)
    29  
    30  	flag.Parse()
    31  
    32  	if *odir == "" {
    33  		*odir = fmt.Sprintf("root-%s", *rvers)
    34  	}
    35  
    36  	dst, err := filepath.Abs(*odir)
    37  	if err != nil {
    38  		log.Fatalf("could not get absolute path to %q: %+v", *odir, err)
    39  	}
    40  	switch _, err := os.Stat(filepath.Join(dst, "root-"+*rvers, "bin", "root.exe")); err {
    41  	case nil:
    42  		log.Printf("ROOT version %s already installed", *rvers)
    43  		return
    44  	default:
    45  		err = os.MkdirAll(dst, 0755)
    46  		if err != nil {
    47  			log.Fatalf("could not create directory %q: %+v", dst, err)
    48  		}
    49  	}
    50  
    51  	install(*rvers, dst)
    52  }
    53  
    54  func install(rvers, odir string) {
    55  	log.Printf("installing ROOT %s to: %q...", rvers, odir)
    56  	tmp, err := os.MkdirTemp("", "go-hep-build-")
    57  	if err != nil {
    58  		log.Fatalf("could not create top-level tmp dir: %+v", err)
    59  	}
    60  	defer os.RemoveAll(tmp)
    61  
    62  	oname := filepath.Join(tmp, "root.tar.gz")
    63  	targz, err := os.Create(oname)
    64  	if err != nil {
    65  		log.Fatalf("could not create ROOT archive destination file %q: %+v", oname, err)
    66  	}
    67  	defer targz.Close()
    68  
    69  	binURL := fmt.Sprintf("https://cern.ch/binet/go-hep/cern-root/root-%s-linux_amd64.tar.gz", rvers)
    70  	log.Printf("downloading %q...", binURL)
    71  	resp, err := http.Get(binURL)
    72  	if err != nil {
    73  		log.Fatalf("could not get ROOT %s from %v: %+v", rvers, binURL, err)
    74  	}
    75  	defer resp.Body.Close()
    76  
    77  	if resp.StatusCode != http.StatusOK {
    78  		log.Fatalf("could not get ROOT %s from %v: %v", rvers, binURL, resp.Status)
    79  	}
    80  
    81  	_, err = io.Copy(targz, resp.Body)
    82  	if err != nil {
    83  		log.Fatalf("could not download ROOT archive from %q: %+v", binURL, err)
    84  	}
    85  
    86  	err = targz.Close()
    87  	if err != nil {
    88  		log.Fatalf("could not close ROOT binary archive %q: %+v", oname, err)
    89  	}
    90  
    91  	log.Printf("decompressing...")
    92  	cmd := exec.Command("tar", "xf", oname)
    93  	cmd.Dir = odir
    94  	cmd.Stdout = os.Stdout
    95  	cmd.Stderr = os.Stderr
    96  
    97  	err = cmd.Run()
    98  	if err != nil {
    99  		log.Fatalf("could not untar ROOT binary archive: %+v", err)
   100  	}
   101  }