fab.tools.compiler#
This file contains the base class for any compiler, and derived classes for gcc, gfortran, icc, ifort
Classes
|
This is the base class for a C compiler. |
|
This is the base class for any compiler. |
|
Class for the native Cray C compiler. |
|
Class for the native Cray Fortran compiler. |
|
This is the base class for a Fortran compiler. |
|
Class for GNU's gcc compiler. |
|
Class for GNU's gfortran compiler. |
|
Class for the Intel's icc compiler. |
|
Class for the Intel's new llvm based icx compiler. |
|
Class for Intel's ifort compiler. |
|
Class for Intel's new ifx compiler. |
|
Class for Nvidia's nvc compiler. |
|
Class for Nvidia's nvfortran compiler. |
- class fab.tools.compiler.Compiler(name, exec_name, suite, version_regex, category, mpi=False, version_argument=None, availability_option=None)#
This is the base class for any compiler. It provides generic flags for common settings, which must be defined by the compiler-specific derived classes.
The following generic flags are used within Fab itself, and so must be provided by all compiler instances:
compilation-only (e.g. -c)
output (e.g. -o)
include-path (e.g. -I)
openmp (e.g. -fopenmp, or -qopenmp, ..)
module-search-path (for Fortran compilers, e.g. -I)
module-out-folder (for Fortran compiler, e.g. -J)
The following generic flags are also defined for any compilers in Fab, but they are not used by Fab itself, but might be very convenient for application scripts
default-8-byte-real (for Fortran compiler)
- default-8-byte-double (for Fortran compiler, required if the compiler
change default double precision to 64 bit if default-8-byte-real is selected)
default-8-byte-integer (for Fortran compiler)
- Parameters:
name (
str) – name of the compiler.suite (
str) – name of the compiler suite this tool belongs to.version_regex (
str) – A regular expression that allows extraction of the version number from the version output of the compiler. The version is taken from the first group of a match.category (
Category) – the Category (C_COMPILER or FORTRAN_COMPILER).mpi (
bool) – whether the compiler or linker support MPI. (default:False)output_flag – the compilation flag to use to indicate the name of the output file
availability_option (
str|list[str] |None) – a command line option for the tool to test if the tool is available on the current system. Defaults to –version. (default:None)
- get_hash(config, file_path)#
Computes a hash code using the name and version of the compiler, and the compilation flag used by the compiler for the specified file.
- Parameters:
config (
BuildConfig) – The build configuration to use.file_path (
Path) – Path of the file to compile.
- Return type:
- Returns:
hash of compiler name and version.
- get_all_commandline_options(config, input_file, output_file, add_flags=None)#
This function returns all command line options for a compiler (but not the executable name). It is used by a compiler wrapper to pass the right flags to the wrapper. This base implementation adds the input and output filename (including the -o flag), the flag to only compile (and not link), and if required openmp.
- Parameters:
- Return type:
- Returns:
all command line options for compilation.
- get_flags(config=None, file_path=None)#
The flags to use when compiling the specified flag. All AbstractFlags (e.g. MatchFlags, …) will be resolved.
- compile_file(input_file, output_file, config, add_flags=None)#
Compiles a file. It will add the flag for compilation-only automatically, as well as the output directives. The current working directory for the command is set to the folder where the source file lives when compile_file is called. This is done to stop the compiler inserting folder information into the mod files, which would cause them to have different checksums depending on where they live.
- check_available()#
Checks if the compiler is available. While the method in the Tools base class would be sufficient (when using –version), in case of a compiler we also want to store the compiler version. So, re-implement check_available in a way that will automatically store the compiler version for later usage.
- Return type:
- Returns:
whether the compiler is available or not. We do this by requesting the compiler version.
- get_version()#
Try to get the version of the given compiler.
Expects a version in a certain part of the –version output, which must adhere to the n.n.n format, with at least 2 parts.
- Return type:
- Returns:
a tuple of at least 2 integers, representing the version e.g. (6, 10, 1) for version ‘6.10.1’.
- Raises:
RuntimeError – if the compiler was not found, or if it returned an unrecognised output from the version command.
- run_version_command(version_command='--version')#
Run the compiler’s command to get its version.
- Parameters:
version_command (
str|None) – The compiler argument used to get version info. (default:'--version')- Return type:
- Returns:
The output from the version command.
- Raises:
RuntimeError – if the compiler was not found, or raised an error.
- get_version_string()#
Get a string representing the version of the given compiler.
- Return type:
- Returns:
a string of at least 2 numeric version components, i.e. major.minor[.patch, …]
- Raises:
RuntimeError – if the compiler was not found, or if it returned an unrecognised output from the version command.
- class fab.tools.compiler.CCompiler(name, exec_name, suite, version_regex, mpi=False, version_argument=None, availability_option=None)#
This is the base class for a C compiler. It just sets the category of the compiler as convenience.
- Parameters:
name (
str) – name of the compiler.exec_name (
str) – name of the executable to start.suite (
str) – name of the compiler suite.version_regex (
str) – A regular expression that allows extraction of the version number from the version output of the compiler.mpi (
bool) – whether the compiler or linker support MPI. (default:False)output_flag – the compilation flag to use to indicate the name of the output file
- class fab.tools.compiler.FortranCompiler(name, exec_name, suite, version_regex, mpi=False, version_argument=None)#
This is the base class for a Fortran compiler. It is a compiler that needs to support a module output path and support for syntax-only compilation (which will only generate the .mod files).
- Parameters:
name (
str) – name of the compiler.exec_name (
str) – name of the executable to start.suite (
str) – name of the compiler suite.version_regex (
str) – A regular expression that allows extraction of the version number from the version output of the compiler.mpi (
bool) – whether MPI is supported by this compiler or not. (default:False)
- set_module_output_path(path)#
Sets the output path for modules.
- Params path:
the path to the output directory.
- get_all_commandline_options(config, input_file, output_file, add_flags=None, syntax_only=False)#
This function returns all command line options for a Fortran compiler (but not the executable name). It is used by a compiler wrapper to pass the right flags to the wrapper. This Fortran-specific implementation adds the module- and syntax-only flags (as required) to the standard compiler flags.
- Parameters:
input_file (
Path) – the name of the input file.output_file (
Path) – the name of the output file.config (
BuildConfig) – The BuildConfig, from which compiler profile and OpenMP status are taken.add_flags (
None|list[str]) – additional flags for the compiler. (default:None)syntax_only (
bool|None) – if set, the compiler will only do a syntax check (default:False)
- Return type:
- Returns:
all command line options for Fortran compilation.
- compile_file(input_file, output_file, config, add_flags=None, syntax_only=False)#
Compiles a file. This basically re-implements compile_file of the base class, but passes the syntax_only flag in
- Parameters:
input_file (
Path) – the name of the input file.output_file (
Path) – the name of the output file.config (
BuildConfig) – The BuildConfig, from which compiler profile and OpenMP status are taken.add_flags (
None|list[str]) – additional flags for the compiler. (default:None)syntax_only (
bool|None) – if set, the compiler will only do a syntax check (default:False)
- class fab.tools.compiler.Gcc(name='gcc', exec_name='gcc', mpi=False)#
Class for GNU’s gcc compiler.
- class fab.tools.compiler.Gfortran(name='gfortran', exec_name='gfortran')#
Class for GNU’s gfortran compiler.
- class fab.tools.compiler.Icc(name='icc', exec_name='icc')#
Class for the Intel’s icc compiler.
- class fab.tools.compiler.Ifort(name='ifort', exec_name='ifort')#
Class for Intel’s ifort compiler.
- class fab.tools.compiler.Icx(name='icx', exec_name='icx')#
Class for the Intel’s new llvm based icx compiler.
- class fab.tools.compiler.Ifx(name='ifx', exec_name='ifx')#
Class for Intel’s new ifx compiler.
- class fab.tools.compiler.Nvc(name='nvc', exec_name='nvc')#
Class for Nvidia’s nvc compiler. Note that the ‘-’ in the Nvidia version number is ignored, e.g. 23.5-0 would return ‘23.5’.
- class fab.tools.compiler.Nvfortran(name='nvfortran', exec_name='nvfortran')#
Class for Nvidia’s nvfortran compiler. Note that the ‘-’ in the Nvidia version number is ignored, e.g. 23.5-0 would return ‘23.5’.
- class fab.tools.compiler.Craycc(name='craycc-cc', exec_name='cc')#
Class for the native Cray C compiler. Since cc is actually a compiler wrapper, follow the naming scheme of a compiler wrapper and call it: craycc-cc.
- Cray has two different compilers. Older ones have as version number:
Cray C : Version 8.7.0 Tue Jul 23, 2024 07:39:46
- Newer compiler (several lines, the important one):
Cray clang version 15.0.1 (66f7391d6a03cf932f321b9f6b1d8612ef5f362c)
We use the beginning (“cray c”) to identify the compiler, which works for both cray c and cray clang. Then we ignore non-numbers, to reach the version number which is then extracted.
- class fab.tools.compiler.Crayftn(name='crayftn-ftn', exec_name='ftn')#
Class for the native Cray Fortran compiler. Since ftn is actually a compiler wrapper, follow the naming scheme of Cray compiler wrapper and call it crayftn-ftn.