Re: fortran tests similar with C tests ?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> It should not: the architecture is made for these tests to be
> implementable independently of the language.

Currently, if I'm not wrong AC_CHECK_SIZEOF checks for C, as it
uses _AC_COMPUTE_INT([(long int) (sizeof ($1))].
This wont work for fortran and even less in a fortran only environment. 

> Dive into fortran.m4 and complete the missing bits.

I don't know for sure what to do, but I made a macro that checks for
fortran type length. I called it AC_FC_CHECK_SIZEOF and AC_F77_CHECK_SIZEOF.
I tried to mimick the code I found in other autoconf macros.

My trick is rather complicated and fragile, but I had no better idea. It is 
unsuitable for cross compiling as it uses AC_RUN_IFELSE. It doesn't
check first that the type is a valid type, but I am not sure that this
is an issue.

Basically it writes to a binary file, using the binary representation, a 1 in 
a variable with the checked type, surrounded by 2 'a'. After that it reread
the file and computes the distance between the 2 'a'. Then it writes the 
result in another file. It will fail if there is a 'a' in binary format in 
the binary headers of the binary file, if there is a 'a' or a newline in the 
binary representation of 1 for a given type. There might be better solutions...

Pat
# _AC_FC_CHECK_SIZEOF (TYPE, [IGNORED], [INCLUDES = DEFAULT-INCLUDES])
# --------------------------------------------------------------------
#
# Determine the size of types for the Fortran.
# First the binary representation of TYPE is written to conftest.unf between
# two a. After that conftest.unf is reread and the distance between 2 'a' gives
# the type length. In the end the detected size is put in conftest.res.
#
# It will fail if there is a 'a' in binary format in the header of 
# conftest.unf, if there is a 'a' or a newline in the binary representation.

AC_DEFUN([_AC_FC_CHECK_SIZEOF],
[_AC_FORTRAN_ASSERT()dnl
AC_CACHE_CHECK([for $[]_AC_FC[] size of $1],
               [ac_cv_[]_AC_LANG_ABBREV[]_sizeof_$1],
[AC_RUN_IFELSE([AC_LANG_SOURCE([[      program typesize]

      $1 [ttype
      integer j,k,stat,length
      character string*30
      logical intype
      ttype = 1

      open (10,FORM='UNFORMATTED',FILE='conftest.unf',STATUS='NEW',
     +IOSTAT=stat,ERR=100)
      if (stat .ne. 0) goto 100
      write(10) 'a',ttype,'a'
      close(10,IOSTAT=stat,ERR=100)
      if (stat .ne. 0) goto 100

1000  format (A)
      open (10,FILE='conftest.unf',STATUS='OLD',IOSTAT=stat,ERR=100)
      if (stat .ne. 0) goto 100
      length = 0
      intype = .false.
      do 20 k=1,6
        read (10, 1000, END=110), string
110     continue
        do 10 j=1,len(string)
          if (intype) then
            if (string(j:j) .eq. 'a') then
              goto 120
            else 
              length = length + 1
            endif
          else
            if (string(j:j) .eq. 'a') then
              intype = .true.
            endif
          endif 
10      continue
20    continue
120   close(10,IOSTAT=stat,ERR=100)
      if (stat .ne. 0) goto 100

1100  format (I4)
      if (length .gt. 0) then
        open (10,FILE='conftest.res',STATUS='NEW',IOSTAT=stat,ERR=100)
        if (stat .ne. 0) goto 100
        write (10, 1100), length
        close(10)
      endif

100   continue

      stop
      end]
])],
[ if test -f 'conftest.res'; then
   AS_TR_SH(ac_cv_[]_AC_LANG_ABBREV[]_sizeof_$1)=`cat conftest.res`
   rm -f conftest.res
  else AS_TR_SH(ac_cv_[]_AC_LANG_ABBREV[]_sizeof_$1)=0
  fi
],
[
  AS_TR_SH(ac_cv_[]_AC_LANG_ABBREV[]_sizeof_$1)=0
], [])
rm -f conftest.unf])
   AC_DEFINE_UNQUOTED(AS_TR_CPP([]_AC_FC[]_sizeof_$1), 
     $AS_TR_SH(ac_cv_[]_AC_LANG_ABBREV[]_sizeof_$1),
     [The size of `$1', detected.])
   AS_TR_SH([]_AC_FC[]_sizeof_$1)=$AS_TR_SH(ac_cv_[]_AC_LANG_ABBREV[]_sizeof_$1)
])# _AC_FC_CHECK_SIZEOF 


# AC_F77_CHECK_SIZEOF
# -------------------
AC_DEFUN([AC_F77_CHECK_SIZEOF],
[AC_REQUIRE([AC_PROG_F77])dnl
AC_LANG_PUSH(Fortran 77)dnl
_AC_FC_CHECK_SIZEOF([$1],[$2],[$3])
AC_LANG_POP(Fortran 77)dnl
])# AC_F77_CHECK_SIZEOF


# AC_FC_CHECK_SIZEOF
# ------------------
AC_DEFUN([AC_FC_CHECK_SIZEOF],
[AC_REQUIRE([AC_PROG_FC])dnl
AC_LANG_PUSH(Fortran)dnl
_AC_FC_CHECK_SIZEOF([$1],[$2],[$3])
AC_LANG_POP(Fortran)dnl
])# AC_FC_CHECK_SIZEOF


_______________________________________________
Autoconf mailing list
Autoconf@xxxxxxx
http://lists.gnu.org/mailman/listinfo/autoconf

[Index of Archives]     [GCC Help]     [Kernel Discussion]     [RPM Discussion]     [Red Hat Development]     [Yosemite News]     [Linux USB]     [Samba]

  Powered by Linux