Page MenuHomeHEPForge

No OneTemporary

diff --git a/herwig-bootstrap b/herwig-bootstrap
--- a/herwig-bootstrap
+++ b/herwig-bootstrap
@@ -1,1378 +1,1383 @@
#!/usr/bin/env python
import subprocess
import sys, os, errno, platform, shutil
import urllib2, ssl
import tarfile
from optparse import OptionParser, OptionGroup
from optparse import SUPPRESS_HELP as NOHELP
from time import sleep
if platform.system() == 'Darwin':
default_cc = os.getenv('CC', '/usr/bin/clang')
default_cxx = os.getenv('CXX', '/usr/bin/clang++')
default_fc = os.getenv('FC', None)
else:
default_cc = os.getenv('CC', 'gcc')
default_cxx = os.getenv('CXX', 'g++')
default_fc = os.getenv('FC', 'gfortran')
# from http://stackoverflow.com/a/377028
def which(program):
import os
def is_exe(fpath):
return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
fpath, fname = os.path.split(program)
if fpath:
if is_exe(program):
return program
else:
for path in os.environ["PATH"].split(os.pathsep):
path = path.strip('"')
exe_file = os.path.join(path, program)
if is_exe(exe_file):
return exe_file
return None
parser = OptionParser(usage='Usage: %prog [options] DEST_DIR\n'
' %prog --help')
without_helptext = """
can optionally be satisfied with pre-existing installations. Specifying the PATH to an
existing installation will prevent a local build.
Each --with-FOO option has a corresponding --without-FOO,
to disable that package completely.
We can't help with build errors arising from use of --with and --without!
"""
parser_core = OptionGroup(parser,"Override main dependencies",
"The main dependencies for Herwig"+without_helptext)
parser_nlo = OptionGroup(parser,"Override NLO dependencies",
"The dependencies on NLO providers."+without_helptext)
parser_scm = OptionGroup(parser,"Source code repositories (for developers)",
"Some dependencies are also available as "
"direct source code checkouts. "
"Default repo URLs are already provided, you only "
"need to use the --foo-repo= options to change the defaults.")
parser_versions = OptionGroup(parser, "Code versions",
"Change the default version of the installation.")
parser_misc = OptionGroup(parser,"Miscellaneous options",
"Options for special use cases, not required for a regular build.")
parser.add_option_group(parser_core)
parser.add_option_group(parser_nlo)
parser.add_option_group(parser_versions)
parser.add_option_group(parser_scm)
parser.add_option_group(parser_misc)
# src directory
parser_misc.add_option("--src-dir",
metavar='PATH',
type='string',
default="",
dest='src_dir',
help='Separate the source/build directory. Default is DEST_DIR/src.')
# function to set up the standard flags for a program
def setUpFlags(parser,program,version) :
parser.add_option("--with-"+program ,
dest=program+'_loc',
metavar='PATH',
default=None,
help="")
parser.add_option("--without-"+program,
action='store_false',
dest=program,
default=True,
help=NOHELP)
if version:
parser_versions.add_option("--"+program+"-version",
metavar='VER',
type='string',
default=version,
dest=program+"_ver",
help="[%default]")
# compiler building
parser.add_option("--build-gcc",
action='store_true' ,
dest="gcc",
default=False,
help="Build a local copy of the gcc compilers to use for the rest of bootstrap.")
parser_versions.add_option("--gcc-version",
metavar='VER',
type='string',
default='6.2.0',
dest="gcc_ver",
help="[%default]")
# C++ 11
parser.add_option("--c++11-flag",
metavar="'...'",
type='string',
dest="cxx11",
default='-std=c++11',
help="Compiler flag to enable C++11 compatibility. ['%default']")
# gengetopt
parser_misc.add_option("--build-gengetopt",
action='store_true' ,
dest='gengetopt',
default=False,
help="Always build a local version of gengetopt instead of automatic detection.")
# flags for boost
setUpFlags(parser_core,"boost","1.62.0")
parser_misc.add_option("--boost-all",
action='store_false',
dest="boost_minimal",
default=True,
help='Install all the boost libaries, including those not required by Herwig.')
# flags for gsl
setUpFlags(parser_core,"gsl","2.2.1")
# flags for fastjet
setUpFlags(parser_core,"fastjet","3.2.1")
# flags for hepmc
setUpFlags(parser_core,"hepmc","2.06.09")
# flags for lhapdf
setUpFlags(parser_core,"lhapdf","6.1.6")
parser_misc.add_option("--add-pdf",
metavar='PDF',
action='append',
dest="pdfs",
default=["MMHT2014lo68cl","MMHT2014nlo68cl"],
help='Add a PDF to the defaults %default')
# flags for yoda
setUpFlags(parser_core,"yoda","1.6.5")
parser_scm.add_option("--yoda-hg",
action='store_true',
dest="yoda_hg",
default=False,
help='')
parser_scm.add_option("--yoda-repo",
metavar='URL',
type='string',
default="https://yoda.hepforge.org/hg/yoda",
dest='yoda_repo',
help='[%default]')
# flags for rivet
setUpFlags(parser_core,"rivet","2.5.2")
parser_scm.add_option("--rivet-hg",
action='store_true',
dest="rivet_hg",
default=False,
help='')
parser_scm.add_option("--rivet-repo",
metavar='URL',
type='string',
default="https://rivet.hepforge.org/hg/rivet",
dest='rivet_repo',
help='[%default]')
# flags for thepeg
setUpFlags(parser_core,"thepeg","2.1.0")
parser_scm.add_option("--thepeg-hg",
action='store_true',
dest="thepeg_hg",
default=False,
help='')
parser_scm.add_option("--thepeg-repo",
metavar='URL',
type='string',
default="https://thepeg.hepforge.org/hg/ThePEG",
dest='thepeg_repo',
help='[%default]')
# flags for herwig
setUpFlags(parser_core,"herwig","7.1.0")
parser_scm.add_option("--herwig-hg",
action='store_true',
dest="herwig_hg",
default=False,
help='')
parser_scm.add_option("--herwig-repo",
metavar='URL',
type='string',
default="https://herwig.hepforge.org/hg/herwig",
dest='herwig_repo',
help=' [%default]')
# madgraph
setUpFlags(parser_nlo,"madgraph","2.5.1")
parser_scm.add_option("--madgraph-bzr",
action='store_true',
dest="madgraph_bzr",
default=False,
help='')
parser_scm.add_option("--madgraph-repo",
metavar='URL',
type='string',
default="lp:~matchboxteam/mg5amcnlo/matchbox_output",
dest='madgraph_repo',
help='[%default]')
# flags for njet
setUpFlags(parser_nlo,"njet","2.0.0")
# flags for vbfnlo
setUpFlags(parser_nlo,"vbfnlo","3.0.0beta2")
parser_misc.add_option("--vbfnlo-processes",
metavar='PROCS',
type='string',
default="vbf,hjjj",
dest='vbfnlo_processes',
help='The processes for VBFNLO [%default]')
# flags for GoSam
setUpFlags(parser_nlo,"gosam","")
# flags for OpenLoops
setUpFlags(parser_nlo,"openloops","public")
parser_scm.add_option("--openloops-repo",
metavar='URL',
type='string',
default="http://openloops.hepforge.org/svn/OpenLoops/branches",
dest='openloops_repo',
help='[%default]')
parser_misc.add_option("--openloops-processes",
metavar='PROCS',
type='string',
default="ppll",
dest='openloops_processes',
help='The processes for OpenLoops [%default]')
# flags for hjets
setUpFlags(parser_nlo,"hjets","1.1")
parser_scm.add_option("--hjets-hg",
action='store_true',
dest="hjets_hg",
default=False,
help='')
parser_scm.add_option("--hjets-repo",
metavar='URL',
type='string',
default="https://hjets.hepforge.org/hg/hjets",
dest='hjets_repo',
help='[%default]')
# flags for porgrans needed by evtgen
### setUpFlags(parser_core,"tauola","1.1.5")
### setUpFlags(parser_core,"photos","3.61")
setUpFlags(parser_core,"pythia","8.186")
setUpFlags(parser_core,"evtgen","R01-06-00")
# no of cores
try:
from multiprocessing import cpu_count
ncore = max(cpu_count()-1, 1)
del cpu_count
except:
ncore = 1
parser.add_option("-j",
type='int',
metavar='N',
default=ncore,
dest="ncore",
help="Use N cores in make -j to speed up compilation. [%default]")
del ncore
# get the options and locations
opts, install_dir = parser.parse_args()
if len(install_dir) != 1:
parser.print_usage(sys.stderr)
exit(1)
install_dir = install_dir[0]
# enable C++11
default_cxx += " %s" % opts.cxx11
# gengetopt is always needed for Herwig hg build
opts.herwig_hg = True # TODO AFTER RELEASE
if opts.herwig_hg and which('gengetopt') is None:
opts.gengetopt = True
if platform.system() == 'Darwin':
# problem with dd_real from libqd
opts.njet = False
sys.stderr.write("* OS X: disabling NJet (need more dd_real overloads for math.h) *\n")
if opts.gcc:
sys.stderr.write("""
*********************************************************
*
* Self-building the compilers is not supported on OS X.
*
* Set FC to a Fortran compiler you have installed from
* another source (e.g. MacPorts, Fink or Homebrew) and
* rerun bootstrap without '--build-gcc'.
*
*********************************************************
""")
sys.exit(1)
if default_fc is None:
sys.stderr.write("""
*********************************************************
*
* Set FC to a Fortran compiler you have installed from
* another source (e.g. MacPorts, Fink or Homebrew).
*
*********************************************************
""")
sys.exit(1)
if not opts.gcc:
print """
*********************************************************
* Using CC="%s" CXX="%s" FC="%s".
* Set these environment variables to change compilers.
*********************************************************
""" % (default_cc,default_cxx,default_fc)
else:
print """
*********************************************************************
* Using self-installed CC, CXX and FC. To use other compilers,
* remove --build-gcc and optionally set these 3 environment variables.
*********************************************************************
"""
sleep(1)
# set the base directory
current_dir=os.getcwd()
base_dir=os.path.join(current_dir,install_dir)
if not os.path.isdir(base_dir):
os.mkdir(base_dir)
opt_dir = os.path.join(base_dir,'opt')
if not os.path.isdir(opt_dir):
os.mkdir(opt_dir)
if not opts.src_dir:
src_dir = os.path.join(base_dir,'src')
else:
src_dir = os.path.join(current_dir,opts.src_dir)
if not os.path.isdir(src_dir):
os.mkdir(src_dir)
# store the used command line for easy repetition later
current_cmdline = []
current_cmdline.append('CC="%s"' % default_cc)
current_cmdline.append('CXX="%s"' % default_cxx)
current_cmdline.append('FC="%s"' % default_fc)
current_cmdline += sys.argv
with open(os.path.join(src_dir,'herwig_bootstrap_last_cmd'),'w') as f:
f.write(' '.join(current_cmdline)+'\n')
del current_cmdline
os.chdir(src_dir)
# set the environment variables
bin_dir = os.path.join(base_dir,'bin')
try:
os.environ['PATH'] = os.pathsep.join([bin_dir, os.environ['PATH']])
except KeyError:
os.environ['PATH'] = bin_dir
ld_env_name = 'LD_LIBRARY_PATH' if platform.system() != 'Darwin' else 'DYLD_LIBRARY_PATH'
libpaths = [os.path.join(base_dir,'lib')]
if platform.system() != 'Darwin':
libpaths.append(os.path.join(base_dir,'lib64'))
lib_dirs = os.pathsep.join(libpaths)
try:
os.environ[ld_env_name] = os.pathsep.join([lib_dirs, os.environ[ld_env_name]])
except KeyError:
os.environ[ld_env_name] = lib_dirs
python_path = os.pathsep.join([os.path.join(base_dir,'lib64','python'+sys.version[:3],'site-packages'),
os.path.join(base_dir,'lib', 'python'+sys.version[:3],'site-packages')])
try:
os.environ['PYTHONPATH'] = os.pathsep.join([python_path, os.environ['PYTHONPATH']])
except KeyError:
os.environ['PYTHONPATH'] = python_path
# storage of prefix info for individual packages
class Prefixes(dict):
# return None instead of raising KeyError for unknown package name
def __missing__(self, key):
return None
prefix = Prefixes()
def check_call(arglist):
print ' '.join(arglist)
subprocess.check_call(arglist)
# checkout
def checkout( location, base, version, repo, branch, repo_type='hg', revision=None) :
os.chdir(location)
if repo_type == 'hg':
directory=base
if version:
directory += "-"+version
if not os.path.isdir(directory):
check_call(["hg","clone",repo,directory])
else:
check_call(["hg","pull","-R",directory,repo])
os.chdir(os.path.join(location,directory))
if revision:
check_call(["hg","up","-r",revision])
else:
check_call(["hg","up",branch])
if os.access('Makefile',os.R_OK):
print 'Makefile exists, skipping autoreconf'
else:
check_call(["autoreconf","-vi"])
elif repo_type == "bzr":
check_call(["bzr","co",repo,base])
elif repo_type == "svn":
if revision:
check_call(["svn","checkout",repo+"/"+branch,base,"-r",revision])
else:
check_call(["svn","checkout",repo+"/"+branch,base])
os.chdir(os.path.join(location,base))
else:
sys.stderr.write('Only supports checkout from hg,svn or bzr\n')
exit(1)
def download_only(url_base,tar_name,distinct=False) :
if os.access(tar_name, os.R_OK):
print 'Found existing %s' % tar_name
return
if distinct:
program_url = url_base
else:
program_url = '%s/%s' % (url_base,tar_name)
print "Download %s as %s" % (program_url,tar_name)
req_headers = {
'User-Agent' : 'herwig-bootstrap',
'Accept' : '*/*'
}
request = urllib2.Request(program_url, headers=req_headers)
try:
try:
context = ssl.create_default_context()
response = urllib2.urlopen(request, context=context)
except AttributeError:
response = urllib2.urlopen(request)
except urllib2.HTTPError as e:
try:
reason = e.reason
except:
reason = ''
sys.stderr.write('Remote server returned error code %s: %s\n' % (e.code, reason))
exit(1)
except urllib2.URLError as e:
sys.stderr.write('Could not reach server: %s\n' % e.reason)
exit(1)
with open(tar_name,'w') as f:
f.write(response.read())
def download(url_base,tar_name,args=[],distinct=False) :
download_only(url_base,tar_name,distinct)
tar = tarfile.open(tar_name,'r')
lastfile = tar.getnames()[-1]
if os.access(lastfile, os.R_OK):
print 'Extracted %s exists already' % lastfile.split('/')[0]
else:
print "Extract %s" % tar_name
tar.extractall()
tar.close()
def compile(config_flags=[]) :
if os.access('Makefile',os.R_OK):
print 'Makefile exists, skipping configure'
else:
flags = ["./configure","--prefix="+base_dir]
flags += config_flags
check_call(flags)
check_call(["make","-s","-j%s" % opts.ncore])
# TODO ?? skip here if some file already exists in /lib or /bin ??
check_call(["make","-s","install"])
os.chdir(src_dir)
def downloadAndCompile(url_base,base_name,suffix,config_flags) :
download(url_base,base_name+suffix)
os.chdir(os.path.join(src_dir,base_name))
compile(config_flags)
def deletelibtool() :
os.chdir(base_dir)
for directory in ["lib","lib64","lib32"] :
full_path = os.path.join(base_dir,directory)
if os.path.isdir(full_path) :
check_call(["find",full_path,"-name","*.la","-delete"])
GCC_SUFFIX = '-herwig-%s' % opts.gcc_ver
def unsupported_gcc():
sys.stderr.write("Unsupported gcc version %s requested.\n" % opts.gcc_ver)
sys.exit(1)
def patch(project,patchtext):
os.chdir(os.path.join(src_dir,project))
print 'patching in', os.getcwd()
p = subprocess.Popen(['patch','-p1'], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
stdout_data, stderr_data = p.communicate(input=patchtext)
print stdout_data
print stderr_data
if p.returncode != 0:
sys.stderr.write('patch failed\n')
def buildgcc() :
# build gmp with --enable-fat to allow portability
# --enable-fat currently broken on Mac, see
# https://gmplib.org/repo/gmp/raw-rev/1fab0adc5ff7
gmp_fatoption = ['--enable-fat']
if platform.system() == 'Darwin':
gmp_fatoption = []
# build gmp
if marker_is_missing('gmp'):
downloadAndCompile('https://gmplib.org/download/gmp',"gmp-6.1.1",".tar.bz2",gmp_fatoption)
prefix['gmp']=base_dir
mark_as_done('gmp')
# build mpfr
if marker_is_missing('mpfr'):
downloadAndCompile('http://mpfr.loria.fr/mpfr-3.1.5',"mpfr-3.1.5",".tar.bz2",["--with-gmp="+base_dir])
prefix['mpfr']=base_dir
mark_as_done('mpfr')
# build mpc
if marker_is_missing('mpc'):
downloadAndCompile("http://www.multiprecision.org/mpc/download","mpc-1.0.3",".tar.gz",["--with-gmp="+base_dir,"--with-mpfr="+base_dir])
prefix['mpc']=base_dir
mark_as_done('mpc')
# gcc
download('http://nl.mirror.babylon.network/gcc/releases/gcc-'+opts.gcc_ver,
"gcc-"+opts.gcc_ver+".tar.bz2")
os.chdir("gcc-%s" % opts.gcc_ver)
obj_path=os.path.join(src_dir,"gcc-build")
if not os.access(obj_path, os.R_OK):
os.mkdir(obj_path)
os.chdir(obj_path)
else:
os.chdir(obj_path)
# don't use check_call here, the command may not always complete OK
subprocess.call(["make","distclean"])
try:
gcc_version = map(int,opts.gcc_ver.split(".")[:2])
except:
sys.stderr.write('Unknown gcc version format. Expecting "N.N.N".\n')
exit(1)
flags=["../gcc-"+opts.gcc_ver+"/configure",
"--prefix="+base_dir,
"--program-suffix="+GCC_SUFFIX,
"--disable-multilib"]
if gcc_version[0] <= 3:
unsupported_gcc()
elif gcc_version[0] >= 4:
if gcc_version[0] == 4 and gcc_version[1] < 8:
unsupported_gcc()
else:
flags.append("--enable-languages=c,c++,fortran")
flags.append("--with-gmp="+base_dir)
flags.append("--with-mpfr="+base_dir)
if gcc_version[0] >= 4:
flags.append("--with-mpc="+base_dir)
# if gcc_version[0] == 4 and gcc_version[1] == 9 and platform.system() == 'Darwin':
# flags.append('--with-build-config=bootstrap-debug')
check_call(flags)
check_call(["make","-s","-j"+str(opts.ncore)])
check_call(["make","-s","install"])
deletelibtool()
os.chdir(src_dir)
def lockfile_path(name,version):
if version:
version = '_' + version.replace('.','_')
path = os.path.join(src_dir,
'herwig_bootstrap_%s%s_done' % (name,version))
return path
def mark_as_done(name,version=''):
lfpath = lockfile_path(name,version)
with open(lfpath, 'w') as f:
f.write('%s\n' % prefix[name])
def build_needed(name,version=''):
alternate_path = getattr(opts,'%s_loc' % name,False)
if alternate_path:
print 'Alternative given for %s.\nUsing %s' % (name, alternate_path)
prefix[name] = alternate_path
return False
cmdline_flag_set = getattr(opts,name,False) # default to false if not found
if cmdline_flag_set:
return marker_is_missing(name,version)
else:
return False
def marker_is_missing(name,version=''):
lfpath = lockfile_path(name,version)
try:
with open(lfpath) as f:
prefixpath = f.readline().rstrip()
except EnvironmentError:
return True
else:
print 'Marker file for %s%s exists in src/, skipping build,' % (name,version)
print ' using prefix=%s.' % prefixpath
prefix[name] = prefixpath
return False
# download and compile gcc
if build_needed('gcc'):
buildgcc()
mark_as_done('gcc')
if opts.gcc:
default_cc = os.path.join(base_dir,'bin','gcc%s' % GCC_SUFFIX)
default_cxx = os.path.join(base_dir,'bin','g++%s' % GCC_SUFFIX)
default_cxx += " %s" % opts.cxx11
default_fc = os.path.join(base_dir,'bin','gfortran%s' % GCC_SUFFIX)
os.environ['CC'] = default_cc
os.environ['CXX'] = default_cxx
os.environ['FC'] = default_fc
os.environ['F77'] = default_fc
if build_needed('gengetopt'):
tmp_ncore=opts.ncore
opts.ncore=1
downloadAndCompile("ftp://ftp.gnu.org/gnu/gengetopt/",
"gengetopt-2.22.6",".tar.gz",[])
opts.ncore=tmp_ncore
mark_as_done('gengetopt')
# install boost if required
if build_needed('boost'):
boost_ver2=opts.boost_ver.replace(".","_")
boost_base = "boost_"+ boost_ver2
download("http://sourceforge.net/projects/boost/files/boost/"+ opts.boost_ver,
boost_base+".tar.bz2")
os.chdir(os.path.join(src_dir,boost_base))
# make sure we use our own compiler
# this works as long as default_cxx is sufficiently gcc-like
# need to separate out the cxxflag addition
boost_cxx = ' '.join(default_cxx.split(' ')[:-1])
boost_cxxflags = opts.cxx11
with open('tools/build/src/user-config.jam','w') as f:
f.write('using gcc : : "%s" : <cxxflags>"%s" ;\n'
% (boost_cxx, boost_cxxflags))
if opts.boost_minimal:
check_call(["./bootstrap.sh","--prefix="+base_dir,'threading=multi',"--with-libraries=filesystem,system,test"])
else :
check_call(["./bootstrap.sh","--prefix="+base_dir,'threading=multi'])
check_call(["./b2","--layout=tagged","install","-j"+str(opts.ncore)])
os.chdir(src_dir)
# on OS X, write helper script
if platform.system() == 'Darwin':
helpername='./boost-osx-path-fix'
with open(helpername,'w') as f:
f.write(
"""\
#!/bin/bash
for i in %s/lib*/libboost*.dylib
do
install_name_tool -id $i $i || true
if [ $(basename $i) == 'libboost_filesystem-mt.dylib' ]; then
install_name_tool -change libboost_system-mt.dylib $(dirname $i)/libboost_system-mt.dylib $i || true
fi
done
""" % base_dir)
os.chmod(helpername,0755)
check_call([helpername])
prefix['boost']=base_dir
mark_as_done('boost')
# install gsl if required
if build_needed('gsl'):
downloadAndCompile("http://www.mirrorservice.org/sites/ftp.gnu.org/gnu/gsl",
"gsl-"+opts.gsl_ver,".tar.gz",
[])
prefix['gsl']=base_dir
mark_as_done('gsl')
# install fastjet if required
if build_needed('fastjet'):
downloadAndCompile("http://fastjet.fr/repo",
"fastjet-"+opts.fastjet_ver,".tar.gz",
["--enable-allcxxplugins"])
prefix['fastjet']=base_dir
mark_as_done('fastjet')
# install hepmc if needed
if build_needed('hepmc'):
downloadAndCompile("http://lcgapp.cern.ch/project/simu/HepMC/download",
"HepMC-"+opts.hepmc_ver,".tar.gz",
["--with-momentum=GEV","--with-length=MM"])
prefix['hepmc']=base_dir
mark_as_done('hepmc')
# install lhapdf if needed
if build_needed('lhapdf'):
args=[]
if prefix['boost']:
args.append("--with-boost="+prefix['boost'])
download("http://www.hepforge.org/archive/lhapdf",
"LHAPDF-"+opts.lhapdf_ver+".tar.gz")
patch("LHAPDF-"+opts.lhapdf_ver,
"""\
diff -r 170b3a75d236 -r 3afd802d43f9 wrappers/python/Makefile.in
--- a/wrappers/python/Makefile.in Wed Sep 28 16:52:54 2016 +0100
+++ b/wrappers/python/Makefile.in Mon Nov 21 15:55:49 2016 +0100
@@ -268,3 +268,3 @@
FIXSOURCES = $(EXTRA_DIST)
-@WITH_PYTHON_TRUE@PYEXT_ENV = CC=$(CC) CXX=$(CXX)
+@WITH_PYTHON_TRUE@PYEXT_ENV = CC="$(CC)" CXX="$(CXX)"
all: all-am
""")
# add "" to PY_ENV in wrappers/python/Makefile
compile(args)
for pdf in opts.pdfs :
lhapdftool = os.path.join(base_dir,'bin','lhapdf')
check_call([lhapdftool,
'--listdir='+os.path.join(base_dir,'share','LHAPDF'),
'--pdfdir='+os.path.join(base_dir,'share','LHAPDF'),
"install",
pdf])
prefix['lhapdf']=base_dir
mark_as_done('lhapdf')
if opts.lhapdf:
os.environ['LHAPATH'] = os.path.join(base_dir,'share','LHAPDF')
# install yoda if needed
if build_needed('yoda'):
# from tar ball
if not opts.yoda_hg:
download("http://www.hepforge.org/archive/yoda",
"YODA-"+opts.yoda_ver+".tar.bz2")
os.chdir(os.path.join(src_dir,"YODA-"+opts.yoda_ver))
else :
if opts.yoda_ver :
if len(opts.yoda_ver)==5:
branch="yoda-"+opts.yoda_ver
else :
branch=opts.yoda_ver
else :
branch=""
checkout(src_dir,"YODA",opts.yoda_ver,opts.yoda_repo,branch)
args=[]
if prefix['boost']:
args.append("--with-boost="+prefix['boost'])
compile(args)
prefix['yoda']=base_dir
mark_as_done('yoda')
# install rivet if needed
if build_needed('rivet'):
# from tar ball
if not opts.rivet_hg:
download("http://www.hepforge.org/archive/rivet",
"Rivet-"+opts.rivet_ver+".tar.bz2")
os.chdir(os.path.join(src_dir,"Rivet-"+opts.rivet_ver))
else:
if len(opts.rivet_ver)==5:
branch="rivet-"+opts.rivet_ver
else:
branch=opts.rivet_ver
checkout(src_dir,"Rivet",opts.rivet_ver,opts.rivet_repo,branch)
args = ["--enable-unvalidated"]
for tool in ['boost','gsl','yoda','hepmc','fastjet']:
if prefix[tool]:
args.append( "--with-%s=%s" % (tool,prefix[tool]) )
compile(args)
prefix['rivet']=base_dir
mark_as_done('rivet')
opts.thepeg_hg = True # TODO AFTER RELEASE
# install thepeg if needed
if build_needed('thepeg',opts.thepeg_ver):
# from tar ball
if not opts.thepeg_hg:
download("http://www.hepforge.org/archive/thepeg","ThePEG-"+opts.thepeg_ver+".tar.bz2")
os.chdir(os.path.join(src_dir,"ThePEG-"+opts.thepeg_ver))
else:
if len(opts.thepeg_ver)==5:
branch="release-"+opts.thepeg_ver[:3].replace(".","-")
else:
branch=opts.thepeg_ver
checkout(src_dir,"ThePEG",opts.thepeg_ver,opts.thepeg_repo,branch)
args=[]
for tool in ['boost','gsl','rivet','hepmc','fastjet','lhapdf']:
if prefix[tool]:
args.append( "--with-%s=%s" % (tool,prefix[tool]) )
compile(args)
prefix['thepeg']=base_dir
mark_as_done('thepeg',opts.thepeg_ver)
# install madgraph
if build_needed('madgraph'):
# from tar ball
if not opts.madgraph_bzr:
mg_name = "MG5_aMC_v"+opts.madgraph_ver.replace(".","_")
# TODO need to work out path more intelligently. Breaks for non 2.5 releases
download("https://launchpad.net/mg5amcnlo/2.0/2.5.x/+download","MG5_aMC_v"+opts.madgraph_ver+".tar.gz")
prefix['madgraph']=os.path.join(opt_dir, mg_name)
print os.path.join(src_dir, mg_name), os.path.join(opt_dir, mg_name)
shutil.move(os.path.join(src_dir, mg_name), os.path.join(opt_dir, mg_name))
del mg_name
else :
checkout(opt_dir,"madgraph",opts.madgraph_ver,opts.madgraph_repo,"",'bzr')
prefix['madgraph']=os.path.join(opt_dir,"madgraph")
os.chdir(src_dir)
mark_as_done('madgraph')
# install the NLO codes if needed
# install njet if required
if build_needed('njet'):
download("https://bitbucket.org/njet/njet/downloads",
"njet-"+opts.njet_ver+".tar.gz")
patch("njet-"+opts.njet_ver,
"""\
diff blha/njet_olp.cpp
--- a/blha/njet_olp.cpp 2014-04-25 12:38:30.000000000 +0100
+++ b/blha/njet_olp.cpp 2016-11-22 12:44:34.187725299 +0000
@@ -1076,12 +1076,12 @@
string line;
int linenum = 0;
- while (is_good && (is_good = getline(*input, line))) {
+ while (is_good && (is_good = bool(getline(*input, line)))) {
linenum++;
if (line.find(SIGNPREF) == 0) {
is_njet = true;
if (stringstream(line.substr(SIGNPREF.length())) >> signval) {
- is_good = getline(*input, line);
+ is_good = bool(getline(*input, line));
linenum++;
body.push_back(line);
continue;
""")
compile(["--disable-autoflags",
"FC="+default_fc,
"F77="+default_fc])
prefix['njet']=base_dir
mark_as_done('njet')
OPENLOOPS_CONFIG = """\
[OpenLoops]
fortran_compiler = {fc}
# fortran_tool = 'gfortran'
compile_extra = 0
"""
# install openloops if needed
if build_needed('openloops'):
checkout(opt_dir,"OpenLoops",opts.openloops_ver,opts.openloops_repo,opts.openloops_ver,'svn',
revision='1945')
with open('openloops.cfg','w') as f:
f.write(OPENLOOPS_CONFIG.format(fc=default_fc))
# We know our gcc works. Disable the strange test that uses the system version number.
if opts.gcc:
searchtext = "env.subst('$CCVERSION').split('.')[:2])) < (4,6)"
with open('tmp.tmp','w') as outfile:
with open('SConstruct') as infile:
for line in infile:
outfile.write(line.replace(searchtext, searchtext + " and False"))
shutil.move('tmp.tmp','SConstruct')
del searchtext
check_call(["./openloops",
"libinstall",
opts.openloops_processes,
"num_jobs=%s" % opts.ncore
])
os.chdir(src_dir)
prefix['openloops']=opt_dir+"/OpenLoops"
mark_as_done('openloops')
# install gosam if needed
if build_needed('gosam'):
# build qgraf
if marker_is_missing('qgraf'):
download('https://www.hepforge.org/archive/herwig/mirror',"qgraf-3.1.4.tgz")
os.chdir(os.path.join(src_dir,'qgraf-3.1.4'))
check_call([default_fc,'qgraf-3.1.4.f','-o','qgraf','-O2'])
shutil.move('qgraf',os.path.join(bin_dir,'qgraf'))
prefix['qgraf']=base_dir
os.chdir(src_dir)
mark_as_done('qgraf')
# build form
if marker_is_missing('form'):
downloadAndCompile('https://gosam.hepforge.org/gosam-installer',"form-4.1",".tar.gz",[])
prefix['form']=base_dir
mark_as_done('form')
# build gosam-contrib
if marker_is_missing('gosam-contrib'):
download('https://www.hepforge.org/archive/gosam/gosam-contrib-2.0-20150803.tar.gz',
"gosam-contrib-2.0.tar.gz", distinct=True)
os.chdir(os.path.join(src_dir,'gosam-contrib-2.0'))
# Gosams build system sometimes hangs and needs a second trial
try:
compile([])
except subprocess.CalledProcessError:
compile([])
prefix['gosam-contrib']=base_dir
mark_as_done('gosam-contrib')
download('https://www.hepforge.org/archive/gosam/','gosam-2.0.3-4146ab2.tar.gz')
os.chdir(os.path.join(src_dir,'gosam-2.0.3'))
check_call(["./setup.py",
"install",
"--prefix="+base_dir,
"-f"])
os.chdir(src_dir)
prefix['gosam']=base_dir
mark_as_done('gosam')
# install vbfnlo if required
if build_needed('vbfnlo'):
download("https://www.itp.kit.edu/vbfnlo/archive","vbfnlo-"+opts.vbfnlo_ver+".tgz")
os.chdir(os.path.join(src_dir,"VBFNLO-"+opts.vbfnlo_ver))
# work around VBFNLO's broken handwritten compiler checks
del os.environ['F77']
check_call(["./configure","--prefix="+base_dir,"--enable-processes="+opts.vbfnlo_processes])
check_call(["make","-s","-j%s"%opts.ncore])
check_call(["make","-s","install"])
# reinsert F77 for the others
os.environ['F77'] = default_fc
os.chdir(src_dir)
prefix['vbfnlo']=base_dir
mark_as_done('vbfnlo')
# install TAUOLA if needed
if False: # build_needed('tauola'):
download("http://tauolapp.web.cern.ch/tauolapp/resources/TAUOLA." + opts.tauola_ver,
"TAUOLA." + opts.tauola_ver + ".tar.gz")
os.chdir(os.path.join(src_dir,"TAUOLA"))
args=["./configure","--prefix="+base_dir]
if prefix['hepmc']:
args.append("--with-hepmc="+prefix['hepmc'])
check_call(args)
check_call(["make"])
check_call(["make","install"])
os.chdir(src_dir)
prefix['tauola']=base_dir
mark_as_done('tauola')
# install PHOTOS if needed
if False: # build_needed('photos'):
download("http://photospp.web.cern.ch/photospp/resources/PHOTOS."+opts.photos_ver,
"PHOTOS."+opts.photos_ver+".tar.gz")
os.chdir(os.path.join(src_dir,"PHOTOS"))
args=["./configure","--prefix="+base_dir]
if prefix['hepmc']:
args.append("--with-hepmc="+prefix['hepmc'])
check_call(args)
check_call(["make","-j%s" % opts.ncore])
check_call(["make","install"])
os.chdir(src_dir)
prefix['photos']=base_dir
mark_as_done('photos')
# install Pytiha8 if needed
if build_needed('pythia'):
pythia_version = opts.pythia_ver.replace(".","")
download("http://home.thep.lu.se/~torbjorn/pythia8","pythia%s.tgz" % pythia_version)
os.chdir(os.path.join(src_dir,"pythia%s" % pythia_version))
args=["./configure",
"--prefix=%s" % base_dir,
"--enable-shared",]
### newer versions need this instead of USRCXXFLAGS
### "--cxx-common='-O2 -pedantic -W -Wall -Wshadow'"]
if prefix['hepmc']:
args.append("--with-hepmc=%s" % prefix['hepmc'])
args.append("--with-hepmcversion=%s" % opts.hepmc_ver)
else:
args.append("--without-hepmc")
os.environ['USRCXXFLAGS'] = opts.cxx11
check_call(args)
check_call(["make","-j%s" % opts.ncore])
check_call(["make","-s","install"])
del os.environ['USRCXXFLAGS']
os.chdir(src_dir)
prefix['pythia'] = base_dir
mark_as_done('pythia')
# install EvtGen if needed
if build_needed('evtgen'):
download("http://evtgen.warwick.ac.uk/static/srcrep/"+opts.evtgen_ver,
"EvtGen."+opts.evtgen_ver+".tar.gz")
os.chdir(os.path.join(src_dir,"EvtGen",opts.evtgen_ver))
# don't use check_call here, the command may not always complete OK
subprocess.call(["make","distclean"])
patch('EvtGen/%s' % opts.evtgen_ver,
"""\
-$ diff -u configure
---- a/configure 2015-10-16 17:46:15.000000000 +0200
-+++ b/configure 2016-11-22 17:30:48.000000000 +0100
-@@ -156,12 +156,12 @@
- #
- # User-changeable part, experts -----------------------------
+$ diff -U1 configure
+--- a/configure 2015-10-16 17:46:15.000000000 +0200
++++ b/configure 2016-11-23 10:55:45.000000000 +0100
+@@ -158,3 +158,3 @@
#
-CXX=g++
+CXX="%s"
CXXFLAGS_OPT="-O2 -Wall"
- CXXFLAGS_DBG="-g -Wall"
- CFLAGS_OPT=-O2
+@@ -163,3 +163,3 @@
CFLAGS_DBG=-g
-FC=gfortran
+FC="%s"
FFLAGS_OPT="-O2 -Wuninitialized"
- FFLAGS_DBG=-g
-
-@@ -178,1 +178,1 @@
+@@ -177,4 +177,4 @@
+ ARCH=`uname`
-theGcc=`g++ --version | grep '[0-9]\.[0-9]\.[0-9]' -o | head -1 | awk -F . '{print $1}'`
+-if [ ${theGcc} = 4 ]; then
+theGcc=`$CXX --version | grep '[0-9]\.[0-9]\.[0-9]' -o | head -1 | awk -F . '{print $1}'`
-@@ -237,1 +237,1 @@
++if [ ${theGcc} -ge 4 ]; then
+ ARCH=${ARCH}-gcc4
+@@ -222,3 +222,6 @@
+ CXXFLAGS="${CXXFLAGS_OPT}"
+- FLIBS="-lgfortran -lgfortranbegin"
++ FLIBS="-lgfortran"
++ if [ ${theGcc} = 4 ]; then
++ FLIBS="$FLIBS -lgfortranbegin"
++ fi
+ if [ ${COMPMODE} = OPT ]; then
+@@ -236,3 +239,3 @@
+ # Add C++11 options if required
-theGcc2=`g++ --version | grep '[0-9]\.[0-9]\.[0-9]' -o | head -1 | awk -F . '{print $2}'`
+theGcc2=`$CXX --version | grep '[0-9]\.[0-9]\.[0-9]' -o | head -1 | awk -F . '{print $2}'`
-@@ -253,7 +253,7 @@
-
- # Mac OS platform with gcc4
+ gccVar=`echo $theGcc`
+@@ -255,3 +258,3 @@
if [[ $ARCH == Darwin* ]]; then
- tt=`gfortran -print-search-dirs|grep libraries|cut -d'=' -f2|sed 's/:/ /g'`
+ tt=`$FC -print-search-dirs|grep libraries|cut -d'=' -f2|sed 's/:/ /g'`
LIBGFORTRANLOCATION=''
- for i in $tt
- do
""" % (default_cxx, default_fc))
if platform.system() == 'Darwin':
patch('EvtGen/%s' % opts.evtgen_ver,
"""\
$ diff -u configure
--- a/configure 2016-11-22 17:37:50.000000000 +0100
+++ b/configure 2016-11-22 22:46:06.000000000 +0100
@@ -309,10 +309,10 @@
LIBDIR_ARCHIVE = \$(EVTGENDIR)/lib/archive
LIBDIRLIST = -lEvtGen
-LIB_SHARED = \$(LIBDIR_SHARED)/lib\$(GENERATOR).so
+LIB_SHARED = \$(LIBDIR_SHARED)/lib\$(GENERATOR).dylib
LIB_ARCHIVE = \$(LIBDIR_ARCHIVE)/lib\$(GENERATOR).a
-LIBEXT_SHARED = \$(LIBDIR_SHARED)/lib\$(GENERATOR)External.so
+LIBEXT_SHARED = \$(LIBDIR_SHARED)/lib\$(GENERATOR)External.dylib
LIBEXT_ARCHIVE = \$(LIBDIR_ARCHIVE)/lib\$(GENERATOR)External.a
# Flags:
"""
)
args=["./configure","--prefix="+base_dir]
if prefix['hepmc']:
args.append("--hepmcdir="+prefix['hepmc'])
# if prefix['tauola']:
# args.append("--tauoladir="+prefix['tauola'])
# if prefix['photos']:
# args.append("--photosdir="+prefix['photos'])
if prefix['pythia']:
args.append("--pythiadir="+prefix['pythia'])
check_call(args)
check_call(["make","-j1"])
check_call(["make","install"])
os.chdir(src_dir)
prefix['evtgen']=base_dir
mark_as_done('evtgen')
# install herwig if needed
if build_needed('herwig',opts.herwig_ver):
# from tar ball
if not opts.herwig_hg:
download("http://www.hepforge.org/archive/herwig","Herwig-"+opts.herwig_ver+".tar.bz2")
os.chdir(os.path.join(src_dir,"Herwig-"+opts.herwig_ver))
else:
if len(opts.herwig_ver)==5:
branch = "herwig-"+opts.herwig_ver[:3].replace(".","-")
else:
branch = opts.herwig_ver
checkout(src_dir,"Herwig",opts.herwig_ver,opts.herwig_repo,branch)
args=[]
for tool in ['thepeg','boost','gsl','fastjet',
'madgraph','njet','openloops','gosam','vbfnlo',
'pythia','evtgen']:
if prefix[tool]:
args.append( "--with-%s=%s" % (tool,prefix[tool]) )
compile(args)
prefix['herwig']=base_dir
mark_as_done('herwig',opts.herwig_ver)
# need to have Herwig if we want HJets++
if not opts.herwig:
opts.hjets = False
# install hjets if needed
if build_needed('hjets'):
# from tar ball
if not opts.hjets_hg:
download("http://www.hepforge.org/archive/hjets",
"HJets-"+opts.hjets_ver+".tar.bz2")
os.chdir(os.path.join(src_dir,"HJets-"+opts.hjets_ver))
else :
if len(opts.hjets_ver)==3:
branch = "release "+opts.hjets_ver
else:
branch = opts.hjets_ver
checkout(src_dir,"HJets",opts.hjets_ver,opts.hjets_repo,branch)
args=[]
args.append("--with-herwig="+prefix['herwig'])
del os.environ['F77']
compile(args)
os.environ['F77'] = default_fc
prefix['hjets']=base_dir
lib_dirs = os.pathsep.join([os.path.join(prefix['hjets'], 'lib64','HJets'),
os.path.join(prefix['hjets'], 'lib','HJets'),
lib_dirs])
mark_as_done('hjets')
# generate an 'activate' shell include like python's virtualenv does
from string import Template
class ShellTemplate(Template):
delimiter = '@'
ACTIVATE = ShellTemplate("""\
# Herwig bootstrap 'activate',
# based on Python's virtualenv mechanism
# This file must be used with "source @{bin_dir}/activate"
# *from bash or zsh*. You cannot run it directly.
deactivate () {
# reset old environment variables
if [ "${_OLD_VIRTUAL_PATH-}" = "Unset" ] ; then
unset PATH
unset _OLD_VIRTUAL_PATH
elif [ -n "${_OLD_VIRTUAL_PATH-}" ] ; then
PATH="$_OLD_VIRTUAL_PATH"
export PATH
unset _OLD_VIRTUAL_PATH
fi
if [ "${_OLD_VIRTUAL_PYTHONPATH-}" = "Unset" ] ; then
unset PYTHONPATH
unset _OLD_VIRTUAL_PYTHONPATH
elif [ -n "${_OLD_VIRTUAL_PYTHONPATH-}" ] ; then
PYTHONPATH="$_OLD_VIRTUAL_PYTHONPATH"
export PYTHONPATH
unset _OLD_VIRTUAL_PYTHONPATH
fi
if [ "${_OLD_VIRTUAL_LHAPATH-}" = "Unset" ] ; then
unset LHAPATH
unset _OLD_VIRTUAL_LHAPATH
elif [ -n "${_OLD_VIRTUAL_LHAPATH-}" ] ; then
LHAPATH="$_OLD_VIRTUAL_LHAPATH"
export LHAPATH
unset _OLD_VIRTUAL_LHAPATH
fi
if [ "${_OLD_VIRTUAL_@{ld_env_name}-}" = "Unset" ] ; then
unset @{ld_env_name}
unset _OLD_VIRTUAL_@{ld_env_name}
elif [ -n "${_OLD_VIRTUAL_@{ld_env_name}-}" ] ; then
@{ld_env_name}="$_OLD_VIRTUAL_@{ld_env_name}"
export @{ld_env_name}
unset _OLD_VIRTUAL_@{ld_env_name}
fi
if [ "${_OLD_VIRTUAL_CC-}" = "Unset" ] ; then
unset CC
unset _OLD_VIRTUAL_CC
elif [ -n "${_OLD_VIRTUAL_CC-}" ] ; then
CC="$_OLD_VIRTUAL_CC"
export CC
unset _OLD_VIRTUAL_CC
fi
if [ "${_OLD_VIRTUAL_CXX-}" = "Unset" ] ; then
unset CXX
unset _OLD_VIRTUAL_CXX
elif [ -n "${_OLD_VIRTUAL_CXX-}" ] ; then
CXX="$_OLD_VIRTUAL_CXX"
export CXX
unset _OLD_VIRTUAL_CXX
fi
if [ "${_OLD_VIRTUAL_FC-}" = "Unset" ] ; then
unset FC
unset _OLD_VIRTUAL_FC
elif [ -n "${_OLD_VIRTUAL_FC-}" ] ; then
FC="$_OLD_VIRTUAL_FC"
export FC
unset _OLD_VIRTUAL_FC
fi
if [ "${_OLD_VIRTUAL_F77-}" = "Unset" ] ; then
unset F77
unset _OLD_VIRTUAL_F77
elif [ -n "${_OLD_VIRTUAL_F77-}" ] ; then
F77="$_OLD_VIRTUAL_F77"
export F77
unset _OLD_VIRTUAL_F77
fi
# This should detect bash and zsh, which have a hash command that must
# be called to get it to forget past commands. Without forgetting
# past commands the $PATH changes we made may not be respected
if [ -n "${BASH-}" -o -n "${ZSH_VERSION-}" ] ; then
hash -r 2>/dev/null
fi
if [ -n "${_OLD_VIRTUAL_PS1-}" ] ; then
PS1="$_OLD_VIRTUAL_PS1"
export PS1
unset _OLD_VIRTUAL_PS1
fi
unset HERWIG_ENV
if [ ! "${1-}" = "nondestructive" ] ; then
# Self destruct!
unset -f deactivate
fi
}
# unset irrelevant variables
deactivate nondestructive
HERWIG_ENV="@{base_dir}"
export HERWIG_ENV
_OLD_VIRTUAL_PATH="${PATH-Unset}"
PATH="@{bin_dir}:$PATH"
export PATH
_OLD_VIRTUAL_PYTHONPATH="${PYTHONPATH-Unset}"
PYTHONPATH="@{python_path}:$PYTHONPATH"
export PYTHONPATH
_OLD_VIRTUAL_LHAPATH="${LHAPATH-Unset}"
LHAPATH="@{lha_path}:$LHAPATH"
export LHAPATH
_OLD_VIRTUAL_@{ld_env_name}="${@{ld_env_name}-Unset}"
@{ld_env_name}="@{lib_dirs}:$@{ld_env_name}"
export @{ld_env_name}
_OLD_VIRTUAL_CC="${CC-Unset}"
CC="@{default_cc}"
export CC
_OLD_VIRTUAL_CXX="${CXX-Unset}"
CXX="@{default_cxx}"
export CXX
_OLD_VIRTUAL_FC="${FC-Unset}"
FC="@{default_fc}"
export FC
_OLD_VIRTUAL_F77="${F77-Unset}"
F77="@{default_fc}"
export F77
if [ -z "${HERWIG_ENV_DISABLE_PROMPT-}" ] ; then
_OLD_VIRTUAL_PS1="$PS1"
if [ "x" != x ] ; then
PS1="$PS1"
else
PS1="(`basename \"$HERWIG_ENV\"`)$PS1"
fi
export PS1
fi
# This should detect bash and zsh, which have a hash command that must
# be called to get it to forget past commands. Without forgetting
# past commands the $PATH changes we made may not be respected
if [ -n "${BASH-}" -o -n "${ZSH_VERSION-}" ] ; then
hash -r 2>/dev/null
fi
""")
subs = {
'ld_env_name' : ld_env_name,
'bin_dir' : bin_dir,
'base_dir' : base_dir,
'python_path' : python_path,
'lib_dirs' : lib_dirs,
'default_cc' : os.path.basename(default_cc),
'default_cxx' : os.path.basename(default_cxx),
'default_fc' : os.path.basename(default_fc),
'lha_path' : os.path.join(base_dir,'share','LHAPDF')
}
activate_file = os.path.join(bin_dir,'activate')
with open(activate_file,'w') as f:
f.write(ACTIVATE.substitute(subs))
# back to the original directory
os.chdir(current_dir)
try:
path_to_activate = os.path.join(os.path.relpath(bin_dir,current_dir),'activate')
except:
path_to_activate = activate_file
print """
################ / / ^^/ ##########################
############### /--/ / ###########################
############## / / / ############################
Herwig 7 bootstrap was successful.
$ source %s
activates all required environment variables.
$ deactivate
returns to the original environment variables.
""" % path_to_activate

File Metadata

Mime Type
text/x-diff
Expires
Tue, Nov 19, 3:27 PM (1 d, 18 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3804949
Default Alt Text
(46 KB)

Event Timeline