diff --git a/release_scripts/linux/build.sh b/release_scripts/linux/build.sh index a196d836..5158e019 100755 --- a/release_scripts/linux/build.sh +++ b/release_scripts/linux/build.sh @@ -26,11 +26,9 @@ initializeVariables() PRODUCT_PATH="$BUILD_DIR/product" # Qt installation path. This may vary across machines - QT_PATH="/opt/qt55" + QT_PATH="/usr/lib/x86_64-linux-gnu/qt5" PLUGINS_PATH="$QT_PATH/plugins" - GUI_TRANSLATIONS_DIRECTORY_PATH="$QT_PATH/translations" - QT_LIBRARY_DEST_PATH="$PRODUCT_PATH/qtlib" - QT_LIBRARY_SOURCE_PATH="$QT_PATH/lib" + GUI_TRANSLATIONS_DIRECTORY_PATH="/usr/share/qt5/translations" QMAKE_PATH="$QT_PATH/bin/qmake" LRELEASES="$QT_PATH/bin/lrelease" diff --git a/release_scripts/linux/debian_package_files/postinst b/release_scripts/linux/debian_package_files/postinst deleted file mode 100644 index dd388664..00000000 --- a/release_scripts/linux/debian_package_files/postinst +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -# -------------------------------------------------------------------- -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# --------------------------------------------------------------------- - -xdg-mime install --mode system /opt/openboard/etc/openboard-ubz.xml -xdg-desktop-menu install --novendor /usr/share/applications/openboard.desktop -xdg-mime default /usr/share/applications/openboard.desktop application/ubz - -ln -s /opt/openboard/run.sh /usr/bin/openboard - -exit 0 diff --git a/release_scripts/linux/package.sh b/release_scripts/linux/package.sh index f2dc932c..1bdf72db 100755 --- a/release_scripts/linux/package.sh +++ b/release_scripts/linux/package.sh @@ -28,7 +28,7 @@ # | postinst # usr/ # | bin/ -# | | openboard <-- actually a symlink to run.sh +# | | openboard <-- actually a symlink to run.sh or OpenBoard # | share/ # | | applications/ # | | | openboard.desktop @@ -37,15 +37,66 @@ # | | importer/ # | | library/ # | | etc/ -# | | qtlib/ -# | | plugins/ +# | | qtlib/ (*) +# | | plugins/ (*) # | | OpenBoard # | | OpenBoard.png -# | | qt.conf -# | | run.sh +# | | run.sh (*) # +# (*) Only included if Qt libs and plugins are bundled. It is necessary to +# bundle these if the target system doesn't provide Qt 5.5.1, for example. # ---------------------------------------------------------------------------- +initializeVariables() +{ + # This script's path + SCRIPT_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + + PROJECT_ROOT="$SCRIPT_PATH/../.." + + # Where the application was built (see build.sh) + BUILD_DIR="$PROJECT_ROOT/build/linux/release" + PRODUCT_PATH="$BUILD_DIR/product" + IMPORTER_DIR="$PROJECT_ROOT/../OpenBoard-Importer/" + IMPORTER_NAME="OpenBoardImporter" + + # Where the package is built to + PACKAGE_BUILD_DIR="$PROJECT_ROOT/install" + + # Temporary folder, where we put all the files that will be built into the + # package + BASE_WORKING_DIR="debianPackage" + + APPLICATION_NAME="OpenBoard" + APPLICATION_CODE="openboard" + APPLICATION_PATH="opt" + + PACKAGE_DIRECTORY=$BASE_WORKING_DIR/$APPLICATION_PATH/$APPLICATION_CODE + QT_PLUGINS_DEST_PATH="$PACKAGE_DIRECTORY/plugins" + QT_LIBRARY_DEST_PATH="$PACKAGE_DIRECTORY/qtlib" + + DESKTOP_FILE_PATH="$BASE_WORKING_DIR/usr/share/applications" + APPLICATION_SHORTCUT="$DESKTOP_FILE_PATH/${APPLICATION_CODE}.desktop" + + DESCRIPTION="OpenBoard, an interactive white board application" + VERSION=`cat $BUILD_DIR/version` + ARCHITECTURE=`cat buildContext` + + + # Include Qt libraries and plugins in the package, or not + # (this is necessary if the target system doesn't provide Qt 5.5.1) + BUNDLE_QT=false + + # Qt installation path. This may vary across machines + QT_PATH="/usr/lib/x86_64-linux-gnu/qt5" + QT_PLUGINS_SOURCE_PATH="$QT_PATH/plugins" + GUI_TRANSLATIONS_DIRECTORY_PATH="/usr/share/qt5/translations" + QT_LIBRARY_SOURCE_PATH="$QT_PATH/.." + + NOTIFY_CMD=`which notify-send` + ZIP_PATH=`which zip` +} + checkUser() { if [ `id -u` -ne 0 ]; then @@ -98,61 +149,19 @@ copyQtPlugin(){ strip $QT_PLUGINS_DEST_PATH/$1/* chmod 644 $QT_PLUGINS_DEST_PATH/$1/* # 644 = rw-r-r + chmod +rx $QT_PLUGINS_DEST_PATH/$1 else notifyError "$1 plugin not found in path: $QT_PLUGINS_SOURCE_PATH" fi } -initializeVariables() -{ - # This script's path - SCRIPT_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - - PROJECT_ROOT="$SCRIPT_PATH/../.." - - # Where the application was built (see build.sh) - BUILD_DIR="$PROJECT_ROOT/build/linux/release" - PRODUCT_PATH="$BUILD_DIR/product" - IMPORTER_DIR="$PROJECT_ROOT/../OpenBoard-Importer/" - IMPORTER_NAME="OpenBoardImporter" - - # Where the package is built to - PACKAGE_BUILD_DIR="$PROJECT_ROOT/install" - - # Temporary folder, where we put all the files that will be built into the - # package - BASE_WORKING_DIR="debianPackage" - - APPLICATION_NAME="OpenBoard" - APPLICATION_CODE="openboard" - APPLICATION_PATH="opt" - - PACKAGE_DIRECTORY=$BASE_WORKING_DIR/$APPLICATION_PATH/$APPLICATION_CODE - QT_PLUGINS_DEST_PATH="$PACKAGE_DIRECTORY/plugins" - QT_LIBRARY_DEST_PATH="$PACKAGE_DIRECTORY/qtlib" - - DESKTOP_FILE_PATH="$BASE_WORKING_DIR/usr/share/applications" - APPLICATION_SHORTCUT="$DESKTOP_FILE_PATH/${APPLICATION_CODE}.desktop" - - DESCRIPTION="OpenBoard, an interactive white board application" - VERSION=`cat $BUILD_DIR/version` - ARCHITECTURE=`cat buildContext` - - # Qt installation path. This may vary across machines - QT_PATH="/opt/qt55" - QT_PLUGINS_SOURCE_PATH="$QT_PATH/plugins" - GUI_TRANSLATIONS_DIRECTORY_PATH="$QT_PATH/translations" - QT_LIBRARY_SOURCE_PATH="/home/craig/openboard/qtlib" - - NOTIFY_CMD=`which notify-send` - ZIP_PATH=`which zip` -} # ---------------------------------------------------------------------------- # Copying the application, libs etc. to the temporary working directory # ---------------------------------------------------------------------------- + initializeVariables checkBuild @@ -170,13 +179,14 @@ notifyProgress "Copying product directory and resources" cp -R $PRODUCT_PATH/* $PACKAGE_DIRECTORY chown -R root:root $PACKAGE_DIRECTORY -cp resources/linux/run.sh $PACKAGE_DIRECTORY -chmod a+x $PACKAGE_DIRECTORY/run.sh - cp -R resources/customizations $PACKAGE_DIRECTORY/ -cp -R resources/linux/qtlinux/* $PACKAGE_DIRECTORY/ cp resources/linux/openboard-ubz.xml $PACKAGE_DIRECTORY/etc/ +if $BUNDLE_QT; then + cp -R resources/linux/run.sh $PACKAGE_DIRECTORY/ + chmod a+x $PACKAGE_DIRECTORY/run.sh +fi + notifyProgress "Copying importer" mkdir -p $PACKAGE_DIRECTORY/importer cp -R "$IMPORTER_DIR/$IMPORTER_NAME" "$PACKAGE_DIRECTORY/importer" @@ -185,45 +195,49 @@ notifyProgress "Stripping importer and main executable" strip $PACKAGE_DIRECTORY/$APPLICATION_NAME strip $PACKAGE_DIRECTORY/importer/$IMPORTER_NAME -notifyProgress "Copying and stripping Qt plugins" -mkdir -p $QT_PLUGINS_DEST_PATH -copyQtPlugin audio -copyQtPlugin generic -copyQtPlugin iconengines -copyQtPlugin imageformats -copyQtPlugin mediaservice -copyQtPlugin platforminputcontexts -copyQtPlugin platforms -copyQtPlugin platformthemes -copyQtPlugin position -copyQtPlugin printsupport -copyQtPlugin qtwebengine -copyQtPlugin sceneparsers -copyQtPlugin xcbglintegrations - -notifyProgress "Copying and stripping Qt libraries" -mkdir -p $QT_LIBRARY_DEST_PATH -copyQtLibrary libQt5Core -copyQtLibrary libQt5Gui -copyQtLibrary libQt5Multimedia -copyQtLibrary libQt5MultimediaWidgets -copyQtLibrary libQt5Network -copyQtLibrary libQt5OpenGL -copyQtLibrary libQt5Positioning -copyQtLibrary libQt5PrintSupport -copyQtLibrary libQt5Qml -copyQtLibrary libQt5Quick -copyQtLibrary libQt5Script -copyQtLibrary libQt5Sensors -copyQtLibrary libQt5Sql -copyQtLibrary libQt5Svg -copyQtLibrary libQt5WebChannel -copyQtLibrary libQt5WebKit -copyQtLibrary libQt5WebKitWidgets -copyQtLibrary libQt5Widgets -copyQtLibrary libQt5XcbQpa -copyQtLibrary libQt5Xml -copyQtLibrary libQt5XmlPatterns +if $BUNDLE_QT; then + notifyProgress "Copying and stripping Qt plugins" + mkdir -p $QT_PLUGINS_DEST_PATH + copyQtPlugin audio + copyQtPlugin generic + copyQtPlugin iconengines + copyQtPlugin imageformats + copyQtPlugin mediaservice + copyQtPlugin platforminputcontexts + copyQtPlugin platforms + copyQtPlugin platformthemes + copyQtPlugin position + copyQtPlugin printsupport + copyQtPlugin qtwebengine + copyQtPlugin sceneparsers + copyQtPlugin xcbglintegrations + + notifyProgress "Copying and stripping Qt libraries" + mkdir -p $QT_LIBRARY_DEST_PATH + copyQtLibrary libQt5Core + copyQtLibrary libQt5DBus + copyQtLibrary libQt5Gui + copyQtLibrary libQt5Multimedia + copyQtLibrary libQt5MultimediaWidgets + copyQtLibrary libQt5Network + copyQtLibrary libQt5OpenGL + copyQtLibrary libQt5Positioning + copyQtLibrary libQt5PrintSupport + copyQtLibrary libQt5Qml + copyQtLibrary libQt5Quick + copyQtLibrary libQt5Script + copyQtLibrary libQt5Sensors + copyQtLibrary libQt5Sql + copyQtLibrary libQt5Svg + copyQtLibrary libQt5WebChannel + copyQtLibrary libQt5WebKit + copyQtLibrary libQt5WebKitWidgets + copyQtLibrary libQt5Widgets + copyQtLibrary libQt5XcbQpa + copyQtLibrary libQt5Xml + copyQtLibrary libQt5XmlPatterns + copyQtLibrary libqgsttools_p +fi notifyProgress "Copying Qt translations" mkdir -p $PACKAGE_DIRECTORY/i18n @@ -237,15 +251,52 @@ notifyProgress "Generating control files for package" mkdir -p "$BASE_WORKING_DIR/DEBIAN" -# Copy prerm, postinst scripts +# Copy prerm script cp -r "$SCRIPT_PATH/debian_package_files/prerm" "$BASE_WORKING_DIR/DEBIAN/" -cp -r "$SCRIPT_PATH/debian_package_files/postinst" "$BASE_WORKING_DIR/DEBIAN/" chmod 755 "$BASE_WORKING_DIR/DEBIAN/prerm" + +# Generate postinst script (can't copy it like prerm because some paths vary depending on +# the values of the variables in this script) + +SYMLINK_TARGET="/$APPLICATION_PATH/$APPLICATION_CODE/$APPLICATION_NAME" +if $BUNDLE_QT ; then + SYMLINK_TARGET="/$APPLICATION_PATH/$APPLICATION_CODE/run.sh" +fi + +cat > "$BASE_WORKING_DIR/DEBIAN/postinst" << EOF +#!/bin/bash +# -------------------------------------------------------------------- +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# --------------------------------------------------------------------- + +xdg-desktop-menu install --novendor /usr/share/applications/${APPLICATION_CODE}.desktop +xdg-mime install --mode system /$APPLICATION_PATH/$APPLICATION_CODE/etc/openboard-ubz.xml +xdg-mime default /usr/share/applications/${APPLICATION_CODE}.desktop application/ubz + +ln -s $SYMLINK_TARGET /usr/bin/$APPLICATION_CODE + +exit 0 +EOF + chmod 755 "$BASE_WORKING_DIR/DEBIAN/postinst" + # Generate md5 sums of everything in the application path (e.g /opt) and the desktop entry -find $BASE_WORKING_DIR/$APPLICATION_PATH/ -exec md5sum {} > $BASE_WORKING_DIR/DEBIAN/md5sums 2>/dev/null \; -find $DESKTOP_FILE_PATH/ -exec md5sum {} > $BASE_WORKING_DIR/DEBIAN/md5sums 2>/dev/null \; +cd $BASE_WORKING_DIR +find $APPLICATION_PATH/ -exec md5sum {} > DEBIAN/md5sums 2>/dev/null \; +find $DESKTOP_FILE_PATH/ -exec md5sum {} >> DEBIAN/md5sums 2>/dev/null \; +cd $PROJECT_ROOT # Generate control file CONTROL_FILE="$BASE_WORKING_DIR/DEBIAN/control" @@ -262,29 +313,53 @@ echo "Homepage: https://github.com/DIP-SEM/OpenBoard" >> "$CONTROL_FILE" # Generate dependency list echo -n "Depends: " >> "$CONTROL_FILE" -#echo -n "libpaper1, zlib1g (>= 1.2.8), libssl1.0.0 (>= 1.0.1), libx11-6, libgl1-mesa-glx, libc6 (>= 2.19), libstdc++6 (>= 4.8.4), libgomp1, onboard" >> "$CONTROL_FILE" unset tab declare -a tab let count=0 -for l in `objdump -p $PACKAGE_DIRECTORY/${APPLICATION_NAME} | grep NEEDED | awk '{ print $2 }'`; do - for lib in `dpkg -S $l | grep -v "libqt5" | grep -v "qt55" | awk -F":" '{ print $1 }'`; do - presence=`echo ${tab[*]} | grep -c "$lib"`; - if [ "$presence" == "0" ]; then - tab[$count]=$lib; - ((count++)); - fi; + +if $BUNDLE_QT; then + for l in `objdump -p $PACKAGE_DIRECTORY/${APPLICATION_NAME} | grep NEEDED | awk '{ print $2 }'`; do + for lib in `dpkg -S $l | grep -v "libqt5" | grep -v "qt55" | awk -F":" '{ print $1 }'`; do + presence=`echo ${tab[*]} | grep -c "$lib"`; + if [ "$presence" == "0" ]; then + tab[$count]=$lib; + ((count++)); + fi; + done; done; -done; +else + for l in `objdump -p $PACKAGE_DIRECTORY/${APPLICATION_NAME} | grep NEEDED | awk '{ print $2 }'`; do + for lib in `dpkg -S $l | awk -F":" '{ print $1 }'`; do + presence=`echo ${tab[*]} | grep -c "$lib"`; + if [ "$presence" == "0" ]; then + tab[$count]=$lib; + ((count++)); + fi; + done; + done; +fi + for ((i=0;i<${#tab[@]};i++)); do if [ $i -ne "0" ]; then echo -n ", " >> "$CONTROL_FILE" fi + echo -n "${tab[$i]} (>= "`dpkg -p ${tab[$i]} | grep "Version: " | awk '{ print $2 }' | sed -e 's/\([:. 0-9?]*\).*/\1/g' | sed -e 's/\.$//'`") " >> "$CONTROL_FILE" done echo -n ", onboard" >> "$CONTROL_FILE" +if $BUNDLE_QT; then + # Listing some dependencies manually; ideally we should use dpkg -p recursively + # to get the dependencies of the bundled shared libs & plugins. Or use static libs. + echo -n ", libxcb-render-util0" >> "$CONTROL_FILE" + echo -n ", libxcb-icccm4" >> "$CONTROL_FILE" + echo -n ", libxcb-xkb1" >> "$CONTROL_FILE" +else + echo -n ", libqt5multimedia5-plugins" >> "$CONTROL_FILE" +fi + echo "" >> "$CONTROL_FILE" echo "Description: $DESCRIPTION" >> "$CONTROL_FILE" @@ -297,7 +372,6 @@ echo "Version=$VERSION" >> $APPLICATION_SHORTCUT echo "Encoding=UTF-8" >> $APPLICATION_SHORTCUT echo "Name=${APPLICATION_NAME}" >> $APPLICATION_SHORTCUT echo "Comment=$DESCRIPTION" >> $APPLICATION_SHORTCUT -#echo "Exec=$APPLICATION_PATH/$APPLICATION_CODE/run.sh" >> $APPLICATION_SHORTCUT echo "Exec=$APPLICATION_CODE %f" >> $APPLICATION_SHORTCUT echo "Icon=/$APPLICATION_PATH/$APPLICATION_CODE/${APPLICATION_NAME}.png" >> $APPLICATION_SHORTCUT echo "StartupNotify=true" >> $APPLICATION_SHORTCUT diff --git a/resources/linux/qtlinux/qt.conf b/resources/linux/qtlinux/qt.conf deleted file mode 100644 index d4441c45..00000000 --- a/resources/linux/qtlinux/qt.conf +++ /dev/null @@ -1,2 +0,0 @@ - [Paths] - Plugins= plugins diff --git a/resources/linux/run.sh b/resources/linux/run.sh index b84a92fd..a179fb4b 100644 --- a/resources/linux/run.sh +++ b/resources/linux/run.sh @@ -25,4 +25,4 @@ DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" # Add custom libraries to LD_LIBRARY_PATH # TODO: Remomve the need for this -env LD_LIBRARY_PATH=$DIR/qtlib:$LD_LIBRARY_PATH $DIR/OpenBoard +env LD_LIBRARY_PATH=$DIR/qtlib:$LD_LIBRARY_PATH QT_PLUGIN_PATH=$DIR/plugins $DIR/OpenBoard