On Mon, 7 Feb 2022 at 21:01, Jonathan Wakely <jwakely....@gmail.com> wrote:
> > > On Mon, 7 Feb 2022 at 20:12, Dimitar Dimitrov <dimi...@dinux.eu> wrote: > >> On PRU target with newlib, we have the following combination in config.h: >> /* #undef HAVE_DIRENT_H */ >> #define HAVE_FCNTL_H 1 >> #define HAVE_UNLINKAT 1 >> >> In newlib, targets which do not define dirent.h, get a build error when >> including <dirent.h>: >> >> https://sourceware.org/git/?p=newlib-cygwin.git;a=blob;f=newlib/libc/include/sys/dirent.h;hb=HEAD >> >> While fs_dir.cc correctly checks for HAVE_FCNTL_H, dir-common.h doesn't, >> and instead uses HAVE_DIRENT_H. This results in unlinkat() function call >> in fs_dir.cc without the needed <fcntl.h> include in dir-common.h. Thus >> a build failure: >> .../gcc/libstdc++-v3/src/c++17/fs_dir.cc:151:11: error: ‘::unlinkat’ >> has not been declared; did you mean ‘unlink’? >> >> Fix by encapsulating <fcntl.h> include with the correct check. >> > > But there's no point doing anything in that file if we don't have > <dirent.h>, the whole thing is unusable. There's no point making the > members using unlinkat compile if you can't ever construct the type. > > So I think we want a different fix. > Maybe something like: --- a/libstdc++-v3/src/filesystem/dir-common.h +++ b/libstdc++-v3/src/filesystem/dir-common.h @@ -70,6 +70,8 @@ struct DIR { }; inline DIR* opendir(const char*) { return nullptr; } inline dirent* readdir(DIR*) { return nullptr; } inline int closedir(DIR*) { return -1; } +#undef _GLIBCXX_HAVE_DIRFD +#undef _GLIBCXX_HAVE_UNLINKAT #endif } // namespace __gnu_posix Or adding wrappers for those in namespace posix.