libaltos: Build -m64 and -m32 for fat tarball when possible
authorKeith Packard <keithp@keithp.com>
Thu, 2 Jan 2014 06:02:56 +0000 (22:02 -0800)
committerKeith Packard <keithp@keithp.com>
Thu, 2 Jan 2014 06:02:56 +0000 (22:02 -0800)
Check to see if we can compile libaltos for both 32 bit and 64 bit
systems, and then use those when generating the linux tarball.

Signed-off-by: Keith Packard <keithp@keithp.com>
altosui/Makefile.am
altosuilib/AltosUILib.java
configure.ac
libaltos/Makefile.am

index 71e96004169915a7fd7d519e10c91ed4a92f2203..dc34c444bc435c4e3cb6906a4169f3720f9dc3d6 100644 (file)
@@ -175,7 +175,13 @@ WINDOWS_DIST=Altos-Windows-$(VERSION_DASH).exe
 
 FAT_FILES=$(FATJAR) $(ALTOSLIB_CLASS) $(ALTOSUILIB_CLASS) $(FREETTS_CLASS) $(JFREECHART_CLASS) $(JCOMMON_CLASS)
 
 
 FAT_FILES=$(FATJAR) $(ALTOSLIB_CLASS) $(ALTOSUILIB_CLASS) $(FREETTS_CLASS) $(JFREECHART_CLASS) $(JCOMMON_CLASS)
 
-LINUX_FILES=$(FAT_FILES) libaltos.so $(FIRMWARE) $(DOC)
+if MULTI_ARCH
+LINUX_LIBS=libaltos32.so libaltos64.so
+else
+LINUX_LIBS=libaltos.so
+endif
+
+LINUX_FILES=$(FAT_FILES) $(LINUX_LIBS) $(FIRMWARE) $(DOC)
 LINUX_EXTRA=altosui-fat
 
 MACOSX_INFO_PLIST=Info.plist
 LINUX_EXTRA=altosui-fat
 
 MACOSX_INFO_PLIST=Info.plist
@@ -269,6 +275,14 @@ libaltos.so: build-libaltos
        -rm -f "$@"
        $(LN_S) ../libaltos/.libs/"$@" .
 
        -rm -f "$@"
        $(LN_S) ../libaltos/.libs/"$@" .
 
+libaltos32.so: build-libaltos
+       -rm -f "$@"
+       $(LN_S) ../libaltos/.libs/"$@" .
+
+libaltos64.so: build-libaltos
+       -rm -f "$@"
+       $(LN_S) ../libaltos/.libs/"$@" .
+
 libaltos.dylib:
        -rm -f "$@"
        $(LN_S) ../libaltos/"$@" .
 libaltos.dylib:
        -rm -f "$@"
        $(LN_S) ../libaltos/"$@" .
