On 17/4/25 11:32, Kohei Tokunaga wrote:

Hi Philippe and Richard, thank you for the feedback.

 > Actually what about checking the symbol presence in meson?
 > Something like (untested):
 >
 > -- >8 --
 > diff --git a/meson.build b/meson.build
 > index b18c46d16a2..33185fdf315 100644
 > --- a/meson.build
 > +++ b/meson.build
 > @@ -2654,3 +2654,2 @@ config_host_data.set('CONFIG_TIMERFD',
 > cc.has_function('timerfd_create'))
>   config_host_data.set('CONFIG_GETLOADAVG', cc.has_function('getloadavg'))
 > -config_host_data.set('HAVE_COPY_FILE_RANGE',
 > cc.has_function('copy_file_range'))
 >   config_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs'))
 > @@ -2756,2 +2755,6 @@ config_host_data.set('HAVE_UTMPX',
 >
 > +config_host_data.set('HAVE_COPY_FILE_RANGE', cc.links(gnu_source_prefix
 > + '''
 > +  #include <unistd.h>
> +  int main(void) { return copy_file_range(-1, NULL, -1, NULL, 0, 0); }'''))
 >   config_host_data.set('CONFIG_EVENTFD', cc.links('''
 > ---

Emscripten doesn't provide copy_file_range implementation but it declares
this function in its headers. Meson correctly detects the missing
implementation and unsets HAVE_COPY_FILE_RANGE. However, the stub defined in
file-posix.c causes a type conflict with the declaration from Emscripten
during compilation:

> ../qemu/block/file-posix.c:2019:14: error: static declaration of 'copy_file_range' follows non-static declaration >  2019 | static off_t copy_file_range(int in_fd, off_t *in_off, int out_fd,
 >       |              ^
> /emsdk/upstream/emscripten/cache/sysroot/include/unistd.h:207:9: note: previous declaration is here >   207 | ssize_t copy_file_range(int, off_t *, int, off_t *, size_t, unsigned);
 >       |         ^
 > 1 error generated.

If introducing a new stub isn't preferable, we could update the existing
stub in file-posix.c to match the declaration used by Emscripten. The
manpage[1] also aligns with this signature.

You are correct we should use ssize_t instead of off_t.

If meson fails to link, it won't define HAVE_COPY_FILE_RANGE, so you
shouldn't get "static declaration of 'copy_file_range' follows non-static declaration" right?


[1] https://man7.org/linux/man-pages/man2/copy_file_range.2.html <https://man7.org/linux/man-pages/man2/copy_file_range.2.html>



Reply via email to