Pull to refresh

Komodo Edit: сборка deb-пакета

Reading time9 min
Views5K
Доброго времени суток, хабравчане.
Я уже довольно давно пользуюсь замечательным редактором Komodo Edit (в принципе, можно его отнести даже к IDE). Когда в 2007-2008 году стал использовать Debian в качестве десктопной ОС, то для разработки продолжил использование Komodo Edit, хотя иногда кидался к Eclipse, но как-то окончательно настроив Komodo Edit, успокоился, так как он меня полностью устраивает в качестве IDE для веб-разработки. Примерно в то же время написал bash-скрипт для сборки deb-пакета, так как дружу с пакетной системой Debian'а.

Данный скрипт также имеет help и может быть использован в Ubuntu и других deb-based дистрибутивах.

Собственно, сам скрипт (прошу прощения за использование английского в комментариях к коду, лень переписывать на русские, а для использования это ни к чему):
#!/bin/bash
################################################################################
#                                                                              #
#  This script makes Komodo Edit package for Debian                            #
#                                                                              #
################################################################################

# backup IFS variable
OLD_IFS=$IFS
UMASK=`umask`

# the archive filename
archive_name=""
# Package version number
VERSION=""
# Package revision number
REVISION=""
# package Architecture
ARCH=""

# Where we are now :)
FULL_PATH=`pwd`
# temporary subfolder
TEMP_PATH="temp-komodo-pkg"
# Full extract path
EXTR_PATH=$FULL_PATH/$TEMP_PATH

# Installation script
SCRIPT="install.sh"

# temporary installation path
TEMP_BUILD_PATH="$EXTR_PATH/temp-build"
# real installation path
BUILD_PATH="$EXTR_PATH/build"

# installation prefix
PREFIX=usr
# delete temporary files
opt_del_temp="1"
# Make submenu Komodo Edit in Development Menu
opt_submenu=""

# Size for Pixmaps Icon
pixmaps_size="48x48"

# show script usage
usage()
{
	cat << EOF
Usage:
    `basename $0` [options] [filename]
        This script makes Debian/Ubuntu package for Komodo Edit.
        The filename is Komodo Edit tar.gz-file.
Options:
	-h | --help  View this message
	-u           Make Ubuntu package (by default packaging for Debain)
	-m           Make menu subfolder entry
	-s           Save temporary files (temp-komodo-pkg folder)
EOF
}

# options parser for check_args function
option_parse()
{
	# Unexpected argument?
	arg=`expr match "$1" ".*\([^-hums]\)"`
	if [ -n "$arg" ]; then
		echo "There is unexpected option specified. Exit."
		usage
		exit 2
	fi
	
	# SHow help?
	arg=`expr match "$1" ".*\([h]\)"`
	if [ -n "$arg" ]; then
		usage
		exit 0
	fi
	
	# Save temprary?
	arg=`expr match "$1" ".*\([s]\)"`
	if [ -n "$arg" ]; then
		opt_del_temp=""
	fi
	
	# Submenu for Komodo?
	arg=`expr match "$1" ".*\([m]\)"`
	if [ `expr match "$1" ".*\([m]\)"` ]; then
		opt_submenu="1"
	fi
	
	# Ubuntu package?
	arg=`expr match "$1" ".*\([u]\)"`
	if [ -n "$arg" ]; then
		PREFIX=usr/local
		REVISION="-ubuntu0"
	fi
}

# check input arguments
check_args()
{
	if [ -z "$1" ]; then
		echo "There is no arguments specified. Exit."
		usage
		exit 1
	fi
	
	for arg in $@
	do
		case $arg in
			
			--help)   option_parse -h;;
							
			-[a-z]*)  options=`expr match "$arg" "\(-[a-z]*\)"`
				     option_parse $options;;
							
			*)	     options=`expr match "$arg" "\(.*\.tar\.gz\)"`
					if [ -z "$options" ]; then
						echo "There is unexpected argument \"$arg\" specified. Exit."
						usage
						exit 2
					elif [ -f "$options" ]; then
						if [ -n "$archive_name" ]; then
							echo "Too many filenames specified. Exit."
							usage
							exit 3
						fi
						archive_name=$options
					else
						echo "The specified argument \"$options\" is not a file. Exit."
						usage
						exit 4
					fi;;
		esac
	done
}

