buildDebianPackage.sh 13.7 KB
Newer Older
1 2 3 4
#!/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
5
# the Free Software Foundation, either version 2 of the License, or
6 7 8 9 10 11 12 13 14 15 16
# (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 <http://www.gnu.org/licenses/>.
# ---------------------------------------------------------------------

Claudio Valerio's avatar
Claudio Valerio committed
17

18 19 20 21
#**********************
#     functions
#**********************

22 23 24 25 26 27 28 29 30
checkUser()
{
  if [ `id -u` -ne 0 ]; then
    echo "Please run the script as root, may be using fakeroot command as follow"
    echo "fakeroot ./buildDebianPackage.sh [options]"
    exit 1
  fi
}

31 32
initializeVariables()
{
33
  APPLICATION_NAME="OpenBoard"
34 35
  MAKE_TAG=true
  CREATE_DIENA_DISTRIBUTION_ZIP=false
36
  STANDARD_QT_USED=false
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

  PRODUCT_PATH="build/linux/release/product"
  QT_PATH="/usr/local/Trolltech/Qt-4.8.0"
  PLUGINS_PATH="$QT_PATH/plugins"
  GUI_TRANSLATIONS_DIRECTORY_PATH="../Qt-4.8/translations"
  QT_LIBRARY_DEST_PATH="$PRODUCT_PATH/qtlib"
  QT_LIBRARY_SOURCE_PATH="$QT_PATH/lib"
  ARCHITECTURE=`uname -m`
  if [ "$ARCHITECTURE" == "x86_64" ]; then
      ARCHITECTURE="amd64"
  fi
  if [ "$ARCHITECTURE" == "i686" ]; then
      ARCHITECTURE="i386"
  fi

  NOTIFY_CMD=`which notify-send`
  QMAKE_PATH="$QT_PATH/bin/qmake"
  LRELEASES="$QT_PATH/bin/lrelease"
  ZIP_PATH=`which zip`
56

57
}
58

Claudio Valerio's avatar
Claudio Valerio committed
59

60
notifyError(){
Claudio Valerio's avatar
Claudio Valerio committed
61 62 63 64 65
    if [ -e "$NOTIFY_CMD" ]; then
        $NOTIFY_CMD -t 0 -i "/usr/share/icons/oxygen/64x64/status/dialog-error.png" "$1"
    else
        printf "\033[31merror:\033[0m $1\n"
    fi
66 67 68
    exit 1
}

Claudio Valerio's avatar
Claudio Valerio committed
69 70 71 72 73 74 75 76
notifyProgress(){
    if [ -e "$NOTIFY_CMD" ]; then
        $NOTIFY_CMD "$1" "$2"
    else
        printf "\033[32m--> Achieved task:\033[0m $1:\n\t$2\n"
    fi
}

77 78 79 80 81
alertIfPreviousVersionInstalled(){
    APT_CACHE=`which apt-cache`
    if [ ! -e "$APT_CACHE" ]; then
        notifyError "apt-cache command not found"
    else
82 83 84
        SEARCH_RESULT=`$APT_CACHE search ${APPLICATION_NAME}`
        if [ `echo $SEARCH_RESULT | grep -c ${APPLICATION_NAME}` -ge 1 ]; then
            notifyError "Found a previous version of ${APPLICATION_NAME}. Remove it to avoid to put it as dependency"
85 86 87 88
        fi
    fi
}

89
checkDir(){
90
    if [ ! -d "$1" ]; then
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
        notifyError "Directory not found : $1"
    fi
}

checkExecutable(){
    if [ ! -e "$1" ]; then
        notifyError "$1 command not found"
    fi
}

