Package: neko
Version: 1.8.1-5
Severity: important
Tags: patch
User: [email protected]
Usertags: hurd
Hi,
currently[1] neko does not compile on hurd-i386.
The following are the issues I found (and how I fixed them), and other changes
needed:
- __MACH__ identifies the Mach microkernel which both Mac OSX and Hurd use
(well, different versions/forks of it), so do not use it for identifying
Mac OSX
- introduce new NEKO_HURD and OS_HURD defines, making them being considered as
POSIX (as Hurd is)
- realpath: we don't have PATH_MAX on Hurd (since we have no limits on paths);
given that glibc's realpath has, since years, the POSIX 2008 behaviour
(i.e. if called with NULL as second argument, return a newly allocated
buffer), then make use of it in glibc-based OSes
- /proc/self is a Linux-specific feature, so limit its usage (in two places)
to just Linux, providing a fallback for the remaining cases (which include
Hurd)
This patch is based on the current Debian patches.
[1]
https://buildd.debian.org/status/fetch.php?pkg=neko&arch=hurd-i386&ver=1.8.1-5&stamp=1266575027
Thanks,
--
Pino
--- a/vm/neko.h
+++ b/vm/neko.h
@@ -22,7 +22,7 @@
# define NEKO_WINDOWS
#endif
-#if defined(__APPLE__) || defined(__MACH__) || defined(macintosh)
+#if defined(__APPLE__) || defined(macintosh)
# define NEKO_MAC
#endif
@@ -38,6 +38,10 @@
# define NEKO_BSD
#endif
+#if defined(__GNU__)
+# define NEKO_HURD
+#endif
+
// COMPILER/PROCESSOR FLAGS
#if defined(__GNUC__)
# define NEKO_GCC
@@ -63,7 +67,7 @@
# define NEKO_64BITS
#endif
-#if defined(NEKO_LINUX) || defined(NEKO_MAC) || defined(NEKO_BSD) || defined(NEKO_GNUKBSD)
+#if defined(NEKO_LINUX) || defined(NEKO_MAC) || defined(NEKO_BSD) || defined(NEKO_GNUKBSD) || defined(NEKO_HURD)
# define NEKO_POSIX
#endif
--- a/libs/std/sys.c
+++ b/libs/std/sys.c
@@ -194,6 +194,8 @@
return alloc_string("BSD");
#elif defined(NEKO_MAC)
return alloc_string("Mac");
+#elif defined(NEKO_HURD)
+ return alloc_string("GNU/Hurd");
#else
#error Unknow system string
#endif
@@ -504,6 +506,14 @@
if( GetFullPathName(val_string(path),MAX_PATH+1,buf,NULL) == 0 )
neko_error();
return alloc_string(buf);
+#elif defined(__GLIBC__)
+ val_check(path,string);
+ char *buf = realpath(val_string(path), NULL);
+ if( buf == NULL )
+ neko_error();
+ value ret = alloc_string(buf);
+ free(buf);
+ return ret;
#else
char buf[PATH_MAX];
val_check(path,string);
@@ -529,7 +539,7 @@
if( _NSGetExecutablePath(path, &path_len) )
neko_error();
return alloc_string(path);
-#else
+#elif defined(NEKO_LINUX)
const char *p = getenv("_");
if( p != NULL )
return alloc_string(p);
@@ -541,6 +551,11 @@
path[length] = '\0';
return alloc_string(path);
}
+#else
+ const char *p = getenv("_");
+ if( p != NULL )
+ return alloc_string(p);
+ neko_error();
#endif
}
--- a/libs/common/osdef.h
+++ b/libs/common/osdef.h
@@ -25,7 +25,7 @@
# define OS_WINDOWS
#endif
-#if defined(__APPLE__) || defined(__MACH__) || defined(macintosh)
+#if defined(__APPLE__) || defined(macintosh)
# define OS_MAC
#endif
@@ -37,7 +37,11 @@
# define OS_BSD
#endif
-#if defined(NEKO_LINUX) || defined(NEKO_MAC) || defined(NEKO_BSD) || defined(NEKO_GNUKBSD)
+#if defined(__GNU__)
+# define OS_HURD
+#endif
+
+#if defined(NEKO_LINUX) || defined(NEKO_MAC) || defined(NEKO_BSD) || defined(NEKO_GNUKBSD) || defined(NEKO_HURD)
# define OS_POSIX
#endif
--- a/vm/main.c
+++ b/vm/main.c
@@ -74,7 +74,7 @@
}
path[length] = '\0';
return path;
-#else
+#elif defined(NEKO_LINUX)
static char path[1024];
int length = readlink("/proc/self/exe", path, sizeof(path));
if( length < 0 || length >= 1024 ) {
@@ -85,6 +85,8 @@
}
path[length] = '\0';
return path;
+#else
+ return getenv("_");
#endif
}