Add linux installer script
authorKeith Packard <keithp@keithp.com>
Sun, 16 Feb 2014 21:01:29 +0000 (13:01 -0800)
committerKeith Packard <keithp@keithp.com>
Sun, 16 Feb 2014 21:42:00 +0000 (13:42 -0800)
Create a linux installer shell script that unpacks the archive in a
sensible place and adds a .desktop file to the environment

Signed-off-by: Keith Packard <keithp@keithp.com>
altosui/Makefile.am
altosui/linux-install.sh [new file with mode: 0644]

index 32a3df97ba9187d9704feebca4b22c9b20066742..20b234ab967cab803c99fb603df10c574815a07b 100644 (file)
@@ -171,6 +171,7 @@ DOC=$(ALTUSMETRUM_DOC) $(ALTOS_DOC) $(TELEMETRY_DOC) $(TEMPLATE_DOC)
 
 # Distribution targets
 LINUX_DIST=Altos-Linux-$(VERSION).tar.bz2
 
 # Distribution targets
 LINUX_DIST=Altos-Linux-$(VERSION).tar.bz2
+LINUX_SH=Altos-Linux-$(VERSION).sh
 MACOSX_DIST=Altos-Mac-$(VERSION).dmg
 WINDOWS_DIST=Altos-Windows-$(VERSION_DASH).exe
 
 MACOSX_DIST=Altos-Mac-$(VERSION).dmg
 WINDOWS_DIST=Altos-Windows-$(VERSION_DASH).exe
 
