]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
kernel: fix gen_init_cpio build on macOS hosts
authorMark Mentovai <mark@mentovai.com>
Fri, 29 May 2026 16:56:42 +0000 (12:56 -0400)
committerRobert Marko <robimarko@gmail.com>
Thu, 4 Jun 2026 18:00:36 +0000 (20:00 +0200)
Kernel ae18b94099b0 (2025-08-20, in 6.18) introduced a dependency on the
Linux-specific O_LARGEFILE, and kernel 97169cd6d95b (2025-08-20, in
6.18) introduced a dependency on the Linux-specific copy_file_range.
Both of these commits were a part of the
https://lore.kernel.org/all/20250819032607.28727-1-ddiss@suse.de/
series. These new dependencies may not be available on non-Linux
systems, although it is possible to cross-build Linux on non-Linux build
hosts, and it is appropriate to run tools like gen_init_cpio on such
build hosts. It is straightforward to avoid these Linux-specific
features when not building on Linux.

This fixes:

  HOSTCC  usr/gen_init_cpio
usr/gen_init_cpio.c:460:16: error: call to undeclared
      function 'copy_file_range'; ISO C99 and later do not support implicit
      function declarations [-Wimplicit-function-declaration]
  460 |                         this_read = copy_file_range(file, NULL, outfd, N...
      |                                     ^
usr/gen_init_cpio.c:677:31: error: use of undeclared
      identifier 'O_LARGEFILE'
  677 |                                      O_WRONLY | O_CREAT | O_LARGEFILE | O_TRUNC,
      |                                                           ^~~~~~~~~~~
2 errors generated.
gmake[7]: *** [scripts/Makefile.host:114: usr/gen_init_cpio] Error 1

Signed-off-by: Mark Mentovai <mark@mentovai.com>
Link: https://github.com/openwrt/openwrt/pull/23612
Signed-off-by: Robert Marko <robimarko@gmail.com>
target/linux/generic/hack-6.18/201-gen_init_cpio_portability.patch [new file with mode: 0644]

diff --git a/target/linux/generic/hack-6.18/201-gen_init_cpio_portability.patch b/target/linux/generic/hack-6.18/201-gen_init_cpio_portability.patch
new file mode 100644 (file)
index 0000000..6704f2b
--- /dev/null
@@ -0,0 +1,52 @@
+From 60e044199e773df4863405dba0f7abe16a43282d Mon Sep 17 00:00:00 2001
+From: Mark Mentovai <mark@mentovai.com>
+Date: Fri, 29 May 2026 12:48:31 -0400
+Subject: [PATCH] gen_init_cpio: fix build on macOS hosts
+
+ae18b94099b0 (2025-08-20, in 6.18) introduced a dependency on the
+Linux-specific O_LARGEFILE, and 97169cd6d95b (2025-08-20, in 6.18)
+introduced a dependency on the Linux-specific copy_file_range. Both of
+these commits were a part of the
+https://lore.kernel.org/all/20250819032607.28727-1-ddiss@suse.de/
+series. These new dependencies may not be available on non-Linux
+systems, although it is possible to cross-build Linux on non-Linux build
+hosts, and it is appropriate to run tools like gen_init_cpio on such
+build hosts. It is straightforward to avoid these Linux-specific
+features when not building on Linux.
+
+Signed-off-by: Mark Mentovai <mark@mentovai.com>
+---
+ usr/gen_init_cpio.c | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+--- a/usr/gen_init_cpio.c
++++ b/usr/gen_init_cpio.c
+@@ -456,6 +456,7 @@ static int cpio_mkfile(const char *name,
+                   push_pad(namepadlen ? namepadlen : padlen(offset, 4)) < 0)
+                       goto error;
++#ifdef __linux__
+               if (size) {
+                       this_read = copy_file_range(file, NULL, outfd, NULL, size, 0);
+                       if (this_read > 0) {
+@@ -466,6 +467,7 @@ static int cpio_mkfile(const char *name,
+                       }
+                       /* short or failed copy falls back to read/write... */
+               }
++#endif
+               while (size) {
+                       unsigned char filebuf[65536];
+@@ -674,7 +676,11 @@ int main (int argc, char *argv[])
+                       break;
+               case 'o':
+                       outfd = open(optarg,
+-                                   O_WRONLY | O_CREAT | O_LARGEFILE | O_TRUNC,
++                                   O_WRONLY | O_CREAT | O_TRUNC
++#ifdef O_LARGEFILE
++                                           | O_LARGEFILE
++#endif
++                                   ,
+                                    0600);
+                       if (outfd < 0) {
+                               fprintf(stderr, "failed to open %s\n", optarg);