This is a series of patches to add support to Mono for building against the Android NDK [0]. Android runs the Linux kernel, but moves many things around compared to a "normal" desktop Linux distro.
These patches are based against the mono-2-6 branch. This fourth patch patches mono/support so that it will properly build and link under Android, largely because many POSIX functions aren't present under Android (hence the numerous configure checks): * dirent.c, grp.c, macros.c, pwd.c, signal.c, sys-statvfs.c, sys-time.c, unistd.c: Add #if HAVE_XXX checks for functions which aren't provided on Android. Permission to commit? - Jon [0] http://developer.android.com/sdk/ndk/index.html
Index: configure.in =================================================================== --- configure.in (revision 155735) +++ configure.in (working copy) @@ -1564,6 +1564,7 @@ dnl *** Checks for MonoPosixHelper *** dnl ********************************** AC_CHECK_HEADERS(checklist.h) + AC_CHECK_HEADERS(pathconf.h) AC_CHECK_HEADERS(fstab.h) AC_CHECK_HEADERS(attr/xattr.h) AC_CHECK_HEADERS(sys/extattr.h) @@ -1575,13 +1576,15 @@ AC_CHECK_HEADERS(sys/mman.h) AC_CHECK_HEADERS(sys/param.h) AC_CHECK_HEADERS(sys/mount.h) + AC_CHECK_FUNCS(confstr) + AC_CHECK_FUNCS(seekdir telldir) AC_CHECK_FUNCS(getdomainname) AC_CHECK_FUNCS(setdomainname) - AC_CHECK_FUNCS(fgetgrent) - AC_CHECK_FUNCS(fgetpwent) - AC_CHECK_FUNCS(fgetpwent) + AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent) + AC_CHECK_FUNCS(setgroups) + AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent) AC_CHECK_FUNCS(getfsstat) - AC_CHECK_FUNCS(lutimes) + AC_CHECK_FUNCS(lutimes futimes) AC_CHECK_FUNCS(mremap) AC_CHECK_FUNCS(remap_file_pages) AC_CHECK_FUNCS(posix_fadvise) @@ -1589,7 +1592,8 @@ AC_CHECK_FUNCS(posix_madvise) AC_CHECK_FUNCS(vsnprintf) AC_CHECK_FUNCS(sendfile) - AC_CHECK_FUNCS(sethostid) + AC_CHECK_FUNCS(gethostid sethostid) + AC_CHECK_FUNCS(sethostname) AC_CHECK_FUNCS(statfs) AC_CHECK_FUNCS(fstatfs) AC_CHECK_FUNCS(statvfs) @@ -1597,6 +1601,11 @@ AC_CHECK_FUNCS(stime) AC_CHECK_FUNCS(strerror_r) AC_CHECK_FUNCS(ttyname_r) + AC_CHECK_FUNCS(psignal) + AC_CHECK_FUNCS(getlogin_r) + AC_CHECK_FUNCS(lockf) + AC_CHECK_FUNCS(swab) + AC_CHECK_FUNCS(setusershell endusershell) AC_CHECK_SIZEOF(size_t) AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , [#include <sys/types.h> @@ -1632,6 +1641,14 @@ [struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, [#include <sys/types.h> #include <dirent.h>]) + AC_CHECK_MEMBERS( + [struct passwd.pw_gecos],,, + [#include <sys/types.h> + #include <pwd.h>]) + AC_CHECK_MEMBERS( + [struct statfs.f_flags],,, + [#include <sys/types.h> + #include <sys/vfs.h>]) dnl Favour xattr through glibc, but use libattr if we have to AC_CHECK_FUNC(lsetxattr, , Index: ChangeLog =================================================================== --- ChangeLog (revision 155735) +++ ChangeLog (working copy) @@ -1,3 +1,13 @@ +2010-04-19 Jonathan Pryor <jpr...@novell.com> + + * configure.in: Use AC_CHECK_LIB() to check for pthread instead of + just blindly linking to -lpthread, as Android includes pthread + support within libc and doesn't provide a separate libpthread. + Add header, structure member, and function checks as Android doesn't + provide all the headers, structure members, and functions that a + "full" Linux distro includes. Android provides <malloc.h>, so check + for it and define HAVE_USR_INCLUDE_MALLOC_H when present. + 2010-04-19 Zoltan Varga <var...@gmail.com> * configure.in: Add a --enable-minimal=normalization option to disable support Index: support/dirent.c =================================================================== --- support/dirent.c (revision 155735) +++ support/dirent.c (working copy) @@ -29,6 +29,7 @@ G_BEGIN_DECLS +#if HAVE_SEEKDIR gint32 Mono_Posix_Syscall_seekdir (void *dir, mph_off_t offset) { @@ -38,12 +39,15 @@ return 0; } +#endif /* def HAVE_SEEKDIR */ +#if HAVE_TELLDIR mph_off_t Mono_Posix_Syscall_telldir (void *dir) { return telldir ((DIR*) dir); } +#endif /* def HAVE_TELLDIR */ static void copy_dirent (struct Mono_Posix_Syscall__Dirent *to, struct dirent *from) Index: support/grp.c =================================================================== --- support/grp.c (revision 155735) +++ support/grp.c (working copy) @@ -226,6 +226,7 @@ } #endif /* ndef HAVE_GETGRGID_R */ +#if HAVE_GETGRENT gint32 Mono_Posix_Syscall_getgrent (struct Mono_Posix_Syscall__Group *grbuf) { @@ -247,6 +248,7 @@ } return 0; } +#endif /* def HAVE_GETGRENT */ #ifdef HAVE_FGETGRENT gint32 @@ -272,13 +274,16 @@ } #endif /* ndef HAVE_FGETGRENT */ +#if HAVE_SETGROUPS gint32 Mono_Posix_Syscall_setgroups (mph_size_t size, mph_gid_t *list) { mph_return_if_size_t_overflow (size); return setgroups ((size_t) size, list); } +#endif /* def HAVE_SETGROUPS */ +#if HAVE_SETGRENT int Mono_Posix_Syscall_setgrent (void) { @@ -289,13 +294,16 @@ mph_return_if_val_in_list5(errno, EIO, EMFILE, ENFILE, ENOMEM, ERANGE); return 0; } +#endif /* def HAVE_SETGRENT */ +#if HAVE_ENDGRENT int Mono_Posix_Syscall_endgrent (void) { endgrent(); return 0; } +#endif /* def HAVE_ENDGRENT */ G_END_DECLS Index: support/ChangeLog =================================================================== --- support/ChangeLog (revision 155735) +++ support/ChangeLog (working copy) @@ -1,3 +1,9 @@ +2010-04-19 Jonathan Pryor <jpr...@novell.com> + + * dirent.c, grp.c, macros.c, pwd.c, signal.c, sys-statvfs.c, sys-time.c, + unistd.c: Add #if HAVE_XXX checks for functions which aren't + provided on Android. + 2010-04-15 Jonathan Pryor <jpr...@novell.com> * Makefile.am: Revert previous linkage against libmono.so, as lupus Index: support/sys-statvfs.c =================================================================== --- support/sys-statvfs.c (revision 155735) +++ support/sys-statvfs.c (working copy) @@ -14,8 +14,14 @@ #include "mph.h" #include "map.h" +#ifdef HAVE_PATHCONF_H +#include <pathconf.h> +#endif + #ifdef HAVE_SYS_STATVFS_H #include <sys/statvfs.h> +#elif defined (HAVE_STATFS) || defined (HAVE_FSTATFS) +#include <sys/vfs.h> #endif /* def HAVE_SYS_STATVFS_H */ #ifdef HAVE_GETFSSTAT @@ -142,8 +148,10 @@ // so this shouldn't lose anything. memcpy (&to->f_fsid, &from->f_fsid, sizeof(to->f_fsid)); +#if HAVE_STRUCT_STATFS_F_FLAGS if (Mono_Posix_ToMountFlags (from->f_flags, &to->f_flag) != 0) return -1; +#endif /* def HAVE_STRUCT_STATFS_F_FLAGS */ return 0; } @@ -165,9 +173,11 @@ // so this shouldn't lose anything. memcpy (&to->f_fsid, &from->f_fsid, sizeof(to->f_fsid)); +#if HAVE_STRUCT_STATFS_F_FLAGS if (Mono_Posix_FromMountFlags (from->f_flag, &flag) != 0) return -1; to->f_flags = flag; +#endif /* def HAVE_STRUCT_STATFS_F_FLAGS */ return 0; } Index: support/unistd.c =================================================================== --- support/unistd.c (revision 155735) +++ support/unistd.c (working copy) @@ -116,6 +116,7 @@ return sysconf (name); } +#if HAVE_CONFSTR mph_size_t Mono_Posix_Syscall_confstr (int name, char *buf, mph_size_t len) { @@ -124,6 +125,7 @@ return -1; return confstr (name, buf, (size_t) len); } +#endif /* def HAVE_CONFSTR */ #ifdef HAVE_TTYNAME_R gint32 @@ -145,12 +147,14 @@ return r; } +#if HAVE_GETLOGIN_R gint32 Mono_Posix_Syscall_getlogin_r (char *buf, mph_size_t len) { mph_return_if_size_t_overflow (len); return getlogin_r (buf, (size_t) len); } +#endif /* def HAVE_GETLOGIN_R */ gint32 Mono_Posix_Syscall_gethostname (char *buf, mph_size_t len) @@ -159,18 +163,22 @@ return gethostname (buf, (size_t) len); } +#if HAVE_SETHOSTNAME gint32 Mono_Posix_Syscall_sethostname (const char *name, mph_size_t len) { mph_return_if_size_t_overflow (len); return sethostname (name, (size_t) len); } +#endif /* def HAVE_SETHOSTNAME */ +#if HAVE_GETHOSTID gint64 Mono_Posix_Syscall_gethostid (void) { return gethostid (); } +#endif /* def HAVE_GETHOSTID */ #ifdef HAVE_SETHOSTID gint32 @@ -204,12 +212,17 @@ } #endif /* def HAVE_SETDOMAINNAME */ +/* Android implements truncate, but doesn't declare it. + * Result is a warning during compilation, so skip it. + */ +#ifndef PLATFORM_ANDROID gint32 Mono_Posix_Syscall_truncate (const char *path, mph_off_t length) { mph_return_if_off_t_overflow (length); return truncate (path, (off_t) length); } +#endif gint32 Mono_Posix_Syscall_ftruncate (int fd, mph_off_t length) @@ -218,6 +231,7 @@ return ftruncate (fd, (off_t) length); } +#if HAVE_LOCKF gint32 Mono_Posix_Syscall_lockf (int fd, int cmd, mph_off_t len) { @@ -226,7 +240,9 @@ return -1; return lockf (fd, cmd, (off_t) len); } +#endif /* def HAVE_LOCKF */ +#if HAVE_SWAB int Mono_Posix_Syscall_swab (void *from, void *to, mph_ssize_t n) { @@ -235,20 +251,25 @@ swab (from, to, (ssize_t) n); return 0; } +#endif /* def HAVE_SWAB */ +#if HAVE_SETUSERSHELL int Mono_Posix_Syscall_setusershell (void) { setusershell (); return 0; } +#endif /* def HAVE_SETUSERSHELL */ +#if HAVE_ENDUSERSHELL int Mono_Posix_Syscall_endusershell (void) { endusershell (); return 0; } +#endif /* def HAVE_ENDUSERSHELL */ int Mono_Posix_Syscall_sync (void) Index: support/sys-time.c =================================================================== --- support/sys-time.c (revision 155735) +++ support/sys-time.c (working copy) @@ -124,6 +124,7 @@ } #endif /* def HAVE_LUTIMES */ +#if HAVE_FUTIMES gint32 Mono_Posix_Syscall_futimes(int fd, struct Mono_Posix_Timeval *tv) { @@ -134,6 +135,7 @@ return futimes (fd, ptv); } +#endif /* def HAVE_FUTIMES */ G_END_DECLS Index: support/signal.c =================================================================== --- support/signal.c (revision 155735) +++ support/signal.c (working copy) @@ -120,6 +120,7 @@ #define mph_int_set(p,o,n) do { *(p) = n; } while (0) #endif +#if HAVE_PSIGNAL int Mono_Posix_Syscall_psignal (int sig, const char* s) { @@ -127,6 +128,7 @@ psignal (sig, s); return errno == 0 ? 0 : -1; } +#endif /* def HAVE_PSIGNAL */ #define NUM_SIGNALS 64 static signal_info signals[NUM_SIGNALS]; Index: support/macros.c =================================================================== --- support/macros.c (revision 155735) +++ support/macros.c (working copy) @@ -99,6 +99,7 @@ return strdup (e->d_name); } +#if HAVE_GETPWNAM_R int helper_Mono_Posix_getpwnamuid (int mode, char *in_name, int in_uid, char **account, char **password, @@ -145,3 +146,5 @@ return 0; } +#endif /* def HAVE_GETPWNAM_R */ + Index: support/pwd.c =================================================================== --- support/pwd.c (revision 155735) +++ support/pwd.c (working copy) @@ -22,7 +22,9 @@ passwd_offsets[] = { MPH_STRING_OFFSET (struct passwd, pw_name, MPH_STRING_OFFSET_PTR), MPH_STRING_OFFSET (struct passwd, pw_passwd, MPH_STRING_OFFSET_PTR), +#if HAVE_STRUCT_PASSWD_PW_GECOS MPH_STRING_OFFSET (struct passwd, pw_gecos, MPH_STRING_OFFSET_PTR), +#endif /* def HAVE_STRUCT_PASSWD_PW_GECOS */ MPH_STRING_OFFSET (struct passwd, pw_dir, MPH_STRING_OFFSET_PTR), MPH_STRING_OFFSET (struct passwd, pw_shell, MPH_STRING_OFFSET_PTR) }; @@ -31,7 +33,9 @@ mph_passwd_offsets[] = { MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Passwd, pw_name, MPH_STRING_OFFSET_PTR), MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Passwd, pw_passwd, MPH_STRING_OFFSET_PTR), +#if HAVE_STRUCT_PASSWD_PW_GECOS MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Passwd, pw_gecos, MPH_STRING_OFFSET_PTR), +#endif /* def HAVE_STRUCT_PASSWD_PW_GECOS */ MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Passwd, pw_dir, MPH_STRING_OFFSET_PTR), MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Passwd, pw_shell, MPH_STRING_OFFSET_PTR) }; @@ -187,6 +191,7 @@ } #endif /* ndef HAVE_GETPWUID_R */ +#if HAVE_GETPWENT gint32 Mono_Posix_Syscall_getpwent (struct Mono_Posix_Syscall__Passwd *pwbuf) { @@ -208,6 +213,7 @@ } return 0; } +#endif /* def HAVE_GETPWENT */ #ifdef HAVE_FGETPWENT gint32 @@ -233,6 +239,7 @@ } #endif /* ndef HAVE_FGETPWENT */ +#if HAVE_SETPWENT int Mono_Posix_Syscall_setpwent (void) { @@ -243,7 +250,9 @@ mph_return_if_val_in_list5(errno, EIO, EMFILE, ENFILE, ENOMEM, ERANGE); return 0; } +#endif /* def HAVE_SETPWENT */ +#if HAVE_ENDPWENT int Mono_Posix_Syscall_endpwent (void) { @@ -253,6 +262,7 @@ return -1; return 0; } +#endif /* def HAVE_ENDPWENT */ G_END_DECLS
_______________________________________________ Mono-devel-list mailing list Mono-devel-list@lists.ximian.com http://lists.ximian.com/mailman/listinfo/mono-devel-list