Hi all,

Attached is a patch by Bevuta which Felix sent last X-mas.  It adds
rudimentary support for iOS through a target Makefile.  I've so far been
unable to test this because I don't have an iOS device.  I don't have
access to a Mac, so I'm unable to verify that this patch even builds.

I've asked Moritz, but he's extremely busy these days, so perhaps
someone else is able to test this patch in the meanwhile?  I think
it's best if two people who know about OS X/iOS check the patch.

If nobody responds within a week, I'm going to go ahead and start the
release process for 4.9.0, because it's not so critical that we can't
make a release without this patch (but it would be nice if we can
include it).

Cheers,
Peter
-- 
http://www.more-magic.net
>From bb1921822b286dd6e6ffe7b2a35752692cc58c75 Mon Sep 17 00:00:00 2001
From: felix <fe...@call-with-current-continuation.org>
Date: Thu, 19 Dec 2013 11:02:06 +0100
Subject: [PATCH] Added basic iOS support.

---
 Makefile.ios          |  111 +++++++++++++++++++++++++++++++++++++++++++++++++
 README                |   32 ++++++++++++++
 distribution/manifest |    1 +
 tcp.scm               |   31 +++++++++++---
 4 files changed, 170 insertions(+), 5 deletions(-)
 create mode 100644 Makefile.ios