# check the system functionality
check_funcs()
{
	CONVERTER=`which convert`
	echo -n "Checking for image converter ..."
	if [ -z "$CONVERTER" ]; then
		echo "Error"
		echo "Please install converter for images (can be found in package imagemagick). Exit."
		exit 5
	fi
	echo "Found"
	
	FAKEROOT=`which fakeroot`
	echo -n "Checking for fakeroot ..."
	if [ -z "$FAKEROOT" ]; then
		echo "Error"
		echo "Please install package fakeroot. Exit."
		exit 5
	fi
	echo "Found"
}

# Package name parser
package_name_parse()
{
	if [ -z "$1" ]; then
		echo "There is no Komodo Edit archive file specified. Exit."
		usage
		exit 6
	else
		echo "The specified file \"$1\" found."
	fi
	
	name=`basename $1`
	IFS="-"
	
	name=( $name )
	VERSION=${name[2]}
	REVISION=${name[3]}$REVISION
	ARCH=${name[6]}
	
	IFS="."
	ARCH=( $ARCH )
	ARCH=${ARCH[0]}
	
	# restore IFS variable
	IFS=$OLD_IFS
	
	if [ "$ARCH" == "x86" ]; then
		ARCH="i386"
	elif [ "$ARCH" == "x86_64" ]; then
		ARCH="amd64"
	fi
	
	echo "Version: $VERSION"
	echo "Revision: $REVISION"
	echo "Architecture: $ARCH"
}

unpack_archive()
{
	umask 022
	echo -n "Clean old temporary files ..."
	rm -rf $EXTR_PATH
	mkdir $EXTR_PATH
	echo "Done"
	
	echo -n "Unpack Komodo Edit tarball file to $EXTR_PATH ..."
	tar -xvf $1 -C $EXTR_PATH > /dev/null
	if [ "$?" != 0 ]; then
		umask $UMASK
		exit 5
	fi
	echo "Done"
	
	SCRIPT=$EXTR_PATH/`ls $EXTR_PATH`/$SCRIPT
	
	mkdir "$TEMP_BUILD_PATH"
	mkdir "$BUILD_PATH"
	umask $UMASK
}

install_komodo()
{
	umask 022
	$SCRIPT -I "$TEMP_BUILD_PATH/$PREFIX" -s
	umask $UMASK
}

# precompile some python scripts at lib/mozilla subfolder
# and change start komodo script
prepare_komodo()
{
	umask 022
	echo "Preparing Komodo scripts ..."
	$TEMP_BUILD_PATH/$PREFIX/lib/python/bin/python -O -mcompileall $TEMP_BUILD_PATH/$PREFIX/lib/mozilla/
	sed -i -e 's/$INSTALLDIR\/lib/$INSTALLDIR\/share\/komodo-edit\/lib/i' $TEMP_BUILD_PATH/$PREFIX/bin/komodo
	echo "Scripts preparing done."
	umask $UMASK
}

