ROSE: add version 0.9.10.0, update to Autotools, add variants (#9484)

* Also add versions 0.9.9.104, 0.9.9.52, 0.9.9.0, and 'develop'
* Replace version 0.9.7 with 0.9.7.0
* Update Rose to be an Autotools package
* Update boost dependency to 1.60.0 or later (previously 1.47.0)
* Add EDG binary identifiers for ROSE versions installing from
  archives (rather than git)
* Add variants for mvapich2 backend, c++11, debug symbols,
  optimization, and ROSE-based projects (codethorn, autopar, and
  polyopt)
* Remove patch add_spack_compiler_recognition
This commit is contained in:
Justin Too 2019-05-29 12:00:50 -07:00 committed by Peter Scheibel
parent ca71f8b044
commit a49ce3fc32
2 changed files with 248 additions and 52 deletions

View file

@ -1,13 +0,0 @@
diff --git a/config/compiler-defs.m4 b/config/compiler-defs.m4
index d7d85d2..780c8de 100644
--- a/config/compiler-defs.m4
+++ b/config/compiler-defs.m4
@@ -28,7 +28,7 @@ dnl predefined by a specific compiler
# g++|gcc|mpicc|mpic++|mpicxx|mpiCC)
# TOO (2/16/2011): added support for tensilica compilers, assuming they are
# like GCC (they use a GCC front-end)
- g++*|gcc*|mpicc|mpic++|mpicxx|mpiCC|xt-xc++|xt-xcc)
+ cc*|c++*|g++*|gcc*|mpicc|mpic++|mpicxx|mpiCC|xt-xc++|xt-xcc)
BACKEND_GCC_MAJOR=`echo|$BACKEND_CXX_COMPILER -dumpversion | cut -d\. -f1`
BACKEND_GCC_MINOR=`echo|$BACKEND_CXX_COMPILER -dumpversion | cut -d\. -f2`
BACKEND_GCC_PATCHLEVEL=`echo|$BACKEND_CXX_COMPILER -dumpversion | cut -d\. -f3`

View file

