~ chicken-core (chicken-5) ec4444e3b9a7c80c63f0dad4059b83f254b92fb2
commit ec4444e3b9a7c80c63f0dad4059b83f254b92fb2
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Thu Dec 19 11:02:06 2013 +0100
Commit: Moritz Heidkamp <moritz@twoticketsplease.de>
CommitDate: Tue Mar 25 11:44:07 2014 +0100
Added basic iOS support.
Signed-off-by: Moritz Heidkamp <moritz@twoticketsplease.de>
diff --git a/Makefile.ios b/Makefile.ios
new file mode 100644
index 00000000..dff7875d
--- /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 7b36ab08..48b36a73 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 791389e0..bb8f1682 100644
--- a/distribution/manifest
+++ b/distribution/manifest
@@ -220,6 +220,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 400e9445..d0ac20e9 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 ()
Trap