copyQtLibrary(){
    if ls "$QT_LIBRARY_SOURCE_PATH/$1.so" &> /dev/null; then
        cp $QT_LIBRARY_SOURCE_PATH/$1.so.? "$QT_LIBRARY_DEST_PATH/"
        cp $QT_LIBRARY_SOURCE_PATH/$1.so.?.?.? "$QT_LIBRARY_DEST_PATH/"
    else
        notifyError "$1 library not found in path: $QT_LIBRARY_SOURCE_PATH"
    fi
}

110 111 112 113 114 115 116 117 118 119

buildWithStandardQt(){
  STANDARD_QT=`which qmake-qt4`
  if [ $? == "0" ]; then
    QT_VERSION=`$STANDARD_QT --version | grep -i "Using Qt version" | sed -e "s/Using Qt version \(.*\) in.*/\1/"`
    if [ `echo $QT_VERSION | sed -e "s/\.//g"` -gt 480 ]; then
        notifyProgress "Standard QT" "A recent enough qmake has been found. Using this one instead of custom one"
        STANDARD_QT_USED=true
        QMAKE_PATH=$STANDARD_QT
        LRELEASES=`which lrelease`
120 121 122 123 124
        if [ "`arch`" == "i686" ]; then
            QT_PATH="/usr/lib/i386-linux-gnu"
        else
            QT_PATH="/usr/lib/`arch`-linux-gnu"
        fi
125 126 127 128 129
        PLUGINS_PATH="$QT_PATH/qt4/plugins"
    fi
  fi
}

Claudio Valerio's avatar
Claudio Valerio committed
130
buildImporter(){
Claudio Valerio's avatar
Claudio Valerio committed
131
    IMPORTER_DIR="../OpenBoard-Importer/"
Claudio Valerio's avatar
Claudio Valerio committed
132 133 134
    IMPORTER_NAME="OpenBoardImporter"
    checkDir $IMPORTER_DIR
    cd ${IMPORTER_DIR}
Claudio Valerio's avatar
Claudio Valerio committed
135

136 137 138 139 140 141 142
    rm moc_*
    rm -rf debug release
    rm *.o

    git reset --hard
    git pull

Claudio Valerio's avatar
Claudio Valerio committed
143
    $QMAKE_PATH ${IMPORTER_NAME}.pro
144
    make clean
Claudio Valerio's avatar
Claudio Valerio committed
145 146 147 148 149
    make -j4
    checkExecutable $IMPORTER_NAME
    cd -
}

150 151 152
#**********************
#     script
#**********************
153
checkUser
154
initializeVariables
155
buildWithStandardQt
156 157 158 159 160 161 162 163 164 165 166 167

for var in "$@"
do
   if [ $var == "notag" ]; then
      MAKE_TAG=false;
   fi
   if [ $var == "diena" ]; then
       CREATE_DIENA_DISTRIBUTION_ZIP=true;
   fi
done


168 169
alertIfPreviousVersionInstalled

170 171 172 173
#check of directories and executables
checkDir $QT_PATH
checkDir $PLUGINS_PATH
checkDir $GUI_TRANSLATIONS_DIRECTORY_PATH
174

175 176 177 178
checkExecutable $QMAKE_PATH
checkExecutable $LRELEASES
checkExecutable $ZIP_PATH

Claudio Valerio's avatar
Claudio Valerio committed
179
#build third party application
Claudio Valerio's avatar
Claudio Valerio committed
180
buildImporter
Claudio Valerio's avatar
Claudio Valerio committed
181 182
notifyProgress "OpenBoardImporter" "Built Importer"

183
# cleaning the build directory
184 185 186
rm -rf "build/linux/release"
rm -rf install

187
notifyProgress "QT" "Internalization"
188
$LRELEASES ${APPLICATION_NAME}.pro
189 190 191
cd $GUI_TRANSLATIONS_DIRECTORY_PATH
$LRELEASES translations.pro
cd -
192

193
notifyProgress "${APPLICATION_NAME}" "Building ${APPLICATION_NAME}"
194

