From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2181) id 957563858438; Mon, 18 Mar 2024 14:06:26 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 957563858438 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1710770786; bh=kq8DKkJGMfOYSkf+WI5Tbe/BfD1UmtbCg0mI6IgikKk=; h=From:To:Subject:Date:From; b=SZelJvdU7j6zRPalVT0VQ+2eXodqOr1iIknXsJhD3xuLPHhKYmIAU3XFTqXxpzoSq TGk15wgbmrlpmxPC8oNMsDIvUGF6l3ay9mhjuoXKvtnxy6q9Aco3frD1fYOF7o1v1X Ho2wAD0qvkXUjwNqr27V4rpXLQGQ8QKWedklgV5g= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jonathan Wakely To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc r12-10256] libstdc++: Add autoconf checks for mkdir, chmod, chdir, and getcwd X-Act-Checkin: gcc X-Git-Author: Jonathan Wakely X-Git-Refname: refs/heads/releases/gcc-12 X-Git-Oldrev: a389921f175c30e8ca0da38ccb79ed60cf744fd4 X-Git-Newrev: 0135f93383b72b24ac62a82593b3ce30d0c3b69f Message-Id: <20240318140626.957563858438@sourceware.org> Date: Mon, 18 Mar 2024 14:06:26 +0000 (GMT) List-Id: https://gcc.gnu.org/g:0135f93383b72b24ac62a82593b3ce30d0c3b69f commit r12-10256-g0135f93383b72b24ac62a82593b3ce30d0c3b69f Author: Jonathan Wakely Date: Thu Sep 7 17:03:40 2023 +0100 libstdc++: Add autoconf checks for mkdir, chmod, chdir, and getcwd The filesystem code was using these functions without checking for their existence, assuming that any UNIX-like libc with would always provide them. That's not true for some newlib targets like arm-eabi. libstdc++-v3/ChangeLog: * acinclude.m4 (GLIBCXX_CHECK_FILESYSTEM_DEPS): Check for mkdir, chmod, chdir, and getcwd. * config.h.in: Regenerate. * configure: Regenerate. * src/c++17/fs_ops.cc (create_dir): Use USE_MKDIR macro. (fs::current_path): Use USE_GETCWD and USE_CHDIR macros. (fs::permissions): Use USE_CHMOD macro. * src/filesystem/ops-common.h [FILESYSTEM_IS_WINDOWS] (chmod, mkdir, getcwd, chdir): Define new macros. [FILESYSTEM_IS_WINDOWS] (chmod, mkdir, getcwd, chdir): Use new macros. * src/filesystem/ops.cc (create_dir): Use USE_MKDIR macro. (fs::current_path): Use USE_GETCWD and USE_CHDIR macros. (fs::permissions): Use USE_CHMOD macro. (cherry picked from commit 5435449be0eb9ca41824eb16f774db3ccc2a593b) Diff: --- libstdc++-v3/acinclude.m4 | 60 ++++++++ libstdc++-v3/config.h.in | 12 ++ libstdc++-v3/configure | 252 +++++++++++++++++++++++++++++++ libstdc++-v3/src/c++17/fs_ops.cc | 12 +- libstdc++-v3/src/filesystem/ops-common.h | 18 ++- libstdc++-v3/src/filesystem/ops.cc | 10 +- 6 files changed, 355 insertions(+), 9 deletions(-) diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4 index 3b657f04443..cf6dbc3b165 100644 --- a/libstdc++-v3/acinclude.m4 +++ b/libstdc++-v3/acinclude.m4 @@ -4569,6 +4569,66 @@ dnl 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 +dnl + AC_CACHE_CHECK([for chmod], glibcxx_cv_chmod, [dnl + GCC_TRY_COMPILE_OR_LINK( + [ + #include + ], + [ + int i = chmod("", S_IRUSR); + ], + [glibcxx_cv_chmod=yes], + [glibcxx_cv_chmod=no]) + ]) + if test $glibcxx_cv_chmod = yes; then + AC_DEFINE(_GLIBCXX_USE_CHMOD, 1, [Define if usable chmod is available in .]) + fi +dnl + AC_CACHE_CHECK([for mkdir], glibcxx_cv_mkdir, [dnl + GCC_TRY_COMPILE_OR_LINK( + [ + #include + ], + [ + int i = mkdir("", S_IRUSR); + ], + [glibcxx_cv_mkdir=yes], + [glibcxx_cv_mkdir=no]) + ]) + if test $glibcxx_cv_mkdir = yes; then + AC_DEFINE(_GLIBCXX_USE_MKDIR, 1, [Define if usable mkdir is available in .]) + fi +dnl + AC_CACHE_CHECK([for chdir], glibcxx_cv_chdir, [dnl + GCC_TRY_COMPILE_OR_LINK( + [ + #include + ], + [ + int i = chdir(""); + ], + [glibcxx_cv_chdir=yes], + [glibcxx_cv_chdir=no]) + ]) + if test $glibcxx_cv_chdir = yes; then + AC_DEFINE(_GLIBCXX_USE_CHDIR, 1, [Define if usable chdir is available in .]) + fi +dnl + AC_CACHE_CHECK([for getcwd], glibcxx_cv_getcwd, [dnl + GCC_TRY_COMPILE_OR_LINK( + [ + #include + ], + [ + char* s = getcwd((char*)0, 1); + ], + [glibcxx_cv_getcwd=yes], + [glibcxx_cv_getcwd=no]) + ]) + if test $glibcxx_cv_getcwd = yes; then + AC_DEFINE(_GLIBCXX_USE_GETCWD, 1, [Define if usable getcwd is available in .]) + fi dnl AC_CACHE_CHECK([for realpath], glibcxx_cv_realpath, [dnl GCC_TRY_COMPILE_OR_LINK( diff --git a/libstdc++-v3/config.h.in b/libstdc++-v3/config.h.in index 2a3972eef54..639000d797a 100644 --- a/libstdc++-v3/config.h.in +++ b/libstdc++-v3/config.h.in @@ -933,6 +933,12 @@ namespace std::tr1. */ #undef _GLIBCXX_USE_C99_STDINT_TR1 +/* Define if usable chdir is available in . */ +#undef _GLIBCXX_USE_CHDIR + +/* Define if usable chmod is available in . */ +#undef _GLIBCXX_USE_CHMOD + /* Defined if clock_gettime syscall has monotonic and realtime clock support. */ #undef _GLIBCXX_USE_CLOCK_GETTIME_SYSCALL @@ -957,6 +963,9 @@ /* Define if fchmodat is available in . */ #undef _GLIBCXX_USE_FCHMODAT +/* Define if usable getcwd is available in . */ +#undef _GLIBCXX_USE_GETCWD + /* Defined if gettimeofday is available. */ #undef _GLIBCXX_USE_GETTIMEOFDAY @@ -972,6 +981,9 @@ /* Define if lstat is available in . */ #undef _GLIBCXX_USE_LSTAT +/* Define if usable mkdir is available in . */ +#undef _GLIBCXX_USE_MKDIR + /* Defined if nanosleep is available. */ #undef _GLIBCXX_USE_NANOSLEEP diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure index 926d91b076b..bc92ce1303c 100755 --- a/libstdc++-v3/configure +++ b/libstdc++-v3/configure @@ -76336,6 +76336,258 @@ $as_echo "$glibcxx_cv_dirent_d_type" >&6; } $as_echo "#define HAVE_STRUCT_DIRENT_D_TYPE 1" >>confdefs.h + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for chmod" >&5 +$as_echo_n "checking for chmod... " >&6; } +if ${glibcxx_cv_chmod+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test x$gcc_no_link = xyes; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + +int +main () +{ + + int i = chmod("", S_IRUSR); + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + glibcxx_cv_chmod=yes +else + glibcxx_cv_chmod=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + if test x$gcc_no_link = xyes; then + as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5 +fi +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + +int +main () +{ + + int i = chmod("", S_IRUSR); + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + glibcxx_cv_chmod=yes +else + glibcxx_cv_chmod=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_chmod" >&5 +$as_echo "$glibcxx_cv_chmod" >&6; } + if test $glibcxx_cv_chmod = yes; then + +$as_echo "#define _GLIBCXX_USE_CHMOD 1" >>confdefs.h + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mkdir" >&5 +$as_echo_n "checking for mkdir... " >&6; } +if ${glibcxx_cv_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test x$gcc_no_link = xyes; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + +int +main () +{ + + int i = mkdir("", S_IRUSR); + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + glibcxx_cv_mkdir=yes +else + glibcxx_cv_mkdir=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + if test x$gcc_no_link = xyes; then + as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5 +fi +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + +int +main () +{ + + int i = mkdir("", S_IRUSR); + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + glibcxx_cv_mkdir=yes +else + glibcxx_cv_mkdir=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_mkdir" >&5 +$as_echo "$glibcxx_cv_mkdir" >&6; } + if test $glibcxx_cv_mkdir = yes; then + +$as_echo "#define _GLIBCXX_USE_MKDIR 1" >>confdefs.h + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for chdir" >&5 +$as_echo_n "checking for chdir... " >&6; } +if ${glibcxx_cv_chdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test x$gcc_no_link = xyes; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + +int +main () +{ + + int i = chdir(""); + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + glibcxx_cv_chdir=yes +else + glibcxx_cv_chdir=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + if test x$gcc_no_link = xyes; then + as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5 +fi +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + +int +main () +{ + + int i = chdir(""); + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + glibcxx_cv_chdir=yes +else + glibcxx_cv_chdir=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_chdir" >&5 +$as_echo "$glibcxx_cv_chdir" >&6; } + if test $glibcxx_cv_chdir = yes; then + +$as_echo "#define _GLIBCXX_USE_CHDIR 1" >>confdefs.h + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getcwd" >&5 +$as_echo_n "checking for getcwd... " >&6; } +if ${glibcxx_cv_getcwd+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test x$gcc_no_link = xyes; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + +int +main () +{ + + char* s = getcwd((char*)0, 1); + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + glibcxx_cv_getcwd=yes +else + glibcxx_cv_getcwd=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + if test x$gcc_no_link = xyes; then + as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5 +fi +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + +int +main () +{ + + char* s = getcwd((char*)0, 1); + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + glibcxx_cv_getcwd=yes +else + glibcxx_cv_getcwd=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_getcwd" >&5 +$as_echo "$glibcxx_cv_getcwd" >&6; } + if test $glibcxx_cv_getcwd = yes; then + +$as_echo "#define _GLIBCXX_USE_GETCWD 1" >>confdefs.h + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for realpath" >&5 $as_echo_n "checking for realpath... " >&6; } diff --git a/libstdc++-v3/src/c++17/fs_ops.cc b/libstdc++-v3/src/c++17/fs_ops.cc index 91caff8cd47..397c46413bb 100644 --- a/libstdc++-v3/src/c++17/fs_ops.cc +++ b/libstdc++-v3/src/c++17/fs_ops.cc @@ -577,7 +577,7 @@ namespace create_dir(const fs::path& p, fs::perms perm, std::error_code& ec) { bool created = false; -#ifdef _GLIBCXX_HAVE_SYS_STAT_H +#if _GLIBCXX_USE_MKDIR posix::mode_t mode = static_cast>(perm); if (posix::mkdir(p.c_str(), mode)) { @@ -735,7 +735,7 @@ fs::path fs::current_path(error_code& ec) { path p; -#if defined _GLIBCXX_HAVE_UNISTD_H && ! defined __AVR__ +#if _GLIBCXX_USE_GETCWD #if defined __GLIBC__ || defined _GLIBCXX_FILESYSTEM_IS_WINDOWS if (char_ptr cwd = char_ptr{posix::getcwd(nullptr, 0)}) { @@ -783,7 +783,7 @@ fs::current_path(error_code& ec) } } #endif // __GLIBC__ -#else // _GLIBCXX_HAVE_UNISTD_H +#else // _GLIBCXX_USE_GETCWD ec = std::make_error_code(std::errc::function_not_supported); #endif return p; @@ -801,7 +801,7 @@ fs::current_path(const path& p) void fs::current_path(const path& p, error_code& ec) noexcept { -#ifdef _GLIBCXX_HAVE_UNISTD_H +#if _GLIBCXX_USE_CHDIR if (posix::chdir(p.c_str())) ec.assign(errno, std::generic_category()); else @@ -1097,6 +1097,7 @@ void fs::permissions(const path& p, perms prms, perm_options opts, error_code& ec) noexcept { +#if _GLIBCXX_USE_FCHMODAT || _GLIBCXX_USE_CHMOD const bool replace = is_set(opts, perm_options::replace); const bool add = is_set(opts, perm_options::add); const bool remove = is_set(opts, perm_options::remove); @@ -1138,6 +1139,9 @@ fs::permissions(const path& p, perms prms, perm_options opts, ec.assign(err, std::generic_category()); else ec.clear(); +#else + ec = std::make_error_code(std::errc::function_not_supported); +#endif } fs::path diff --git a/libstdc++-v3/src/filesystem/ops-common.h b/libstdc++-v3/src/filesystem/ops-common.h index 789e39522a8..62c1945f045 100644 --- a/libstdc++-v3/src/filesystem/ops-common.h +++ b/libstdc++-v3/src/filesystem/ops-common.h @@ -35,7 +35,7 @@ # endif # if defined(_GLIBCXX_HAVE_SYS_STAT_H) && defined(_GLIBCXX_HAVE_SYS_TYPES_H) # include -# include +# include // mkdir, chmod # endif #endif #if !_GLIBCXX_USE_UTIMENSAT && _GLIBCXX_HAVE_UTIME_H @@ -129,15 +129,19 @@ namespace __gnu_posix inline int chmod(const wchar_t* path, mode_t mode) { return ::_wchmod(path, mode); } +#define _GLIBCXX_USE_CHMOD 1 inline int mkdir(const wchar_t* path, mode_t) { return ::_wmkdir(path); } +#define _GLIBCXX_USE_MKDIR 1 inline wchar_t* getcwd(wchar_t* buf, size_t size) { return ::_wgetcwd(buf, size > (size_t)INT_MAX ? INT_MAX : (int)size); } +#define _GLIBCXX_USE_GETCWD 1 inline int chdir(const wchar_t* path) { return ::_wchdir(path); } +#define _GLIBCXX_USE_CHDIR 1 #if !_GLIBCXX_USE_UTIMENSAT && _GLIBCXX_HAVE_UTIME_H using utimbuf = _utimbuf; @@ -186,10 +190,18 @@ namespace __gnu_posix # endif # endif using ::mode_t; +# if _GLIBCXX_USE_CHMOD using ::chmod; +# endif +# if _GLIBCXX_USE_MKDIR using ::mkdir; +# endif +# if _GLIBCXX_USE_GETCWD using ::getcwd; +# endif +# if _GLIBCXX_USE_CHDIR using ::chdir; +# endif # if !_GLIBCXX_USE_UTIMENSAT && _GLIBCXX_USE_UTIME using ::utimbuf; using ::utime; @@ -491,8 +503,10 @@ _GLIBCXX_BEGIN_NAMESPACE_FILESYSTEM if (::fchmod(out.fd, from_st->st_mode)) #elif defined _GLIBCXX_USE_FCHMODAT && ! defined _GLIBCXX_FILESYSTEM_IS_WINDOWS if (::fchmodat(AT_FDCWD, to, from_st->st_mode, 0)) -#else +#elif defined _GLIBCXX_USE_CHMOD if (posix::chmod(to, from_st->st_mode)) +#else + if (false) #endif { ec.assign(errno, std::generic_category()); diff --git a/libstdc++-v3/src/filesystem/ops.cc b/libstdc++-v3/src/filesystem/ops.cc index e7481eb0e1b..e08e9fe5a5f 100644 --- a/libstdc++-v3/src/filesystem/ops.cc +++ b/libstdc++-v3/src/filesystem/ops.cc @@ -487,7 +487,7 @@ namespace create_dir(const fs::path& p, fs::perms perm, std::error_code& ec) { bool created = false; -#ifdef _GLIBCXX_HAVE_SYS_STAT_H +#if _GLIBCXX_USE_MKDIR posix::mode_t mode = static_cast>(perm); if (posix::mkdir(p.c_str(), mode)) { @@ -644,7 +644,7 @@ fs::path fs::current_path(error_code& ec) { path p; -#ifdef _GLIBCXX_HAVE_UNISTD_H +#if _GLIBCXX_USE_GETCWD #if defined __GLIBC__ || defined _GLIBCXX_FILESYSTEM_IS_WINDOWS if (char_ptr cwd = char_ptr{posix::getcwd(nullptr, 0)}) { @@ -710,7 +710,7 @@ fs::current_path(const path& p) void fs::current_path(const path& p, error_code& ec) noexcept { -#ifdef _GLIBCXX_HAVE_UNISTD_H +#if _GLIBCXX_USE_CHDIR if (posix::chdir(p.c_str())) ec.assign(errno, std::generic_category()); else @@ -946,6 +946,7 @@ fs::permissions(const path& p, perms prms) void fs::permissions(const path& p, perms prms, error_code& ec) noexcept { +#if _GLIBCXX_USE_FCHMODAT || _GLIBCXX_USE_CHMOD const bool add = is_set(prms, perms::add_perms); const bool remove = is_set(prms, perms::remove_perms); const bool nofollow = is_set(prms, perms::symlink_nofollow); @@ -986,6 +987,9 @@ fs::permissions(const path& p, perms prms, error_code& ec) noexcept ec.assign(err, std::generic_category()); else ec.clear(); +#else + ec = std::make_error_code(std::errc::function_not_supported); +#endif } fs::path