mv_package_files()
{
	umask 022
	mkdir -p $BUILD_PATH/$PREFIX/bin
	mkdir -p $BUILD_PATH/$PREFIX/share/komodo-edit/lib
	mkdir -p $BUILD_PATH/$PREFIX/share/komodo-edit/doc
	
	echo -n "Moving files for package. Please wait ..."
	# Move main script
	mv $TEMP_BUILD_PATH/$PREFIX/bin/* $BUILD_PATH/$PREFIX/bin/
	# Move all libs
	mv $TEMP_BUILD_PATH/$PREFIX/lib/* $BUILD_PATH/$PREFIX/share/komodo-edit/lib/
	
	# Move docs
	mv $TEMP_BUILD_PATH/$PREFIX/share/doc/* $BUILD_PATH/$PREFIX/share/komodo-edit/doc/
	mv $TEMP_BUILD_PATH/$PREFIX/share/doc/.css $BUILD_PATH/$PREFIX/share/komodo-edit/doc/
	
	echo "Done"
	umask $UMASK
}

make_icons()
{
	umask 022
	echo -n "Creating icons ..."
	SIZES="64x64 48x48 32x32 24x24 22x22 16x16"
	mkdir -p $BUILD_PATH/$PREFIX/share/icons/hicolor/128x128/apps
	cp -p $TEMP_BUILD_PATH/$PREFIX/share/icons/komodo128.png $BUILD_PATH/$PREFIX/share/icons/hicolor/128x128/apps/komodo.png
	WORK_PATH=$BUILD_PATH/$PREFIX/share/icons/hicolor
	for size in $SIZES
	do
		mkdir -p $WORK_PATH/$size/apps
		$CONVERTER $WORK_PATH/128x128/apps/komodo.png -resize $size $WORK_PATH/$size/apps/komodo.png
	done
	
	mkdir -p $BUILD_PATH/usr/share/pixmaps
	cp $BUILD_PATH/$PREFIX/share/icons/hicolor/$pixmaps_size/apps/komodo.png $BUILD_PATH/usr/share/pixmaps/
	
	echo "Done"
	umask $UMASK
}

make_menu_entries()
{
	umask 022
	echo -n "Make menu entries ..."
	
	mkdir -p $BUILD_PATH/usr/share/menu
	filename=$BUILD_PATH/usr/share/menu/komodo-edit
	echo "?package(komodo-edit):needs=\"x11\" section=\"Apps/Programming\" \ " > $filename
    echo "        title=\"Komodo Edit\" command=\"/$PREFIX/bin/komodo %F\" \ " >> $filename
    echo "        icon=\"/usr/share/pixmaps/komodo.png\" " >> $filename
    echo "" >> $filename
	
	if [ -z "$opt_submenu" ]; then
		echo "Done"
		category="Development;"
		depends=""
		umask $UMASK
		return
	fi
	
	category="Komodo;"
	depends="xdg-utils"
	
	mkdir -p $BUILD_PATH/etc/xdg/menus/applications-merged
	filename=$BUILD_PATH/etc/xdg/menus/applications-merged/komodo-edit.menu
	echo '<!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN"' > $filename
	echo '"http://www.freedesktop.org/standards/menu-spec/menu-1.0.dtd">' >> $filename
	echo '<Menu>' >> $filename
	echo '  <Name>Applications</Name>' >> $filename
	echo '  <Menu>' >> $filename
	echo '    <Name>Development</Name>' >> $filename
	echo '    <Menu>' >> $filename
	echo '      <Name>Komodo</Name>' >> $filename
	echo '      <Directory>komodoedit.directory</Directory>' >> $filename
	echo '      <Include>' >> $filename
	echo '        <Category>Komodo</Category>' >> $filename
	echo '      </Include>' >> $filename
	echo '    </Menu>' >> $filename
	echo '  </Menu>' >> $filename
	echo '</Menu>' >> $filename
	
	mkdir -p $BUILD_PATH/usr/share/desktop-directories
	filename=$BUILD_PATH/usr/share/desktop-directories/komodoedit.directory
	echo '[Desktop Entry]' > $filename
	echo 'Encoding=UTF-8' >> $filename
	echo 'Type=Directory' >> $filename
	echo 'Name=Komodo Edit' >> $filename
	echo 'Icon=komodo' >> $filename
	
	echo "Done"
	umask $UMASK
}

make_desktop_files()
{
	umask 022
	echo -n "Make desktop files ..."
	mkdir -p $BUILD_PATH/usr/share/applications
	
	filename=$BUILD_PATH/usr/share/applications/komodo-edit.desktop
	echo '[Desktop Entry]' > $filename
	echo 'Type=Application' >> $filename
	echo 'Name=Komodo Edit' >> $filename
	echo 'Encoding=UTF-8' >> $filename
	echo 'Icon=komodo' >> $filename
	echo 'Exec=komodo %F' >> $filename
	echo "Categories=$category" >> $filename
	echo 'Terminal=false' >> $filename
	echo 'Comment=Dynamic Languages Web-Editor' >> $filename
	echo 'GenericName=Dynamic Web-pages Editor' >> $filename
	
	if [ -z "$opt_submenu" ]; then
		echo "Done"
		umask $UMASK
		return
	fi
	
	filename=$BUILD_PATH/usr/share/applications/komodo-license.desktop
	echo '[Desktop Entry]' > $filename
	echo 'Type=Application' >> $filename
	echo 'Name=License' >> $filename
	echo 'Encoding=UTF-8' >> $filename
	echo 'Icon=txt' >> $filename
	echo "Exec=xdg-open /$PREFIX/share/komodo-edit/doc/license.txt" >> $filename
	echo "Categories=$category" >> $filename
	echo 'Terminal=false' >> $filename
	
	filename=$BUILD_PATH/usr/share/applications/komodo-relnotes.desktop
	echo '[Desktop Entry]' > $filename
	echo 'Type=Application' >> $filename
	echo 'Name=Release Notes' >> $filename
	echo 'Encoding=UTF-8' >> $filename
	echo 'Icon=html' >> $filename
	echo "Exec=xdg-open /$PREFIX/share/komodo-edit/doc/relnotes.html" >> $filename
	echo "Categories=$category" >> $filename
	echo 'Terminal=false' >> $filename
		
	echo "Done"
	umask $UMASK
}

make_control_file()
{
	umask 022
	echo -n "Make Debian control file ..."
	mkdir -p $BUILD_PATH/DEBIAN
	#calculate installed size
	full_size=`du -s $BUILD_PATH/usr | awk '{print $1}'`
	
	filename=$BUILD_PATH/DEBIAN/control
	echo "Package: komodo-edit" > $filename
	echo "Version: $VERSION-$REVISION" >> $filename
	echo "Architecture: $ARCH" >> $filename
	echo "Section: web" >> $filename
	echo "Priority: optional" >> $filename
	echo "Installed-Size: $full_size" >> $filename
	if [ -n "$depends" ]; then
		echo "Depends: $depends" >> $filename
	fi
	echo "Homepage: www.activestate.com" >> $filename
	echo "Maintainer: KernelPanic :) <admin@localhost>" >> $filename
	echo "Description: Komodo Edit is a free, open source editor from dynamic language experts." >> $filename
	echo " Komodo Edit, based on the award-winning Komodo IDE, offers sophisticated support" >> $filename
	echo " for all major scripting languages, including in-depth autocomplete and calltips, " >> $filename
	echo " multi-language file support, syntax coloring and syntax checking, Vi emulation, " >> $filename
	echo " Emacs key bindings." >> $filename
	echo " It provides dynamic language expertise for Perl, PHP, Python, Ruby, and Tcl, plus JavaScript, " >> $filename
	echo " CSS, HTML, and XML, and template languages like RHTML, Template-Toolkit, HTML-Smarty " >> $filename
	echo " and Django." >> $filename
	
	echo "Done"
	umask $UMASK
}

make_package()
{
	fakeroot dpkg-deb -b $BUILD_PATH ./
}

del_temporary()
{
	if [ -n "$opt_del_temp" ]; then
		echo -n "Delete temporary files and directories ..."
		rm -rf $EXTR_PATH
		echo "Done"
	else
		rm -rf $TEMP_BUILD_PATH
		echo "Temporary files may be found at temp-komodo-pkg/ folder"
	fi
}

check_args $@
package_name_parse $archive_name
check_funcs
unpack_archive $archive_name
install_komodo
prepare_komodo
mv_package_files
make_icons
make_menu_entries
make_desktop_files
make_control_file
make_package
del_temporary

echo "All Done. Package is ready :)"
exit 0


Ход работы скрипта:
1) парсинг имени архива вида Komodo-Edit-#VERSION-#REVISION-linux-libcpp6-#ARCH.tar.gz откуда получаем всю нужную информацию;
2) распаковка архива во временную папку;
3) установка Komodo Edit туда;
4) прекомпилирование исходников;
5) рассовывание файлов в нужные подпапки;
6) создание control файла;
7) сборка deb-пакета с использованием fakeroot;

Использование:
0) сделать файл со скриптом исполняемым
1) кинуть скрипт (у меня называется mkpkg-komodo) в /usr/local/bin
2) скачать архив с activestate.com
3) запустить скрипт с нужными параметрами (посмотрите help, кому нужно, мне хватает просто имени файла с архивом):
$ mkpkg-komodo Komodo-Edit-6.1.3-8844-linux-libcpp6-x86_64.tar.gz
4) установите получившийся deb-пакет:
# dpkg -i komodo-edit_6.1.3-8844_amd64.deb

Можно также добавить в локальный репозиторий, копировать свой топик про создание репозитория не буду, кому интересно, гляньте.

В разделе Разработка (Developement) меню появится пункт Komodo Edit.
Чтобы сделать Komodo Edit более полноценной IDE установите плагин NST

Как это выглядит:


UPD: В принципе, скрипт предупредит вас, если не будут установлены пакеты imagemagick и fakeroot, надо поставить:
# aptitude install imagemagick fakeroot
Tags:
Hubs:
+19
Comments24

Articles