Pull to refresh

Собираем установочные пакеты из Qt проектов по-взрослому

Reading time21 min
Views22K
Методом проб и ошибок я изобрел очередной велосипед, о котором и собираюсь рассказать Вам ниже.Речь пойдет о сборке пакетов из проектов Qt для Debian и Rpm based систем, Windows из под Ubuntu/Debian. В принципе метод весьма прост, поэтому, думаю, что при небольших изменениях он подойдет и для rpb based дистрибтивов, а для Windows систем потребуется установка cygwin.Кроме того эта тема очень мало обсуждается в интернете, хотя я бы не назвал сборку кроссплатформенных приложений в инсталяционные пакеты простой задачей.Кому будет интересен данный материал:
  • в первую очередь начинающим разработчикам Qt, которые хотят распространять свои приложения в удобном для пользователей виде;
  • разработчикам, использующих другие языки программирования (при небольших изменениях можно получить.
У меня есть уверенность в том, что все действия, описанные ниже, можно было бы сделать скриптом make, но и текущий вариант тоже неплох и имеет право на существование.Также, если Вы используете любой другой способ для автоматической сборки проектов, опишите его пожалуйста. Хотелось бы собрать в итоге как можно больше информации по этой теме.Небольшое вступление.В статье я буду приводить готовые скрипты для моего open source проекта, о котором я уже писал ранее тут.Часть 1. Установка и настройкаИ так, прежде всего нам потребуется установить следующие пакеты:
sudo aptitude install build-essential dh-make mingw32 alien wine qt4-dev-tools
Я мог позабыть добавить сюда какие-то пакеты, но об их нехватке Вы узнаете при выполнении скрипта.Можно обойтись и без qt4-dev-tools, указав в PATH и LD_LIBRARY_PATH путь к Вашему qmake и библиотекам qt из Qt-Sdk, скачанного с сайта Nokia.
Например, прописав пути в ~/.bashrc:
export PATH=~/qtsdk-2010.01/qt/bin/:$PATH

export LD_LIBRARY_PATH=~/qtsdk-2010.01/qt/lib/:$LD_LIBRARY_PATH
Также нам требуется скачать и установить Nullsoft Scriptable Install System под wine, он потребуется нам для создания инсталяционных пакетов для Windows.После установки NSIS потребуется небольшая настройка.Запустим
wine regedit
Добавим в HKEY_CURRENT_USER ключе Environment, в котором создадим два строковых значения:
  • NSISDIR — C:\Program Files\NSIS
  • PATH — C:\Program Files\NSIS
В результате такой нехитрой процедуры мы сможем вызывать в любой директории wine makensis, что позволит нам отказаться от указания полных путей к makensis в будущем.Часть 2. Пишем скриптыКомпиляция qt-проектов для Windows из под LinuxДля кросс-компиляции нам потребуется mingw32, который мы уже установили, а также собственные настройки конфигурации для qmake.Конфигурацию для qmake, на базе которой мы будем делать собственную, можно найти по следующему пути:
$QT_SDK_INSTALL_DIR/qt/mkspecs.
Скопируем win32-g++ в директорию с нашим проектом, переименовав ее в win32-x-g++. Далее отредактируем qmake.conf, заменив вызовы mingw32, команды Windows на команды Linux.По сути у нас должен получится файл со следующим содержимым:
<pre>
#
# qmake configuration for win32-g++
#
# Written for MinGW
#

MAKEFILE_GENERATOR    = MINGW
TEMPLATE        = app
CONFIG            += qt warn_on release link_prl copy_dir_files debug_and_release debug_and_release_target precompile_header
QT            += core gui
DEFINES            += UNICODE QT_LARGEFILE_SUPPORT
QMAKE_COMPILER_DEFINES  += __GNUC__ WIN32

QMAKE_EXT_OBJ           = .o
QMAKE_EXT_RES           = _res.o

QMAKE_CC        = gcc
QMAKE_LEX        = flex
QMAKE_LEXFLAGS        =
QMAKE_YACC        = byacc
QMAKE_YACCFLAGS        = -d
QMAKE_CFLAGS        =
QMAKE_CFLAGS_DEPS    = -M
QMAKE_CFLAGS_WARN_ON    = -Wall
QMAKE_CFLAGS_WARN_OFF    = -w
QMAKE_CFLAGS_RELEASE    = -O2
QMAKE_CFLAGS_DEBUG    = -g
QMAKE_CFLAGS_YACC    = -Wno-unused -Wno-parentheses

QMAKE_CXX        = i586-mingw32msvc-g++
QMAKE_CXXFLAGS        = $$QMAKE_CFLAGS
QMAKE_CXXFLAGS_DEPS    = $$QMAKE_CFLAGS_DEPS
QMAKE_CXXFLAGS_WARN_ON    = $$QMAKE_CFLAGS_WARN_ON
QMAKE_CXXFLAGS_WARN_OFF    = $$QMAKE_CFLAGS_WARN_OFF
QMAKE_CXXFLAGS_RELEASE    = $$QMAKE_CFLAGS_RELEASE
QMAKE_CXXFLAGS_DEBUG    = $$QMAKE_CFLAGS_DEBUG
QMAKE_CXXFLAGS_YACC    = $$QMAKE_CFLAGS_YACC
QMAKE_CXXFLAGS_THREAD    = $$QMAKE_CFLAGS_THREAD
QMAKE_CXXFLAGS_RTTI_ON    = -frtti
QMAKE_CXXFLAGS_RTTI_OFF    = -fno-rtti
QMAKE_CXXFLAGS_EXCEPTIONS_ON = -fexceptions -mthreads
QMAKE_CXXFLAGS_EXCEPTIONS_OFF = -fno-exceptions

QMAKE_INCDIR        =
QMAKE_INCDIR_QT        = $$[QT_WIN_INCLUDE_PATH]
QMAKE_LIBDIR_QT        = $$[QT_WIN_LIB_PATH]

QMAKE_RUN_CC        = $(CC) -c $(CFLAGS) $(INCPATH) -o $obj $src
QMAKE_RUN_CC_IMP    = $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
QMAKE_RUN_CXX        = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $obj $src
QMAKE_RUN_CXX_IMP    = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<

QMAKE_LINK        = i586-mingw32msvc-g++
QMAKE_LINK_C        = gcc
QMAKE_LFLAGS        = -mthreads -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import \
   -Wl,-enable-runtime-pseudo-reloc -mwindows
QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads -Wl
QMAKE_LFLAGS_EXCEPTIONS_OFF =
QMAKE_LFLAGS_RELEASE    = -Wl,-s
QMAKE_LFLAGS_DEBUG    =
QMAKE_LFLAGS_CONSOLE    = -Wl,-subsystem,console
QMAKE_LFLAGS_WINDOWS    = -Wl,-subsystem,windows
QMAKE_LFLAGS_DLL        = -shared
QMAKE_LINK_OBJECT_MAX    = 10
QMAKE_LINK_OBJECT_SCRIPT= object_script


QMAKE_LIBS        =
QMAKE_LIBS_CORE         = -lkernel32 -luser32 -lshell32 -luuid -lole32 -ladvapi32 -lws2_32
QMAKE_LIBS_GUI          = -lgdi32 -lcomdlg32 -loleaut32 -limm32 -lwinmm -lwinspool -lws2_32 -lole32 -luuid -luser32 -ladvapi32
QMAKE_LIBS_NETWORK      = -lws2_32
QMAKE_LIBS_OPENGL       = -lopengl32 -lglu32 -lgdi32 -luser32
QMAKE_LIBS_COMPAT       = -ladvapi32 -lshell32 -lcomdlg32 -luser32 -lgdi32 -lws2_32
QMAKE_LIBS_QT_ENTRY     = -lmingw32 -lqtmain

!isEmpty(QMAKE_SH) {
    MINGW_IN_SHELL      = 1
    QMAKE_DIR_SEP        = /
    QMAKE_COPY        = cp
    QMAKE_COPY_DIR        = xcopy /s /q /y /i
    QMAKE_MOVE        = mv
    QMAKE_DEL_FILE        = rm
    QMAKE_MKDIR        = mkdir
    QMAKE_DEL_DIR        = rmdir
    QMAKE_CHK_DIR_EXISTS = test -d
} else {
    QMAKE_COPY        = copy /y
    QMAKE_COPY_DIR        = xcopy /s /q /y /i
    QMAKE_MOVE        = move
    QMAKE_DEL_FILE        = del
    QMAKE_MKDIR        = mkdir
    QMAKE_DEL_DIR        = rmdir
    QMAKE_CHK_DIR_EXISTS    = if not exist
}

QMAKE_MOC        = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}moc
QMAKE_UIC        = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}uic
QMAKE_IDC        = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}idc