diff --git a/Makefile.ios b/Makefile.ios
new file mode 100644
index 0000000..dff7875
--- /dev/null
+++ b/Makefile.ios
@@ -0,0 +1,111 @@
+# Makefile.ios - configuration for Apple iOS -*- Makefile -*-
+#
+# Copyright (c) 2013, The Chicken Team
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without 
modification, are permitted provided that the following
+# conditions are met:
+#
+#   Redistributions of source code must retain the above copyright notice, 
this list of conditions and the following
+#     disclaimer. 
+#   Redistributions in binary form must reproduce the above copyright notice, 
this list of conditions and the following
+#     disclaimer in the documentation and/or other materials provided with the 
distribution. 
+#   Neither the name of the author nor the names of its contributors may be 
used to endorse or promote
+#     products derived from this software without specific prior written 
permission. 
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
AND ANY EXPRESS
+# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
OF MERCHANTABILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
COPYRIGHT HOLDERS OR
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
(INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+
+ifneq ($(CONFIG),)
+include $(CONFIG)
+endif
+
+SRCDIR = ./
+
+# platform configuration
+
+# for simulator:  ARCH ?= i386
+ARCH ?= armv7
+XCODE_PATH ?= /Applications/Xcode.app
+XCODE_DEVELOPER ?= $(XCODE_PATH)/Contents/Developer
+# for Xcode 4:  XCODE_TOOLPATH ?= 
$(XCODE_DEVELOPER)/Toolchains/XCodeDefault.xctoolchain/usr/bin
+XCODE_TOOLPATH ?= $(XCODE_DEVELOPER)/usr/bin
+# for simulator:  XCODE_SDK ?= 
$(XCODE_DEVELOPER)/Platforms/iPhoneSimulator.platform/Developer/SDKs/ipHoneSimulator7.0.sdk
+XCODE_SDK ?= 
$(XCODE_DEVELOPER)/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk
+STATICBUILD = 1
+HACKED_APPLY =
+
+# options
+
+# for Xcode 4:  C_COMPILER ?= 
$(XCODE_DEVELOPER)/Platforms/iPhoneOS.platform/iPhoneOS.platform/Developer/usr/bin
+C_COMPILER ?= $(XCODE_TOOLPATH)/gcc
+LIBRARIAN ?= 
$(XCODE_DEVELOPER)/Platforms/iPhoneOS.platform/Developer/usr/bin/ar
+C_COMPILER_OPTIONS ?= -no-cpp-precomp -fno-strict-aliasing -fwrapv -fno-common 
-DHAVE_CHICKEN_CONFIG_H -mno-thumb -isysroot $(XCODE_SDK) -arch $(ARCH)
+ifdef DEBUGBUILD
+C_COMPILER_OPTIMIZATION_OPTIONS ?= -g -Wall -Wno-unused
+else
+ifdef OPTIMIZE_FOR_SPEED
+C_COMPILER_OPTIMIZATION_OPTIONS ?= -O3 -fomit-frame-pointer
+else
+C_COMPILER_OPTIMIZATION_OPTIONS ?= -Os -fomit-frame-pointer
+endif
+endif
+LIBRARIAN_OPTIONS = scru
+ASSEMBLER_OPTIONS =
+LINKER_OPTIONS = -isysroot $(XCODE_SDK) -arch $(ARCH)
+
+# special files
+
+CHICKEN_CONFIG_H = chicken-config.h
+
+# select default and internal settings
+
+include $(SRCDIR)/defaults.make
+
+chicken-config.h: chicken-defaults.h
+       echo "/* GENERATED */" >$@
+       echo "#define HAVE_DIRENT_H 1" >>$@
+       echo "#define HAVE_INTTYPES_H 1" >>$@
+       echo "#define HAVE_LIMITS_H 1" >>$@
+       echo "#define HAVE_LONG_LONG 1" >>$@
+       echo "#define HAVE_MEMMOVE 1" >>$@
+       echo "#define HAVE_MEMORY_H 1" >>$@
+       echo "#define HAVE_POSIX_POLL 1" >>$@
+       echo "#define HAVE_SIGACTION 1" >>$@
+       echo "#define HAVE_SIGSETJMP 1" >>$@
+       echo "#define HAVE_SIGPROCMASK 1" >>$@
+       echo "#define HAVE_STDINT_H 1" >>$@
+       echo "#define HAVE_STDLIB_H 1" >>$@
+       echo "#define HAVE_STRERROR 1" >>$@
+       echo "#define HAVE_STRINGS_H 1" >>$@
+       echo "#define HAVE_STRING_H 1" >>$@
+       echo "#define HAVE_STRTOLL 1" >>$@
+       echo "#define HAVE_STRTOQ 1" >>$@
+       echo "#define HAVE_SYS_STAT_H 1" >>$@
+       echo "#define HAVE_SYS_TYPES_H 1" >>$@
+       echo "#define HAVE_UNISTD_H 1" >>$@
+       echo "#define HAVE_UNSIGNED_LONG_LONG 1" >>$@
+       echo "#define STDC_HEADERS 1" >>$@
+       echo "#define HAVE_ALLOCA 1" >>$@
+       echo "#define HAVE_ALLOCA_H 1" >>$@
+       echo "#define HAVE_GRP_H 1" >>$@
+       echo "#define HAVE_ERRNO_H 1" >>$@
+       echo "#define HAVE_SYSEXITS_H 1" >>$@
+       echo "#define C_STACK_GROWS_DOWNWARD 1" >>$@
+ifdef GCHOOKS
+       echo "#define C_GC_HOOKS" >>$@
+endif
+ifdef SYMBOLGC
+       echo "#define C_COLLECT_ALL_SYMBOLS" >>$@
+endif
+       cat chicken-defaults.h >>$@
+
+include $(SRCDIR)/rules.make
diff --git a/README b/README
index 49abb0d..d64d9c0 100644
--- a/README
+++ b/README
@@ -464,6 +464,38 @@
          - On 10.3 and earlier, you must first install `dlcompat'
            which can be found at http://distfiles.macports.org/dlcompat/.
 
+
+        iOS:
+
+          - Make sure the "XCODE_PATH" setting is correct (see
+            Makefile.ios), it defaults to "/Applications/Xcode.app".
+
+          - The paths for the the various build tools changed between
+            Xcode 4 and 5. The makefile used for iOS builds of CHICKEN
+            assume Xcode 5 is used. If you are using Xcode 4, override
+            the XCODE_TOOLPATH and C_COMPILER make-variables providing
+            the correct paths, see Makefile.ios for suggestions.
+
+          - The iOS build is static (iOS doesn't support dynamic
+            loading of executable code). Only the runtime library
+            (libchicken.a) is of interest. To use it, integrate
+            libchicken.a in your Xcode project and use a normal MacOS
+            build to compile your Scheme sources into C files, adding
+            them to you project.
+
+          - Core library units must by accessed via "(declare (uses
+            ...))" and "(import ...)", "require", "require-library",
+            "require-extension" and "use" will not work, due to the
+            reasons mentioned above.
+
+          - As dynamic loading is not supported, eggs can not be used
+            as usual, you will have to compile them manually and
+            integrate what you need into your project.
+
+          - If you want to build for the iPhone Simulator, override
+            the ARCH and XCODE_SDK variables accordingly, see also in
+            Makefile.ios for suggestions.
+
        Windows:
 
          - On Windows, mingw32, <http://mingw.sourceforge.net/> and
diff --git a/distribution/manifest b/distribution/manifest
index 1003489..8415d68 100644
--- a/distribution/manifest
+++ b/distribution/manifest
@@ -221,6 +221,7 @@ Makefile
 Makefile.aix
 Makefile.linux
 Makefile.macosx
+Makefile.ios
 Makefile.mingw
 Makefile.mingw-msys
 Makefile.solaris
diff --git a/tcp.scm b/tcp.scm
index bba60c4..f9361cb 100644
--- a/tcp.scm
+++ b/tcp.scm
@@ -81,6 +81,27 @@ static WSADATA wsa;
 #endif
 
 static char addr_buffer[ 20 ];
+
+static int C_set_socket_options(int socket)
+{
+  int yes = 1; 
+  int r;
+
+  r = setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, (const char *)&yes, 
sizeof(int));
+  
+  if(r != 0) return r;
+
+#ifdef SO_NOSIGPIPE
+  /*
+   * Avoid SIGPIPE (iOS uses *only* SIGPIPE otherwise, not returning EPIPE).
+   * For consistency we do this everywhere the option is supported.
+   */
+  r = setsockopt(socket, SOL_SOCKET, SO_NOSIGPIPE, (const char *)&yes, 
sizeof(int));
+#endif
+
+  return r;
+}
+
 EOF
 ) )
 
@@ -117,6 +138,7 @@ EOF
 (define ##net#shutdown (foreign-lambda int "shutdown" int int))
 (define ##net#connect (foreign-lambda int "connect" int scheme-pointer int))
 (define ##net#check-fd-ready (foreign-lambda int "C_check_fd_ready" int))
+(define ##net#set-socket-options (foreign-lambda int "C_set_socket_options" 
int))
 
 (define ##net#send
   (foreign-lambda* 
@@ -253,11 +275,8 @@ EOF
        (##sys#update-errno)
        (##sys#error "cannot create socket") )
       ;; PLT makes this an optional arg to tcp-listen. Should we as well?
-      (when (eq? -1 ((foreign-lambda* int ((int socket)) 
-                      "int yes = 1; 
-                     C_return(setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, 
(const char *)&yes, sizeof(int)));") 
-                    s) )
-       (network-error/close 'tcp-listen "error while setting up socket" s) )
+      (when (eq? -1 (##net#set-socket-options s))
+       (network-error 'tcp-listen "error while setting up socket" s) )
       (when (eq? -1 (##net#bind s addr _sockaddr_in_size))
        (network-error/close 'tcp-listen "cannot bind to socket" s host port) )
       s)) )
@@ -542,6 +561,8 @@ EOF
     (let ((s (##net#socket _af_inet _sock_stream 0)) )
       (when (eq? -1 s)
        (network-error 'tcp-connect "cannot create socket" host port) )
+      (when (eq? -1 (##net#set-socket-options s))
+       (network-error/close 'tcp-connect "error while setting up socket" s) )
       (unless (##net#make-nonblocking s)
        (network-error/close 'tcp-connect "fcntl() failed" s) )
       (let loop ()
-- 
1.7.9.5

_______________________________________________
Chicken-hackers mailing list
Chicken-hackers@nongnu.org
https://lists.nongnu.org/mailman/listinfo/chicken-hackers

Reply via email to