index 307ef19dc048413886d6e5e5cb47d8f65d9b9068..18c4c3d9eee0bc2035331eddab9b76bbdaf0dd21 100644 (file)
@@ -81,18 +81,20 @@ public class AltosUILib extends AltosLib {
        static public boolean initialized = false;
        static public boolean loaded_library = false;
 
        static public boolean initialized = false;
        static public boolean loaded_library = false;
 
+       static final String[] library_names = { "altos", "altos32", "altos64" };
+
        public static boolean load_library() {
                if (!initialized) {
        public static boolean load_library() {
                if (!initialized) {
-                       try {
-                               System.loadLibrary("altos");
-                               libaltos.altos_init();
-                               loaded_library = true;
-                       } catch (UnsatisfiedLinkError e) {
+                       for (String name : library_names) {
                                try {
                                try {
-                                       System.loadLibrary("altos64");
+                                       System.out.printf ("Trying library %s\n", name);
+                                       System.loadLibrary(name);
                                        libaltos.altos_init();
                                        loaded_library = true;
                                        libaltos.altos_init();
                                        loaded_library = true;
-                               } catch (UnsatisfiedLinkError e2) {
+                                       System.out.printf ("Using library %s\n", name);
+                                       break;
+                               } catch (UnsatisfiedLinkError e) {
+                                       System.out.printf("Link error %s\n", e.getMessage());
                                        loaded_library = false;
                                }
                        }
                                        loaded_library = false;
                                }
                        }
index 1214564b9dc808d4e3b546fd5667d2999ceae51b..20acdf5f3dd2b2bab0e593b1b617c91364aebf80 100644 (file)
@@ -430,7 +430,58 @@ if test x"$HAVE_STLINK" = "xyes"; then
        AC_DEFINE(HAVE_STLINK,1,[Using STlink library])
 fi
 
        AC_DEFINE(HAVE_STLINK,1,[Using STlink library])
 fi
 
-AM_CONDITIONAL([LIBSTLINK], [test x$HAVE_STLINK == xyes])
+AM_CONDITIONAL([LIBSTLINK], [test x$HAVE_STLINK = xyes])
+
+AC_ARG_ENABLE([multi-arch],
+             [AS_HELP_STRING([--enable-multi-arch],
+                             [enable building both i386 and amd64 libraries (default=auto)])],
+             [MULTI_ARCH=$enableval],
+             [MULTI_ARCH=auto])
+
+case x"$MULTI_ARCH" in
+xauto)
+       arch=`uname -m`
+       case x"$arch" in
+       xx86_64|xi*86)
+               save_CFLAGS="$CFLAGS"
+               save_LIBS="$LIBS"
+               LIBS="-lbluetooth"
+               CFLAGS="-m64"
+               AC_MSG_CHECKING([if ]$CC[ ]$CFLAGS[ can link programs])
+               AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
+                               [M64_LINK=yes],
+                               [M64_LINK=no])
+               AC_MSG_RESULT([$M64_LINK])
+               CFLAGS="-m32"
+               AC_MSG_CHECKING([if ]$CC[ ]$CFLAGS[ can link programs])
+               AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
+                               [M32_LINK=yes],
+                               [M32_LINK=no])
+               AC_MSG_RESULT([$M32_LINK])
+               CFLAGS="$save_CFLAGS"
+               LIBS="$save_LIBS"
+               case x"$M64_LINK"x"$M32_LINK" in
+               xyesxyes)
+                       MULTI_ARCH=yes
+                       ;;
+               *)
+                       MULTI_ARCH=no
+                       ;;
+               esac
+               ;;
+       *)
+               MULTI_ARCH=no
+               ;;
+       esac
+       ;;
+xyes|xno)
+       ;;
+*)
+       MULTI_ARCH="no"
+       ;;
+esac
+       
+AM_CONDITIONAL([MULTI_ARCH], [test x$MULTI_ARCH = xyes])
 
 AC_OUTPUT([
 Makefile
 
 AC_OUTPUT([
 Makefile
@@ -483,6 +534,7 @@ echo "    AVR support.................: ${HAVE_AVR_CC}"
 echo "    Android support.............: ${HAVE_ANDROID_SDK}"
 echo "    STlink support..............: ${HAVE_STLINK}"
 echo "    Local pdclib................: ${HAVE_PDCLIB}"
 echo "    Android support.............: ${HAVE_ANDROID_SDK}"
 echo "    STlink support..............: ${HAVE_STLINK}"
 echo "    Local pdclib................: ${HAVE_PDCLIB}"
+echo "    i386 and amd64 libaltos.....: ${MULTI_ARCH}"
 echo ""
 echo "  Java paths"
 echo "    freetts.....................: ${FREETTS}"
 echo ""
 echo "  Java paths"
 echo "    freetts.....................: ${FREETTS}"
index 831432fc1a8e6e7aec7d12f6f5c64c04d10ed569..969aa8ad95ac483b6967d6df5354d08880a5f997 100644 (file)
@@ -5,8 +5,7 @@ AM_JAVACFLAGS=-target 1.6 -encoding UTF-8 -Xlint:deprecation -source 6
 altoslibdir=$(libdir)/altos
 
 altoslib_LTLIBRARIES=libaltos.la
 altoslibdir=$(libdir)/altos
 
 altoslib_LTLIBRARIES=libaltos.la
-
-libaltos_la_LDFLAGS = -version-info 1:0:1
+libaltos_la_LDFLAGS=-version-info 1:0:1
 
 libaltos_la_SOURCES=\
        libaltos.c \
 
 libaltos_la_SOURCES=\
        libaltos.c \
@@ -14,8 +13,35 @@ libaltos_la_SOURCES=\
 
 noinst_PROGRAMS=cjnitest
 
 
 noinst_PROGRAMS=cjnitest
 
+cjnitest_SOURCES=cjnitest.c
 cjnitest_LDADD=libaltos.la
 
 cjnitest_LDADD=libaltos.la
 
+if MULTI_ARCH
+altoslib_LTLIBRARIES+=libaltos32.la libaltos64.la
+
+libaltos32_la_LDFLAGS=$(libaltos_la_LDFLAGS)
+libaltos64_la_LDFLAGS=$(libaltos_la_LDFLAGS)
+
+libaltos32_la_CFLAGS=-m32 $(AM_CFLAGS)
+libaltos64_la_CFLAGS=-m64 $(AM_CFLAGS)
+
+libaltos32_la_SOURCES=$(libaltos_la_SOURCES)
+libaltos64_la_SOURCES=$(libaltos_la_SOURCES)
+
+noinst_PROGRAMS+=cjnitest32 cjnitest64
+
+cjnitest32_CFLAGS=-m32
+cjnitest64_CFLAGS=-m64
+
+cjnitest32_SOURCES=$(cjnitest_SOURCES)
+cjnitest64_SOURCES=$(cjnitest_SOURCES)
+
+cjnitest32_LDADD=libaltos32.la
+cjnitest64_LDADD=libaltos64.la
+
+endif
+
+
 LIBS=-lbluetooth
 
 HFILES=libaltos.h
 LIBS=-lbluetooth
 
 HFILES=libaltos.h