Customizing Compilers

  • Spack doesn’t come with any compiler. To add a compiler you type:

    spack compiler add
  • This will add the default compiler gcc@4.8.0 that comes with the centos7. Now you can use the compiler to install another packages.

Listing Available Compilers

  • To list available compilers, you simply type:

    spack compilers
  • This will show all available compilers that you can use when installing packages. For example, the following output shows that there is only one available compiler.

    ==> Available compilers
    -- gcc centos7-x86_64 -------------------------------------------
    gcc@4.8.5

    The spack compilers command is an alias for the command spack compiler list.

Adding a Compiler to Spack

  • To add a compiler to Spack, you need to make sure that the compiler is installed. Suppose that you need to add gcc at version 7.1.0. This compiler hasn’t been installed, so you need to install it using the following command:

    spack install gcc@7.1.0
  • To make sure that gcc at version 7.1.0 has been installed successfully, type:

    spack find -p gcc
  • The flag -p is to show paths to the installed package directories. The following output shows that the compiler has been installed successfully.

    ==> 2 installed packages
    -- linux-centos7-x86_64 / gcc@4.8.5 -----------------------------
    gcc@9.3.0  /home/tahat/spack/opt/spack/linux-centos7-x86_64/gcc-4.8.5/gcc-9.3.0-vxq35mmyzthsbvcdkikwpnkexqj4h3hx
    
    -- linux-centos7-x86_64 / gcc@9.3.0 -----------------------------
    gcc@7.1.0  /home/tahat/spack/opt/spack/linux-centos7-x86_64/gcc-9.3.0/gcc-7.1.0-tnyp43zpkz6yrcqlglauwiyetmvrifpp
  • To add a compiler as an available compiler, use the spack compiler add command.

    spack compiler add <location>
  • Location is the location of the installed compiler. To print the location of the gcc@8.3.0 compiler, type:

    spack location -i gcc@7.1.0

    output:

    /home/tahat/spack/opt/spack/linux-centos7-x86_64/gcc-9.3.0/gcc-7.1.0-tnyp43zpkz6yrcqlglauwiyetmvrifpp
  • You can add gccgcc@7.1.0 to Spack as an available compiler using the spack compiler add command. This will allow future packages to build with gcc@7.1.0.

    spack compiler add /home/tahat/spack/opt/spack/linux-centos7-x86_64/gcc-9.3.0/gcc-7.1.0-tnyp43zpkz6yrcqlglauwiyetmvrifpp
  • The following output shows that gcc@7.1.0 has been added.

    ==> Added 1 new compiler to /home/tahat/.spack/linux/compilers.yaml
        gcc@7.1.0
    ==> Compilers are defined in the following files:
        /home/tahat/.spack/linux/compilers.yaml----
  • Alternatively, you can add compilers to Spack by editing compilers.yaml which is located in $SPACK_ROOT/etc/spack/linux.

  • You can add the compiler you installed above (gcc@7.1.0) manually. You can find the location of this compiler using the spack location command as shown above. You’ll find it’s installed in $SPACK_ROOT/opt/spack/linux-centos7-x86_64/gcc-9.3.0/gcc-7.1.0-tnyp43zpkz6yrcqlglauwiyetmvrifpp. You edit the compilers.yaml file as follows:

    vim $SPACK_ROOT/opt/spack/compilers.yaml
  • The file looks like the following:

    compilers:
    - compiler:
        spec: gcc@4.8.5
        paths:
          cc: /usr/bin/gcc
          cxx: /usr/bin/g++
          f77: /usr/bin/gfortran
          fc: /usr/bin/gfortran
        flags: {}
        operating_system: centos7
        target: x86_64
        modules: []
        environment: {}
        extra_rpaths: []
    ...
  • You can see that the file begins with compilers:. Also, it has -compiler: where you can add your compiler.

  • You found the location of the installed compiler:

    /home/tahat/spack/opt/spack/linux-centos7-x86_64/gcc-9.3.0/gcc-7.1.0-tnyp43zpkz6yrcqlglauwiyetmvrifpp----
  • Now, you specify different compilers such as cc, cxx and Fortran using the path of the installed compiler. You add the following section to the compilers.yaml file:

    - compiler:
        spec: gcc@7.1.0
        paths:
          cc: $SPACK_ROOT/opt/spack/linux-centos7-x86_64/gcc-9.3.0/gcc-7.1.0-tnyp43zpkz6yrcqlglauwiyetmvrifpp/bin/gcc
          cxx: $SPACK_ROOT/opt/spack/linux-centos7-x86_64/gcc-9.3.0/gcc-7.1.0-tnyp43zpkz6yrcqlglauwiyetmvrifpp/bin/g++
          f77: $SPACK_ROOT/opt/spack/linux-centos7-x86_64/gcc-9.3.0/gcc-7.1.0-tnyp43zpkz6yrcqlglauwiyetmvrifpp/bin/gfortran
          fc: $SPACK_ROOT/opt/spack/linux-centos7-x86_64/gcc-9.3.0/gcc-7.1.0-tnyp43zpkz6yrcqlglauwiyetmvrifpp/bin/gfortran
        operating_system: centos7
        flags: {}
        operating_system: centos7
        target: x86_64
        modules: []
        environment: {}
        extra_rpaths: []
  • To check if the compiler has been added successfully, type:

    spack compiler list
  • The following output shows that the gcc@7.1.0 compiler is available and can be used to build packages.

    ==> Available compilers
    -- gcc centos7-x86_64 -------------------------------------------
    gcc@9.3.0  gcc@8.3.0  gcc@7.1.0  gcc@4.8.5

    For more details go to Spack Documentation.