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.

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

Reply via email to