Add mingw-w64-genromfs (#24188)

This commit is contained in:
7dog123 2025-05-07 01:48:19 -05:00 committed by GitHub
parent 0c9574c6c5
commit f94c37e6d1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 309 additions and 0 deletions

View File

@ -0,0 +1,278 @@
diff -bur genromfs-0.5.2-orig/genromfs.c genromfs-0.5.2/genromfs.c
--- genromfs-0.5.2-orig/genromfs.c 2025-05-05 19:04:30.584521000 -0500
+++ genromfs-0.5.2/genromfs.c 2025-05-05 18:58:13.023004200 -0500
@@ -57,21 +57,31 @@
* Sorry about that. Feel free to contact me if you have problems.
*/
+#ifdef __CYGWIN__
+#define _WIN32
+#endif
+
#include <stdio.h> /* Userland pieces of the ANSI C standard I/O package */
#include <stdlib.h> /* Userland prototypes of the ANSI C std lib functions */
+#include <stdint.h>
#include <string.h> /* Userland prototypes of the string handling funcs */
#include <unistd.h> /* Userland prototypes of the Unix std system calls */
#include <fcntl.h> /* Flag value for file handling functions */
#include <time.h>
+#if defined (_WIN32) && !defined(__CYGWIN__)
+#include <getopt.h>
+#include <winsock2.h>
+#include <shlwapi.h>
+#define lstat stat
+#else
+#include <netinet/in.h> /* Consts & structs defined by the internet system */
#include <fnmatch.h>
+#endif /* _WIN32 */
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
-
-#include <netinet/in.h> /* Consts & structs defined by the internet system */
-
-/* good old times without autoconf... */
-#if defined(__linux__) || defined(__sun__) || defined(__CYGWIN__)
+#include <inttypes.h>
+#if defined(__linux__) || defined(__sun__)
#include <sys/sysmacros.h>
#endif
@@ -193,7 +203,11 @@
char *start = node->name;
/* XXX: ugly realbase is global */
if (pattern[0] == '/') start = node->realname + realbase;
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ return !PathMatchSpec(start, pattern);
+#else
return fnmatch(pattern,start,FNM_PATHNAME|FNM_PERIOD);
+#endif
}
int findalign(struct filenode *node)
@@ -284,7 +298,7 @@
{
int len;
- len = strlen(n->name)+1;
+ len = strlen(n->name) + 1;
memcpy(bigbuf, ri, sizeof(*ri));
memcpy(bigbuf+16, n->name, len);
if (len&15) {
@@ -299,13 +313,13 @@
#if 0
fprintf(stderr, "RI: [at %06x] %08lx, %08lx, %08lx, %08lx [%s]\n",
n->offset,
- ntohl(ri->nextfh), ntohl(ri->spec),
- ntohl(ri->size), ntohl(ri->checksum),
+ (long unsigned int)ntohl(ri->nextfh), (long unsigned int)ntohl(ri->spec),
+ (long unsigned int)ntohl(ri->size), (long unsigned int)ntohl(ri->checksum),
n->name);
#endif
}
-void dumpnode(struct filenode *node, FILE *f)
+int dumpnode(struct filenode *node, FILE *f)
{
struct romfh ri;
struct filenode *p;
@@ -336,13 +350,19 @@
ri.spec = htonl(node->dirlist.head->offset);
}
dumpri(&ri, node, f);
- } else if (S_ISLNK(node->modes)) {
+ }
+#if !defined(_WIN32) || defined(__CYGWIN__)
+ else if (S_ISLNK(node->modes)) {
ri.nextfh |= htonl(ROMFH_LNK);
dumpri(&ri, node, f);
memset(bigbuf, 0, sizeof(bigbuf));
- readlink(node->realname, bigbuf, node->size);
+ if (readlink(node->realname, bigbuf, node->size) < 0) {
+ return 1;
+ }
dumpdataa(bigbuf, node->size, f);
- } else if (S_ISREG(node->modes)) {
+ }
+#endif
+ else if (S_ISREG(node->modes)) {
int offset, len, fd, max, avail;
ri.nextfh |= htonl(ROMFH_REG);
dumpri(&ri, node, f);
@@ -372,7 +392,9 @@
dumpdata(bigbuf, avail, f);
offset+=avail;
}
- } else if (S_ISCHR(node->modes)) {
+ }
+#if !defined(_WIN32) || defined(__CYGWIN__)
+ else if (S_ISCHR(node->modes)) {
ri.nextfh |= htonl(ROMFH_CHR);
ri.spec = htonl(major(node->devnode)<<16|minor(node->devnode));
dumpri(&ri, node, f);
@@ -387,16 +409,19 @@
ri.nextfh |= htonl(ROMFH_SCK);
dumpri(&ri, node, f);
}
+#endif
p = node->dirlist.head;
while (p->next) {
- dumpnode(p, f);
+ if(dumpnode(p, f)) {
+ return 1;
+ }
p = p->next;
}
+ return 0;
}
-void dumpall(struct filenode *node, int lastoff, FILE *f)
-{
+int dumpall(struct filenode *node, int lastoff, FILE *f) {
struct romfh ri;
struct filenode *p;
@@ -407,12 +432,16 @@
dumpri(&ri, node, f);
p = node->dirlist.head;
while (p->next) {
- dumpnode(p, f);
+ if(dumpnode(p, f)) {
+ return 1;
+ }
p = p->next;
}
/* Align the whole bunch to ROMBSIZE boundary */
if (lastoff&1023)
dumpzero(1024-(lastoff&1023), f);
+
+ return 0;
}
/* Node manipulating functions */
@@ -495,7 +524,11 @@
while (p->next) {
found = findnode(p, dev, ino);
if (found)
+#if defined(_WIN32) && !defined (__CYGWIN__)
+ return NULL;
+#else
return found;
+#endif
p = p->next;
}
return NULL;
@@ -579,14 +612,16 @@
fprintf(stderr, "ignoring '%s' (lstat failed)\n", n->realname);
freenode(n); continue;
}
-
+#if !defined(_WIN32) || defined(__CYGWIN__)
/* Handle special names */
if ( n->name[0] == '@' ) {
if (S_ISLNK(sb->st_mode)) {
/* this is a link to follow at build time */
n->name = n->name + 1; /* strip off the leading @ */
memset(bigbuf, 0, sizeof(bigbuf));
- readlink(n->realname, bigbuf, sizeof(bigbuf));
+ if (readlink(n->realname, bigbuf, sizeof(bigbuf))) {
+ return -1;
+ }
n->realname = strdup(bigbuf);
if (lstat(n->realname, sb)) {
@@ -628,13 +663,17 @@
}
}
}
+#endif
setnode(n, sb->st_dev, sb->st_ino, sb->st_mode);
+
+#if !defined(_WIN32) || defined(__CYGWIN__)
/* Skip unreadable files/dirs */
if (!S_ISLNK(n->modes) && access(n->realname, R_OK)) {
fprintf(stderr, "ignoring '%s' (access failed)\n", n->realname);
freenode(n); continue;
}
+#endif
/* Look up old links */
if ( strcmp(n->name, ".") == 0 ) {
@@ -658,9 +697,12 @@
n->size = sb->st_size;
} else
curroffset = alignnode(n, curroffset, 0);
+
+#if !defined(_WIN32) || defined(__CYGWIN__)
if (S_ISLNK(sb->st_mode)) {
n->size = sb->st_size;
}
+#endif
curroffset += spaceneeded(n);
if (S_ISCHR(sb->st_mode) || S_ISBLK(sb->st_mode)) {
n->devnode = sb->st_rdev;
@@ -674,6 +716,9 @@
curroffset = processdir(level+1, n->realname, dp->d_name,
sb, n, root, curroffset);
}
+
+ if(curroffset < 0)
+ return -1;
}
}
if (dirfd) closedir(dirfd);
@@ -780,7 +825,7 @@
}
if (!volname) {
- sprintf(buf, "rom %08lx", time(NULL));
+ sprintf(buf, "rom %" PRId64, (int64_t)time(NULL));
volname = buf;
}
if (!outf) {
@@ -802,9 +847,16 @@
root = newnode(dir, volname, 0);
root->parent = root;
lastoff = processdir (1, dir, dir, &sb, root, root, spaceneeded(root));
+ if(lastoff < 0) {
+ fprintf(stderr, "Error while processing directory.\n");
+ return 1;
+ }
if (verbose)
shownode(0, root, stderr);
- dumpall(root, lastoff, f);
+ if(dumpall(root, lastoff, f)) {
+ fprintf(stderr, "Error while dumping!\n");
+ return 1;
+ }
- exit(0);
+ return 0;
}
diff -bur genromfs-0.5.2-orig/Makefile genromfs-0.5.2/Makefile
--- genromfs-0.5.2-orig/Makefile 2025-05-05 19:04:30.537608400 -0500
+++ genromfs-0.5.2/Makefile 2025-05-05 21:31:47.309303100 -0500
@@ -1,6 +1,12 @@
# Makefile for the genromfs program.
+# Modified to build on MINGW
+ifeq ($(OS), Windows_NT)
+ LDLIBS = -lshlwapi -lws2_32
+endif
+
+
all: genromfs
PACKAGE = genromfs
@@ -21,7 +27,7 @@
mandir = $(prefix)/man
genromfs: genromfs.o
- $(CC) $(LDFLAGS) genromfs.o -o genromfs
+ $(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
.c.o:
$(CC) $(CFLAGS) $< -c -o $@

View File

@ -0,0 +1,31 @@
_realname=genromfs
pkgbase=mingw-w64-${_realname}
pkgname=("${MINGW_PACKAGE_PREFIX}-${_realname}")
pkgver=0.5.2
pkgrel=1
pkgdesc="Creates ROMFS images"
arch=('any')
mingw_arch=('mingw64' 'ucrt64' 'clang64' 'clangarm64')
url="https://romfs.sourceforge.net/"
license=("GPL+2")
makedepends=("${MINGW_PACKAGE_PREFIX}-cc")
source=("${_realname}-${pkgver}.tar.gz::https://github.com/chexum/${_realname}/archive/refs/tags/${pkgver}.tar.gz"
"0001-build-mingw.patch")
sha256sums=('a96953ff6a2ce96b9c9aca99faaa43fda0e25e0012f3855cd6b988a12895467b'
'86ace4744dd2cc60b3f4187e3889f8ace48421451c3d754a774f6c946fc63e65')
prepare() {
cd "${srcdir}"/${_realname}-${pkgver}
patch -Np1 -i "${srcdir}/0001-build-mingw.patch"
}
build() {
cd "${srcdir}"/${_realname}-${pkgver}
make CC="${CC}"
}
package() {
cd "${srcdir}"/${_realname}-${pkgver}
make prefix="${MINGW_PREFIX}" PREFIX="${pkgdir}" install
}