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.

Reply via email to