Working GCC package.
This commit is contained in:
parent
a37828bafb
commit
b97ee67a4b
@ -22,8 +22,9 @@
|
|||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
##############################################################################
|
##############################################################################
|
||||||
__all__ = ['install', 'expand_user', 'working_dir', 'touch', 'mkdirp',
|
__all__ = ['set_install_permissions', 'install', 'expand_user', 'working_dir',
|
||||||
'join_path', 'ancestor', 'can_access', 'filter_file', 'change_sed_delimiter']
|
'touch', 'mkdirp', 'force_remove', 'join_path', 'ancestor',
|
||||||
|
'can_access', 'filter_file', 'change_sed_delimiter']
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
@ -127,10 +128,19 @@ def change_sed_delimiter(old_delim, new_delim, *filenames):
|
|||||||
filter_file(double_quoted, '"%s"' % repl, f)
|
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):
|
def install(src, dest):
|
||||||
"""Manually install a file to a particular location."""
|
"""Manually install a file to a particular location."""
|
||||||
tty.info("Installing %s to %s" % (src, dest))
|
tty.info("Installing %s to %s" % (src, dest))
|
||||||
shutil.copy(src, dest)
|
shutil.copy(src, dest)
|
||||||
|
set_install_permissions(dest)
|
||||||
|
|
||||||
|
|
||||||
def expand_user(path):
|
def expand_user(path):
|
||||||
@ -152,6 +162,15 @@ def mkdirp(*paths):
|
|||||||
raise OSError(errno.EEXIST, "File alredy exists", path)
|
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
|
@contextmanager
|
||||||
def working_dir(dirname, **kwargs):
|
def working_dir(dirname, **kwargs):
|
||||||
if kwargs.get('create', False):
|
if kwargs.get('create', False):
|
||||||
|
@ -24,20 +24,67 @@
|
|||||||
##############################################################################
|
##############################################################################
|
||||||
from spack import *
|
from spack import *
|
||||||
|
|
||||||
|
from contextlib import closing
|
||||||
|
from glob import glob
|
||||||
|
|
||||||
class Gcc(Package):
|
class Gcc(Package):
|
||||||
"""The GNU Compiler Collection includes front ends for C, C++,
|
"""The GNU Compiler Collection includes front ends for C, C++,
|
||||||
Objective-C, Fortran, and Java."""
|
Objective-C, Fortran, and Java."""
|
||||||
homepage = "https://gcc.gnu.org"
|
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("mpc")
|
||||||
depends_on("mpfr")
|
depends_on("mpfr")
|
||||||
depends_on("gmp")
|
depends_on("gmp")
|
||||||
|
depends_on("libelf")
|
||||||
|
|
||||||
|
|
||||||
def install(self, spec, prefix):
|
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,
|
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()
|
||||||
make("install")
|
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)
|
||||||
|
Loading…
Reference in New Issue
Block a user