Working GCC package.
This commit is contained in:
		@@ -22,8 +22,9 @@
 | 
			
		||||
# along with this program; if not, write to the Free Software Foundation,
 | 
			
		||||
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 | 
			
		||||
##############################################################################
 | 
			
		||||
__all__ = ['install', 'expand_user', 'working_dir', 'touch', 'mkdirp',
 | 
			
		||||
           'join_path', 'ancestor', 'can_access', 'filter_file', 'change_sed_delimiter']
 | 
			
		||||
__all__ = ['set_install_permissions', 'install', 'expand_user', 'working_dir',
 | 
			
		||||
           'touch', 'mkdirp', 'force_remove', 'join_path', 'ancestor',
 | 
			
		||||
           'can_access', 'filter_file', 'change_sed_delimiter']
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
@@ -127,10 +128,19 @@ def change_sed_delimiter(old_delim, new_delim, *filenames):
 | 
			
		||||
        filter_file(double_quoted, '"%s"' % repl, f)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def set_install_permissions(path):
 | 
			
		||||
    """Set appropriate permissions on the installed file."""
 | 
			
		||||
    if os.path.isdir(path):
 | 
			
		||||
        os.chmod(path, 0755)
 | 
			
		||||
    else:
 | 
			
		||||
        os.chmod(path, 0644)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def install(src, dest):
 | 
			
		||||
    """Manually install a file to a particular location."""
 | 
			
		||||
    tty.info("Installing %s to %s" % (src, dest))
 | 
			
		||||
    shutil.copy(src, dest)
 | 
			
		||||
    set_install_permissions(dest)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def expand_user(path):
 | 
			
		||||
@@ -152,6 +162,15 @@ def mkdirp(*paths):
 | 
			
		||||
            raise OSError(errno.EEXIST, "File alredy exists", path)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def force_remove(*paths):
 | 
			
		||||
    """Remove files without printing errors.  Like rm -f, does NOT
 | 
			
		||||
       remove directories."""
 | 
			
		||||
    for path in paths:
 | 
			
		||||
        try:
 | 
			
		||||
            os.remove(path)
 | 
			
		||||
        except OSError, e:
 | 
			
		||||
            pass
 | 
			
		||||
 | 
			
		||||
@contextmanager
 | 
			
		||||
def working_dir(dirname, **kwargs):
 | 
			
		||||
    if kwargs.get('create', False):
 | 
			
		||||
 
 | 
			
		||||
@@ -24,20 +24,67 @@
 | 
			
		||||
##############################################################################
 | 
			
		||||
from spack import *
 | 
			
		||||
 | 
			
		||||
from contextlib import closing
 | 
			
		||||
from glob import glob
 | 
			
		||||
 | 
			
		||||
class Gcc(Package):
 | 
			
		||||
    """The GNU Compiler Collection includes front ends for C, C++,
 | 
			
		||||
       Objective-C, Fortran, and Java."""
 | 
			
		||||
    homepage = "https://gcc.gnu.org"
 | 
			
		||||
    url      = "http://www.netgull.com/gcc/releases/gcc-4.9.1/gcc-4.9.1.tar.bz2"
 | 
			
		||||
 | 
			
		||||
    version('4.9.1', 'fddf71348546af523353bd43d34919c1')
 | 
			
		||||
    list_url = 'http://mirrors.kernel.org/gnu/gcc/'
 | 
			
		||||
    list_depth = 2
 | 
			
		||||
 | 
			
		||||
    version('4.9.2', '4df8ee253b7f3863ad0b86359cd39c43',
 | 
			
		||||
            url="http://mirrors.kernel.org/gnu/gcc/gcc-4.9.2/gcc-4.9.2.tar.bz2")
 | 
			
		||||
    version('4.9.1', 'fddf71348546af523353bd43d34919c1',
 | 
			
		||||
            url="http://mirrors.kernel.org/gnu/gcc/gcc-4.9.1/gcc-4.9.1.tar.bz2")
 | 
			
		||||
 | 
			
		||||
    depends_on("mpc")
 | 
			
		||||
    depends_on("mpfr")
 | 
			
		||||
    depends_on("gmp")
 | 
			
		||||
    depends_on("libelf")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def install(self, spec, prefix):
 | 
			
		||||
        # libjava/configure needs a minor fix to install into spack paths.
 | 
			
		||||
        filter_file(r"'@.*@'", "'@[[:alnum:]]*@'", 'libjava/configure', string=True)
 | 
			
		||||
 | 
			
		||||
        # Rest of install is straightforward.
 | 
			
		||||
        configure("--prefix=%s" % prefix,
 | 
			
		||||
                  "--disable-multilib")
 | 
			
		||||
                  "--libdir=%s/lib64" % prefix,
 | 
			
		||||
                  "--disable-multilib",
 | 
			
		||||
                  "--enable-languages=c,c++,fortran,java,objc,go",
 | 
			
		||||
                  "--enable-lto",
 | 
			
		||||
                  "--with-quad")
 | 
			
		||||
        make()
 | 
			
		||||
        make("install")
 | 
			
		||||
 | 
			
		||||
        self.write_rpath_specs()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def spec_dir(self):
 | 
			
		||||
        # e.g. lib64/gcc/x86_64-unknown-linux-gnu/4.9.2
 | 
			
		||||
        spec_dir = glob("%s/lib64/gcc/*/*" % self.prefix)
 | 
			
		||||
        return spec_dir[0] if spec_dir else None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def write_rpath_specs(self):
 | 
			
		||||
        """Generate a spec file so the linker adds a rpath to the libs
 | 
			
		||||
           the compiler used to build the executable."""
 | 
			
		||||
        if not self.spec_dir:
 | 
			
		||||
            tty.warn("Could not install specs for %s." % self.spec.format('$_$@'))
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        gcc = Executable(join_path(self.prefix.bin, 'gcc'))
 | 
			
		||||
        lines = gcc('-dumpspecs', return_output=True).split("\n")
 | 
			
		||||
        for i, line in enumerate(lines):
 | 
			
		||||
            if line.startswith("*link:"):
 | 
			
		||||
                specs_file = join_path(self.spec_dir, 'specs')
 | 
			
		||||
                with closing(open(specs_file, 'w')) as out:
 | 
			
		||||
                    out.write(lines[i] + "\n")
 | 
			
		||||
                    out.write("-rpath %s/lib:%s/lib64 \\\n"
 | 
			
		||||
                                % (self.prefix, self.prefix))
 | 
			
		||||
                    out.write(lines[i+1] + "\n")
 | 
			
		||||
                set_install_permissions(specs_file)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user