>From bb1921822b286dd6e6ffe7b2a35752692cc58c75 Mon Sep 17 00:00:00 2001 From: felix 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, 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