This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] PR libstdc++/78870 support std::filesystem on Windows


On 16/06/18 20:56 -0600, Sandra Loosemore wrote:
On 06/16/2018 05:05 PM, Jonathan Wakely wrote:
Oops, that message got bounced from the lists and was the wrong
version of the patch anyway - this is the one I meant to attach.

On Sun, 17 Jun 2018 at 00:00, Jonathan Wakely <jwakely.gcc@gmail.com> wrote:

Here's what I wanted to test, which removes the new AC_CHECK_FUNCS (replacing them with GLIBCXX_COMPILE_OR_LINK tests that shouldn't even get run on bare metal ).

This patch worked for me, or at least I got successful builds now. I'm testing the new C-SKY port and built both csky-elf and csky-linux-gnu. (I expect to be submitting the port within the next few weeks.)

Here's what I've committed (it's the same apart from some comments and
re-indenting).

Tested x86_64-linux and powerpc64le-linux, committed to trunk.


commit 6857313ff08786cf66f1e1200d4e480b764937ef
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Mon Jun 18 16:43:36 2018 +0100

    Fix bootstrap failure for bare metal due to autoconf link tests
    
    The AC_CHECK_FUNCS tests cause the build to fail for bare metal cross
    compilers, where link tests are not allowed. Replace them with
    GCC_TRY_COMPILE_OR_LINK tests instead. Skip all the Filesystem
    dependency checks if not building the filesystem library.
    
            * acinclude.m4 (GLIBCXX_CHECK_FILESYSTEM_DEPS): Only check when
            enable_libstdcxx_filesystem_ts = yes. Check for link, readlink and
            symlink.
            * config.h.in: Regenerate.
            * configure: Regenerate.
            * configure.ac: Remove AC_CHECK_FUNCS for link, readlink and symlink.

diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
index 4f37b6a6498..6c855b6c7e5 100644
--- a/libstdc++-v3/acinclude.m4
+++ b/libstdc++-v3/acinclude.m4
@@ -4309,143 +4309,194 @@ AC_DEFUN([GLIBCXX_ENABLE_FILESYSTEM_TS], [
 ])
 
 dnl