QMAKE_IDL        = midl
QMAKE_LIB        = ar -ru
QMAKE_RC        = i586-mingw32msvc-windres
QMAKE_ZIP        = zip -r -9

QMAKE_STRIP        = i586-mingw32msvc-strip
QMAKE_STRIPFLAGS_LIB     += --strip-unneeded
load(qt_config)
Более подробно о кросс компиляции можно почитать тут.Правим файл проекта (.pro).Данные дополнения в файле нужны для того, чтобы в Makefile, сгенерированным qmake, появилась опция install.
<pre>
unix { 
    # VARIABLES
    isEmpty(PREFIX):PREFIX = /usr/local #PREFIX - это путь установки
    BINDIR = $$PREFIX/bin # путь к бинарникам
    DATADIR = $$PREFIX/share # путь к различным компонентам приложения, от которых можно отказаться
    DEFINES += DATADIR=\"$$DATADIR\" \
        PKGDATADIR=\"$$PKGDATADIR\"
    
    # MAKE INSTALL
    INSTALLS += target \
        desktop \
        pixmaps \
        icon22 \
        templates1 \
        templates2 \
        pagetemplates # оставив в INSTALLS только target, также по аналогии можно добавить и инсталяцию библиотек в нужные директории
    target.path = $$BINDIR
    desktop.path = $$DATADIR/applications/
    desktop.files += $${TARGET}.desktop
    pixmaps.path = $$DATADIR/pixmaps/
    pixmaps.files += images/$${TARGET}.png
    icon22.path = $$DATADIR/icons/hicolor/22x22/apps/
    icon22.files += images/$${TARGET}.png
    templates1.path = $$DATADIR/yourownnewsmaker/templates/default/
    templates1.files = templates/default/*.*
    templates2.path = $$DATADIR/yourownnewsmaker/templates/eeex-sony-pdf/
    templates2.files = templates/eeex-sony-pdf/*.*
    pagetemplates.path = $$DATADIR/yourownnewsmaker/page-templates/
    pagetemplates.files = page-templates/*.*
}
Если мы хотим, чтобы у нашего приложения в Windows была собственная иконка, то нам необходимо добавить следующие строчки в файл проекта:
win32:RC_FILE = icons.rc
И создать файл icons.rc со следующим содержимым
IDI_ICON1               ICON    DISCARDABLE     "путь/к/Вашей/иконке.ico"
Сборка deb пакетов.Control и changelog файлы весьма стандартны и думаю в описании лишний раз не нуждаются. Примеры моих файлов Вы можете посмотреть, скачав архив со скриптами.Обращаю внимание на то, что во всех скриптах не используется табуляция. Это очень важно для NSIS и для dh_make.Rules пришлось целиком заменить, но в результате получаем весьма универсальный файл, в котором нам требуется указать только APPNAME.
<pre>
#!/usr/bin/make -f
APPNAME := yourownnewsmaker
builddir:
    mkdir -p builddir

builddir/Makefile: builddir
    cd builddir && qmake-qt4 PREFIX=/usr ../$(APPNAME).pro -spec linux-g++ -r 

build: build-stamp

build-stamp: builddir/Makefile
    dh_testdir
    # Add here commands to compile the package.
    cd builddir && $(MAKE)
    touch $@

clean:
    dh_testdir
    dh_testroot
    rm -f build-stamp
    # Add here commands to clean up after the build process.
    rm -rf builddir
    dh_clean
install: build
    dh_testdir
    dh_testroot
    dh_clean -k
    dh_installdirs

    # Add here commands to install the package into debian/your_appname
    #cd builddir && $(MAKE) install
    cd builddir && $(MAKE) INSTALL_ROOT=$(CURDIR)/debian/$(APPNAME) install
    #cd builddir && $(MAKE) install
binary-indep: build install

binary-arch: build install
    dh_testdir
    dh_testroot
    dh_installdocs
    dh_installexamples
    dh_installman
    dh_link
    dh_compress
    dh_fixperms
    dh_installdeb
    dh_shlibdeps
    dh_gencontrol
    dh_md5sums
    dh_builddeb

binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install configurege
Changelog — ниже приведен пример, обратите внимание, что в файле не используется табуляция.
<pre>
yourownnewsmaker (1.3) karmic; urgency=low

    * Added new template for sony e-readers;
    * Added new file pdf-print.properties in templates;
    * Fixed installer for windows;

 -- Valery Konchin <eeexception@gmail.com>  Mon, 1 Mar 2010 00:00:00 +0300

Здесь можно почитать немного больше о создании deb пакетов из qt проектов.NSIS скрипт для Windows.Данный скрипт я писал на основе примеров и он не содержит ничего лишнего, только показ лицензии, выбор пути для установки и саму установку приложения.Вам потребуется только поменять пути в скрипте на свои.Содержимое скрипта:
<pre>
; Turn off old selected section
; 12 06 2005: Luis Wong
; Template voor het genereren van een installer.
; speciaal voor het genereren van EasyPlayer installers.
; Trimedia Interactive Projects
 
 
; -------------------------------
; Start
 
 
  !define MUI_PRODUCT "yourownnewsmaker"
  !define MUI_FILE "yourownnewsmaker"
  !define MUI_VERSION "1.3"
  !define MUI_BRANDINGTEXT "Your Own New Maker Ver. ${MUI_VERSION}"
  CRCCheck On
 
  ; Bij deze moeten we waarschijnlijk een absoluut pad gaan gebruiken
  ; dit moet effe uitgetest worden.
  !include "${NSISDIR}\Contrib\Modern UI\System.nsh"
 
 
;--------------------------------
;General
  Name "${MUI_BRANDINGTEXT}"
  OutFile "../yourownnewsmaker-install-v.${MUI_VERSION}.exe"
  ShowInstDetails "nevershow"
  ShowUninstDetails "nevershow"
  ;SetCompressor "bzip2"
 
  !define MUI_ICON "images/yourownnewsmaker.ico"
  !define MUI_UNICON "images/yourownnewsmaker.ico"
  ;!define MUI_SPECIALBITMAP "Bitmap.bmp"
 
  ; Request application privileges for Windows Vista
  RequestExecutionLevel user
  
;--------------------------------
;Folder selection page
 
  InstallDir "$PROGRAMFILES\${MUI_PRODUCT}"
 
 
;--------------------------------
;Modern UI Configuration
 
  !define MUI_WELCOMEPAGE  
  !define MUI_LICENSEPAGE
  !define MUI_DIRECTORYPAGE
  !define MUI_ABORTWARNING
  !define MUI_UNINSTALLER
  !define MUI_UNCONFIRMPAGE
  !define MUI_FINISHPAGE  
 

;--------------------------------
;Pages

  !insertmacro MUI_PAGE_WELCOME
  !insertmacro MUI_PAGE_LICENSE "license"
  !insertmacro MUI_PAGE_COMPONENTS
  !insertmacro MUI_PAGE_DIRECTORY
  !insertmacro MUI_PAGE_INSTFILES
  !insertmacro MUI_PAGE_FINISH

  !insertmacro MUI_UNPAGE_WELCOME
  !insertmacro MUI_UNPAGE_CONFIRM
  !insertmacro MUI_UNPAGE_INSTFILES
  !insertmacro MUI_UNPAGE_FINISH
 
;--------------------------------
;Language
 
  !insertmacro MUI_LANGUAGE "English"
 
 
;-------------------------------- 
;Modern UI System
 
  ;!insertmacro MUI_SYSTEM 
  !include "MUI2.nsh"
 
;--------------------------------
;Data
 
  LicenseData "license"
 
 
;-------------------------------- 
;Installer Sections     
Section "Your Own News Maker  (required)"
 
;Add files
  SetOutPath "$INSTDIR"
 
  File "${MUI_FILE}.exe"
  File "*.dll"
  File "license"
  File "changes"
  SetOutPath "$INSTDIR\page-templates"
  file "page-templates\*.properties"
  SetOutPath "$INSTDIR\templates\eeex-sony-pdf"
  file "templates\eeex-sony-pdf\*.*"
  SetOutPath "$INSTDIR\templates\default"
  file "templates\default\*.*"
  ;file "templates\*.html"
  ; file "page-templates\*.properties"
  ; SetOutPath "$INSTDIR\data"
  ; file "data\*.cst"
  ; file "data\errorlog.txt"
  ; hier komen dan nog de bestanden die in de playlist staan
  ; SetOutPath "$INSTDIR"  
  ; file /r mpg
  ; SetOutPath "$INSTDIR"  
  ; file /r xtras  
 
;create desktop shortcut
  CreateShortCut "$DESKTOP\${MUI_PRODUCT}.lnk" "$INSTDIR\${MUI_FILE}.exe" ""
 
;create start-menu items
  CreateDirectory "$SMPROGRAMS\${MUI_PRODUCT}"
  CreateShortCut "$SMPROGRAMS\${MUI_PRODUCT}\Uninstall.lnk" "$INSTDIR\Uninstall.exe" "" "$INSTDIR\Uninstall.exe" 0
  CreateShortCut "$SMPROGRAMS\${MUI_PRODUCT}\${MUI_PRODUCT}.lnk" "$INSTDIR\${MUI_FILE}.exe" "" "$INSTDIR\${MUI_FILE}.exe" 0
 
;write uninstall information to the registry
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}" "DisplayName" "${MUI_PRODUCT} (remove only)"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}" "UninstallString" "$INSTDIR\Uninstall.exe"
 
  WriteUninstaller "$INSTDIR\Uninstall.exe"
 
SectionEnd
 
 
;--------------------------------    
;Uninstaller Section  
Section "Uninstall"
 
;Delete Files 
  RMDir /r "$INSTDIR\*.*"    
 
;Remove the installation directory
  RMDir "$INSTDIR"
 
;Delete Start Menu Shortcuts
  Delete "$DESKTOP\${MUI_PRODUCT}.lnk"
  Delete "$SMPROGRAMS\${MUI_PRODUCT}\*.*"
  RmDir  "$SMPROGRAMS\${MUI_PRODUCT}"
 
;Delete Uninstaller And Unistall Registry Entries
  DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\${MUI_PRODUCT}"
  DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}"  
 
SectionEnd
 
 
;--------------------------------    
;MessageBox Section
 
 
;Function that calls a messagebox when installation finished correctly
Function .onInstSuccess
  MessageBox MB_OK "You have successfully installed ${MUI_PRODUCT}. Use the desktop icon to start the program."
FunctionEnd
 
 
Function un.onUninstSuccess
  MessageBox MB_OK "You have successfully uninstalled ${MUI_PRODUCT}."
FunctionEnd
 
 
;eof

Скрипты для автоматической сборки.Linux пакеты:
<pre>
#!/bin/sh
#
#

BUILDDATE=$(date +%F)

MAJORVERSION=`sed '/^\#/d' version.properties | grep 'major'  | tail -n 1 | sed 's/^.*=//;s/^[[:space:]]*//;s/[[:space:]]*$//'`
MINORVERSION=`sed '/^\#/d' version.properties | grep 'minor'  | tail -n 1 | sed 's/^.*=//;s/^[[:space:]]*//;s/[[:space:]]*$//'`

echo "Version: $MAJORVERSION.$MINORVERSION"
echo "Build date: $BUILDDATE"

BASEDIR="./"
DEPLOYDIR="deploy/yourownnewsmaker-$MAJORVERSION.$MINORVERSION"
PLATFORMDIR="linux"
BUILDNAME="yourownnewsmaker-$MAJORVERSION.$MINORVERSION"
RELEASEDIR="$DEPLOYDIR/$PLATFORMDIR/$BUILDNAME"

echo "Build dir: $RELEASEDIR"

rm -rf $DEPLOYDIR/$PLATFORMDIR/

mkdir -p "$DEPLOYDIR/$PLATFORMDIR"
svn export ./ $RELEASEDIR
cd $RELEASEDIR

sed -i "s/%test-major-version%/$MAJORVERSION/g" version.cpp
sed -i "s/%test-minor-version%/$MINORVERSION/g" version.cpp
sed -i "s/%test-date%/$BUILDDATE/g" version.cpp

rm -rf *.rc
rm -rf build-libs
rm -rf win32-x-g++
rm -rf linux-g++-qt4.5
rm -rf *.user
rm -rf *.sh
rm -rf Makefile
rm -rf *.properties
rm -rf *.nsi
rm -rf help

mkdir src
mv *.cpp src
mv *.h src
mv *.ui src
mv yourownnewsmaker.pro src/src.pro
mv *.qrc src
mv images src
mv page-templates src
mv templates src
mv yourownnewsmaker.desktop src
mv changes src
mv license src

touch yourownnewsmaker.pro
echo "QMAKEVERSION = $$[QMAKE_VERSION]" >> yourownnewsmaker.pro
echo "ISQT4 = $$find(QMAKEVERSION, ^[2-9])" >> yourownnewsmaker.pro
echo "isEmpty( ISQT4 ) {" >> yourownnewsmaker.pro
echo "error(\"Use the qmake include with Qt4.4 or greater, on Debian that is qmake-qt4\");" >> yourownnewsmaker.pro
echo "}" >> yourownnewsmaker.pro
echo "" >> yourownnewsmaker.pro
echo "TEMPLATE = subdirs" >> yourownnewsmaker.pro
echo "SUBDIRS  = src" >> yourownnewsmaker.pro
export DEBFULLNAME="Valery Konchin"
dh_make -e eeexception@gmail.com --createorig --single -c gpl

mkdir debian
mv rules debian/rules
mv control debian/control
mv changelog debian/changelog

sed -i "s/<url:\/\/example.com>/http:\/\/eeexception.org/g" debian/copyright
sed -i "s/<put author's name and email here>/Valery Konchin <eeexception@gmail.com>/g" debian/copyright
sed -i "s/<likewise for another author>//g" debian/copyright
sed -i "s/Copyright (C) YYYY Firstname Lastname/Copyright (C) 2010 Valery Konchin/g" debian/copyright

dpkg-buildpackage 
rm -rf debian
rm -rf builddir
cd ../
tar -pczf $BUILDNAME.tar.gz $BUILDNAME
rm -rf $BUILDNAME
Windows пакеты:
<pre>
#!/bin/sh
#
#

BUILDDATE=$(date +%F)

MAJORVERSION=`sed '/^\#/d' version.properties | grep 'major'  | tail -n 1 | sed 's/^.*=//;s/^[[:space:]]*//;s/[[:space:]]*$//'`
MINORVERSION=`sed '/^\#/d' version.properties | grep 'minor'  | tail -n 1 | sed 's/^.*=//;s/^[[:space:]]*//;s/[[:space:]]*$//'`

echo "Version: $MAJORVERSION.$MINORVERSION"
echo "Build date: $BUILDDATE"

BASEDIR="./"
DEPLOYDIR="deploy/yourownnewsmaker-$MAJORVERSION.$MINORVERSION"
PLATFORMDIR="windows"
BUILDNAME="yourownnewsmaker-$MAJORVERSION.$MINORVERSION"
RELEASEDIR="$DEPLOYDIR/$PLATFORMDIR/$BUILDNAME"

echo "Build dir: $RELEASEDIR"

rm -rf $DEPLOYDIR/$PLATFORMDIR/

mkdir -p "$DEPLOYDIR/$PLATFORMDIR"
svn export ./ $RELEASEDIR
cd $RELEASEDIR

sed -i "s/%test-major-version%/$MAJORVERSION/g" version.cpp
sed -i "s/%test-minor-version%/$MINORVERSION/g" version.cpp
sed -i "s/%test-date%/$BUILDDATE/g" version.cpp

#устанавливаем необходимые пути
QT_WIN_INSTALL_DIR=/home/exception/Development/qt-4.6.1-win
QT_LIN_INSTALL_DIR=/home/exception/Development/qtsdk-2010.01/qt

export LD_LIBRARY_PATH=$QT_LIN_INSTALL_DIR/lib:$LD_LIBRARY_PATH
export PATH=$QT_LIN_INSTALL_DIR/bin:$PATH
export QT_LINUX_BIN_PATH=$QT_LIN_INSTALL_DIR/bin
export QT_WIN_INCLUDE_PATH=$QT_WIN_INSTALL_DIR/include
export QT_WIN_LIB_PATH=$QT_WIN_INSTALL_DIR/lib

qmake -set QT_WIN_INCLUDE_PATH $QT_WIN_INCLUDE_PATH
qmake -set QT_WIN_LIB_PATH $QT_WIN_LIB_PATH

#вот так выглядит запуск qmake с кросс компиляцией
qmake yourownnewsmaker.pro -spec win32-x-g++ -r
make

cp -rf build-libs/win/*.dll ./
cp -rf release/*.exe ./

rm -rf images/*.png
rm -rf *.rc
rm -rf *.res
rm -rf build-libs
rm -rf win32-x-g++
rm -rf linux-g++-qt4.5
rm -rf *.user
rm -rf *.sh
rm -rf Makefile
rm -rf *.properties
rm -rf release
rm -rf debug
rm -rf *.desktop
rm -rf Makefile.*
rm -rf *.Debug
rm -rf *.Release
rm -rf control
rm -rf changelog
rm -rf rules
rm -rf help

rm -rf *.qrc
rm -rf *.cpp
rm -rf *.h
rm -rf *.ui
rm -rf *.pro

#Данными командами мы заменяем переносы строк на виндовые
sed -i s/$/'\r'/ templates/default/*.*
sed -i s/$/'\r'/ templates/eeex-sony-pdf/*.*
sed -i s/$/'\r'/ page-templates/*.properties
sed -i s/$/'\r'/ license
sed -i s/$/'\r'/ changes

wine makensis.exe win.nsi

rm -rf *.nsi
cd ../
zip -r $BUILDNAME.zip $BUILDNAME
Часть 3. Проверяем результаты работы.В результате выполнения скриптов мы будем получать в директории deploy/ deb, rpm, архив с исходниками, а также архив с бинарниками и инсталяционный пакет для Windows, чего на мой взгляд вполне достаточно для большинства пользователей. Сгенерированные таким образом deb и rpm пакеты может и не являются идеальными для включения в репозиторий, но вполне успешно устанавливают и обновляют приложение в системе. В идеале в скриптах не хватает еще проверки правильности установки, а также работоспособности самих приложений.Но для этого надо воспользоваться какой-либо системой для GUI тестирования, в поиске которой я сейчас нахожусь.P.S. В связи с ограничением на размер статьи скрипты целиком я выкладываю отдельно.Кроме того рекомендую их скачать, так как парсер редактора сайта мог проглотить какие-то символы.http://dl.dropbox.com/u/930431/project-build-scripts.tar.gz.
http://eeexception.org/project-build-scripts.tar.gz.
http://yourownnewsmaker.googlecode.com/files/project-build-scripts.tar.gz.
Tags:
Hubs:
Total votes 31: ↑30 and ↓1+29
Comments18

Articles