Add GCC 7 (#4144)
* Add GCC 7 * Allow users to build subset of GCC compilers with multi-value variant. * Add comment explaining what 'all' actually means * More specific golang support * Only require Zip when building Java * Comment out provide directives that don't currently work * Add Ada support * Use conflicts directive * Fix joining of languages * Need special flag to build jit * Explicitly declare GNAT download extension * Import tty, update lib64 to lib * BRIG and Go are not supported on macOS * Simplify formatting and imports * JIT patch required for newer versions as well
This commit is contained in:
parent
3efa9bd296
commit
4b866c6395
@ -0,0 +1,21 @@
|
|||||||
|
# Fix for libgccjit.so linkage on Darwin
|
||||||
|
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64089
|
||||||
|
# https://github.com/Homebrew/homebrew-core/issues/1872#issuecomment-225625332
|
||||||
|
# https://github.com/Homebrew/homebrew-core/issues/1872#issuecomment-225626490
|
||||||
|
|
||||||
|
# Stolen from Homebrew:
|
||||||
|
# https://raw.githubusercontent.com/Homebrew/formula-patches/e9e0ee09389a54cc4c8fe1c24ebca3cd765ed0ba/gcc/6.1.0-jit.patch
|
||||||
|
diff --git a/gcc/jit/Make-lang.in b/gcc/jit/Make-lang.in
|
||||||
|
index 44d0750..4df2a9c 100644
|
||||||
|
--- a/gcc/jit/Make-lang.in
|
||||||
|
+++ b/gcc/jit/Make-lang.in
|
||||||
|
@@ -85,8 +85,7 @@ $(LIBGCCJIT_FILENAME): $(jit_OBJS) \
|
||||||
|
$(jit_OBJS) libbackend.a libcommon-target.a libcommon.a \
|
||||||
|
$(CPPLIB) $(LIBDECNUMBER) $(LIBS) $(BACKENDLIBS) \
|
||||||
|
$(EXTRA_GCC_OBJS) \
|
||||||
|
- -Wl,--version-script=$(srcdir)/jit/libgccjit.map \
|
||||||
|
- -Wl,-soname,$(LIBGCCJIT_SONAME)
|
||||||
|
+ -Wl,-install_name,$(LIBGCCJIT_SONAME)
|
||||||
|
|
||||||
|
$(LIBGCCJIT_SONAME_SYMLINK): $(LIBGCCJIT_FILENAME)
|
||||||
|
ln -sf $(LIBGCCJIT_FILENAME) $(LIBGCCJIT_SONAME_SYMLINK)
|
@ -0,0 +1,19 @@
|
|||||||
|
# Use -headerpad_max_install_names in the build,
|
||||||
|
# otherwise lto1 load commands cannot be edited on El Capitan
|
||||||
|
|
||||||
|
# Stolen from Homebrew:
|
||||||
|
# https://raw.githubusercontent.com/Homebrew/formula-patches/32cf103/gcc/7.1.0-headerpad.patch
|
||||||
|
|
||||||
|
diff --git a/config/mh-darwin b/config/mh-darwin
|
||||||
|
index 148b730..c2318b5 100644
|
||||||
|
--- a/config/mh-darwin
|
||||||
|
+++ b/config/mh-darwin
|
||||||
|
@@ -16,7 +16,7 @@ DARWIN_GCC_MDYNAMIC_NO_PIC := \
|
||||||
|
DARWIN_NO_PIE := `case ${host} in *-*-darwin[1][1-9]*) echo -Wl,-no_pie ;; esac;`
|
||||||
|
|
||||||
|
BOOT_CFLAGS += $(DARWIN_MDYNAMIC_NO_PIC)
|
||||||
|
-BOOT_LDFLAGS += $(DARWIN_NO_PIE)
|
||||||
|
+BOOT_LDFLAGS += $(DARWIN_NO_PIE) -Wl,-headerpad_max_install_names
|
||||||
|
|
||||||
|
# Similarly, for cross-compilation.
|
||||||
|
STAGE1_CFLAGS += $(DARWIN_MDYNAMIC_NO_PIC)
|
@ -23,22 +23,24 @@
|
|||||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
##############################################################################
|
##############################################################################
|
||||||
from spack import *
|
from spack import *
|
||||||
|
from llnl.util import tty
|
||||||
|
|
||||||
from contextlib import closing
|
import glob
|
||||||
from glob import glob
|
import os
|
||||||
|
import shutil
|
||||||
import sys
|
import sys
|
||||||
from os.path import isfile
|
|
||||||
|
|
||||||
|
|
||||||
class Gcc(AutotoolsPackage):
|
class Gcc(AutotoolsPackage):
|
||||||
"""The GNU Compiler Collection includes front ends for C, C++,
|
"""The GNU Compiler Collection includes front ends for C, C++, Objective-C,
|
||||||
Objective-C, Fortran, and Java."""
|
Fortran, Ada, and Go, as well as libraries for these languages."""
|
||||||
homepage = "https://gcc.gnu.org"
|
|
||||||
|
|
||||||
url = "http://ftp.gnu.org/gnu/gcc/gcc-4.9.2/gcc-4.9.2.tar.bz2"
|
homepage = 'https://gcc.gnu.org'
|
||||||
|
url = 'http://ftp.gnu.org/gnu/gcc/gcc-7.1.0/gcc-7.1.0.tar.bz2'
|
||||||
list_url = 'http://ftp.gnu.org/gnu/gcc/'
|
list_url = 'http://ftp.gnu.org/gnu/gcc/'
|
||||||
list_depth = 1
|
list_depth = 1
|
||||||
|
|
||||||
|
version('7.1.0', '6bf56a2bca9dac9dbbf8e8d1036964a8')
|
||||||
version('6.3.0', '677a7623c7ef6ab99881bc4e048debb6')
|
version('6.3.0', '677a7623c7ef6ab99881bc4e048debb6')
|
||||||
version('6.2.0', '9768625159663b300ae4de2f4745fcc4')
|
version('6.2.0', '9768625159663b300ae4de2f4745fcc4')
|
||||||
version('6.1.0', '8fb6cb98b8459f5863328380fbf06bd1')
|
version('6.1.0', '8fb6cb98b8459f5863328380fbf06bd1')
|
||||||
@ -56,23 +58,35 @@ class Gcc(AutotoolsPackage):
|
|||||||
version('4.6.4', 'b407a3d1480c11667f293bfb1f17d1a4')
|
version('4.6.4', 'b407a3d1480c11667f293bfb1f17d1a4')
|
||||||
version('4.5.4', '27e459c2566b8209ab064570e1b378f7')
|
version('4.5.4', '27e459c2566b8209ab064570e1b378f7')
|
||||||
|
|
||||||
|
# Builds all default languages by default.
|
||||||
|
# Ada, Go, Jit, and Objective-C++ are not default languages.
|
||||||
|
# In that respect, the name 'all' is rather misleading.
|
||||||
|
variant('languages',
|
||||||
|
default='all',
|
||||||
|
values=('all', 'ada', 'brig', 'c', 'c++', 'fortran',
|
||||||
|
'go', 'java', 'jit', 'lto', 'objc', 'obj-c++'),
|
||||||
|
multi=True,
|
||||||
|
description='Compilers and runtime libraries to build')
|
||||||
variant('binutils',
|
variant('binutils',
|
||||||
default=sys.platform != 'darwin',
|
default=sys.platform != 'darwin',
|
||||||
description="Build via binutils")
|
description='Build via binutils')
|
||||||
variant('piclibs',
|
variant('piclibs',
|
||||||
default=False,
|
default=False,
|
||||||
description="Build PIC versions of libgfortran.a and libstdc++.a")
|
description='Build PIC versions of libgfortran.a and libstdc++.a')
|
||||||
|
|
||||||
depends_on("mpfr")
|
# https://gcc.gnu.org/install/prerequisites.html
|
||||||
depends_on("gmp")
|
depends_on('gmp@4.3.2:')
|
||||||
depends_on("mpc", when='@4.5:')
|
depends_on('mpfr@2.4.2:')
|
||||||
depends_on("isl", when='@5.0:')
|
depends_on('mpc@0.8.1:', when='@4.5:')
|
||||||
depends_on("binutils~libiberty", when='+binutils')
|
depends_on('isl@0.15:', when='@5.0:')
|
||||||
depends_on("zip", type='build')
|
depends_on('zlib', when='@6:')
|
||||||
|
depends_on('gnat', when='languages=ada')
|
||||||
|
depends_on('binutils~libiberty', when='+binutils')
|
||||||
|
depends_on('zip', type='build', when='languages=java')
|
||||||
|
|
||||||
# TODO: integrate these libraries.
|
# TODO: integrate these libraries.
|
||||||
# depends_on("ppl")
|
# depends_on('ppl')
|
||||||
# depends_on("cloog")
|
# depends_on('cloog')
|
||||||
|
|
||||||
# TODO: Add a 'test' deptype
|
# TODO: Add a 'test' deptype
|
||||||
# https://github.com/LLNL/spack/issues/1279
|
# https://github.com/LLNL/spack/issues/1279
|
||||||
@ -82,60 +96,115 @@ class Gcc(AutotoolsPackage):
|
|||||||
# depends_on('autogen@5.5.4:', type='test')
|
# depends_on('autogen@5.5.4:', type='test')
|
||||||
# depends_on('guile@1.4.1:', type='test')
|
# depends_on('guile@1.4.1:', type='test')
|
||||||
|
|
||||||
|
# See https://golang.org/doc/install/gccgo#Releases
|
||||||
|
provides('golang', when='languages=go')
|
||||||
|
# 'when' does not currently support multiple parts of a spec.
|
||||||
|
# See https://github.com/LLNL/spack/pull/4151
|
||||||
|
# provides('golang', when='languages=go @4.6:')
|
||||||
|
# provides('golang@:1', when='languages=go @4.7.1:')
|
||||||
|
# provides('golang@:1.1', when='languages=go @4.8:')
|
||||||
|
# provides('golang@:1.1.2', when='languages=go @4.8.2:')
|
||||||
|
# provides('golang@:1.2', when='languages=go @4.9:')
|
||||||
|
# provides('golang@:1.4', when='languages=go @5:')
|
||||||
|
# provides('golang@:1.6.1', when='languages=go @6:')
|
||||||
|
# provides('golang@:1.8', when='languages=go @7:')
|
||||||
|
|
||||||
|
# For a list of valid languages for a specific release,
|
||||||
|
# run the following command in the GCC source directory:
|
||||||
|
# $ grep ^language= gcc/*/config-lang.in
|
||||||
|
# See https://gcc.gnu.org/install/configure.html
|
||||||
|
|
||||||
|
# Support for processing BRIG 1.0 files was added in GCC 7
|
||||||
|
# BRIG is a binary format for HSAIL:
|
||||||
|
# (Heterogeneous System Architecture Intermediate Language).
|
||||||
|
# See https://gcc.gnu.org/gcc-7/changes.html
|
||||||
|
conflicts('languages=brig', when='@:6')
|
||||||
|
|
||||||
|
# BRIG does not seem to be supported on macOS
|
||||||
|
conflicts('languages=brig', when='platform=darwin')
|
||||||
|
|
||||||
|
# GCC 4.8 added a 'c' language. I'm sure C was always built,
|
||||||
|
# but this is the first version that accepts 'c' as a valid language.
|
||||||
|
conflicts('languages=c', when='@:4.7')
|
||||||
|
|
||||||
|
# GCC 4.6 added support for the Go programming language.
|
||||||
|
# See https://gcc.gnu.org/gcc-4.6/changes.html
|
||||||
|
conflicts('languages=go', when='@:4.5')
|
||||||
|
|
||||||
|
# Go is not supported on macOS
|
||||||
|
conflicts('languages=go', when='platform=darwin')
|
||||||
|
|
||||||
|
# The GCC Java frontend and associated libjava runtime library
|
||||||
|
# have been removed from GCC as of GCC 7.
|
||||||
|
# See https://gcc.gnu.org/gcc-7/changes.html
|
||||||
|
conflicts('languages=java', when='@7:')
|
||||||
|
|
||||||
|
# GCC 5 added the ability to build GCC as a Just-In-Time compiler.
|
||||||
|
# See https://gcc.gnu.org/gcc-5/changes.html
|
||||||
|
conflicts('languages=jit', when='@:4')
|
||||||
|
|
||||||
if sys.platform == 'darwin':
|
if sys.platform == 'darwin':
|
||||||
|
patch('darwin/gcc-7.1.0-headerpad.patch', when='@5:')
|
||||||
|
patch('darwin/gcc-6.1.0-jit.patch', when='@5:')
|
||||||
patch('darwin/gcc-4.9.patch1', when='@4.9.0:4.9.3')
|
patch('darwin/gcc-4.9.patch1', when='@4.9.0:4.9.3')
|
||||||
patch('darwin/gcc-4.9.patch2', when='@4.9.0:4.9.3')
|
patch('darwin/gcc-4.9.patch2', when='@4.9.0:4.9.3')
|
||||||
else:
|
|
||||||
provides('golang', when='@4.7.1:')
|
|
||||||
|
|
||||||
patch('piclibs.patch', when='+piclibs')
|
patch('piclibs.patch', when='+piclibs')
|
||||||
patch('gcc-backport.patch', when='@4.7:4.9.2,5:5.3')
|
patch('gcc-backport.patch', when='@4.7:4.9.2,5:5.3')
|
||||||
|
|
||||||
def configure_args(self):
|
build_directory = 'spack-build'
|
||||||
|
|
||||||
|
def patch(self):
|
||||||
spec = self.spec
|
spec = self.spec
|
||||||
prefix = self.spec.prefix
|
prefix = self.spec.prefix
|
||||||
|
|
||||||
enabled_languages = set(('c', 'c++', 'fortran', 'java', 'objc'))
|
|
||||||
|
|
||||||
if spec.satisfies("@4.7.1:") and sys.platform != 'darwin' and \
|
|
||||||
not (spec.satisfies('@:4.9.3') and 'ppc64le' in spec.architecture):
|
|
||||||
enabled_languages.add('go')
|
|
||||||
|
|
||||||
# Fix a standard header file for OS X Yosemite that
|
# Fix a standard header file for OS X Yosemite that
|
||||||
# is GCC incompatible by replacing non-GCC compliant macros
|
# is GCC incompatible by replacing non-GCC compliant macros
|
||||||
if 'yosemite' in spec.architecture:
|
if 'yosemite' in spec.architecture:
|
||||||
if isfile(r'/usr/include/dispatch/object.h'):
|
if os.path.isfile('/usr/include/dispatch/object.h'):
|
||||||
new_dispatch_dir = join_path(prefix, 'include', 'dispatch')
|
new_dispatch_dir = join_path(prefix, 'include', 'dispatch')
|
||||||
mkdirp(new_dispatch_dir)
|
mkdirp(new_dispatch_dir)
|
||||||
cp = which('cp')
|
|
||||||
new_header = join_path(new_dispatch_dir, 'object.h')
|
new_header = join_path(new_dispatch_dir, 'object.h')
|
||||||
cp(r'/usr/include/dispatch/object.h', new_header)
|
shutil.copyfile('/usr/include/dispatch/object.h', new_header)
|
||||||
filter_file(r'typedef void \(\^dispatch_block_t\)\(void\)',
|
filter_file(r'typedef void \(\^dispatch_block_t\)\(void\)',
|
||||||
'typedef void* dispatch_block_t',
|
'typedef void* dispatch_block_t',
|
||||||
new_header)
|
new_header)
|
||||||
|
|
||||||
|
def configure_args(self):
|
||||||
|
spec = self.spec
|
||||||
|
|
||||||
# Generic options to compile GCC
|
# Generic options to compile GCC
|
||||||
options = [
|
options = [
|
||||||
'--libdir={0}'.format(prefix.lib64),
|
|
||||||
'--disable-multilib',
|
'--disable-multilib',
|
||||||
'--enable-languages={0}'.format(','.join(enabled_languages)),
|
'--enable-languages={0}'.format(
|
||||||
|
','.join(spec.variants['languages'].value)),
|
||||||
'--with-mpfr={0}'.format(spec['mpfr'].prefix),
|
'--with-mpfr={0}'.format(spec['mpfr'].prefix),
|
||||||
'--with-gmp={0}'.format(spec['gmp'].prefix),
|
'--with-gmp={0}'.format(spec['gmp'].prefix),
|
||||||
'--enable-lto',
|
'--enable-lto',
|
||||||
'--with-quad'
|
'--with-quad'
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# Use installed libz
|
||||||
|
if self.version >= Version('6'):
|
||||||
|
options.append('--with-system-zlib')
|
||||||
|
|
||||||
|
# Enabling language "jit" requires --enable-host-shared.
|
||||||
|
if 'languages=jit' in spec:
|
||||||
|
options.append('--enable-host-shared')
|
||||||
|
|
||||||
# Binutils
|
# Binutils
|
||||||
if spec.satisfies('+binutils'):
|
if spec.satisfies('+binutils'):
|
||||||
static_bootstrap_flags = "-static-libstdc++ -static-libgcc"
|
static_bootstrap_flags = '-static-libstdc++ -static-libgcc'
|
||||||
binutils_options = [
|
binutils_options = [
|
||||||
"--with-sysroot=/", "--with-stage1-ldflags=%s %s" %
|
'--with-sysroot=/',
|
||||||
(self.rpath_args, static_bootstrap_flags),
|
'--with-stage1-ldflags={0} {1}'.format(
|
||||||
"--with-boot-ldflags=%s %s" %
|
self.rpath_args, static_bootstrap_flags),
|
||||||
(self.rpath_args, static_bootstrap_flags), "--with-gnu-ld",
|
'--with-boot-ldflags={0} {1}'.format(
|
||||||
"--with-ld=%s/bin/ld" % spec['binutils'].prefix,
|
self.rpath_args, static_bootstrap_flags),
|
||||||
"--with-gnu-as",
|
'--with-gnu-ld',
|
||||||
"--with-as=%s/bin/as" % spec['binutils'].prefix
|
'--with-ld={0}/ld'.format(spec['binutils'].prefix.bin),
|
||||||
|
'--with-gnu-as',
|
||||||
|
'--with-as={0}/as'.format(spec['binutils'].prefix.bin),
|
||||||
]
|
]
|
||||||
options.extend(binutils_options)
|
options.extend(binutils_options)
|
||||||
|
|
||||||
@ -153,8 +222,6 @@ def configure_args(self):
|
|||||||
|
|
||||||
return options
|
return options
|
||||||
|
|
||||||
build_directory = 'spack-build'
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def build_targets(self):
|
def build_targets(self):
|
||||||
if sys.platform == 'darwin':
|
if sys.platform == 'darwin':
|
||||||
@ -163,8 +230,8 @@ def build_targets(self):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def spec_dir(self):
|
def spec_dir(self):
|
||||||
# e.g. lib64/gcc/x86_64-unknown-linux-gnu/4.9.2
|
# e.g. lib/gcc/x86_64-unknown-linux-gnu/4.9.2
|
||||||
spec_dir = glob("%s/lib64/gcc/*/*" % self.prefix)
|
spec_dir = glob.glob('{0}/gcc/*/*'.format(self.prefix.lib))
|
||||||
return spec_dir[0] if spec_dir else None
|
return spec_dir[0] if spec_dir else None
|
||||||
|
|
||||||
@run_after('install')
|
@run_after('install')
|
||||||
@ -172,17 +239,17 @@ def write_rpath_specs(self):
|
|||||||
"""Generate a spec file so the linker adds a rpath to the libs
|
"""Generate a spec file so the linker adds a rpath to the libs
|
||||||
the compiler used to build the executable."""
|
the compiler used to build the executable."""
|
||||||
if not self.spec_dir:
|
if not self.spec_dir:
|
||||||
tty.warn("Could not install specs for %s." %
|
tty.warn('Could not install specs for {0}.'.format(
|
||||||
self.spec.format('$_$@'))
|
self.spec.format('$_$@')))
|
||||||
return
|
return
|
||||||
|
|
||||||
gcc = self.spec['gcc'].command
|
gcc = self.spec['gcc'].command
|
||||||
lines = gcc('-dumpspecs', output=str).strip().split("\n")
|
lines = gcc('-dumpspecs', output=str).strip().split('\n')
|
||||||
specs_file = join_path(self.spec_dir, 'specs')
|
specs_file = join_path(self.spec_dir, 'specs')
|
||||||
with closing(open(specs_file, 'w')) as out:
|
with open(specs_file, 'w') as out:
|
||||||
for line in lines:
|
for line in lines:
|
||||||
out.write(line + "\n")
|
out.write(line + '\n')
|
||||||
if line.startswith("*link:"):
|
if line.startswith('*link:'):
|
||||||
out.write("-rpath %s/lib:%s/lib64 \\\n" %
|
out.write(r'-rpath {0}:{1} \n'.format(
|
||||||
(self.prefix, self.prefix))
|
self.prefix.lib, self.prefix.lib64))
|
||||||
set_install_permissions(specs_file)
|
set_install_permissions(specs_file)
|
||||||
|
51
var/spack/repos/builtin/packages/gnat/package.py
Normal file
51
var/spack/repos/builtin/packages/gnat/package.py
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
##############################################################################
|
||||||
|
# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
|
||||||
|
# Produced at the Lawrence Livermore National Laboratory.
|
||||||
|
#
|
||||||
|
# This file is part of Spack.
|
||||||
|
# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
|
||||||
|
# LLNL-CODE-647188
|
||||||
|
#
|
||||||
|
# For details, see https://github.com/llnl/spack
|
||||||
|
# Please also see the LICENSE file for our notice and the LGPL.
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Lesser General Public License (as
|
||||||
|
# published by the Free Software Foundation) version 2.1, February 1999.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
|
||||||
|
# conditions of the GNU Lesser General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Lesser General Public
|
||||||
|
# License along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
##############################################################################
|
||||||
|
from spack import *
|
||||||
|
|
||||||
|
|
||||||
|
class Gnat(MakefilePackage):
|
||||||
|
"""The GNAT Ada compiler. Ada is a modern programming language designed
|
||||||
|
for large, long-lived applications - and embedded systems in particular
|
||||||
|
- where reliability and efficiency are essential."""
|
||||||
|
|
||||||
|
homepage = "https://libre.adacore.com/tools/gnat-gpl-edition/"
|
||||||
|
|
||||||
|
# NOTE: This is a binary installer intended to bootstrap GCC's Ada compiler
|
||||||
|
|
||||||
|
# There may actually be a way to install GNAT from source. If you go to
|
||||||
|
# the GNAT Download page: https://libre.adacore.com/download/
|
||||||
|
# select "Free Software or Academic Development", select your platform,
|
||||||
|
# expand GNAT Ada, and expand Sources, you'll see links to download the
|
||||||
|
# source code for GNAT and all of its dependencies. Most of these
|
||||||
|
# dependencies are already in Spack.
|
||||||
|
|
||||||
|
# This is the GPL release for Linux x86-64
|
||||||
|
version('2016', '9741107cca1a6a4ddb0d5e8de824a90c', extension='tar.gz',
|
||||||
|
url="http://mirrors.cdn.adacore.com/art/5739cefdc7a447658e0b016b")
|
||||||
|
|
||||||
|
phases = ['install']
|
||||||
|
|
||||||
|
def install(self, spec, prefix):
|
||||||
|
make('ins-all', 'prefix={0}'.format(prefix))
|
Loading…
Reference in New Issue
Block a user