is_cxx_gnu_based Function

public function is_cxx_gnu_based(self) result(is_gnu)

Check if C++ compiler is GNU-based by checking its version output

Arguments

Type IntentOptional Attributes Name
class(compiler_t), intent(in) :: self

Return Value logical


Variables

Type Visibility Attributes Name Initial
integer, public :: io
character(len=:), public, allocatable :: output_file
integer, public :: stat
character(len=:), public, allocatable :: version_output

Source Code

function is_cxx_gnu_based(self) result(is_gnu)
    class(compiler_t), intent(in) :: self
    logical :: is_gnu
    character(len=:), allocatable :: output_file, version_output
    integer :: stat, io

    is_gnu = .false.
    
    if (.not.allocated(self%cxx)) return
    if (len_trim(self%cxx)<=0) return

    ! Get temporary file for compiler version output
    output_file = get_temp_filename()

    ! Run compiler with --version to get version info
    call run(self%cxx//" --version > "//output_file//" 2>&1", &
             echo=.false., exitstat=stat)

    if (stat == 0) then
        ! Read the version output
        open(file=output_file, newunit=io, iostat=stat)
        if (stat == 0) then
            call getline(io, version_output, stat)
            close(io, iostat=stat)

            ! Check if output contains GNU indicators
            if (allocated(version_output)) then
                is_gnu = index(version_output, 'gcc') > 0 .or. &
                         index(version_output, 'GCC') > 0 .or. &
                         index(version_output, 'GNU') > 0 .or. &
                         index(version_output, 'Free Software Foundation') > 0
            end if
        end if
    end if

    ! Clean up temporary file
    call run("rm -f "//output_file, echo=.false., exitstat=stat)

end function is_cxx_gnu_based