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....@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 <jwak...@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