Page Menu
Home
HEPForge
Search
Configure Global Search
Log In
Files
F2079225
herwig-bootstrap
sidsule (Siddharth Sule)
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Authored By
sidsule
Aug 9 2023, 2:57 PM
2023-08-09 14:57:58 (UTC+1)
Size
54 KB
Referenced Files
None
Subscribers
None
herwig-bootstrap
View Options
#!/usr/bin/env python
import
subprocess
,
glob
import
sys
,
os
,
errno
,
platform
,
shutil
,
ssl
try
:
from
urllib.request
import
Request
as
Request
from
urllib.request
import
urlopen
as
urlopen
from
urllib.error
import
URLError
as
URLError
from
urllib.error
import
HTTPError
as
HTTPError
except
ImportError
:
from
urllib2
import
Request
as
Request
from
urllib2
import
urlopen
as
urlopen
from
urllib2
import
URLError
as
URLError
from
urllib2
import
HTTPError
as
HTTPError
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'
,
'/opt/homebrew/bin/gfortran'
)
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. [DEST_DIR/src]'
)
# lite optin (build a minimal set of packages)
def
lite
(
option
,
opt
,
value
,
parser
):
non_lite_components
=
[
'vbfnlo'
,
'madgraph'
,
'evtgen'
,
'yoda'
,
'njet'
,
'gosam'
,
'openloops'
,
'hjets'
,
'rivet'
,
'fastjet_contrib'
,
'pythia'
]
for
program
in
non_lite_components
:
setattr
(
parser
.
values
,
program
,
False
)
pass
parser_misc
.
add_option
(
"--lite"
,
action
=
"callback"
,
callback
=
lite
,
help
=
'Build the minimal set of packages to run Herwig'
)
# 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
=
"[
%d
efault]"
)
# 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
=
'12.2.0'
,
dest
=
"gcc_ver"
,
help
=
"[
%d
efault]"
)
# C++ 14
parser
.
add_option
(
"--c++14-flag"
,
metavar
=
"'...'"
,
type
=
'string'
,
dest
=
"cxx14"
,
default
=
'-std=c++14'
,
help
=
"Compiler flag which enables C++14 compatibility. ['
%d
efault']"
)
# 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.80.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.7"
)
# flags for fastjet
setUpFlags
(
parser_core
,
"fastjet"
,
"3.4.0"
)
# flags for fastjet
setUpFlags
(
parser_core
,
"fastjet_contrib"
,
"1.050"
)
# flags for hepmc
setUpFlags
(
parser_core
,
"hepmc"
,
"3.2.5"
)
# flags for lhapdf
setUpFlags
(
parser_core
,
"lhapdf"
,
"6.5.3"
)
parser_misc
.
add_option
(
"--add-pdf"
,
metavar
=
'PDF'
,
action
=
'append'
,
dest
=
"pdfs"
,
default
=
[
"MMHT2014lo68cl"
,
"MMHT2014nlo68cl"
,
"CT14lo"
,
"CT14nlo"
],
help
=
'Add a PDF to the defaults
%d
efault'
)
# flags for yoda
setUpFlags
(
parser_core
,
"yoda"
,
"1.9.8"
)
parser_scm
.
add_option
(
"--yoda-git"
,
action
=
'store_true'
,
dest
=
"yoda_git"
,
default
=
False
,
help
=
''
)
parser_scm
.
add_option
(
"--yoda-repo"
,
metavar
=
'URL'
,
type
=
'string'
,
default
=
"https://gitlab.com/hepcedar/yoda.git"
,
dest
=
'yoda_repo'
,
help
=
'[
%d
efault]'
)
parser_misc
.
add_option
(
"--yoda-disable-root"
,
action
=
'store_false'
,
dest
=
'yoda_root'
,
default
=
True
,
help
=
'Configure YODA with the --disable-root option.'
)
# flags for rivet
setUpFlags
(
parser_core
,
"rivet"
,
"3.1.8"
)
parser_scm
.
add_option
(
"--rivet-git"
,
action
=
'store_true'
,
dest
=
"rivet_git"
,
default
=
False
,
help
=
''
)
parser_scm
.
add_option
(
"--rivet-repo"
,
metavar
=
'URL'
,
type
=
'string'
,
default
=
"https://gitlab.com/hepcedar/rivet.git"
,
dest
=
'rivet_repo'
,
help
=
'[
%d
efault]'
)
# flags for thepeg
setUpFlags
(
parser_core
,
"thepeg"
,
"2.3.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://phab.hepforge.org/source/thepeghg/"
,
dest
=
'thepeg_repo'
,
help
=
'[
%d
efault]'
)
# flags for herwig
setUpFlags
(
parser_core
,
"herwig"
,
"7.3.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://phab.hepforge.org/source/herwighg/"
,
dest
=
'herwig_repo'
,
help
=
' [
%d
efault]'
)
# madgraph
setUpFlags
(
parser_nlo
,
"madgraph"
,
"3.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
=
'[
%d
efault]'
)
# flags for njet
setUpFlags
(
parser_nlo
,
"njet"
,
"2.1.1"
)
# flags for vbfnlo
setUpFlags
(
parser_nlo
,
"vbfnlo"
,
"3.0.0beta5"
)
parser_misc
.
add_option
(
"--vbfnlo-processes"
,
metavar
=
'PROCS'
,
type
=
'string'
,
default
=
"vbf,hjjj"
,
dest
=
'vbfnlo_processes'
,
help
=
'The processes for VBFNLO [
%d
efault]'
)
parser_scm
.
add_option
(
"--vbfnlo-git"
,
action
=
'store_true'
,
dest
=
"vbfnlo_git"
,
default
=
False
,
help
=
''
)
parser_scm
.
add_option
(
"--vbfnlo-repo"
,
metavar
=
'URL'
,
type
=
'string'
,
default
=
"https://github.com/vbfnlo/vbfnlo.git"
,
dest
=
'vbfnlo_repo'
,
help
=
'[
%d
efault]'
)
# flags for GoSam
setUpFlags
(
parser_nlo
,
"gosam"
,
""
)
# flags for OpenLoops
setUpFlags
(
parser_nlo
,
"openloops"
,
"2.1.2"
)
parser_scm
.
add_option
(
"--openloops-svn"
,
action
=
'store_true'
,
dest
=
"openloops_svn"
,
default
=
False
,
help
=
''
)
parser_scm
.
add_option
(
"--openloops-repo"
,
metavar
=
'URL'
,
type
=
'string'
,
default
=
"svn+ssh://phab.hepforge.org/source/openloopssvn/OpenLoops/"
,
dest
=
'openloops_repo'
,
help
=
'[
%d
efault]'
)
parser_misc
.
add_option
(
"--openloops-processes"
,
metavar
=
'PROCS'
,
type
=
'string'
,
default
=
"ppll"
,
dest
=
'openloops_processes'
,
help
=
'The processes for OpenLoops [
%d
efault]'
)
# flags for hjets
setUpFlags
(
parser_nlo
,
"hjets"
,
"1.3"
)
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
=
'[
%d
efault]'
)
## Dependencies for EvtGen
# pythia
setUpFlags
(
parser_core
,
"pythia"
,
None
)
# version needs to be held fixed at R01-07-00
setUpFlags
(
parser_core
,
"evtgen"
,
None
)
# 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. [
%d
efault]"
)
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++14
default_cxx
=
"
%s
%s
"
%
(
default_cxx
,
opts
.
cxx14
)
# gengetopt is always needed for Herwig hg build
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.
*********************************************************************
"""
)
# warnings and checks for python 3
if
sys
.
version_info
[
0
]
==
3
:
if
opts
.
madgraph
:
vtemp
=
opts
.
madgraph_ver
.
split
(
"."
)
for
i
in
range
(
0
,
len
(
vtemp
)):
vtemp
[
i
]
=
int
(
vtemp
[
i
])
if
(
vtemp
[
0
]
==
2
and
(
vtemp
[
1
]
<
7
or
(
vtemp
[
1
]
==
7
and
vtemp
[
2
]
<
3
)))
:
print
(
"Version
%s
of Madgraph is too old to work with python 3
\n
"
%
opts
.
madgraph_ver
)
print
(
"Please use at least 2.8.1
\n
"
)
quit
()
if
which
(
"cython"
)
is
None
and
which
(
"cython3"
)
is
None
:
print
(
"""Python 3 install needs cython to rebuild lhapdf, yoda and
rivet python interfaces
"""
)
quit
()
if
which
(
"autoreconf"
)
is
None
:
print
(
"Python 3 install needs autoreconf to rebuild lhapdf configure script
\n
"
)
quit
()
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
=
[
'CC="
%s
"'
%
default_cc
,
'CXX="
%s
"'
%
default_cxx
,
'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
iloc_python
=
3
try
:
int
(
sys
.
version
[
iloc_python
])
iloc_python
+=
1
except
:
pass
python_path
=
os
.
pathsep
.
join
([
os
.
path
.
join
(
base_dir
,
'lib64'
,
'python'
+
sys
.
version
[:
iloc_python
],
'site-packages'
),
os
.
path
.
join
(
base_dir
,
'lib'
,
'python'
+
sys
.
version
[:
iloc_python
],
'site-packages'
),
os
.
path
.
join
(
base_dir
,
'local'
,
'lib64'
,
'python'
+
sys
.
version
[:
iloc_python
],
'dist-packages'
),
os
.
path
.
join
(
base_dir
,
'local'
,
'lib'
,
'python'
+
sys
.
version
[:
iloc_python
],
'dist-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
==
'git'
:
directory
=
base
if
version
:
directory
+=
"-"
+
version
if
not
os
.
path
.
isdir
(
directory
):
check_call
([
"git"
,
"clone"
,
repo
,
directory
])
os
.
chdir
(
os
.
path
.
join
(
location
,
directory
))
else
:
os
.
chdir
(
os
.
path
.
join
(
location
,
directory
))
check_call
([
"git"
,
"pull"
])
if
revision
:
check_call
([
"git"
,
"checkout"
,
revision
])
else
:
try
:
check_call
([
"git"
,
"fetch"
,
"origin"
,
branch
])
except
:
pass
check_call
([
"git"
,
"checkout"
,
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, git, 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
=
Request
(
program_url
,
headers
=
req_headers
)
def
response
(
request
,
verify_cert
=
True
):
"""Returns response from urllib, accounting for Python2/3 function
signatures and recursive attempt without certificate validation"""
try
:
try
:
context
=
ssl
.
create_default_context
()
if
not
verify_cert
:
context
.
check_hostname
=
False
context
.
verify_mode
=
ssl
.
CERT_NONE
response
=
urlopen
(
request
,
context
=
context
)
except
AttributeError
:
response
=
urlopen
(
request
)
except
(
HTTPError
)
as
e
:
reason
=
getattr
(
e
,
'reason'
,
'[HTTPError did not provide a reason]'
)
sys
.
stderr
.
write
(
'Remote server returned error code
%s
:
%s
\n
'
%
(
e
.
code
,
reason
))
exit
(
1
)
except
(
URLError
)
as
e
:
sys
.
stderr
.
write
(
'Could not reach server:
%s
\n
'
%
e
.
reason
)
if
verify_cert
:
sys
.
stderr
.
write
(
'Trying without certificates
\n
'
)
response
=
response
(
request
,
False
)
else
:
exit
(
1
)
else
:
return
response
response
=
response
(
request
)
with
open
(
tar_name
,
'wb'
)
as
f
:
f
.
write
(
response
.
read
())
def
download
(
url_base
,
tar_name
,
args
=
[],
distinct
=
False
)
:
download_only
(
url_base
,
tar_name
,
distinct
)
# tarfile module can't use the 'with' context in Python 2.6
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
:
if
not
os
.
access
(
'configure'
,
os
.
X_OK
):
os
.
chmod
(
'configure'
,
0
o755
)
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
%s
'
%
os
.
getcwd
())
try
:
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
'
)
except
OSError
:
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.2.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-4.1.0'
,
"mpfr-4.1.0"
,
".tar.bz2"
,[
"--with-gmp="
+
base_dir
])
prefix
[
'mpfr'
]
=
base_dir
mark_as_done
(
'mpfr'
)
# build mpc
if
marker_is_missing
(
'mpc'
):
downloadAndCompile
(
"https://ftpmirror.gnu.org/gnu/mpc"
,
"mpc-1.2.1"
,
".tar.gz"
,[
"--with-gmp="
+
base_dir
,
"--with-mpfr="
+
base_dir
])
prefix
[
'mpc'
]
=
base_dir
mark_as_done
(
'mpc'
)
# gcc
download
(
'https://ftpmirror.gnu.org/gnu/gcc/gcc-'
+
opts
.
gcc_ver
,
"gcc-
%s
.tar.gz"
%
opts
.
gcc_ver
)
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
=
list
(
map
(
int
,
opts
.
gcc_ver
.
split
(
"."
)[:
2
]))
except
:
sys
.
stderr
.
write
(
'Unknown gcc version format. Expecting "N.N.N".
\n
'
)
exit
(
1
)
flags
=
[
"../gcc-
%s
/configure"
%
opts
.
gcc_ver
,
"--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
)
flags
.
append
(
"--with-mpc="
+
base_dir
)
check_call
(
flags
)
check_call
([
"make"
,
"-s"
,
"-j
%s
"
%
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 '
+
name
+
'.
\n
Using '
+
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 '
+
name
+
version
+
' exists in src/, skipping build,'
)
print
(
' using prefix='
+
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
(
bin_dir
,
'gcc
%s
'
%
GCC_SUFFIX
)
default_cxx
=
os
.
path
.
join
(
bin_dir
,
'g++
%s
%s
'
%
(
GCC_SUFFIX
,
opts
.
cxx14
)
)
default_fc
=
os
.
path
.
join
(
bin_dir
,
'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'
):
os
.
chdir
(
src_dir
)
tmp_ncore
=
opts
.
ncore
opts
.
ncore
=
1
downloadAndCompile
(
"https://ftpmirror.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'
):
os
.
chdir
(
src_dir
)
boost_ver2
=
opts
.
boost_ver
.
replace
(
"."
,
"_"
)
boost_base
=
"boost_"
+
boost_ver2
try
:
download
(
"https://boostorg.jfrog.io/artifactory/main/release/"
+
opts
.
boost_ver
+
"/source"
,
boost_base
+
".tar.bz2"
)
except
:
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
.
cxx14
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
%s
"
%
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
,
0
o755
)
check_call
([
helpername
])
prefix
[
'boost'
]
=
base_dir
mark_as_done
(
'boost'
)
# install gsl if required
if
build_needed
(
'gsl'
):
os
.
chdir
(
src_dir
)
downloadAndCompile
(
"https://ftpmirror.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'
):
os
.
chdir
(
src_dir
)
downloadAndCompile
(
"https://fastjet.fr/repo"
,
"fastjet-"
+
opts
.
fastjet_ver
,
".tar.gz"
,
[
"--enable-allcxxplugins"
,
"--disable-auto-ptr"
])
prefix
[
'fastjet'
]
=
base_dir
mark_as_done
(
'fastjet'
)
if
build_needed
(
'fastjet_contrib'
):
download
(
"https://fastjet.hepforge.org/contrib/downloads"
,
"fjcontrib-"
+
opts
.
fastjet_contrib_ver
+
".tar.gz"
)
os
.
chdir
(
os
.
path
.
join
(
src_dir
,
"fjcontrib-"
+
opts
.
fastjet_contrib_ver
))
# force use of CXX from configure
files
=
glob
.
glob
(
"*/Makefile"
)
files
.
append
(
"Makefile.in"
)
for
make
in
files
:
with
open
(
'tmp.tmp'
,
'w'
)
as
outfile
:
with
open
(
make
)
as
infile
:
for
line
in
infile
:
if
(
"CXX="
not
in
line
)
:
outfile
.
write
(
line
)
shutil
.
move
(
'tmp.tmp'
,
make
)
# compile
compile
([
"--fastjet-config=
%s
/bin/fastjet-config"
%
prefix
[
'fastjet'
]])
# rivet needs these options for the install
os
.
chdir
(
os
.
path
.
join
(
src_dir
,
"fjcontrib-"
+
opts
.
fastjet_contrib_ver
))
check_call
([
"make"
,
"fragile-shared-install"
,
"-j
%s
"
%
opts
.
ncore
])
os
.
chdir
(
src_dir
)
prefix
[
'fastjet_contrib'
]
=
base_dir
mark_as_done
(
'fastjet_contrib'
)
# install hepmc if needed
if
build_needed
(
'hepmc'
):
if
opts
.
hepmc_ver
[
0
]
==
"2"
:
download
(
"https://hepmc.web.cern.ch/hepmc/releases"
,
"hepmc"
+
opts
.
hepmc_ver
+
".tgz"
)
try
:
os
.
chdir
(
os
.
path
.
join
(
src_dir
,
"hepmc"
+
opts
.
hepmc_ver
))
except
:
os
.
chdir
(
os
.
path
.
join
(
src_dir
,
"HepMC-"
+
opts
.
hepmc_ver
))
compile
([
"--with-momentum=GEV"
,
"--with-length=MM"
])
else
:
download
(
"https://gitlab.cern.ch/hepmc/HepMC3/-/archive/"
+
opts
.
hepmc_ver
,
"HepMC3-"
+
opts
.
hepmc_ver
+
".tar.bz2"
)
if
not
os
.
path
.
exists
(
os
.
path
.
join
(
src_dir
,
"hepmc_build"
))
:
os
.
mkdir
(
os
.
path
.
join
(
src_dir
,
"hepmc_build"
))
os
.
chdir
(
os
.
path
.
join
(
src_dir
,
"hepmc_build"
))
args
=
[
"cmake"
,
os
.
path
.
join
(
src_dir
,
"HepMC3-"
+
opts
.
hepmc_ver
),
"-DCMAKE_INSTALL_PREFIX="
+
base_dir
,
"-DHEPMC3_ENABLE_ROOTIO:BOOL=OFF"
,
"-DHEPMC3_ENABLE_PYTHON:BOOL=OFF"
]
check_call
(
args
)
check_call
([
"make"
,
"-j
%s
"
%
opts
.
ncore
])
check_call
([
"make"
,
"install"
])
prefix
[
'hepmc'
]
=
base_dir
mark_as_done
(
'hepmc'
)
# install lhapdf if needed
if
build_needed
(
'lhapdf'
):
os
.
chdir
(
src_dir
)
args
=
[]
if
prefix
[
'boost'
]:
args
.
append
(
"--with-boost="
+
prefix
[
'boost'
])
downloadAndCompile
(
"https://lhapdf.hepforge.org/downloads"
,
"LHAPDF-"
+
opts
.
lhapdf_ver
,
".tar.gz"
,
args
)
for
pdf
in
opts
.
pdfs
:
lhapdftool
=
os
.
path
.
join
(
bin_dir
,
'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'
):
os
.
chdir
(
src_dir
)
# from tar ball
if
not
opts
.
yoda_git
:
download
(
"https://yoda.hepforge.org/downloads/"
,
"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
,
'git'
)
if
sys
.
version_info
[
0
]
==
3
:
for
val
in
[
"pyext/yoda/core.cpp"
,
"pyext/yoda/util.cpp"
]:
if
os
.
path
.
isfile
(
val
)
:
os
.
remove
(
val
)
compile
([]
if
opts
.
yoda_root
else
[
'--disable-root'
])
prefix
[
'yoda'
]
=
base_dir
mark_as_done
(
'yoda'
)
# install rivet if needed
if
build_needed
(
'rivet'
):
os
.
chdir
(
src_dir
)
# from tar ball
if
not
opts
.
rivet_git
:
download
(
"https://rivet.hepforge.org/downloads/"
,
"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
,
'git'
)
if
os
.
path
.
exists
(
base_dir
+
"/lib64"
)
and
os
.
path
.
isfile
(
base_dir
+
"/lib/libfastjetcontribfragile.so"
):
print
(
"soft linking lib/fastjetcontribfragile.so to lib64"
)
os
.
system
(
"ln -s "
+
base_dir
+
"/lib/libfastjetcontribfragile.so "
+
base_dir
+
"/lib64/libfastjetcontribfragile.so"
)
args
=
[]
for
tool
in
[
'yoda'
,
'hepmc'
,
'fastjet'
,
'fastjet_contrib'
]:
if
prefix
[
tool
]:
if
tool
==
"hepmc"
and
opts
.
hepmc_ver
[
0
]
==
"3"
:
args
.
append
(
"--with-
%s
3=
%s
"
%
(
tool
,
prefix
[
tool
])
)
elif
tool
==
"fastjet_contrib"
:
args
.
append
(
"--with-fjcontrib=
%s
"
%
(
prefix
[
tool
])
)
else
:
args
.
append
(
"--with-
%s
=
%s
"
%
(
tool
,
prefix
[
tool
])
)
compile
(
args
)
prefix
[
'rivet'
]
=
base_dir
mark_as_done
(
'rivet'
)
# install thepeg if needed
if
build_needed
(
'thepeg'
,
opts
.
thepeg_ver
):
os
.
chdir
(
src_dir
)
# from tar ball
if
not
opts
.
thepeg_hg
:
download
(
"https://thepeg.hepforge.org/downloads"
,
"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
])
)
if
tool
==
"hepmc"
and
opts
.
hepmc_ver
[
0
]
==
"3"
:
args
.
append
(
"--with-hepmcversion=3"
)
compile
(
args
)
prefix
[
'thepeg'
]
=
base_dir
mark_as_done
(
'thepeg'
,
opts
.
thepeg_ver
)
# function to run madgraph
def
runMadgraph
(
mgCommand
)
:
with
open
(
'proc.dat'
,
'w'
)
as
f
:
f
.
write
(
mgCommand
)
mg_exe
=
os
.
path
.
join
(
prefix
[
'madgraph'
],
'bin'
,
'mg5_aMC'
)
try
:
check_call
([
mg_exe
,
'proc.dat'
])
except
:
check_call
([
'python2'
,
mg_exe
,
'proc.dat'
])
# install madgraph
if
build_needed
(
'madgraph'
):
os
.
chdir
(
src_dir
)
# from tar ball
if
not
opts
.
madgraph_bzr
:
mg_name
=
"MG5_aMC_v"
+
opts
.
madgraph_ver
.
replace
(
"."
,
"_"
)
mg_tar
=
"MG5_aMC_v
%s
"
%
opts
.
madgraph_ver
if
sys
.
version_info
[
0
]
==
3
and
opts
.
madgraph_ver
==
"2.7.3"
:
mg_name
+=
"_py3"
mg_tar
+=
".py3"
mg_tar
+=
".tar.gz"
try
:
download
(
"http://madgraph.physics.illinois.edu/Downloads/"
,
mg_tar
)
except
:
print
(
"Madgraph download for Illinois server failed, trying launchpad"
)
vSplit
=
opts
.
madgraph_ver
.
split
(
"."
)
mg_loc
=
"https://launchpad.net/mg5amcnlo/
%s
.0/
%s
.
%s
.x/+download"
%
(
vSplit
[
0
],
vSplit
[
0
],
vSplit
[
1
])
download
(
mg_loc
,
mg_tar
)
prefix
[
'madgraph'
]
=
os
.
path
.
join
(
opt_dir
,
mg_name
)
print
(
'mv '
+
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"
)
# temp directory for madgraph
mg_tmp_dir
=
os
.
path
.
join
(
prefix
[
'madgraph'
],
'tmp_hw_bootstrap_test'
)
if
not
os
.
path
.
isdir
(
mg_tmp_dir
):
os
.
mkdir
(
mg_tmp_dir
)
os
.
chdir
(
mg_tmp_dir
)
# run madgraph so loop stuff is installed
# and try to automatically convert all python2 models
# Note: the command "set acknowledged_v3.1_syntax True --global"
# reverts MG >= 3.2.0 syntax to before 3.1.
mg_initial_run
=
"""\
set auto_update 0
set cpp_compiler {cxx}
set fortran_compiler {fc}
set auto_convert_model T
set acknowledged_v3.1_syntax True --global
import model sm
generate g g > h > w+ w- [virt=QCD]
output
"""
.
format
(
cxx
=
default_cxx
,
fc
=
default_fc
)
runMadgraph
(
mg_initial_run
)
# force import of the heft model
heftTemplate
=
"""\
set auto_update 0
set cpp_compiler {cxx}
set fortran_compiler {fc}
{convert}
import model heft
"""
mg_heft
=
heftTemplate
.
format
(
cxx
=
default_cxx
,
fc
=
default_fc
,
convert
=
"set auto_convert_model T"
)
runMadgraph
(
mg_heft
)
# remove tmp directory
shutil
.
rmtree
(
mg_tmp_dir
)
mark_as_done
(
'madgraph'
)
# install the NLO codes if needed
# install njet if required
if
build_needed
(
'njet'
):
os
.
chdir
(
src_dir
)
download
(
"https://bitbucket.org/njet/njet/downloads"
,
"njet-"
+
opts
.
njet_ver
+
".tar.gz"
)
patch
(
"njet-"
+
opts
.
njet_ver
,
b
"""\
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
,
"FFLAGS=-std=legacy"
])
prefix
[
'njet'
]
=
base_dir
mark_as_done
(
'njet'
)
OPENLOOPS_CONFIG
=
"""\
[OpenLoops]
fortran_compiler = {fc}
compile_extra = 0
"""
# install openloops if needed
if
build_needed
(
'openloops'
):
if
not
opts
.
openloops_svn
:
os
.
chdir
(
opt_dir
)
download
(
"https://openloops.hepforge.org/downloads"
,
"OpenLoops-"
+
opts
.
openloops_ver
+
".tar.gz"
)
os
.
chdir
(
os
.
path
.
join
(
opt_dir
,
"OpenLoops-"
+
opts
.
openloops_ver
))
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
([
"./scons"
,
"--jobs=
%s
"
%
opts
.
ncore
])
check_call
([
"./openloops"
,
"libinstall"
,
opts
.
openloops_processes
,
"num_jobs=
%s
"
%
opts
.
ncore
])
os
.
chdir
(
src_dir
)
prefix
[
'openloops'
]
=
opt_dir
+
"/OpenLoops-"
+
opts
.
openloops_ver
mark_as_done
(
'openloops'
)
else
:
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'
):
os
.
chdir
(
src_dir
)
# build qgraf
if
marker_is_missing
(
'qgraf'
):
download
(
"https://herwig.hepforge.org/downloads/mirror"
,
"qgraf-3.4.2.tgz"
)
os
.
chdir
(
os
.
path
.
join
(
src_dir
,
'qgraf-3.4.2'
))
check_call
([
default_fc
,
'qgraf-3.4.2.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'
):
download
(
"https://github.com/vermaseren/form/releases/download/v4.2.1"
,
"form-4.2.1.tar.gz"
)
os
.
chdir
(
os
.
path
.
join
(
src_dir
,
'form-4.2.1'
))
compile
([])
prefix
[
'form'
]
=
base_dir
mark_as_done
(
'form'
)
# build gosam-contrib
if
marker_is_missing
(
'gosam-contrib'
):
download
(
'https://github.com/gudrunhe/gosam-contrib/releases/download/gosam-contrib-2.0-20200904/gosam-contrib-2.0-20200904.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
([
"FFLAGS=-std=legacy"
])
except
subprocess
.
CalledProcessError
:
compile
([
"FFLAGS=-std=legacy"
])
prefix
[
'gosam-contrib'
]
=
base_dir
mark_as_done
(
'gosam-contrib'
)
download
(
'https://github.com/gudrunhe/gosam/releases/download/2.1.1/gosam-2.1.1-4b98559.tar.gz'
,
'gosam-2.1.1.tar.gz'
,
distinct
=
True
)
try
:
os
.
chdir
(
os
.
path
.
join
(
src_dir
,
'gosam-2.1.1-4b98559'
))
except
OSError
:
os
.
chdir
(
os
.
path
.
join
(
src_dir
,
'gosam'
))
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'
):
os
.
chdir
(
src_dir
)
# from tar ball
if
not
opts
.
vbfnlo_git
:
download
(
"https://www.itp.kit.edu/vbfnlo/archive"
,
"vbfnlo-"
+
opts
.
vbfnlo_ver
+
".tgz"
)
os
.
chdir
(
os
.
path
.
join
(
src_dir
,
"VBFNLO-"
+
opts
.
vbfnlo_ver
))
else
:
checkout
(
src_dir
,
"VBFNLO"
,
opts
.
vbfnlo_ver
,
opts
.
vbfnlo_repo
,
"v"
+
opts
.
vbfnlo_ver
,
'git'
)
if
opts
.
vbfnlo_ver
==
"3.0.0beta1"
or
opts
.
vbfnlo_ver
==
"3.0.0beta2"
:
# 3.0.0beta1 and 2 did not yet accept setting F77
del
os
.
environ
[
'F77'
]
check_call
([
"./configure"
,
"--prefix="
+
base_dir
,
"--enable-processes="
+
opts
.
vbfnlo_processes
,
"FCFLAGS=-std=legacy"
])
check_call
([
"make"
,
"-s"
,
"-j
%s
"
%
opts
.
ncore
])
check_call
([
"make"
,
"-s"
,
"install"
])
if
opts
.
vbfnlo_ver
==
"3.0.0beta1"
or
opts
.
vbfnlo_ver
==
"3.0.0beta2"
:
# 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 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 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'
):
os
.
chdir
(
src_dir
)
pythia_version
=
"8.307"
.
replace
(
"."
,
""
)
download
(
"https://pythia.org/download/pythia83"
,
"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'
]:
if
opts
.
hepmc_ver
[
0
]
==
"2"
:
args
.
append
(
"--with-hepmc2=
%s
"
%
prefix
[
'hepmc'
])
else
:
args
.
append
(
"--with-hepmc3=
%s
"
%
prefix
[
'hepmc'
])
os
.
environ
[
'USRCXXFLAGS'
]
=
opts
.
cxx14
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'
):
os
.
chdir
(
src_dir
)
evtgen_version
=
'02.02.00'
evtgen_srcpath
=
os
.
path
.
join
(
'EvtGen'
,
'R'
+
evtgen_version
.
replace
(
'.'
,
'-'
))
download
(
"https://evtgen.hepforge.org/downloads"
,
"EvtGen-
%s
.tar.gz"
%
evtgen_version
)
if
not
os
.
path
.
exists
(
os
.
path
.
join
(
src_dir
,
"evtgen_build"
))
:
os
.
mkdir
(
os
.
path
.
join
(
src_dir
,
"evtgen_build"
))
os
.
chdir
(
os
.
path
.
join
(
src_dir
,
"evtgen_build"
))
args
=
[
"cmake"
,
os
.
path
.
join
(
src_dir
,
evtgen_srcpath
),
"-DCMAKE_INSTALL_PREFIX="
+
base_dir
]
if
prefix
[
'hepmc'
]
and
opts
.
hepmc_ver
[
0
]
==
"2"
:
args
.
append
(
"-DEVTGEN_HEPMC3=OFF"
)
args
.
append
(
"-DHEPMC2_ROOT_DIR="
+
prefix
[
'hepmc'
])
# if prefix['tauola']:
# args.append("--tauoladir="+prefix['tauola'])
# if prefix['photos']:
# args.append("--photosdir="+prefix['photos'])
if
prefix
[
'pythia'
]:
args
.
append
(
"-DEVTGEN_PYTHIA=ON"
)
args
.
append
(
"-DPYTHIA8_ROOT_DIR="
+
prefix
[
'pythia'
])
check_call
(
args
)
# Has to be single thread build. Dependencies are broken otherwise.
check_call
([
"make"
,
"-j1"
])
check_call
([
"make"
,
"install"
])
if
platform
.
system
()
==
'Darwin'
:
# fix path settings to help autodetection of lib locations
os
.
chdir
(
os
.
path
.
join
(
base_dir
,
'lib'
))
for
i
in
[
"libEvtGen.dylib"
,
"libEvtGenExternal.dylib"
]:
check_call
([
"install_name_tool"
,
"-id"
,
os
.
path
.
join
(
os
.
getcwd
(),
i
),
i
])
for
i
in
[
"libEvtGen.dylib"
,
"libpythia8.dylib"
,
"liblhapdfdummy.dylib"
]:
check_call
([
"install_name_tool"
,
"-change"
,
i
,
os
.
path
.
join
(
os
.
getcwd
(),
i
),
"libEvtGenExternal.dylib"
])
os
.
chdir
(
src_dir
)
prefix
[
'evtgen'
]
=
base_dir
mark_as_done
(
'evtgen'
)
# install herwig if needed
if
build_needed
(
'herwig'
,
opts
.
herwig_ver
):
os
.
chdir
(
src_dir
)
# from tar ball
if
not
opts
.
herwig_hg
:
download
(
"https://herwig.hepforge.org/downloads/"
,
"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'
):
os
.
chdir
(
src_dir
)
# 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 TEXMFHOME
unset HOMETEXMF
unset TEXMFCNF
unset TEXINPUTS
unset LATEXINPUTS
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
# adding the path to rivet latex required packages
export TEXMFHOME="${HERWIG_ENV}/share/Rivet/texmf:$TEXMFHOME"
export HOMETEXMF="${HERWIG_ENV}/share/Rivet/texmf:$HOMETEXMF"
export TEXMFCNF="${HERWIG_ENV}/share/Rivet/texmf/cnf:$TEXMFCNF"
export TEXINPUTS="${HERWIG_ENV}/share/Rivet/texmf/tex//:$TEXINPUTS"
export LATEXINPUTS="${HERWIG_ENV}/share/Rivet/texmf/tex//:$LATEXINPUTS"
_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
Details
Attached
Mime Type
text/x-python
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1340503
Default Alt Text
herwig-bootstrap (54 KB)
Attached To
Mode
T226: Compiling Herwig 7.3.0 on Mac OS X with Apple Silicon
Attached
Detach File
Event Timeline
Log In to Comment