From 3e37903ffdbc72410264d1949dde9239e81ec698 Mon Sep 17 00:00:00 2001
From: Todd Gamblin <tgamblin@llnl.gov>
Date: Thu, 22 Jan 2015 23:34:39 -0800
Subject: [PATCH] Packages have rpath property.

---
 lib/spack/spack/package.py        | 31 +++++++++++++++++++++++++++----
 var/spack/packages/gcc/package.py | 29 +++++++++++++++++++++++------
 2 files changed, 50 insertions(+), 10 deletions(-)

diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py
index 1a797e88b1..fe4fc748d8 100644
--- a/lib/spack/spack/package.py
+++ b/lib/spack/spack/package.py
@@ -713,6 +713,14 @@ def do_patch(self):
         tty.msg("Patched %s" % self.name)
 
 
+    def do_fake_install(self):
+        """Make a fake install directory contaiing a 'fake' file in bin."""
+        mkdirp(self.prefix.bin)
+        touch(join_path(self.prefix.bin, 'fake'))
+        mkdirp(self.prefix.lib)
+        mkdirp(self.prefix.man1)
+
+
     def do_install(self, **kwargs):
         """This class should call this version of the install method.
            Package implementations should override install().
@@ -758,13 +766,11 @@ def do_install(self, **kwargs):
                 spack.install_layout.make_path_for_spec(self.spec)
 
                 # Set up process's build environment before running install.
+                self.stage.chdir_to_source()
                 build_env.setup_package(self)
 
                 if fake_install:
-                    mkdirp(self.prefix.bin)
-                    touch(join_path(self.prefix.bin, 'fake'))
-                    mkdirp(self.prefix.lib)
-                    mkdirp(self.prefix.man1)
+                    self.do_fake_install()
                 else:
                     # Subclasses implement install() to do the real work.
                     self.install(self.spec, self.prefix)
@@ -925,6 +931,23 @@ def fetch_remote_versions(self):
                     e.url, e.message)
 
 
+    @property
+    def rpath(self):
+        """Get the rpath this package links with, as a list of paths."""
+        rpaths = [self.prefix.lib, self.prefix.lib64]
+        rpaths.extend(d.prefix.lib for d in self.spec.traverse(root=False)
+                      if os.path.isdir(d.prefix.lib))
+        rpaths.extend(d.prefix.lib64 for d in self.spec.traverse(root=False)
+                      if os.path.isdir(d.prefix.lib64))
+        return rpaths
+
+
+    @property
+    def rpath_args(self):
+        """Get the rpath args as a string, with -Wl,-rpath= for each element."""
+        return " ".join("-Wl,-rpath=%s" % p for p in self.rpath)
+
+
 def find_versions_of_archive(*archive_urls, **kwargs):
     list_url   = kwargs.get('list_url', None)
     list_depth = kwargs.get('list_depth', 1)
diff --git a/var/spack/packages/gcc/package.py b/var/spack/packages/gcc/package.py
index da0debd5dc..3da6c25d47 100644
--- a/var/spack/packages/gcc/package.py
+++ b/var/spack/packages/gcc/package.py
@@ -32,29 +32,46 @@ class Gcc(Package):
        Objective-C, Fortran, and Java."""
     homepage = "https://gcc.gnu.org"
 
+    url = "http://open-source-box.org/gcc/gcc-4.9.2/gcc-4.9.2.tar.bz2"
     list_url = 'http://open-source-box.org/gcc/'
     list_depth = 2
 
-    version('4.9.2', '4df8ee253b7f3863ad0b86359cd39c43',
-            url="http://open-source-box.org/gcc/gcc-4.9.2/gcc-4.9.2.tar.bz2")
-    version('4.9.1', 'fddf71348546af523353bd43d34919c1',
-            url="http://open-source-box.org/gcc/gcc-4.9.1/gcc-4.9.1.tar.bz2")
+    version('4.9.2', '4df8ee253b7f3863ad0b86359cd39c43')
+    version('4.9.1', 'fddf71348546af523353bd43d34919c1')
+    version('4.8.4', '5a84a30839b2aca22a2d723de2a626ec')
+    version('4.7.4', '4c696da46297de6ae77a82797d2abe28')
+    version('4.6.4', 'b407a3d1480c11667f293bfb1f17d1a4')
+    version('4.5.4', '27e459c2566b8209ab064570e1b378f7')
 
-    depends_on("mpc")
     depends_on("mpfr")
     depends_on("gmp")
+    depends_on("mpc")     # when @4.5:
     depends_on("libelf")
 
+    # Save these until we can do optional deps.
+    #depends_on("isl")
+    #depends_on("ppl")
+    #depends_on("cloog")
 
     def install(self, spec, prefix):
         # libjava/configure needs a minor fix to install into spack paths.
         filter_file(r"'@.*@'", "'@[[:alnum:]]*@'", 'libjava/configure', string=True)
 
+        enabled_languages = set(('c', 'c++', 'fortran', 'java', 'objc'))
+        if spec.satisfies("@4.7.1:"):
+            enabled_languages.add('go')
+
         # Rest of install is straightforward.
         configure("--prefix=%s" % prefix,
                   "--libdir=%s/lib64" % prefix,
                   "--disable-multilib",
-                  "--enable-languages=c,c++,fortran,java,objc,go",
+                  "--enable-languages=" + ','.join(enabled_languages),
+                  "--with-mpc=%s"    % spec['mpc'].prefix,
+                  "--with-mpfr=%s"   % spec['mpfr'].prefix,
+                  "--with-gmp=%s"    % spec['gmp'].prefix,
+                  "--with-libelf=%s" % spec['libelf'].prefix,
+                  "--with-stage1-ldflags=%s" % self.rpath_args,
+                  "--with-boot-ldflags=%s"   % self.rpath_args,
                   "--enable-lto",
                   "--with-quad")
         make()
-- 
GitLab