updated Android build to use "gcc --sysroot" technique, first available in NDKr4
authorHans-Christoph Steiner <hans@eds.org>
Wed, 4 Apr 2012 23:30:54 +0000 (19:30 -0400)
committerHans-Christoph Steiner <hans@eds.org>
Sat, 5 May 2012 16:45:08 +0000 (12:45 -0400)
Makefile
Makefile.inc
android/README
android/regex/Makefile.inc [deleted file]
make/Makefile.android

index 6eb3e85..c3c2851 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -183,6 +183,7 @@ libs:
 
 libs_clean clean_libs:
                -for dir in $(SUBDIRS);do $(MAKECMD) -C lib/$$dir LIBDIR=$(LIBDIR) clean;rm -f lib/$$dir/*.so lib/$$dir/*.dll;done
+               -rm -f $(REGEX_OBJS)
 
 libs_install install_libs:
                @set -e;for dir in $(SUBDIRS);do $(MAKECMD) -C lib/$$dir LIBDIR=$(LIBDIR) install;done
@@ -283,7 +284,11 @@ mdns_uninstall:
 # no targets for mini: it's an example plugin
 #
 
-nameservice:
+# nameserver uses regex, which was only recently added to Android.  On
+# Android, $(REGEX_OBJS) will have all of the files needed, on all
+# other platforms, it'll be empty and therefore ignored.
+nameservice: $(REGEX_OBJS)
+               @$(MAKECMD) -C lib/nameservice clean
                @$(MAKECMD) -C lib/nameservice
 
 nameservice_clean:
index 34af527..d70578e 100644 (file)
@@ -230,12 +230,13 @@ help:
        @echo ' by setting the OS variable! Valid  '
        @echo ' target OSes are:                   '
        @echo ' ---------------------------------  '
-       @echo ' linux - GNU/Linux                  '
-       @echo ' win32 - MS Windows                 '
-       @echo ' fbsd  - FreeBSD                    '
-       @echo ' nbsd  - NetBSD                     '
-       @echo ' obsd  - OpenBSD                    '
-       @echo ' osx   - Mac OS X                   '
+       @echo ' linux   - GNU/Linux                '
+       @echo ' win32   - MS Windows               '
+       @echo ' fbsd    - FreeBSD                  '
+       @echo ' nbsd    - NetBSD                   '
+       @echo ' obsd    - OpenBSD                  '
+       @echo ' osx     - Mac OS X                 '
+       @echo ' android - Android                  '
        @echo ' ---------------------------------  '
        @echo ' Example - build for windows:       '
        @echo ' make OS=win32                      '
index 8c1da51..a842eba 100644 (file)
@@ -1 +1,4 @@
-This directory contains some Android specific code. (Mostly dealing with providing missing filesfrom Android NDK.)
+This directory contains some Android specific code. (Mostly dealing
+with providing missing filesfrom Android NDK.)
+
+ * regex support was not added until NDK platform android-8 (v2.2)
diff --git a/android/regex/Makefile.inc b/android/regex/Makefile.inc
deleted file mode 100644 (file)
index 9c44858..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#      $OpenBSD: Makefile.inc,v 1.6 2005/04/15 02:07:04 millert Exp $
-#      @(#)Makefile.inc        8.1 (Berkeley) 6/4/93
-
-# regex sources
-.PATH: ${LIBCSRCDIR}/regex
-
-CFLAGS+=-DPOSIX_MISTAKE
-
-SRCS+= regcomp.c regerror.c regexec.c regfree.c
-
-MAN+=  regex.3 re_format.7
-
-MLINKS+=regex.3 regcomp.3 regex.3 regexec.3 regex.3 regerror.3 regex.3 regfree.3
index 615620b..40b5963 100644 (file)
@@ -3,11 +3,10 @@
 #
 # 1) Download and extract the Android NDK from
 #    http://developer.android.com/sdk/ndk/index.html
-#    (e.g. into to /opt, otherwise call 'make NDK=')
+#    (e.g. into to /opt, otherwise call 'make NDK_BASE=')
 #
 # 2) Compile olsrd with the make command:
-#    make OS=android DEBUG=0 build_all
-#    (expect lots of warnings which is normal)
+#    make OS=android DEBUG=0 NDK_BASE=/opt
 #
 # 3) Install olsrd on your local PC, e.g.
 #    sudo make OS=android DEBUG=0 install_all
@@ -34,19 +33,31 @@ LIBDIR = $(PREFIX)/lib
 DOCDIR =
 MANDIR =
 
-SRCS +=        $(wildcard src/linux/*.c src/unix/*.c)
-HDRS +=                $(wildcard src/linux/*.h src/unix/*.h)
+# there probably should be an Android log.c and misc.c to support
+# Logcat, but this works for now
+SRCS += $(wildcard src/unix/*.c src/linux/*.c)
+HDRS += $(wildcard src/unix/*.h src/linux/*.h)
+
+# Android didn't add regex until android-8 so include this one
+REGEX_SRCS = \
+       android/regex/regcomp.c \
+       android/regex/regerror.c \
+       android/regex/regexec.c \
+       android/regex/regfree.c
+REGEX_OBJS = $(REGEX_SRCS:.c=.o)
 
 CPPFLAGS +=    -Dlinux
 
-# bionic libc: missing declaration
-CPPFLAGS +=    -DINET_ADDRSTRLEN=16
+CPPFLAGS +=    -DOLSRD_GLOBAL_CONF_FILE=\"$(CFGFILE)\"
 # bionic libc: missing declarations
+CPPFLAGS +=    -DINET_ADDRSTRLEN=16
 CPPFLAGS +=    -D'IPTOS_PREC(tos)=((tos)&0xe0)'
 CPPFLAGS +=    -D'IPTOS_TOS(tos)=((tos)&0x1e)'
-CPPFLAGS +=    -DOLSRD_GLOBAL_CONF_FILE=\"$(CFGFILE)\"
+# Android NDK is missing some Linux headers and regex, we have them here:
+CPPFLAGS += -I$(TOPDIR)/android
 
 # Compilation flags from build/toolchains/arm-eabi-4.2.1/setup.mk
+#  * removed -fstrict-aliasing since the code has a lot of type-punning
 CPPFLAGS +=  \
        -march=armv5te -mtune=xscale \
        -msoft-float -fpic \
@@ -60,60 +71,59 @@ CPPFLAGS +=  \
 ifeq ($(DEBUG),0)
 CPPFLAGS +=  \
        -fomit-frame-pointer \
-       -fstrict-aliasing \
        -funswitch-loops \
        -finline-limit=300
 else
 CPPFLAGS += \
-       -fno-omit-frame-pointer \
-       -fno-strict-aliasing
+       -fno-omit-frame-pointer
 endif
 
-PLUGIN_SONAME ?= $(PLUGIN_NAME)
-PLUGIN_FULLNAME ?= $(PLUGIN_NAME).so.$(PLUGIN_VER)
-INSTALL_LIB =  install -D -m 755 $(PLUGIN_FULLNAME) $(LIBDIR)/$(PLUGIN_FULLNAME); \
-               /sbin/ldconfig -n $(LIBDIR)
-UNINSTALL_LIB =        rm -f $(LIBDIR)/$(PLUGIN_FULLNAME); \
-               /sbin/ldconfig -n $(LIBDIR)
-
 ifdef OLSRD_PLUGIN
 GENERATE_PIC = true
 endif
 
+LDFLAGS += -llog
+
 ifdef GENERATE_PIC
 CFLAGS +=      -fPIC
 LDFLAGS +=     -fPIC
 endif
 
-NDK = /opt/android-ndk-r4b
-NDK_ARCH = $(NDK)/build/platforms/android-3/arch-arm
+PLUGIN_SONAME ?= $(PLUGIN_NAME)
+PLUGIN_FULLNAME ?= $(PLUGIN_NAME).so.$(PLUGIN_VER)
+INSTALL_LIB =  install -D -m 755 $(PLUGIN_FULLNAME) $(LIBDIR)/$(PLUGIN_FULLNAME); \
+               /sbin/ldconfig -n $(LIBDIR)
+UNINSTALL_LIB =        rm -f $(LIBDIR)/$(PLUGIN_FULLNAME); \
+               /sbin/ldconfig -n $(LIBDIR)
+
+HOST = arm-linux-androideabi
+NDK_BASE = /opt/android-ndk
+CURRENT_SYSTEM := $(shell uname -s | tr A-Z a-z)
+NDK_TOOLCHAIN_BASE = $(NDK_BASE)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/$(CURRENT_SYSTEM)-x86
 
-ifneq ($(shell uname -m),armv6l)
-# You are not compiling with Debian direct on the phone
-CURRENT_SYSTEM = $(shell uname -s | tr A-Z a-z)
-CROSS_COMPILE = $(NDK)/build/prebuilt/$(CURRENT_SYSTEM)-x86/arm-eabi-4.2.1/bin/arm-eabi-
-CC = $(CROSS_COMPILE)gcc
+NDK_PLATFORM_VERSION = 4
+NDK_SYSROOT = $(NDK_BASE)/platforms/android-$(NDK_PLATFORM_VERSION)/arch-arm
+CROSS_COMPILE = $(NDK_TOOLCHAIN_BASE)/bin/$(HOST)-
+
+CC = $(CROSS_COMPILE)gcc --sysroot="$(NDK_SYSROOT)"
+LD = $(CROSS_COMPILE)ld
+AR = $(CROSS_COMPILE)ar
 ifeq ($(DEBUG),0)
 STRIP = $(CROSS_COMPILE)strip
 endif
-endif
 
-CFLAGS += -I$(NDK_ARCH)/usr/include
-CFLAGS += -I$(TOPDIR)/android
 
-LDFLAGS += -nostartfiles -nodefaultlibs -nostdlib -Bdynamic
-LDFLAGS += -Wl,--dynamic-linker -Wl,/system/bin/linker
-LDFLAGS += -L$(NDK_ARCH)/usr/lib
-LDFLAGS += -Wl,-rpath-link -Wl,$(NDK_ARCH)/usr/lib
-LDFLAGS += -llog
-ifndef OLSRD_PLUGIN
-LDFLAGS += $(NDK_ARCH)/usr/lib/crtbegin_dynamic.o
-endif
+# The Android NDK didn't add proper regex support until android-8
+# (2.2), so we include the Android files here, and build with
+# -DPOSIX_MISTAKE like Android does.
+$(REGEX_OBJS): $(REGEX_SRCS)
+       echo "[CC] $<"
+       $(CC) $(CFLAGS) $(CPPFLAGS) -DPOSIX_MISTAKE -c -o $@ $<
 
-LIBS += -Wl,-lc -Wl,-lm -Wl,-lgcc
-ifndef OLSRD_PLUGIN
-LIBS += $(NDK_ARCH)/usr/lib/crtend_android.o
-endif
+regex: $(REGEX_OBJS)
+
+regex_clean:
+       rm -f $(REGEX_OBJS)
 
 # Local Variables:
 # mode: makefile