195
if [ "$ARCHITECTURE" == "amd64" ]; then
196
    $QMAKE_PATH ${APPLICATION_NAME}.pro -spec linux-g++-64
197
else
198
    $QMAKE_PATH ${APPLICATION_NAME}.pro -spec linux-g++
199
fi
200

201
make -j 4 release-install
202

203 204
if [ ! -e "$PRODUCT_PATH/${APPLICATION_NAME}" ]; then
    notifyError "${APPLICATION_NAME} build failed"
Claudio Valerio's avatar
Claudio Valerio committed
205 206 207 208
fi

notifyProgress "Git Hub" "Make a tag of the delivered version"

209
VERSION=`cat build/linux/release/version`
Claudio Valerio's avatar
Claudio Valerio committed
210

211 212 213 214 215
if [ ! -f build/linux/release/version ]; then
    notifyError "version not found"
else
    LAST_COMMITED_VERSION="`git describe $(git rev-list --tags --max-count=1)`"
    if [ "v$VERSION" != "$LAST_COMMITED_VERSION" ]; then
216
        if [ $MAKE_TAG == true ]; then
217
            git tag -a "OBv$VERSION" -m "OpenBoard setup for v$VERSION"
Claudio Valerio's avatar
Claudio Valerio committed
218
            git push origin --tags
Claudio Valerio's avatar
Claudio Valerio committed
219
        fi
220 221 222
    fi
fi

223 224
cp resources/linux/run.sh $PRODUCT_PATH
chmod a+x $PRODUCT_PATH/run.sh
225

