Методом проб и ошибок я изобрел очередной велосипед, о котором и собираюсь рассказать Вам ниже.Речь пойдет о сборке пакетов из проектов Qt для Debian и Rpm based систем, Windows из под Ubuntu/Debian. В принципе метод весьма прост, поэтому, думаю, что при небольших изменениях он подойдет и для rpb based дистрибтивов, а для Windows систем потребуется установка cygwin.Кроме того эта тема очень мало обсуждается в интернете, хотя я бы не назвал сборку кроссплатформенных приложений в инсталяционные пакеты простой задачей.Кому будет интересен данный материал:
Например, прописав пути в ~/.bashrc:
http://eeexception.org/project-build-scripts.tar.gz.
http://yourownnewsmaker.googlecode.com/files/project-build-scripts.tar.gz.
- в первую очередь начинающим разработчикам Qt, которые хотят распространять свои приложения в удобном для пользователей виде;
- разработчикам, использующих другие языки программирования (при небольших изменениях можно получить.
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
$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.