Redirige la salida del scanner al @OUTPUT@ a nivel de descriptor (dup2) en vez de freopen(stdout).

En hammer el wayland-scanner se compila ENLAZADO DINÁMICO contra la musl del sandbox (zig cc
nativo no produce estático aquí), y bajo musl-dinámico `freopen(argv[2], "w", stdout)` queda roto
por la copy-relocation de `stdout`: trunca/crea el archivo de salida PERO no redirige el fd que usa
`printf()`, así que el header generado sale por stdout y el @OUTPUT@ queda VACÍO. Resultado: al
compilar libwayland, `WL_SHM_FORMAT_*` / `wl_*_interface` / `wl_callback_*` aparecen «undeclared»
(headers de protocolo vacíos). Verificado a fondo: el binario ESTÁTICO escribe bien al archivo; el
DINÁMICO no — mismo source, flags y config.h.

`dup2(outfd, STDOUT_FILENO)` redirige el descriptor 1 a nivel de kernel: TODAS las escrituras a
stdout (cualquiera sea el objeto FILE por la copy-reloc) terminan en el archivo. Robusto frente al
modo de enlace. La salida queda idéntica byte-a-byte a la del scanner estático.

--- a/src/scanner.c
+++ b/src/scanner.c
@@ -36,6 +36,8 @@
 #include <getopt.h>
 #include <limits.h>
 #include <unistd.h>
+#include <fcntl.h>
+#include <sys/stat.h>

 #if HAVE_LIBXML
 #include <libxml/parser.h>
@@ -2138,11 +2140,14 @@ int main(int argc, char *argv[])
 				strerror(errno));
 			exit(EXIT_FAILURE);
 		}
-		if (freopen(argv[2], "w", stdout) == NULL) {
+		int outfd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644);
+		if (outfd < 0 || dup2(outfd, STDOUT_FILENO) < 0) {
 			fprintf(stderr, "Could not open output file: %s\n",
 				strerror(errno));
 			fclose(input);
 			exit(EXIT_FAILURE);
 		}
+		if (outfd != STDOUT_FILENO)
+			close(outfd);
 	}

 	/* initialize protocol structure */