226
cp -R resources/linux/qtlinux/* $PRODUCT_PATH/
227

Claudio Valerio's avatar
Claudio Valerio committed
228
notifyProgress "QT" "Copying plugins and library ..."
229
cp -R $PLUGINS_PATH $PRODUCT_PATH/
230

231 232 233
# copying customization
cp -R resources/customizations $PRODUCT_PATH/

Claudio Valerio's avatar
Claudio Valerio committed
234 235
# copying importer
mkdir -p $PRODUCT_PATH/Importer
236
cp -R ${IMPORTER_DIR}/${IMPORTER_NAME} $PRODUCT_PATH/Importer
Claudio Valerio's avatar
Claudio Valerio committed
237

Claudio Valerio's avatar
Claudio Valerio committed
238
if [ $STANDARD_QT_USED == false ]; then
239
#copying custom qt library
240 241 242 243 244 245 246 247 248 249 250 251
  mkdir -p $QT_LIBRARY_DEST_PATH
  copyQtLibrary libQtDBus
  copyQtLibrary libQtScript
  copyQtLibrary libQtSvg
  copyQtLibrary libQtXmlPatterns
  copyQtLibrary libQtNetwork
  copyQtLibrary libQtXml
  copyQtLibrary libQtGui
  copyQtLibrary libQtCore
  copyQtLibrary libphonon
  copyQtLibrary libQtWebKit
fi
252

253 254 255
notifyProgress "QT" "Internalization"
if [ ! -e $PRODUCT_PATH/i18n ]; then
    mkdir $PRODUCT_PATH/i18n
256
fi
Claudio Valerio's avatar
Claudio Valerio committed
257
#copying qt gui translation
258
cp $GUI_TRANSLATIONS_DIRECTORY_PATH/qt_??.qm $PRODUCT_PATH/i18n/
259

260 261 262 263
rm -rf install/linux
mkdir -p install/linux

#Removing .svn directories ...
264
cd $PRODUCT_PATH
265 266 267
find . -name .svn -exec rm -rf {} \; 2> /dev/null
cd -

268
notifyProgress "Building ${APPLICATION_NAME}" "Finished to build ${APPLICATION_NAME} building the package"
269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295

BASE_WORKING_DIR="packageBuildDir"

#creating package directory
mkdir $BASE_WORKING_DIR
mkdir "$BASE_WORKING_DIR/DEBIAN"
mkdir -p "$BASE_WORKING_DIR/usr/share/applications"
mkdir -p "$BASE_WORKING_DIR/usr/local"


cat > "$BASE_WORKING_DIR/DEBIAN/prerm" << 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 <http://www.gnu.org/licenses/>.
# ---------------------------------------------------------------------

296
xdg-desktop-menu uninstall /usr/share/applications/${APPLICATION_NAME}.desktop
297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317
exit 0
#DEBHELPER#
EOF

cat > "$BASE_WORKING_DIR/DEBIAN/postint" << 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 <http://www.gnu.org/licenses/>.
# ---------------------------------------------------------------------

318
xdg-desktop-menu install --novendor /usr/share/applications/${APPLICATION_NAME}.desktop
319 320 321 322 323
exit 0
#DEBHELPER#
EOF


324
APPLICATION_DIRECTORY_NAME="${APPLICATION_NAME}-$VERSION"
325 326
PACKAGE_DIRECTORY="$BASE_WORKING_DIR/usr/local/$APPLICATION_DIRECTORY_NAME"
#move build directory to packages directory
Claudio Valerio's avatar
Claudio Valerio committed
327
cp -R $PRODUCT_PATH $PACKAGE_DIRECTORY
328 329


330
cat > $BASE_WORKING_DIR/usr/local/$APPLICATION_DIRECTORY_NAME/run.sh << EOF
Claudio Valerio's avatar
Claudio Valerio committed
331
#!/bin/bash
332 333 334 335 336 337 338 339 340 341 342 343 344 345 346
# --------------------------------------------------------------------
# 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 <http://www.gnu.org/licenses/>.
# ---------------------------------------------------------------------

347
env LD_LIBRARY_PATH=/usr/local/$APPLICATION_DIRECTORY_NAME/qtlib:$LD_LIBRARY_PATH /usr/local/$APPLICATION_DIRECTORY_NAME/${APPLICATION_NAME}
348 349 350
EOF


351
CHANGE_LOG_FILE="$BASE_WORKING_DIR/DEBIAN/changelog-${APPLICATION_NAME}-$VERSION.txt"
352 353 354
CONTROL_FILE="$BASE_WORKING_DIR/DEBIAN/control"
CHANGE_LOG_TEXT="changelog.txt"

355
echo "${APPLICATION_NAME} ($VERSION) $ARCHITECTURE; urgency=low" > "$CHANGE_LOG_FILE"
356 357 358
echo >> "$CHANGE_LOG_FILE"
cat $CHANGE_LOG_TEXT >> "$CHANGE_LOG_FILE"
echo >> "$CHANGE_LOG_FILE"
359
echo "-- Claudio Valerio <claudio.valerio@oe-f.org>  `date`" >> "$CHANGE_LOG_FILE"
360

361
echo "Package: ${APPLICATION_NAME}" > "$CONTROL_FILE"
362 363 364 365 366
echo "Version: $VERSION" >> "$CONTROL_FILE"
echo "Section: education" >> "$CONTROL_FILE"
echo "Priority: optional" >> "$CONTROL_FILE"
echo "Architecture: $ARCHITECTURE" >> "$CONTROL_FILE"
echo "Essential: no" >> "$CONTROL_FILE"
367
echo "Installed-Size: `du -s $PACKAGE_DIRECTORY | awk '{ print $1 }'`" >> "$CONTROL_FILE"
368
echo "Maintainer: ${APPLICATION_NAME} Developers team <dev@oe-f.org>" >> "$CONTROL_FILE"
369
echo "Homepage: http://www.openboard.org" >> "$CONTROL_FILE"
370 371 372 373
echo -n "Depends: " >> "$CONTROL_FILE"
unset tab
declare -a tab
let count=0
374
for l in `objdump -p $PACKAGE_DIRECTORY/${APPLICATION_NAME} | grep NEEDED | awk '{ print $2 }'`; do 
375 376 377 378 379 380 381 382 383 384 385 386 387 388
    for lib in `dpkg -S  $l | awk -F":" '{ print $1 }'`; do
        #echo $lib
        presence=`echo ${tab[*]} | grep -c "$lib"`; 
        if [ "$presence" == "0" ]; then   
            tab[$count]=$lib;
            ((count++));
        fi; 
    done; 
done; 

for ((i=0;i<${#tab[@]};i++)); do
    if [ $i -ne "0" ]; then
        echo -n ",    " >> "$CONTROL_FILE"
    fi
389
    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"
390 391 392 393 394
done
echo "" >> "$CONTROL_FILE"
echo "Description: This a interactive white board that uses a free standard format." >> "$CONTROL_FILE"

find $BASE_WORKING_DIR/usr/ -exec md5sum {} > $BASE_WORKING_DIR/DEBIAN/md5sums 2>/dev/null \; 
395
APPLICATION_SHORTCUT="$BASE_WORKING_DIR/usr/share/applications/${APPLICATION_NAME}.desktop"
396 397 398
echo "[Desktop Entry]" > $APPLICATION_SHORTCUT
echo "Version=$VERSION" >> $APPLICATION_SHORTCUT
echo "Encoding=UTF-8" >> $APPLICATION_SHORTCUT
399 400
echo "Name=${APPLICATION_NAME} ($VERSION)" >> $APPLICATION_SHORTCUT
echo "GenericName=${APPLICATION_NAME}" >> $APPLICATION_SHORTCUT
401 402
echo "Comment=Logiciel de création de présentations pour tableau numérique interactif (TNI)" >> $APPLICATION_SHORTCUT 
echo "Exec=/usr/local/$APPLICATION_DIRECTORY_NAME/run.sh" >> $APPLICATION_SHORTCUT
403
echo "Icon=/usr/local/$APPLICATION_DIRECTORY_NAME/${APPLICATION_NAME}.png" >> $APPLICATION_SHORTCUT
404 405 406 407
echo "StartupNotify=true" >> $APPLICATION_SHORTCUT
echo "Terminal=false" >> $APPLICATION_SHORTCUT
echo "Type=Application" >> $APPLICATION_SHORTCUT
echo "Categories=Education" >> $APPLICATION_SHORTCUT
408
cp "resources/images/${APPLICATION_NAME}.png" "$PACKAGE_DIRECTORY/${APPLICATION_NAME}.png"
409 410 411 412 413
chmod 755 "$BASE_WORKING_DIR/DEBIAN"
chmod 755 "$BASE_WORKING_DIR/DEBIAN/prerm"
chmod 755 "$BASE_WORKING_DIR/DEBIAN/postint"

mkdir -p "install/linux"
414
DEBIAN_PACKAGE_NAME="${APPLICATION_NAME}_${VERSION}_$ARCHITECTURE.deb"
415

416
chown -R root:root $BASE_WORKING_DIR 
417
dpkg -b "$BASE_WORKING_DIR" "install/linux/$DEBIAN_PACKAGE_NAME"
418 419

#clean up mess
420 421
rm -rf $BASE_WORKING_DIR

422
notifyProgress "${APPLICATION_NAME}" "Package built"
423

424 425 426

if [ $CREATE_DIENA_DISTRIBUTION_ZIP == true ]; then

427
    ZIP_NAME="${APPLICATION_NAME}_`lsb_release -is`_`lsb_release -rs`_${VERSION}_${ARCHITECTURE}.zip"
428
    cd install/linux
429
    $ZIP_PATH -1 --junk-paths ${ZIP_NAME} ${DEBIAN_PACKAGE_NAME} ../../ReleaseNotes.pdf ../../JournalDesModifications.pdf
430
    cd -
431
    notifyProgress "${APPLICATION_NAME}" "Build Diena zip file for distribution"
432 433
fi

434
exit 0