Hi again,

Moritz Heidkamp <mor...@twoticketsplease.de> writes:

> I have a new version of this patch on my machine which applies cleanly
> again (Felix already reviewed it). I'll post it here when I'm back at
> it!

find it attached!

Moritz
>From 4064075061189c7b743b69ebbacad82a089c5c34 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               |  33 ++++++++++++---
 4 files changed, 171 insertions(+), 6 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 7b36ab0..48b36a7 100644
--- a/README
+++ b/README
@@ -506,6 +506,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 682587e..303d475 100644
--- a/distribution/manifest
+++ b/distribution/manifest
@@ -222,6 +222,7 @@ Makefile.android
 Makefile.aix
 Makefile.linux
 Makefile.macosx
+Makefile.ios
 Makefile.mingw
 Makefile.mingw-msys
 Makefile.solaris
diff --git a/tcp.scm b/tcp.scm
index 400e944..d0ac20e 100644
--- a/tcp.scm
+++ b/tcp.scm
@@ -116,6 +116,27 @@ static C_word make_socket_nonblocking (C_word sock) {
 #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
 ) )
 
@@ -152,6 +173,8 @@ 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* 
@@ -281,12 +304,8 @@ EOF
       (when (eq? _invalid_socket s)
 	(##sys#error "cannot create socket") )
       ;; PLT makes this an optional arg to tcp-listen. Should we as well?
-      (when (eq? _socket_error
-		 ((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? _socket_error (##net#set-socket-options s))
+	(network-error 'tcp-listen "error while setting up socket" s) )
       (when (eq? _socket_error (##net#bind s addr _sockaddr_in_size))
 	(network-error/close 'tcp-listen "cannot bind to socket" s host port) )
       s)) )
@@ -571,6 +590,8 @@ EOF
     (let ((s (##net#socket _af_inet _sock_stream 0)) )
       (when (eq? _invalid_socket s)
 	(network-error 'tcp-connect "cannot create socket" host port) )
+      (when (eq? _socket_error (##net#set-socket-options s))
+	(network-error/close 'tcp-connect "error while setting up socket" s) )
       (unless (##core#inline "make_socket_nonblocking" s)
 	(network-error/close 'tcp-connect "fcntl() failed" s) )
       (let loop ()
-- 
1.8.5.2

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

Reply via email to