def install(self, spec, prefix): options = [] options.extend(std_cmake_args) options.extend([ '-DOCE_INSTALL_PREFIX=%s' % prefix, '-DOCE_BUILD_SHARED_LIB:BOOL=ON', '-DCMAKE_BUILD_TYPE:STRING=Release', '-DOCE_DATAEXCHANGE:BOOL=ON', '-DOCE_DISABLE_X11:BOOL=%s' % ('OFF' if '+X11' in spec else 'ON'), '-DOCE_DRAW:BOOL=OFF', '-DOCE_MODEL:BOOL=ON', '-DOCE_MULTITHREAD_LIBRARY:STRING=%s' % ('TBB' if '+tbb' in spec else 'NONE'), '-DOCE_OCAF:BOOL=ON', '-DOCE_USE_TCL_TEST_FRAMEWORK:BOOL=OFF', '-DOCE_VISUALISATION:BOOL=OFF', '-DOCE_WITH_FREEIMAGE:BOOL=OFF', '-DOCE_WITH_GL2PS:BOOL=OFF', '-DOCE_WITH_OPENCL:BOOL=OFF' ]) if platform.system() == 'Darwin': options.extend([ '-DOCE_OSX_USE_COCOA:BOOL=ON', ]) if platform.system() == 'Darwin' and (macOS_version() >= Version('10.12')): # use @rpath on Sierra due to limit of dynamic loader options.append('-DCMAKE_MACOSX_RPATH=ON') else: options.append('-DCMAKE_INSTALL_NAME_DIR:PATH=%s/lib' % prefix) cmake('.', *options) make("install/strip") if self.run_tests: make("test")
class Bison(AutotoolsPackage): """Bison is a general-purpose parser generator that converts an annotated context-free grammar into a deterministic LR or generalized LR (GLR) parser employing LALR(1) parser tables.""" homepage = "http://www.gnu.org/software/bison/" url = "http://ftp.gnu.org/gnu/bison/bison-3.0.4.tar.gz" version('3.0.4', 'a586e11cd4aff49c3ff6d3b6a4c9ccf8') version('2.7', 'ded660799e76fb1667d594de1f7a0da9') depends_on('m4', type=('build', 'run')) patch('pgi.patch', when='@3.0.4') if sys.platform == 'darwin' and macOS_version() >= Version('10.13'): patch('secure_snprintf.patch', level=0, when='@3.0.4') build_directory = 'spack-build'
def patch(self): # aclocal need complete include path (especially on os x) pkgconf_inc = '-I %s/share/aclocal/' % (self.spec['pkg-config'].prefix) libtool_inc = '-I %s/share/aclocal/' % (self.spec['libtool'].prefix) newpath = 'aclocal -I m4 %s %s' % (pkgconf_inc, libtool_inc) filter_file(r'aclocal -I m4', r'%s' % newpath, "build.sh") # patch hh.mod to be compatible with coreneuron if self.spec.satisfies('+coreneuron'): filter_file(r'GLOBAL minf', r'RANGE minf', 'src/nrnoc/hh.mod') filter_file(r'TABLE minf', r':TABLE minf', "src/nrnoc/hh.mod") # python header path changed on highsierra if sys.platform == 'darwin' and macOS_version() >= Version('10.13'): files = ['src/nrnpython/grids.c', 'src/nrnpython/grids.h', 'src/nrnpython/rxd.c', 'src/nrnpython/rxd_vol.c'] filter_file(r'<Python/Python.h>', r'<Python.h>', *files)
class Oce(Package): """Open CASCADE Community Edition: patches/improvements/experiments contributed by users over the official Open CASCADE library. """ homepage = "https://github.com/tpaviot/oce" url = "https://github.com/tpaviot/oce/archive/OCE-0.18.tar.gz" version('0.18.2', '6dfd68e459e2c62387579888a867281f') version('0.18.1', '2a7597f4243ee1f03245aeeb02d00956') version( '0.18', '226e45e77c16a4a6e127c71fefcd171410703960ae75c7ecc7eb68895446a993') version('0.17.2', 'bf2226be4cd192606af677cf178088e5') version('0.17.1', '36c67b87093c675698b483454258af91') version('0.17', 'f1a89395c4b0d199bea3db62b85f818d') version('0.16.1', '4d591b240c9293e879f50d86a0cb2bb3') version('0.16', '7a4b4df5a104d75a537e25e7dd387eca') variant('tbb', default=True, description='Build with Intel Threading Building Blocks') variant('X11', default=False, description='Build with X11 enabled') depends_on('[email protected]:', type='build') depends_on('tbb', when='+tbb') # There is a bug in OCE which appears with Clang (version?) or GCC 6.0 # and has to do with compiler optimization, see # https://github.com/tpaviot/oce/issues/576 # http://tracker.dev.opencascade.org/view.php?id=26042 # https://github.com/tpaviot/oce/issues/605 # https://github.com/tpaviot/oce/commit/61cb965b9ffeca419005bc15e635e67589c421dd.patch patch('null.patch', when='@0.16:0.17.1') # OCE depends on xlocale.h from glibc-headers but it was removed in 2.26, # see https://github.com/tpaviot/oce/issues/675 patch('xlocale.patch', level=0, when='@0.18.1:') # fix build with Xcode 8 "previous definition of CLOCK_REALTIME" # reported 27 Sep 2016 https://github.com/tpaviot/oce/issues/643 if (platform.system() == "Darwin") and (macOS_version() == Version('10.12')): patch('sierra.patch', when='@0.17.2:0.18.0') def install(self, spec, prefix): options = [] options.extend(std_cmake_args) options.extend([ '-DOCE_INSTALL_PREFIX=%s' % prefix, '-DOCE_BUILD_SHARED_LIB:BOOL=ON', '-DCMAKE_BUILD_TYPE:STRING=Release', '-DOCE_DATAEXCHANGE:BOOL=ON', '-DOCE_DISABLE_X11:BOOL=%s' % ('OFF' if '+X11' in spec else 'ON'), '-DOCE_DRAW:BOOL=OFF', '-DOCE_MODEL:BOOL=ON', '-DOCE_MULTITHREAD_LIBRARY:STRING=%s' % ('TBB' if '+tbb' in spec else 'NONE'), '-DOCE_OCAF:BOOL=ON', '-DOCE_USE_TCL_TEST_FRAMEWORK:BOOL=OFF', '-DOCE_VISUALISATION:BOOL=OFF', '-DOCE_WITH_FREEIMAGE:BOOL=OFF', '-DOCE_WITH_GL2PS:BOOL=OFF', '-DOCE_WITH_OPENCL:BOOL=OFF' ]) if platform.system() == 'Darwin': options.extend([ '-DOCE_OSX_USE_COCOA:BOOL=ON', ]) if platform.system() == 'Darwin' and (macOS_version() >= Version('10.12')): # use @rpath on Sierra due to limit of dynamic loader options.append('-DCMAKE_MACOSX_RPATH=ON') else: options.append('-DCMAKE_INSTALL_NAME_DIR:PATH=%s/lib' % prefix) cmake('.', *options) make("install/strip") if self.run_tests: make("test")
def cmake_args(self): spec = self.spec cxx_flags = [] options = [] # #################### Base Settings ####################### mpi_bin = spec['mpi'].prefix.bin options.extend([ '-DTrilinos_VERBOSE_CONFIGURE:BOOL=OFF', '-DTrilinos_ENABLE_TESTS:BOOL=OFF', '-DTrilinos_ENABLE_EXAMPLES:BOOL=OFF', '-DTrilinos_ENABLE_CXX11:BOOL=ON', '-DBUILD_SHARED_LIBS:BOOL=%s' % ('ON' if '+shared' in spec else 'OFF'), # The following can cause problems on systems that don't have # static libraries available for things like dl and pthreads # for example when trying to build static libs # '-DTPL_FIND_SHARED_LIBS:BOOL=%s' % ( # 'ON' if '+shared' in spec else 'OFF'), # '-DTrilinos_LINK_SEARCH_START_STATIC:BOOL=%s' % ( # 'OFF' if '+shared' in spec else 'ON'), # Force Trilinos to use the MPI wrappers instead of raw compilers # this is needed on Apple systems that require full resolution of # all symbols when linking shared libraries '-DTPL_ENABLE_MPI:BOOL=ON', '-DCMAKE_C_COMPILER=%s' % spec['mpi'].mpicc, '-DCMAKE_CXX_COMPILER=%s' % spec['mpi'].mpicxx, '-DCMAKE_Fortran_COMPILER=%s' % spec['mpi'].mpifc, '-DMPI_BASE_DIR:PATH=%s' % spec['mpi'].prefix ]) # ################## Trilinos Packages ##################### options.extend([ '-DTrilinos_ENABLE_ALL_OPTIONAL_PACKAGES:BOOL=%s' % ('ON' if '+alloptpkgs' in spec else 'OFF'), '-DTrilinos_ENABLE_Tpetra:BOOL=%s' % ('ON' if '+tpetra' in spec else 'OFF'), '-DTrilinos_ENABLE_Epetra:BOOL=%s' % ('ON' if '+epetra' in spec else 'OFF'), '-DTrilinos_ENABLE_EpetraExt:BOOL=%s' % ('ON' if '+epetraext' in spec else 'OFF'), '-DTrilinos_ENABLE_ML:BOOL=%s' % ('ON' if '+ml' in spec else 'OFF'), '-DTrilinos_ENABLE_AztecOO:BOOL=%s' % ('ON' if '+aztec' in spec else 'OFF'), '-DTrilinos_ENABLE_Sacado:BOOL=%s' % ('ON' if '+sacado' in spec else 'OFF'), '-DTrilinos_ENABLE_Belos:BOOL=%s' % ('ON' if '+belos' in spec else 'OFF'), '-DTrilinos_ENABLE_Zoltan:BOOL=%s' % ('ON' if '+zoltan' in spec else 'OFF'), '-DTrilinos_ENABLE_Zoltan2:BOOL=%s' % ('ON' if '+zoltan2' in spec else 'OFF'), '-DTrilinos_ENABLE_Amesos:BOOL=%s' % ('ON' if '+amesos' in spec else 'OFF'), '-DTrilinos_ENABLE_Amesos2:BOOL=%s' % ('ON' if '+amesos2' in spec else 'OFF'), '-DTrilinos_ENABLE_MueLu:BOOL=%s' % ('ON' if '+muelu' in spec else 'OFF'), '-DTrilinos_ENABLE_Ifpack:BOOL=%s' % ('ON' if '+ifpack' in spec else 'OFF'), '-DTrilinos_ENABLE_Ifpack2:BOOL=%s' % ('ON' if '+ifpack2' in spec else 'OFF'), '-DTrilinos_ENABLE_Gtest:BOOL=%s' % ('ON' if '+gtest' in spec else 'OFF'), '-DTrilinos_ENABLE_Teuchos:BOOL=%s' % ('ON' if '+teuchos' in spec else 'OFF'), '-DTrilinos_ENABLE_Anasazi:BOOL=%s' % ('ON' if '+anasazi' in spec else 'OFF'), '-DTrilinos_ENABLE_ROL:BOOL=%s' % ('ON' if '+rol' in spec else 'OFF'), '-DTrilinos_ENABLE_NOX:BOOL=%s' % ('ON' if '+nox' in spec else 'OFF'), '-DTrilinos_ENABLE_Shards=%s' % ('ON' if '+shards' in spec else 'OFF'), '-DTrilinos_ENABLE_Intrepid=%s' % ('ON' if '+intrepid' in spec else 'OFF'), '-DTrilinos_ENABLE_Intrepid2=%s' % ('ON' if '+intrepid2' in spec else 'OFF'), ]) if '+xsdkflags' in spec: options.extend(['-DUSE_XSDK_DEFAULTS=YES']) if '+stk' in spec: # Currently these are fairly specific to the Nalu package # They can likely change when necessary in the future options.extend([ '-DTrilinos_ENABLE_STKMesh:BOOL=ON', '-DTrilinos_ENABLE_STKSimd:BOOL=ON', '-DTrilinos_ENABLE_STKIO:BOOL=ON', '-DTrilinos_ENABLE_STKTransfer:BOOL=ON', '-DTrilinos_ENABLE_STKSearch:BOOL=ON', '-DTrilinos_ENABLE_STKUtil:BOOL=ON', '-DTrilinos_ENABLE_STKTopology:BOOL=ON', '-DTrilinos_ENABLE_STKUnit_tests:BOOL=ON', '-DTrilinos_ENABLE_STKUnit_test_utils:BOOL=ON', '-DTrilinos_ENABLE_STKClassic:BOOL=OFF', '-DTrilinos_ENABLE_STKExprEval:BOOL=ON' ]) if '+dtk' in spec: options.extend([ '-DTrilinos_EXTRA_REPOSITORIES:STRING=DataTransferKit', '-DTpetra_INST_INT_UNSIGNED_LONG:BOOL=ON', '-DTrilinos_ENABLE_DataTransferKit:BOOL=ON' ]) if '+exodus' in spec: # Currently these are fairly specific to the Nalu package # They can likely change when necessary in the future options.extend([ '-DTrilinos_ENABLE_SEACAS:BOOL=ON', '-DTrilinos_ENABLE_SEACASExodus:BOOL=ON', '-DTrilinos_ENABLE_SEACASEpu:BOOL=ON', '-DTrilinos_ENABLE_SEACASExodiff:BOOL=ON', '-DTrilinos_ENABLE_SEACASNemspread:BOOL=ON', '-DTrilinos_ENABLE_SEACASNemslice:BOOL=ON', '-DTrilinos_ENABLE_SEACASIoss:BOOL=ON' ]) else: options.extend([ '-DTrilinos_ENABLE_SEACAS:BOOL=OFF', '-DTrilinos_ENABLE_SEACASExodus:BOOL=OFF' ]) # ######################### TPLs ############################# blas = spec['blas'].libs lapack = spec['lapack'].libs # Note: -DXYZ_LIBRARY_NAMES= needs semicolon separated list of names options.extend([ '-DTPL_ENABLE_BLAS=ON', '-DBLAS_LIBRARY_NAMES=%s' % ';'.join(blas.names), '-DBLAS_LIBRARY_DIRS=%s' % ';'.join(blas.directories), '-DTPL_ENABLE_LAPACK=ON', '-DLAPACK_LIBRARY_NAMES=%s' % ';'.join(lapack.names), '-DLAPACK_LIBRARY_DIRS=%s' % ';'.join(lapack.directories), '-DTPL_ENABLE_Netcdf:BOOL=ON', '-DNetCDF_ROOT:PATH=%s' % spec['netcdf'].prefix, '-DTPL_ENABLE_X11:BOOL=%s' % ('ON' if '+x11' in spec else 'OFF'), '-DTrilinos_ENABLE_PyTrilinos:BOOL=%s' % ('ON' if '+python' in spec else 'OFF'), ]) if '+hypre' in spec: options.extend([ '-DTPL_ENABLE_HYPRE:BOOL=ON', '-DHYPRE_INCLUDE_DIRS:PATH=%s' % spec['hypre'].prefix.include, '-DHYPRE_LIBRARY_DIRS:PATH=%s' % spec['hypre'].prefix.lib ]) if '+boost' in spec: options.extend([ '-DTPL_ENABLE_Boost:BOOL=ON', '-DBoost_INCLUDE_DIRS:PATH=%s' % spec['boost'].prefix.include, '-DBoost_LIBRARY_DIRS:PATH=%s' % spec['boost'].prefix.lib ]) else: options.extend(['-DTPL_ENABLE_Boost:BOOL=OFF']) if '+hdf5' in spec: options.extend([ '-DTPL_ENABLE_HDF5:BOOL=ON', '-DHDF5_INCLUDE_DIRS:PATH=%s' % spec['hdf5'].prefix.include, '-DHDF5_LIBRARY_DIRS:PATH=%s' % spec['hdf5'].prefix.lib ]) else: options.extend(['-DTPL_ENABLE_HDF5:BOOL=OFF']) if '+suite-sparse' in spec: options.extend([ # FIXME: Trilinos seems to be looking for static libs only, # patch CMake TPL file? '-DTPL_ENABLE_Cholmod:BOOL=OFF', # '-DTPL_ENABLE_Cholmod:BOOL=ON', # '-DCholmod_LIBRARY_DIRS:PATH=%s' % ( # spec['suite-sparse'].prefix.lib, # '-DCholmod_INCLUDE_DIRS:PATH=%s' % ( # spec['suite-sparse'].prefix.include, '-DTPL_ENABLE_UMFPACK:BOOL=ON', '-DUMFPACK_LIBRARY_DIRS:PATH=%s' % (spec['suite-sparse'].prefix.lib), '-DUMFPACK_INCLUDE_DIRS:PATH=%s' % (spec['suite-sparse'].prefix.include), '-DUMFPACK_LIBRARY_NAMES=umfpack;amd;colamd;cholmod;' + 'suitesparseconfig' ]) else: options.extend([ '-DTPL_ENABLE_Cholmod:BOOL=OFF', '-DTPL_ENABLE_UMFPACK:BOOL=OFF', ]) if '+metis' in spec: options.extend([ '-DTPL_ENABLE_METIS:BOOL=ON', '-DMETIS_LIBRARY_DIRS=%s' % spec['metis'].prefix.lib, '-DMETIS_LIBRARY_NAMES=metis', '-DTPL_METIS_INCLUDE_DIRS=%s' % spec['metis'].prefix.include, '-DTPL_ENABLE_ParMETIS:BOOL=ON', '-DParMETIS_LIBRARY_DIRS=%s;%s' % (spec['parmetis'].prefix.lib, spec['metis'].prefix.lib), '-DParMETIS_LIBRARY_NAMES=parmetis;metis', '-DTPL_ParMETIS_INCLUDE_DIRS=%s;%s' % (spec['parmetis'].prefix.include, spec['metis'].prefix.include) ]) else: options.extend([ '-DTPL_ENABLE_METIS:BOOL=OFF', '-DTPL_ENABLE_ParMETIS:BOOL=OFF', ]) if '+mumps' in spec: scalapack = spec['scalapack'].libs options.extend([ '-DTPL_ENABLE_MUMPS:BOOL=ON', '-DMUMPS_LIBRARY_DIRS=%s' % spec['mumps'].prefix.lib, # order is important! '-DMUMPS_LIBRARY_NAMES=dmumps;mumps_common;pord', '-DTPL_ENABLE_SCALAPACK:BOOL=ON', '-DSCALAPACK_LIBRARY_NAMES=%s' % ';'.join(scalapack.names), '-DSCALAPACK_LIBRARY_DIRS=%s' % ';'.join(scalapack.directories) ]) # see # https://github.com/trilinos/Trilinos/blob/master/packages/amesos/README-MUMPS cxx_flags.extend(['-DMUMPS_5_0']) else: options.extend([ '-DTPL_ENABLE_MUMPS:BOOL=OFF', '-DTPL_ENABLE_SCALAPACK:BOOL=OFF', ]) if '+superlu-dist' in spec: # Amesos, conflicting types of double and complex SLU_D # see # https://trilinos.org/pipermail/trilinos-users/2015-March/004731.html # and # https://trilinos.org/pipermail/trilinos-users/2015-March/004802.html options.extend([ '-DTeuchos_ENABLE_COMPLEX:BOOL=OFF', '-DKokkosTSQR_ENABLE_Complex:BOOL=OFF' ]) options.extend([ '-DTPL_ENABLE_SuperLUDist:BOOL=ON', '-DSuperLUDist_LIBRARY_DIRS=%s' % spec['superlu-dist'].prefix.lib, '-DSuperLUDist_INCLUDE_DIRS=%s' % spec['superlu-dist'].prefix.include ]) if spec.satisfies('^[email protected]:'): options.extend( ['-DHAVE_SUPERLUDIST_LUSTRUCTINIT_2ARG:BOOL=ON']) else: options.extend([ '-DTPL_ENABLE_SuperLUDist:BOOL=OFF', ]) if '+superlu' in spec: options.extend([ '-DTPL_ENABLE_SuperLU:BOOL=ON', '-DSuperLU_LIBRARY_DIRS=%s' % spec['superlu'].prefix.lib, '-DSuperLU_INCLUDE_DIRS=%s' % spec['superlu'].prefix.include ]) else: options.extend([ '-DTPL_ENABLE_SuperLU:BOOL=OFF', ]) if '+pnetcdf' in spec: options.extend([ '-DTPL_ENABLE_Pnetcdf:BOOL=ON', '-DTPL_Netcdf_Enables_Netcdf4:BOOL=ON', '-DTPL_Netcdf_PARALLEL:BOOL=ON', '-DPNetCDF_ROOT:PATH=%s' % spec['parallel-netcdf'].prefix ]) else: options.extend(['-DTPL_ENABLE_Pnetcdf:BOOL=OFF']) if '+zlib' in spec: options.extend([ '-DTPL_ENABLE_Zlib:BOOL=ON', '-DZlib_ROOT:PATH=%s' % spec['zlib'].prefix, ]) else: options.extend(['-DTPL_ENABLE_Zlib:BOOL=OFF']) if '+cgns' in spec: options.extend([ '-DTPL_ENABLE_CGNS:BOOL=ON', '-DCGNS_INCLUDE_DIRS:PATH=%s' % spec['cgns'].prefix.include, '-DCGNS_LIBRARY_DIRS:PATH=%s' % spec['cgns'].prefix.lib ]) else: options.extend(['-DTPL_ENABLE_GGNS:BOOL=OFF']) # ################# Miscellaneous Stuff ###################### # OpenMP if '+openmp' in spec: options.extend([ '-DTrilinos_ENABLE_OpenMP:BOOL=ON', '-DKokkos_ENABLE_OpenMP:BOOL=ON' ]) if '+tpetra' in spec: options.extend(['-DTpetra_INST_OPENMP:BOOL=ON']) # Fortran lib if '+fortran' in spec: if spec.satisfies('%gcc') or spec.satisfies('%clang'): libgfortran = os.path.dirname( os.popen('%s --print-file-name libgfortran.a' % join_path(mpi_bin, 'mpif90')).read()) options.extend([ '-DTrilinos_EXTRA_LINK_FLAGS:STRING=-L%s/ -lgfortran' % (libgfortran), '-DTrilinos_ENABLE_Fortran=ON' ]) # Explicit instantiation if '+instantiate' in spec: options.extend( ['-DTrilinos_ENABLE_EXPLICIT_INSTANTIATION:BOOL=ON']) if '+tpetra' in spec: options.extend([ '-DTpetra_INST_DOUBLE:BOOL=ON', '-DTpetra_INST_INT_LONG:BOOL=ON' '-DTpetra_INST_COMPLEX_DOUBLE=%s' % ('ON' if '+instantiate_cmplx' in spec else 'OFF') ]) # disable due to compiler / config errors: if spec.satisfies('%xl') or spec.satisfies('%xl_r'): options.extend([ '-DTrilinos_ENABLE_Pamgen:BOOL=OFF', '-DTrilinos_ENABLE_Stokhos:BOOL=OFF' ]) if sys.platform == 'darwin': options.extend(['-DTrilinos_ENABLE_FEI=OFF']) if sys.platform == 'darwin' and macOS_version() >= Version('10.12'): # use @rpath on Sierra due to limit of dynamic loader options.append('-DCMAKE_MACOSX_RPATH=ON') else: options.append('-DCMAKE_INSTALL_NAME_DIR:PATH=%s' % self.prefix.lib) if spec.satisfies('%intel') and spec.satisfies('@12.6.2'): # Panzer uses some std:chrono that is not recognized by Intel # Don't know which (maybe all) Trilinos versions this applies to # Don't know which (maybe all) Intel versions this applies to options.extend(['-DTrilinos_ENABLE_Panzer:BOOL=OFF']) # collect CXX flags: options.extend([ '-DCMAKE_CXX_FLAGS:STRING=%s' % (' '.join(cxx_flags)), ]) # disable due to compiler / config errors: options.extend(['-DTrilinos_ENABLE_Pike=OFF']) return options
class Gcc(AutotoolsPackage): """The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Ada, and Go, as well as libraries for these languages.""" 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_depth = 1 version('7.3.0', 'be2da21680f27624f3a87055c4ba5af2') version('7.2.0', 'ff370482573133a7fcdd96cd2f552292') version('7.1.0', '6bf56a2bca9dac9dbbf8e8d1036964a8') version('6.4.0', '11ba51a0cfb8471927f387c8895fe232') version('6.3.0', '677a7623c7ef6ab99881bc4e048debb6') version('6.2.0', '9768625159663b300ae4de2f4745fcc4') version('6.1.0', '8fb6cb98b8459f5863328380fbf06bd1') version('5.5.0', '0f70424213b4a1113c04ba66ddda0c1f') version('5.4.0', '4c626ac2a83ef30dfb9260e6f59c2b30') version('5.3.0', 'c9616fd448f980259c31de613e575719') version('5.2.0', 'a51bcfeb3da7dd4c623e27207ed43467') version('5.1.0', 'd5525b1127d07d215960e6051c5da35e') version('4.9.4', '87c24a4090c1577ba817ec6882602491') version('4.9.3', '6f831b4d251872736e8e9cc09746f327') version('4.9.2', '4df8ee253b7f3863ad0b86359cd39c43') version('4.9.1', 'fddf71348546af523353bd43d34919c1') version('4.8.5', '80d2c2982a3392bb0b89673ff136e223') version('4.8.4', '5a84a30839b2aca22a2d723de2a626ec') version('4.7.4', '4c696da46297de6ae77a82797d2abe28') version('4.6.4', 'b407a3d1480c11667f293bfb1f17d1a4') version('4.5.4', '27e459c2566b8209ab064570e1b378f7') # We specifically do not add 'all' variant here because: # (i) Ada, Go, Jit, and Objective-C++ are not default languages. # In that respect, the name 'all' is rather misleading. # (ii) Languages other than c,c++,fortran are prone to configure bug in GCC # For example, 'java' appears to ignore custom location of zlib # (iii) meaning of 'all' changes with GCC version, i.e. 'java' is not part # of gcc7. Correctly specifying conflicts() and depends_on() in such a # case is a PITA. variant('languages', default='c,c++,fortran', values=('ada', 'brig', 'c', 'c++', 'fortran', 'go', 'java', 'jit', 'lto', 'objc', 'obj-c++'), multi=True, description='Compilers and runtime libraries to build') variant('binutils', default=False, description='Build via binutils') variant('piclibs', default=False, description='Build PIC versions of libgfortran.a and libstdc++.a') variant('strip', default=False, description='Strip executables to reduce installation size') # https://gcc.gnu.org/install/prerequisites.html depends_on('[email protected]:') depends_on('[email protected]:') depends_on('[email protected]:', when='@4.5:') depends_on('[email protected]', when='@5:5.9') depends_on('[email protected]:', when='@6:') 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. # depends_on('ppl') # depends_on('cloog') # https://gcc.gnu.org/install/test.html depends_on('[email protected]', type='test') depends_on('expect', type='test') depends_on('tcl', type='test') depends_on('[email protected]:', type='test') depends_on('[email protected]:', type='test') # See https://golang.org/doc/install/gccgo#Releases 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': # Fix parallel build on APFS filesystem # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81797 if macOS_version() >= Version('10.13'): patch('darwin/apfs.patch', when='@6.1:6.4,7.1:7.3') 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.patch2', when='@4.9.0:4.9.3') patch('piclibs.patch', when='+piclibs') patch('gcc-backport.patch', when='@4.7:4.9.2,5:5.3') build_directory = 'spack-build' def url_for_version(self, version): url = 'http://ftp.gnu.org/gnu/gcc/gcc-{0}/gcc-{0}.tar.{1}' suffix = 'xz' if version < Version('6.4.0') or version == Version('7.1.0'): suffix = 'bz2' if version == Version('5.5.0'): suffix = 'xz' return url.format(version, suffix) def patch(self): spec = self.spec prefix = self.spec.prefix # Fix a standard header file for OS X Yosemite that # is GCC incompatible by replacing non-GCC compliant macros if 'yosemite' in spec.architecture: if os.path.isfile('/usr/include/dispatch/object.h'): new_dispatch_dir = join_path(prefix, 'include', 'dispatch') mkdirp(new_dispatch_dir) new_header = join_path(new_dispatch_dir, 'object.h') shutil.copyfile('/usr/include/dispatch/object.h', new_header) filter_file(r'typedef void \(\^dispatch_block_t\)\(void\)', 'typedef void* dispatch_block_t', new_header) # Use installed libz if self.version >= Version('6'): filter_file('@zlibdir@', '-L{0}'.format(spec['zlib'].prefix.lib), 'gcc/Makefile.in') filter_file('@zlibinc@', '-I{0}'.format(spec['zlib'].prefix.include), 'gcc/Makefile.in') def configure_args(self): spec = self.spec # Generic options to compile GCC options = [ '--disable-multilib', '--enable-languages={0}'.format( ','.join(spec.variants['languages'].value)), '--with-mpfr={0}'.format(spec['mpfr'].prefix), '--with-gmp={0}'.format(spec['gmp'].prefix), '--enable-lto', '--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 if spec.satisfies('+binutils'): static_bootstrap_flags = '-static-libstdc++ -static-libgcc' binutils_options = [ '--with-sysroot=/', '--with-stage1-ldflags={0} {1}'.format( self.rpath_args, static_bootstrap_flags), '--with-boot-ldflags={0} {1}'.format( self.rpath_args, static_bootstrap_flags), '--with-gnu-ld', '--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) # MPC if 'mpc' in spec: options.append('--with-mpc={0}'.format(spec['mpc'].prefix)) # ISL if 'isl' in spec: options.append('--with-isl={0}'.format(spec['isl'].prefix)) # macOS if sys.platform == 'darwin': options.append('--with-build-config=bootstrap-debug') return options @property def build_targets(self): if sys.platform == 'darwin': return ['bootstrap'] return [] @property def install_targets(self): if '+strip' in self.spec: return ['install-strip'] return ['install'] @property def spec_dir(self): # e.g. lib/gcc/x86_64-unknown-linux-gnu/4.9.2 spec_dir = glob.glob('{0}/gcc/*/*'.format(self.prefix.lib)) return spec_dir[0] if spec_dir else None @run_after('install') 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 {0}.'.format( self.spec.format('$_$@'))) return gcc = self.spec['gcc'].command lines = gcc('-dumpspecs', output=str).strip().split('\n') specs_file = join_path(self.spec_dir, 'specs') with open(specs_file, 'w') as out: for line in lines: out.write(line + '\n') if line.startswith('*link:'): out.write('-rpath {0}:{1} '.format( self.prefix.lib, self.prefix.lib64)) set_install_permissions(specs_file) def setup_environment(self, spack_env, run_env): run_env.set('CC', join_path(self.spec.prefix.bin, 'gcc')) run_env.set('CXX', join_path(self.spec.prefix.bin, 'g++')) run_env.set('FC', join_path(self.spec.prefix.bin, 'gfortran')) run_env.set('F77', join_path(self.spec.prefix.bin, 'gfortran')) run_env.set('F90', join_path(self.spec.prefix.bin, 'gfortran'))