@ -4,79 +4,288 @@
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
# -----------------------------------------------------------------------------
# Author: Justin Too <too1@llnl.gov>
# Author: Justin Too
# -----------------------------------------------------------------------------
from spack import *
class Rose(Package):
class Rose(AutotoolsPackage):
"""A compiler infrastructure to build source-to-source program
transformation and analysis tools.
(Developed at Lawrence Livermore National Lab)"""
homepage = "http://rosecompiler.org/"
url = "https://github.com/rose-compiler/rose/archive/v0.9.7.tar.gz"
git = "https://github.com/rose-compiler/rose.git"
# url = "https://github.com/rose-compiler/rose-develop/archive/v0.9.7.0.tar.gz"
url = "https://github.com/rose-compiler/rose-develop/archive/v0.9.9.104.zip"
version('master', branch='master')
version('0.9.7', 'e14ce5250078df4b09f4f40559d46c75')
# --------------------------------------------------------------------------
# ROSE Versions
# --------------------------------------------------------------------------
version(
"0.9.10.0",
sha256="7b53b6913fd6ca0c5050b630dae380f3e6b0897cde6148172ba01095f71cbaca",
)
version("0.9.9.104", "b01cf9d2fd440fc0fe77a713c5f7831e")
version("0.9.9.0", "8f47fb8aa803d019657bd42c8b892cce")
version("0.9.7.0", "be0d0941ba4c0349a20d6394c20d16d7")
version(
"0.9.9.52",
commit="bd4fc0cc332ce62d9fa54db19879507d9e4f239b",
git="https://github.com/rose-compiler/rose-develop.git",
)
version(
"develop",
branch="master",
git="https://github.com/rose-compiler/rose-develop.git",
)
patch('add_spack_compiler_recognition.patch')
# --------------------------------------------------------------------------
# Dependencies
# --------------------------------------------------------------------------
depends_on("autoconf@2.69:", type="build")
depends_on("automake@1.14:", type="build")
depends_on("libtool@2.4:", type="build")
depends_on("boost@1.56.0:", when="~cxx11")
depends_on("autoconf@2.69", type='build')
depends_on("automake@1.14", type='build')
depends_on("libtool@2.4", type='build')
depends_on("boost@1.47.0:")
# C++11 compatible boost and gcc versions required for +cxx11 variant:
# https://github.com/spack/spack/wiki/Telcon%3A-2015-05-14
depends_on("boost@1.60.0: cxxstd=11", when="+cxx11")
variant('tests', default=False, description='Build the tests directory')
# TODO: Doesn't seem to be a way to require a specific compiler: https://github.com/spack/spack/issues/896
# https://www.gnu.org/software/gcc/projects/cxx-status.html#cxx11
# depends_on("%gcc@4.8.1:", when="^boost@1.60.0: cxxstd=11")
variant('binanalysis', default=False, description='Enable binary analysis tooling')
depends_on('libgcrypt', when='+binanalysis', type='build')
depends_on('py-binwalk', when='+binanalysis', type='run')
# --------------------------------------------------------------------------
# Variants
# --------------------------------------------------------------------------
variant("debug", default=False, description="Enable compiler debugging symbols")
variant("optimized", default=False, description="Enable compiler optimizations")
variant('c', default=True, description='Enable c language support')
variant('cxx', default=True, description='Enable c++ language support')
variant("tests", default=False, description="Build the tests directory")
variant("tutorial", default=False, description="Build the tutorial directory")
variant('fortran', default=False, description='Enable fortran language support')
variant(
"mvapich2_backend",
default=False,
description="Enable mvapich2 backend compiler",
)
depends_on("mvapich2", when="+mvapich2_backend")
variant('java', default=False, description='Enable java language support')
depends_on('java', when='+java')
variant("binanalysis", default=False, description="Enable binary analysis tooling")
depends_on("libgcrypt", when="+binanalysis", type="build")
depends_on("py-binwalk", when="+binanalysis", type="run")
variant('z3', default=False, description='Enable z3 theorem prover')
depends_on('z3', when='+z3')
variant("c", default=True, description="Enable c language support")
variant("cxx", default=True, description="Enable c++ language support")
build_directory = 'spack-build'
# Use spack install cxxflags=-std=c++11
variant("cxx11", default=False, description="Enable c++11 language support")
variant("fortran", default=False, description="Enable fortran language support")
variant("java", default=False, description="Enable java language support")
depends_on("jdk", when="+java")
variant("z3", default=False, description="Enable z3 theorem prover")
depends_on("z3", when="+z3")
variant(
"edg_source",
default=False,
description="Use the EDG C/C++ frontend source code",
)
depends_on("git", when="+edg_source")
# ------------------------------------------------------------------------
# ROSE-based Projects
# ------------------------------------------------------------------------
variant("codethorn", default=False, description="Enable the CodeThorn project")
variant(
"autopar",
default=False,
description="Enable the autoParallelization project"
)
variant("polyopt", default=False, description="Enable the PolyOpt project")
build_directory = "rose-build"
def patch(self):
spec = self.spec
# ROSE needs its to compute its EDG
# binary compatibility signature for C/C++ and for its
# --version information.
#
# git rev-parse HEAD
# git log -1 --format="%at"
#
with open("VERSION", "w") as f:
if "@0.9.9.104:" in spec:
# EDG: 27acd506c6b0e4b1c5f7573c642e3e407237eddd
f.write("66c87e9395126a7ab8663d81f0e0b99d6e09131e 1504924600")
elif "@0.9.9.0:" in spec:
# EDG: 46306e9f73d3ccd690be300aefdaf766a9ba3f70
f.write("14d3ebdd7f83cbcc295e6ed45b45d2e9ed32b5ff 1492716108")
elif "@0.9.7.0:" in spec:
# EDG: 8e63f421f9107ef6c7882b57f9c83e3878623ffa
f.write("992c21ad06893bc1e9e7688afe0562eee0fda021 1460595442")
elif "@0.9.10.0:" in spec:
# EDG: f4624773cb93dfcc67a00efb5e9e8affeb57fb73
f.write("277fea7e1e5305e5b3c86b550a0c1354e8285b96 1523991417")
else:
raise InstallError("Unknown ROSE version!")
def autoreconf(self, spec, prefix):
bash = which('bash')
bash('build')
# if not spec.satisfies('@develop'):
with working_dir(self.stage.source_path):
bash = which("bash")
bash("build")
if "+edg_source" in spec:
git = which("git")
git(
"clone",
"rose-dev@rosecompiler1.llnl.gov:rose/edg4x/edg.git",
"src/frontend/CxxFrontend/EDG",
)
@property
def languages(self):
spec = self.spec
langs = [
'binaries' if '+binanalysis' in spec else '',
'c' if '+c' in spec else '',
'c++' if '+cxx' in spec else '',
'java' if '+java' in spec else '',
'fortran' if '+fortran' in spec else ''
"binaries" if "+binanalysis" in spec else "",
"c" if "+c" in spec else "",
"c++" if "+cxx" in spec else "",
"java" if "+java" in spec else "",
"fortran" if "+fortran" in spec else "",
]
return list(filter(None, langs))
def configure_args(self):
spec = self.spec
cc = self.compiler.cc
cxx = self.compiler.cxx
return [
'--disable-boost-version-check',
if "+mvapich2_backend" in spec:
cc = spec["mvapich2"].mpicc
cxx = spec["mvapich2"].mpicxx
else:
cc = spack_cc
cxx = spack_cxx
if spec.satisfies("@0.9.8:"):
edg = "4.12"
else:
edg = "4.9"
args = [
"--disable-boost-version-check",
"--enable-edg_version={0}".format(edg),
"--with-alternate_backend_C_compiler={0}".format(cc),
"--with-alternate_backend_Cxx_compiler={0}".format(cxx),
"--with-boost={0}".format(spec['boost'].prefix),
"--with-boost={0}".format(spec["boost"].prefix),
"--enable-languages={0}".format(",".join(self.languages)),
"--with-z3={0}".format(spec['z3'].prefix) if '+z3' in spec else '',
'--disable-tests-directory' if '+tests' not in spec else '',
'--enable-tutorial-directory={0}'.format('no'),
]
install_targets = ["install-core"]
if "+z3" in spec:
args.append("--with-z3={0}".format(spec["z3"].prefix))
else:
args.append("--without-z3")
if "+tests" in spec:
args.append("--enable-tests-directory")
else:
args.append("--disable-tests-directory")
if "+tutorial" in spec:
args.append("--enable-tutorial-directory")
else:
args.append("--disable-tutorial-directory")
if "+java" in spec:
args.append("--with-java={0}".format(spec["java"].prefix))
else:
args.append("--without-java")
if "+debug" in spec:
args.append("--with-CXX_DEBUG=-g")
else:
args.append("--without-CXX_DEBUG")
if "+optimized" in spec:
args.append("--with-C_OPTIMIZE=-O0")
args.append("--with-CXX_OPTIMIZE=-O0")
else:
args.append("--without-C_OPTIMIZE")
args.append("--without-CXX_OPTIMIZE")
if "+cxx11" in spec:
args.append("CXXFLAGS=-std=c++11")
return args
def setup_environment(self, spack_env, run_env):
if "+codethorn" in self.spec:
spack_env.set("CXXFLAGS", "-std=c++11")
def build(self, spec, prefix):
# Spack will automatically pass ncpus as the number of make jobs.
#
# If you really want to srun this on a separate node, you can do this:
#
# $ srun -n1 spack install rose
#
with working_dir(self.build_directory):
# ROSE needs the EDG version for C/C++
with open("src/frontend/CxxFrontend/EDG-submodule-sha1", "w") as f:
if "@0.9.9.104" in spec:
f.write("27acd506c6b0e4b1c5f7573c642e3e407237eddd")
elif "@0.9.9.52" in spec:
f.write("56a826126289414db5436e6c49879b99d046d26d")
elif "@0.9.9.0" in spec:
f.write("46306e9f73d3ccd690be300aefdaf766a9ba3f70")
elif "@0.9.7.0" in spec:
f.write("8e63f421f9107ef6c7882b57f9c83e3878623ffa")
elif "@0.9.10.0" in spec:
f.write("f4624773cb93dfcc67a00efb5e9e8affeb57fb73")
else:
raise InstallError("Unknown ROSE version for EDG!")
# Compile librose
with working_dir("src"):
make()
# Install librose
with working_dir("src"):
make("install")
# Install "official" ROSE-based tools
make("install-core")
with working_dir("tools"):
make("install")
# -----------------------------------------------------------------
# ROSE-based Projects
# -----------------------------------------------------------------
if "+codethorn" in spec:
with working_dir("projects/CodeThorn"):
make("install")
if "+autopar" in spec:
with working_dir("projects/autoParallelization"):
make("install")
if "+polyopt" in spec:
mkdir = which("mkdir")
mkdir("-p", "projects/PolyOpt2")
with working_dir("projects/PolyOpt2"):
env["ROSE_SRC"] = self.stage.source_path
env["ROSE_ROOT"] = self.prefix
bash = which("bash")
bash(
join_path(
self.stage.source_path,
"projects/PolyOpt2/install.sh"
)
)