@@ -179,7 +180,7 @@ FAT_FILES=$(FATJAR) $(ALTOSLIB_CLASS) $(ALTOSUILIB_CLASS) $(FREETTS_CLASS) $(JFR
 LINUX_LIBS=libaltos32.so libaltos64.so
 
 LINUX_FILES=$(FAT_FILES) $(LINUX_LIBS) $(FIRMWARE) $(DOC)
 LINUX_LIBS=libaltos32.so libaltos64.so
 
 LINUX_FILES=$(FAT_FILES) $(LINUX_LIBS) $(FIRMWARE) $(DOC)
-LINUX_EXTRA=altosui-fat
+LINUX_EXTRA=altosui-fat ../debian/altos.desktop ../debian/altusmetrum.xpm
 
 MACOSX_INFO_PLIST=Info.plist
 MACOSX_FILES=$(FAT_FILES) libaltos.dylib $(MACOSX_INFO_PLIST) $(DOC) ReadMe-Mac.rtf
 
 MACOSX_INFO_PLIST=Info.plist
 MACOSX_FILES=$(FAT_FILES) libaltos.dylib $(MACOSX_INFO_PLIST) $(DOC) ReadMe-Mac.rtf
@@ -191,7 +192,7 @@ all-local: classes/altosui $(JAR) altosui altosui-test altosui-jdb
 
 clean-local:
        -rm -rf classes $(JAR) $(FATJAR) \
 
 clean-local:
        -rm -rf classes $(JAR) $(FATJAR) \
-               $(LINUX_DIST) $(MACOSX_DIST) windows $(WINDOWS_DIST) $(ALTOSLIB_CLASS) $(ALTOSUILIB_CLASS) $(FREETTS_CLASS) \
+               $(LINUX_DIST) $(LINUX_SH) $(MACOSX_DIST) windows $(WINDOWS_DIST) $(ALTOSLIB_CLASS) $(ALTOSUILIB_CLASS) $(FREETTS_CLASS) \
                $(JFREECHART_CLASS) $(JCOMMON_CLASS) $(LIBALTOS) Manifest.txt Manifest-fat.txt altos-windows.log altos-windows.nsi \
                altosui altosui-test altosui-jdb macosx linux
 
                $(JFREECHART_CLASS) $(JCOMMON_CLASS) $(LIBALTOS) Manifest.txt Manifest-fat.txt altos-windows.log altos-windows.nsi \
                altosui altosui-test altosui-jdb macosx linux
 
@@ -200,15 +201,20 @@ if FATINSTALL
 FATTARGET=$(FATDIR)/$(VERSION)
 
 LINUX_DIST_TARGET=$(FATTARGET)/$(LINUX_DIST)
 FATTARGET=$(FATDIR)/$(VERSION)
 
 LINUX_DIST_TARGET=$(FATTARGET)/$(LINUX_DIST)
+LINUX_SH_TARGET=$(FATTARGET)/$(LINUX_SH)
 MACOSX_DIST_TARGET=$(FATTARGET)/$(MACOSX_DIST)
 WINDOWS_DIST_TARGET=$(FATTARGET)/$(WINDOWS_DIST)
 
 MACOSX_DIST_TARGET=$(FATTARGET)/$(MACOSX_DIST)
 WINDOWS_DIST_TARGET=$(FATTARGET)/$(WINDOWS_DIST)
 
-fat: $(LINUX_DIST_TARGET) $(MACOSX_DIST_TARGET) $(WINDOWS_DIST_TARGET)
+fat: $(LINUX_DIST_TARGET) $(LINUX_SH_TARGET) $(MACOSX_DIST_TARGET) $(WINDOWS_DIST_TARGET)
 
 $(LINUX_DIST_TARGET): $(LINUX_DIST)
        mkdir -p $(FATTARGET)
        cp -p $< $@
 
 
 $(LINUX_DIST_TARGET): $(LINUX_DIST)
        mkdir -p $(FATTARGET)
        cp -p $< $@
 
+$(LINUX_SH_TARGET): $(LINUX_SH)
+       mkdir -p $(FATTARGET)
+       cp -p $< $@
+
 $(MACOSX_DIST_TARGET): $(MACOSX_DIST)
        mkdir -p $(FATTARGET)
        cp -p $< $@
 $(MACOSX_DIST_TARGET): $(MACOSX_DIST)
        mkdir -p $(FATTARGET)
        cp -p $< $@
@@ -218,7 +224,7 @@ $(WINDOWS_DIST_TARGET): $(WINDOWS_DIST)
        cp -p $< $@
 
 else
        cp -p $< $@
 
 else
-fat: $(LINUX_DIST) $(MACOSX_DIST) $(WINDOWS_DIST)
+fat: $(LINUX_DIST) $(LINUX_SH) $(MACOSX_DIST) $(WINDOWS_DIST)
 endif
 
 
 endif
 
 
@@ -329,10 +335,16 @@ $(LINUX_DIST): $(LINUX_FILES) $(LINUX_EXTRA)
        -rm -rf linux
        mkdir -p linux/AltOS
        cp -p $(LINUX_FILES) linux/AltOS
        -rm -rf linux
        mkdir -p linux/AltOS
        cp -p $(LINUX_FILES) linux/AltOS
+       sed -e 's;/usr/bin;%BIN%;' -e 's;/usr/share/pixmaps;%BIN%;' $(srcdir)/../debian/altos.desktop > linux/AltOS/altos.desktop.in
+       cp -p $(srcdir)/../debian/altusmetrum.xpm linux/AltOS/altusmetrum.xpm
        cp -p altosui-fat linux/AltOS/altosui
        chmod +x linux/AltOS/altosui
        tar cjf $@ -C linux AltOS
 
        cp -p altosui-fat linux/AltOS/altosui
        chmod +x linux/AltOS/altosui
        tar cjf $@ -C linux AltOS
 
+$(LINUX_SH): $(LINUX_DIST) linux-install.sh
+       cat linux-install.sh $(LINUX_DIST) > $@
+       chmod +x $@
+
 $(MACOSX_DIST): $(MACOSX_FILES) $(MACOSX_EXTRA) Makefile
        -rm -f $@
        -rm -rf macosx
 $(MACOSX_DIST): $(MACOSX_FILES) $(MACOSX_EXTRA) Makefile
        -rm -f $@
        -rm -rf macosx
diff --git a/altosui/linux-install.sh b/altosui/linux-install.sh
new file mode 100644 (file)
index 0000000..c5101eb
--- /dev/null
@@ -0,0 +1,190 @@
+#!/bin/sh
+
+can_ask=y
+
+finish()
+{
+    if [ "$can_ask" = "y" ]; then
+       echo ""
+       echo -n "Press enter to continue..."
+       read foo
+    fi
+    exit $1
+}
+
+#
+# Make sure we have a terminal to talk to
+#
+
+if tty -s; then
+    :
+else
+    case "$DISPLAY" in
+       "")
+       echo 'No user input available'
+       can_ask=n
+       ;;
+       *)
+       GUESS_XTERMS="x-terminal-emulator xterm rxvt roxterm gnome-terminal dtterm eterm Eterm kvt konsole aterm"
+        for a in $GUESS_XTERMS; do
+            if type $a >/dev/null 2>&1; then
+                XTERM=$a
+                break
+            fi
+        done
+       case "$XTERM" in
+           "")
+           echo 'No terminal emulator available'
+           can_ask=n
+           ;;
+           *)
+           exec "$XTERM" -e "sh '$0'"
+           ;;
+       esac
+       ;;
+    esac
+fi
+
+#
+# Make sure we can run java
+#
+
+echo -n "Checking for java..."
+
+if java -version > /dev/null 2>&1; then
+    echo " found it."
+else
+    echo " java isn't working."
+    echo ""
+    echo "You'll need to install a java runtime system"
+    echo "on this computer before AltOS will work properly."
+    finish 1
+fi
+    
+#
+# Pick an installation target
+# 
+
+if [ '(' -d /opt -a -w /opt ')' -o '(' -d /opt/AltOS -a -w /opt/AltOS ')' ]; then
+    target_default=/opt
+else
+    target_default="$HOME"
+fi
+
+case "$#" in
+0)
+    echo -n "Installation location [default: $target_default] "
+    if [ "$can_ask" = "y" ]; then
+       read target
+    else
+       echo ""
+       target=""
+    fi
+    case "$target" in
+       "")
+       target="$target_default"
+       ;;
+    esac
+    ;;
+*)
+    target="$1"
+    ;;
+esac
+
+target_altos="$target"/AltOS
+
+echo -n "Installing to $target..."
+
+#
+# Make sure the target exists
+#
+mkdir -p "$target_altos"
+
+if [ ! -d "$target_altos" ]; then
+    echo "$target_altos does not exist and cannot be created"
+    finish 1
+fi
+
+if [ ! -w "$target_altos" ]; then
+    echo "$target_altos cannot be written"
+    finish 1
+fi
+
+#
+# Unpack the tar archive appended to the end of this script
+#
+archive_line=`awk '/^__ARCHIVE_BELOW__/ {print NR + 1; exit 0; }' "$0"`
+
+tail -n+$archive_line "$0" | tar xjf - -C "$target"
+
+case $? in
+0)
+    echo " done."
+    ;;
+*)
+    echo "Install failed."
+    finish 1
+    ;;
+esac
+
+#
+# Create the .desktop file by editing the paths
+#
+case "$target" in
+/*)
+    target_abs="$target"
+    ;;
+*)
+    target_abs=`pwd`/$target
+    ;;
+esac
+
+BIN="$target_abs"/AltOS
+
+desktop="$target"/AltOS/altos.desktop
+
+rm -f "$desktop"
+sed "s;%BIN%;$BIN;" "$target"/AltOS/altos.desktop.in > "$desktop"
+
+#
+# Figure out where to install the .desktop file. If we can, write it
+# to the public /usr/share/applications, otherwise, write it to the
+# per-user ~/.local/share/applications
+#
+
+public=/usr/share/applications
+private=$HOME/.local/share/applications
+apps=""
+
+if [ -d "$public" -a -w "$public" ]; then
+    apps="$public"
+else
+    mkdir -p "$private" >/dev/null 2>&1 
+    if [ -d "$private" -a -w "$private" ]; then
+       apps="$private"
+    fi
+fi
+       
+case "$apps" in
+"")
+    echo "Cannot install application icon"
+    finish 1
+    ;;
+esac
+
+echo -n "Installing .desktop file to $apps..."
+
+cp "$desktop" "$apps"
+
+case "$?" in
+0)
+    echo " done."
+    ;;
+*)
+    echo " failed."
+    ;;
+esac
+
+finish 0
+
+__ARCHIVE_BELOW__