[project @ 2004-09-01 15:57:13 by ross]
authorross <unknown>
Wed, 1 Sep 2004 15:57:15 +0000 (15:57 +0000)
committerross <unknown>
Wed, 1 Sep 2004 15:57:15 +0000 (15:57 +0000)
devolve the recently added dirent checks to a new libraries/base/configure.ac

aclocal.m4 [new file with mode: 0644]
configure.ac [new file with mode: 0644]
include/HsBase.h

diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644 (file)
index 0000000..dae32b6
--- /dev/null
@@ -0,0 +1,94 @@
+dnl @synopsis FP_READDIR_EOF_ERRNO
+dnl
+dnl Check what readdir() sets 'errno' to upon reaching 
+dnl end of directory; not setting it is the correct thing to do,
+dnl but mingw based versions have set it to ENOENT until recently
+dnl (summer 2004).
+dnl
+dnl
+AC_DEFUN(FP_READDIR_EOF_ERRNO,
+[AC_CACHE_CHECK([what readdir sets errno to upon EOF], fptools_cv_readdir_eof_errno,
+[AC_TRY_RUN([#include <dirent.h>
+#include <stdio.h>
+#include <errno.h>
+int
+main(argc, argv)
+int argc;
+char **argv;
+{
+  FILE *f=fopen("conftestval", "w");
+#if defined(__MINGW32__)
+  int fd = mkdir("testdir");
+#else
+  int fd = mkdir("testdir", 0666);
+#endif
+  DIR* dp;
+  struct dirent* de;
+  int err = 0;
+
+  if (!f) return 1;
+  if (fd == -1) { 
+     fprintf(stderr,"unable to create directory; quitting.\n");
+     return 1;
+  }
+  close(fd);
+  dp = opendir("testdir");
+  if (!dp) { 
+     fprintf(stderr,"unable to browse directory; quitting.\n");
+     rmdir("testdir");
+     return 1;
+  }
+
+  /* the assumption here is that readdir() will only return NULL
+   * due to reaching the end of the directory.
+   */
+  while (de = readdir(dp)) {
+       ;
+  }
+  err = errno;
+  fprintf(f,"%d", err);
+  fclose(f);
+  closedir(de);
+  rmdir("testdir");
+  return 0;
+}],fptools_cv_readdir_eof_errno=`cat conftestval`, fptools_cv_readdir_eof_errno=bogus, fptools_cv_readdir_eof_errno=0)])
+dnl the cross value is somewhat bogus.
+AC_DEFINE_UNQUOTED([READDIR_ERRNO_EOF], [$fptools_cv_readdir_eof_errno], [readdir() sets errno to this upon EOF])
+])
+
+dnl @synopsis FP_DIRENT_FLAT_LAYOUT
+dnl
+dnl Check whether 'struct dirent' (in dirent.h) has d_name defined
+dnl as being the final field in a struct, or a pointer to somewhere
+dnl else. The former is the standardly thing to do, but mingw defns
+dnl have for the longest time gone for the latter. They no longer do,
+dnl hence the need to configure test for this.
+dnl
+dnl
+AC_DEFUN(FP_DIRENT_FLAT_LAYOUT,
+[AC_CACHE_CHECK([if struct dirent layout is flat], fptools_cv_dirent_flat_layout,
+[AC_TRY_RUN([#include <dirent.h>
+#include <stdio.h>
+#include <string.h>
+int
+main(argc, argv)
+int argc;
+char **argv;
+{
+  struct dirent de;
+  /*
+   * Check whether d_name is defined as
+   *    struct dirent { .... ; char d_name[..]; } 
+   * or
+   *    struct dirent { .... ; char* d_name; } 
+   * 
+   * Returns 0 if the former.
+   */
+  memset(&de,0,sizeof(struct dirent));
+  return ((int)de.d_name == 0);
+}],fptools_cv_dirent_flat_layout=yes, fptools_cv_dirent_flat_layout=no, fptools_cv_dirent_flat_layout=yes)])
+dnl the cross value is somewhat bogus.
+if test "$fptools_cv_dirent_flat_layout" = yes; then
+AC_DEFINE([STRUCT_DIRENT_FLAT_LAYOUT], [1], [Define to 1 if struct dirent is a flat structure])
+fi
+])
diff --git a/configure.ac b/configure.ac
new file mode 100644 (file)
index 0000000..0c248e1
--- /dev/null
@@ -0,0 +1,12 @@
+AC_INIT([base], [], [libraries@haskell.org], [base])
+
+# Safety check: Ensure that we are in the correct source directory.
+AC_CONFIG_SRCDIR([include/HsBase.h])
+
+AC_CONFIG_HEADERS([include/HsBaseConfig.h])
+
+dnl ** Check for idiosyncracies in some mingw impls of directory handling.
+FP_READDIR_EOF_ERRNO
+FP_DIRENT_FLAT_LAYOUT
+
+AC_OUTPUT
index 61faaf8..ba7827e 100644 (file)
@@ -10,6 +10,7 @@
 #define __HSBASE_H__
 
 #include "ghcconfig.h"
+#include "HsBaseConfig.h"
 #include "HsFFI.h"
 
 #include <stdio.h>