-dnl Check whether the library calls required by the Filesystem TS are present
-dnl and define _GLIBCXX_USE_REALPATH and _GLIBCXX_USE_UTIMENSAT.
+dnl Check whether the library calls required by the Filesystem TS are present.
+dnl Defines:
+dnl  HAVE_STRUCT_DIRENT_D_TYPE
+dnl  _GLIBCXX_USE_REALPATH
+dnl  _GLIBCXX_USE_UTIMENSAT
+dnl  _GLIBCXX_USE_ST_MTIM
+dnl  _GLIBCXX_USE_FCHMOD
+dnl  _GLIBCXX_USE_FCHMODAT
+dnl  _GLIBCXX_USE_SENDFILE
+dnl  HAVE_LINK
+dnl  HAVE_READLINK
+dnl  HAVE_SYMLINK
 dnl
 AC_DEFUN([GLIBCXX_CHECK_FILESYSTEM_DEPS], [dnl
 dnl
-  AC_LANG_SAVE
-  AC_LANG_CPLUSPLUS
-  ac_save_CXXFLAGS="$CXXFLAGS"
-  CXXFLAGS="$CXXFLAGS -fno-exceptions"
+  if test $enable_libstdcxx_filesystem_ts = yes; then
+    AC_LANG_SAVE
+    AC_LANG_CPLUSPLUS
+    ac_save_CXXFLAGS="$CXXFLAGS"
+    CXXFLAGS="$CXXFLAGS -fno-exceptions"
 dnl
-  AC_MSG_CHECKING([for struct dirent.d_type])
-  AC_CACHE_VAL(glibcxx_cv_dirent_d_type, [dnl
-    GCC_TRY_COMPILE_OR_LINK(
-      [#include <dirent.h>],
-      [
-       struct dirent d;
-       if (sizeof d.d_type) return 0;
-      ],
-      [glibcxx_cv_dirent_d_type=yes],
-      [glibcxx_cv_dirent_d_type=no])
-  ])
-  if test $glibcxx_cv_dirent_d_type = yes; then
-    AC_DEFINE(HAVE_STRUCT_DIRENT_D_TYPE, 1, [Define to 1 if `d_type' is a member of `struct dirent'.])
+    AC_MSG_CHECKING([for struct dirent.d_type])
+    AC_CACHE_VAL(glibcxx_cv_dirent_d_type, [dnl
+      GCC_TRY_COMPILE_OR_LINK(
+        [#include <dirent.h>],
+        [
+         struct dirent d;
+         if (sizeof d.d_type) return 0;
+        ],
+        [glibcxx_cv_dirent_d_type=yes],
+        [glibcxx_cv_dirent_d_type=no])
+    ])
+    if test $glibcxx_cv_dirent_d_type = yes; then
+      AC_DEFINE(HAVE_STRUCT_DIRENT_D_TYPE, 1, [Define to 1 if `d_type' is a member of `struct dirent'.])
+    fi
+    AC_MSG_RESULT($glibcxx_cv_dirent_d_type)
+dnl
+    AC_MSG_CHECKING([for realpath])
+    AC_CACHE_VAL(glibcxx_cv_realpath, [dnl
+      GCC_TRY_COMPILE_OR_LINK(
+        [
+         #include <limits.h>
+         #include <stdlib.h>
+         #include <unistd.h>
+        ],
+        [
+         #if _XOPEN_VERSION < 500
+         #error
+         #elif _XOPEN_VERSION >= 700 || defined(PATH_MAX)
+         char *tmp = realpath((const char*)NULL, (char*)NULL);
+         #else
+         #error
+         #endif
+        ],
+        [glibcxx_cv_realpath=yes],
+        [glibcxx_cv_realpath=no])
+    ])
+    if test $glibcxx_cv_realpath = yes; then
+      AC_DEFINE(_GLIBCXX_USE_REALPATH, 1, [Define if usable realpath is available in <stdlib.h>.])
+    fi
+    AC_MSG_RESULT($glibcxx_cv_realpath)
+dnl
+    AC_MSG_CHECKING([for utimensat])
+    AC_CACHE_VAL(glibcxx_cv_utimensat, [dnl
+      GCC_TRY_COMPILE_OR_LINK(
+        [
+          #include <fcntl.h>
+          #include <sys/stat.h>
+        ],
+        [
+          struct timespec ts[2] = { { 0, UTIME_OMIT }, { 1, 1 } };
+          int i = utimensat(AT_FDCWD, "path", ts, 0);
+        ],
+        [glibcxx_cv_utimensat=yes],
+        [glibcxx_cv_utimensat=no])
+    ])
+    if test $glibcxx_cv_utimensat = yes; then
+      AC_DEFINE(_GLIBCXX_USE_UTIMENSAT, 1, [Define if utimensat and UTIME_OMIT are available in <sys/stat.h> and AT_FDCWD in <fcntl.h>.])
+    fi
+    AC_MSG_RESULT($glibcxx_cv_utimensat)
+dnl
+    AC_MSG_CHECKING([for struct stat.st_mtim.tv_nsec])
+    AC_CACHE_VAL(glibcxx_cv_st_mtim, [dnl
+      GCC_TRY_COMPILE_OR_LINK(
+        [ #include <sys/stat.h> ],
+        [
+          struct stat st;
+          return st.st_mtim.tv_nsec;
+        ],
+        [glibcxx_cv_st_mtim=yes],
+        [glibcxx_cv_st_mtim=no])
+    ])
+    if test $glibcxx_cv_st_mtim = yes; then
+      AC_DEFINE(_GLIBCXX_USE_ST_MTIM, 1, [Define if struct stat has timespec members.])
+    fi
+    AC_MSG_RESULT($glibcxx_cv_st_mtim)
+dnl
+    AC_MSG_CHECKING([for fchmod])
+    AC_CACHE_VAL(glibcxx_cv_fchmod, [dnl
+      GCC_TRY_COMPILE_OR_LINK(
+        [#include <sys/stat.h>],
+        [fchmod(1, S_IWUSR);],
+        [glibcxx_cv_fchmod=yes],
+        [glibcxx_cv_fchmod=no])
+    ])
+    if test $glibcxx_cv_fchmod = yes; then
+      AC_DEFINE(_GLIBCXX_USE_FCHMOD, 1, [Define if fchmod is available in <sys/stat.h>.])
+    fi
+    AC_MSG_RESULT($glibcxx_cv_fchmod)
+dnl
+    AC_MSG_CHECKING([for fchmodat])
+    AC_CACHE_VAL(glibcxx_cv_fchmodat, [dnl
+      GCC_TRY_COMPILE_OR_LINK(
+        [
+          #include <fcntl.h>
+          #include <sys/stat.h>
+        ],
+        [fchmodat(AT_FDCWD, "", 0, AT_SYMLINK_NOFOLLOW);],
+        [glibcxx_cv_fchmodat=yes],
+        [glibcxx_cv_fchmodat=no])
+    ])
+    if test $glibcxx_cv_fchmodat = yes; then
+      AC_DEFINE(_GLIBCXX_USE_FCHMODAT, 1, [Define if fchmodat is available in <sys/stat.h>.])
+    fi
+    AC_MSG_RESULT($glibcxx_cv_fchmodat)
+dnl
+    AC_MSG_CHECKING([for sendfile that can copy files])
+    AC_CACHE_VAL(glibcxx_cv_sendfile, [dnl
+      case "${target_os}" in
+        gnu* | linux* | solaris*)
+          GCC_TRY_COMPILE_OR_LINK(
+            [#include <sys/sendfile.h>],
+            [sendfile(1, 2, (off_t*)0, sizeof 1);],
+            [glibcxx_cv_sendfile=yes],
+            [glibcxx_cv_sendfile=no])
+          ;;
+        *)
+          glibcxx_cv_sendfile=no
+          ;;
+      esac
+    ])
+    if test $glibcxx_cv_sendfile = yes; then
+      AC_DEFINE(_GLIBCXX_USE_SENDFILE, 1, [Define if sendfile is available in <sys/sendfile.h>.])
+    fi
+    AC_MSG_RESULT($glibcxx_cv_sendfile)
+dnl
+    AC_MSG_CHECKING([for link])
+    AC_CACHE_VAL(glibcxx_cv_link, [dnl
+      GCC_TRY_COMPILE_OR_LINK(
+        [#include <unistd.h>],
+        [link("", "");],
+        [glibcxx_cv_link=yes],
+        [glibcxx_cv_link=no])
+    ])
+    if test $glibcxx_cv_link = yes; then
+      AC_DEFINE(HAVE_LINK, 1, [Define if link is available in <unistd.h>.])
+    fi
+    AC_MSG_RESULT($glibcxx_cv_link)
+dnl
+    AC_MSG_CHECKING([for readlink])
+    AC_CACHE_VAL(glibcxx_cv_readlink, [dnl
+      GCC_TRY_COMPILE_OR_LINK(
+        [#include <unistd.h>],
+        [char buf[32]; readlink("", buf, sizeof(buf));],
+        [glibcxx_cv_readlink=yes],
+        [glibcxx_cv_readlink=no])
+    ])
+    if test $glibcxx_cv_readlink = yes; then
+      AC_DEFINE(HAVE_READLINK, 1, [Define if readlink is available in <unistd.h>.])
+    fi
+    AC_MSG_RESULT($glibcxx_cv_readlink)
+dnl
+    AC_MSG_CHECKING([for symlink])
+    AC_CACHE_VAL(glibcxx_cv_symlink, [dnl
+      GCC_TRY_COMPILE_OR_LINK(
+        [#include <unistd.h>],
+        [symlink("", "");],
+        [glibcxx_cv_symlink=yes],
+        [glibcxx_cv_symlink=no])
+    ])
+    if test $glibcxx_cv_symlink = yes; then
+      AC_DEFINE(HAVE_SYMLINK, 1, [Define if symlink is available in <unistd.h>.])
+    fi
+    AC_MSG_RESULT($glibcxx_cv_symlink)
+dnl
+    CXXFLAGS="$ac_save_CXXFLAGS"
+    AC_LANG_RESTORE
   fi
-  AC_MSG_RESULT($glibcxx_cv_dirent_d_type)
-dnl
-  AC_MSG_CHECKING([for realpath])
-  AC_CACHE_VAL(glibcxx_cv_realpath, [dnl
-    GCC_TRY_COMPILE_OR_LINK(
-      [
-       #include <limits.h>
-       #include <stdlib.h>
-       #include <unistd.h>
-      ],
-      [
-       #if _XOPEN_VERSION < 500
-       #error
-       #elif _XOPEN_VERSION >= 700 || defined(PATH_MAX)
-       char *tmp = realpath((const char*)NULL, (char*)NULL);
-       #else
-       #error
-       #endif
-      ],
-      [glibcxx_cv_realpath=yes],
-      [glibcxx_cv_realpath=no])
-  ])
-  if test $glibcxx_cv_realpath = yes; then
-    AC_DEFINE(_GLIBCXX_USE_REALPATH, 1, [Define if usable realpath is available in <stdlib.h>.])
-  fi
-  AC_MSG_RESULT($glibcxx_cv_realpath)
-dnl
-  AC_MSG_CHECKING([for utimensat])
-  AC_CACHE_VAL(glibcxx_cv_utimensat, [dnl
-    GCC_TRY_COMPILE_OR_LINK(
-      [
-        #include <fcntl.h>
-        #include <sys/stat.h>
-      ],
-      [
-        struct timespec ts[2] = { { 0, UTIME_OMIT }, { 1, 1 } };
-        int i = utimensat(AT_FDCWD, "path", ts, 0);
-      ],
-      [glibcxx_cv_utimensat=yes],
-      [glibcxx_cv_utimensat=no])
-  ])
-  if test $glibcxx_cv_utimensat = yes; then
-    AC_DEFINE(_GLIBCXX_USE_UTIMENSAT, 1, [Define if utimensat and UTIME_OMIT are available in <sys/stat.h> and AT_FDCWD in <fcntl.h>.])
-  fi
-  AC_MSG_RESULT($glibcxx_cv_utimensat)
-dnl
-  AC_MSG_CHECKING([for struct stat.st_mtim.tv_nsec])
-  AC_CACHE_VAL(glibcxx_cv_st_mtim, [dnl
-    GCC_TRY_COMPILE_OR_LINK(
-      [ #include <sys/stat.h> ],
-      [
-        struct stat st;
-        return st.st_mtim.tv_nsec;
-      ],
-      [glibcxx_cv_st_mtim=yes],
-      [glibcxx_cv_st_mtim=no])
-  ])
-  if test $glibcxx_cv_st_mtim = yes; then
-    AC_DEFINE(_GLIBCXX_USE_ST_MTIM, 1, [Define if struct stat has timespec members.])
-  fi
-  AC_MSG_RESULT($glibcxx_cv_st_mtim)
-dnl
-  AC_MSG_CHECKING([for fchmod])
-  AC_CACHE_VAL(glibcxx_cv_fchmod, [dnl
-    GCC_TRY_COMPILE_OR_LINK(
-      [#include <sys/stat.h>],
-      [fchmod(1, S_IWUSR);],
-      [glibcxx_cv_fchmod=yes],
-      [glibcxx_cv_fchmod=no])
-  ])
-  if test $glibcxx_cv_fchmod = yes; then
-    AC_DEFINE(_GLIBCXX_USE_FCHMOD, 1, [Define if fchmod is available in <sys/stat.h>.])
-  fi
-  AC_MSG_RESULT($glibcxx_cv_fchmod)
-dnl
-  AC_MSG_CHECKING([for fchmodat])
-  AC_CACHE_VAL(glibcxx_cv_fchmodat, [dnl
-    GCC_TRY_COMPILE_OR_LINK(
-      [
-        #include <fcntl.h>
-        #include <sys/stat.h>
-      ],
-      [fchmodat(AT_FDCWD, "", 0, AT_SYMLINK_NOFOLLOW);],
-      [glibcxx_cv_fchmodat=yes],
-      [glibcxx_cv_fchmodat=no])
-  ])
-  if test $glibcxx_cv_fchmodat = yes; then
-    AC_DEFINE(_GLIBCXX_USE_FCHMODAT, 1, [Define if fchmodat is available in <sys/stat.h>.])
-  fi
-  AC_MSG_RESULT($glibcxx_cv_fchmodat)
-dnl
-  AC_MSG_CHECKING([for sendfile that can copy files])
-  AC_CACHE_VAL(glibcxx_cv_sendfile, [dnl
-    case "${target_os}" in
-      gnu* | linux* | solaris*)
-        GCC_TRY_COMPILE_OR_LINK(
-          [#include <sys/sendfile.h>],
-          [sendfile(1, 2, (off_t*)0, sizeof 1);],
-          [glibcxx_cv_sendfile=yes],
-          [glibcxx_cv_sendfile=no])
-        ;;
-      *)
-        glibcxx_cv_sendfile=no
-        ;;
-    esac
-  ])
-  if test $glibcxx_cv_sendfile = yes; then
-    AC_DEFINE(_GLIBCXX_USE_SENDFILE, 1, [Define if sendfile is available in <sys/sendfile.h>.])
-  fi
-  AC_MSG_RESULT($glibcxx_cv_sendfile)
-dnl
-  CXXFLAGS="$ac_save_CXXFLAGS"
-  AC_LANG_RESTORE
 ])
 
 dnl
diff --git a/libstdc++-v3/configure.ac b/libstdc++-v3/configure.ac
index dde1c4da944..7e1fd84606a 100644
--- a/libstdc++-v3/configure.ac
+++ b/libstdc++-v3/configure.ac
@@ -420,7 +420,6 @@ GLIBCXX_CHECK_GTHREADS
 
 # For Filesystem TS.
 AC_CHECK_HEADERS([fcntl.h dirent.h sys/statvfs.h utime.h])
-AC_CHECK_FUNCS(link readlink symlink)
 GLIBCXX_ENABLE_FILESYSTEM_TS
 GLIBCXX_CHECK_FILESYSTEM_DEPS
 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]