<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3068039613872793354</id><updated>2011-08-01T17:26:33.854+04:00</updated><category term='Hardware'/><category term='KDE'/><category term='Sane'/><category term='Ubuntu'/><category term='Talks'/><category term='Programming'/><title type='text'>Vest's Blog</title><subtitle type='html'>Данный блог содержит описание некоторых отдельных частей взятых из моего небогатого жизненного опыта. Возможно вам, столкнувшимися с похожими вопросами, будет интересно почитать чужие мысли, прежде чем начать действовать самим.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://vest-one.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://vest-one.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Vest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_4Y-F98DPD_0/SXS-6duFvGI/AAAAAAAAAAM/L0zgoDEP8u8/s1600-R/x_801fa864.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>16</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3068039613872793354.post-5429894872858230812</id><published>2009-05-04T19:41:00.010+04:00</published><updated>2009-05-04T19:55:11.086+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Принтер Samsung ML-2015</title><content type='html'>&lt;span style="font-family:verdana;"&gt;&lt;p&gt;С незапамятных времен у меня был принтер, название которого вы видите выше. Так получилось, что мне нужно использовать его под Linux. Всё было хорошо, в ранних версиях Ubuntu (&lt; 9.04), он у меня подхватывался системой CUPS как говориться "искоропки". Но вот, незадача, как-то пришлось мне обновиться (во всяком случае я не так часто печатал, чтобы обратить внимание на то, как вёл себя принтер в 8.10, здесь я говорю именно про сейчас) до Jaunty релиза и он у меня перестал работать. Точнее когда отправляешь задание на печать, я получаю следующее: документ тормозится на обработке и мне сообщается, что принтер не подключён (кстати сказать на моём нетбуке под той же версией Ubuntu принтер работает):&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_4Y-F98DPD_0/Sf8N_ebf93I/AAAAAAAAADw/5SFSXlXn6wo/s1600-h/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA-%D0%A1%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5+%D0%BF%D0%B5%D1%87%D0%B0%D1%82%D0%B8+%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2+(%D0%BC%D0%BE%D0%B8+%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F).png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 96px;" src="http://2.bp.blogspot.com/_4Y-F98DPD_0/Sf8N_ebf93I/AAAAAAAAADw/5SFSXlXn6wo/s320/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA-%D0%A1%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5+%D0%BF%D0%B5%D1%87%D0%B0%D1%82%D0%B8+%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2+(%D0%BC%D0%BE%D0%B8+%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F).png" border="0" alt="Состояние печати" id="BLOGGER_PHOTO_ID_5331995867981281138" /&gt;&lt;/a&gt;&lt;p&gt;Сравнив настройки принтера в моих дистрибутивах, я обнаружил интересную разницу, которую сам добавить никак не мог (выделено на рисунке):&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4Y-F98DPD_0/Sf8Ob5ymO8I/AAAAAAAAAD4/mhwxUnvz-XM/s1600-h/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA-%D0%A1%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0+%D0%BF%D1%80%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B0+%E2%80%94+%C2%ABML-2010%C2%BB+%D0%BD%D0%B0+localhost-1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 153px;" src="http://3.bp.blogspot.com/_4Y-F98DPD_0/Sf8Ob5ymO8I/AAAAAAAAAD4/mhwxUnvz-XM/s320/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA-%D0%A1%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0+%D0%BF%D1%80%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B0+%E2%80%94+%C2%ABML-2010%C2%BB+%D0%BD%D0%B0+localhost-1.png" border="0" alt="Свойства принтера" id="BLOGGER_PHOTO_ID_5331996356362255298" /&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Стерев разницу мой принтер сразу же заработал. Кстати добавив к с вышеизложенному. В &lt;samp class="file-name"&gt;/var/log/syslog&lt;/samp&gt; я увидел следующее:&lt;/p&gt;&lt;div class="terminal"&gt;May  4 19:29:05 vest-desktop hal_lpadmin: Running hal_lpadmin&lt;br /&gt;May  4 19:29:06 vest-desktop hal_lpadmin: hal_lpadmin triggered by low-level USB device&lt;br /&gt;May  4 19:29:06 vest-desktop hal_lpadmin: Getting device ID from the usblp HAL entry ...&lt;br /&gt;May  4 19:29:06 vest-desktop hal_lpadmin: Device ID for /dev/usb/lp0: MFG:Samsung;MDL:ML-2010;DES:;CMD:GDI;&lt;br /&gt;May  4 19:29:06 vest-desktop hal_lpadmin: Written device ID into HAL database entry: MFG:Samsung;MDL:ML-2010;DES:;CMD:GDI;&lt;br /&gt;May  4 19:29:06 vest-desktop hal_lpadmin: add&lt;br /&gt;May  4 19:29:06 vest-desktop hal_lpadmin: Printer reported by HAL: Samsung ML-2010 3D66BKCPA21817X.&lt;br /&gt;&lt;b&gt;May  4 19:29:06 vest-desktop hal_lpadmin: Found configured printer: ML-2010; URI: usb://Samsung/ML-2010?serial=3D66BKCPA21817X.&lt;/b&gt;&lt;br /&gt;May  4 19:29:06 vest-desktop hal_lpadmin: Not adding printer: ML-2010 already exists&lt;br /&gt;May  4 19:29:06 vest-desktop hal_lpadmin: Re-enabling printer ML-2010&lt;/div&gt;&lt;p&gt;То есть принтер-то найден верно, хоть и модель немного другая. И серийный номер совпал, но вот это и являлось причиной. Что ж... если такое повторится дальше, будем продолжать исследование.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3068039613872793354-5429894872858230812?l=vest-one.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vest-one.blogspot.com/feeds/5429894872858230812/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3068039613872793354&amp;postID=5429894872858230812' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/5429894872858230812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/5429894872858230812'/><link rel='alternate' type='text/html' href='http://vest-one.blogspot.com/2009/05/samsung-ml-2015.html' title='Принтер Samsung ML-2015'/><author><name>Vest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_4Y-F98DPD_0/SXS-6duFvGI/AAAAAAAAAAM/L0zgoDEP8u8/s1600-R/x_801fa864.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4Y-F98DPD_0/Sf8N_ebf93I/AAAAAAAAADw/5SFSXlXn6wo/s72-c/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA-%D0%A1%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5+%D0%BF%D0%B5%D1%87%D0%B0%D1%82%D0%B8+%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2+(%D0%BC%D0%BE%D0%B8+%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F).png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3068039613872793354.post-7703831521578532285</id><published>2009-03-04T19:43:00.025+03:00</published><updated>2009-03-05T00:08:47.490+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Gnome Internationalization или интернационализация средствами Glib и intltool</title><content type='html'>&lt;span style="font-family:verdana;"&gt;&lt;p&gt;Теперь пришло время, добавить в наш шаблон «Интернационализацию». Основное отличие от «Локализации» заключается в &lt;a href="http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F"&gt;том&lt;/a&gt;, что приложение, поддерживающее интернационализацию физически представляет собой один исполняемый файл (с сопутствующими ему файлами с данными), которое равно запускается в операционной системе и отображает локализованную информацию в зависимости от настроек ОС. Локализованное приложение отображает только тот язык, для которого оно было создано. Так, например, в Windows часто вы встречали фразы «Скачать русскую версию». Так вот, это были локализованные приложения.&lt;/p&gt;&lt;p&gt;Наше приложение пока отображает только английскую локаль. Попробуем встроить в него интернационализацию управляемую библиотекой GLib. Для начала нам понадобятся пара пакетов: &lt;samp class="file-name"&gt;intltool&lt;/samp&gt; и &lt;samp class="file-name"&gt;gettext&lt;/samp&gt;. Они помогут нам, избавив от некоторой рутинной работы.&lt;/p&gt;&lt;p&gt;Для начала подправим наш исходный код, и доведём его до следующего состояния (жирным я отмечу то, что дописал непосредственно в файл):&lt;/p&gt;&lt;p&gt;&lt;b&gt;Здесь и далее хочу сказать, что в исходных кодах можно использовать как TAB символы, так и пробелы, в шаблонах &lt;samp class="file-name"&gt;configure.ac&lt;/samp&gt; также, НО в &lt;samp class="file-name"&gt;Makefile.am&lt;/samp&gt; только TAB.&lt;/b&gt;&lt;/p&gt;&lt;div class="terminal"&gt;#include &amp;lt;config.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;b&gt;#include &amp;lt;glib/gi18n.h&amp;gt;&lt;/b&gt; -- поддержка макросов gettext&lt;br /&gt;&lt;br /&gt;int main(int argc, char** argv)&lt;br /&gt;{&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setlocale (LC_ALL, "");&lt;/b&gt; -- устанавливаем текущую локаль, информацию берём с переменных окружения &lt;b&gt;(это можно опустить в GUI программировании)&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bindtextdomain (GETTEXT_PACKAGE, QUOD_LOCALEDIR);&lt;/b&gt; -- устанавливаем каталог, где лежат файлы для разных языков&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");&lt;/b&gt; -- устанавливаем кодировку для вывода символов (благо Linux легко поддерживает Unicode)&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;textdomain (GETTEXT_PACKAGE);&lt;/b&gt;  -- установка домена по умолчанию&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;b&gt;_(&lt;/b&gt;"Hello World!\n"&lt;b&gt;)&lt;/b&gt;); -- отмечаем текст, который надо перевести с помощью макроса &lt;code class="options"&gt;_()&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 0;&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;Почитав повнимательнее, я выяснил, что оказывается сам GLib локализован с помощью механизма &lt;samp class="file-name"&gt;gettext&lt;/samp&gt;, поэтому он принят стандартом де-факто. Существуют разные макросы, выделяющие наш текст, требующий интернационализации. Например, для строк, к которым не может быть применён вызов &lt;code class="options"&gt;gettext&lt;/code&gt; (например глобальные переменные переменные принимающие строки в массивах), то к ним применяется макрос &lt;code class="options"&gt;N_()&lt;/code&gt;. Дополнительную информацию можете поискать в самом &lt;a href="http://library.gnome.org/devel/glib/unstable/glib-I18N.html"&gt;Glib&lt;/a&gt;'e, либо &lt;a href="http://www.gnome.org/%7Emalcolm/i18n/index.html"&gt;Internationalising GNOME applications&lt;/a&gt;, ещё как вариант скачать &lt;a href="http://ftp.gnome.org/pub/gnome/sources/intltool/"&gt;intltool&lt;/a&gt;, и там прочесть HOW-TO. Вообще, информации много, но вот собранной воедино и с нуля — мало.&lt;/p&gt;&lt;p&gt;Следующим этапом идёт создание каталога &lt;samp class="file-name"&gt;po&lt;/samp&gt;, где будут находиться наши переводы. Заодно, подправим наши шаблоны:&lt;/p&gt;&lt;div class="terminal"&gt;~/gnome-quod$ mkdir po&lt;br /&gt;&lt;br /&gt;configure.ac&lt;br /&gt;# ======================== initialization ===============================&lt;br /&gt;AC_INIT([Gnome Quod],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[0.4.0],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[vest@mail.com],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[gnome-quod])&lt;br /&gt;&lt;br /&gt;AC_CONFIG_SRCDIR([src/main.c])&lt;br /&gt;AC_CONFIG_HEADERS([config.h])&lt;br /&gt;AM_INIT_AUTOMAKE([-Wall -Werror dist-bzip2])&lt;br /&gt;AC_DEFINE([NDEBUG], [], [Disable debugging information])&lt;br /&gt;&lt;br /&gt;# ==================== basic compiler settings ==========================&lt;br /&gt;AC_PROG_CC&lt;br /&gt;AM_PROG_CC_C_O&lt;br /&gt;AC_HEADER_STDC&lt;br /&gt;&lt;br /&gt;&lt;b&gt;# ==================== internationalization i18n ========================&lt;/b&gt;&lt;br /&gt;&lt;b&gt;IT_PROG_INTLTOOL([0.40.4])&lt;/b&gt; -- требование библиотеки intltool не ниже 0.40.4&lt;br /&gt;&lt;b&gt;GETTEXT_PACKAGE=gnome-quod&lt;/b&gt; -- название пакета выносим в отдельную переменную&lt;br /&gt;&lt;b&gt;AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE], ["$GETTEXT_PACKAGE"],&lt;/b&gt; -- которую делаем в качестве&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[The domain to use with gettext])&lt;/b&gt; -- директивы для препроцессора (см. config.h)&lt;br /&gt;&lt;b&gt;AM_GLIB_GNU_GETTEXT&lt;/b&gt; -- не знаю до конца, но скорей всего включает поддержку GETTEXT у Glib (или через)&lt;br /&gt;&lt;b&gt;AC_SUBST(GETTEXT_PACKAGE)&lt;/b&gt; -- добавляет опции в компилятор для включения gettext&lt;br /&gt;&lt;br /&gt;&lt;b&gt;QUOD_LOCALEDIR=[${datadir}/locale]&lt;/b&gt; --указываем, где будут находиться локализации&lt;br /&gt;&lt;b&gt;AC_SUBST(QUOD_LOCALEDIR)&lt;/b&gt; -- запоминаем этот путь и добавляем его в опции компилятора&lt;br /&gt;&lt;br /&gt;&lt;b&gt;PKG_CHECK_MODULES([GLIB],[glib-2.0 &amp;gt;= 2.18])&lt;/b&gt; -- проверяем, что у нас стоит Glib нужной версии&lt;br /&gt;&lt;br /&gt;# ==================== generate files ===================================&lt;br /&gt;AC_CONFIG_FILES([&lt;br /&gt;&amp;nbsp;&amp;nbsp;Makefile&lt;br /&gt;&amp;nbsp;&amp;nbsp;src/Makefile&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;po/Makefile.in&lt;/b&gt; -- выводим ещё один шаблон Makefile'a в новом каталоге po&lt;br /&gt;])&lt;br /&gt;AC_OUTPUT&lt;/div&gt;&lt;p&gt;В HOW-TO, я прочитал следующее, что вместо &lt;code class="options"&gt;AM_GLIB_GNU_GETTEXT&lt;/code&gt; можно использовать &lt;code class="options"&gt;AM_GNU_GETTEXT([external])&lt;/code&gt;, а сам autoreconf предложил мне воспользоваться &lt;code class="options"&gt;AM_GNU_GETTEXT_VERSION&lt;/code&gt;. С одним предупреждением у меня получился следующий вариант:&lt;/p&gt;&lt;div class="terminal"&gt;...&lt;br /&gt;AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE], ["$GETTEXT_PACKAGE"],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[The domain to use with gettext])&lt;br /&gt;&lt;b&gt;AM_GNU_GETTEXT_VERSION&lt;/b&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;$ autoreconf&lt;br /&gt;...&lt;br /&gt;autoreconf: configure.ac: AM_GNU_GETTEXT_VERSION is used, but not AM_GNU_GETTEXT&lt;/div&gt;&lt;p&gt;с другим вариантом:&lt;/p&gt;&lt;div class="terminal"&gt;autoreconf: configure.ac: AM_GNU_GETTEXT is used, but not AM_GNU_GETTEXT_VERSION&lt;br /&gt;configure.ac:23: required file `./config.guess' not found&lt;br /&gt;configure.ac:23:   `automake --add-missing' can install `config.guess'&lt;br /&gt;configure.ac:23: required file `./config.rpath' not found&lt;br /&gt;configure.ac:23: required file `./config.sub' not found&lt;br /&gt;configure.ac:23:   `automake --add-missing' can install `config.sub'&lt;br /&gt;configure.ac:23: required file `./ABOUT-NLS' not found&lt;/div&gt;&lt;p&gt;То, что я запустил конфигурирование пакета, я решил показать в демонстрационных целях, у Вас пакет ещё не до конца сконфигурирован, поэтому вы возможно получите ошибки. Далее подправляем другие файлы:&lt;/p&gt;&lt;div class="terminal"&gt;// Makefile.am&lt;br /&gt;SUBDIRS = src &lt;b&gt;po&lt;/b&gt; -- добавляем лишний каталог&lt;br /&gt;&lt;br /&gt;&lt;b&gt;@INTLTOOL_DESKTOP_RULE@&lt;/b&gt; -- этот макрос позволяет intltool определить, где какие файлы требуют перевода (в частности, в корневой директории может находиться будущий ярлык программы)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;INTLTOOL_FILES = \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;intltool-extract.in \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;intltool-merge.in \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;intltool-update.in&lt;br /&gt;&lt;br /&gt;EXTRA_DIST = $(INTLTOOL_FILES)&lt;br /&gt;&lt;br /&gt;DISTCLEANFILES = \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;intltool-extract \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;intltool-merge  \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;intltool-update&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;# здесь я говорю, что вышеследующие файлы (шаблоны) будут распространятся в дистрибутиве без обработки, в случае очистки сгенерированные с шаблонов файлы следует стирать&lt;br /&gt;&lt;br /&gt;# эти строки я встречал не всегда. Они отвечают за очистку кеша, создаваемого intltool&lt;br /&gt;&lt;b&gt;clean-local:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rm -f po/.intltool-merge-cache&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;// src/Makefile.am&lt;br /&gt;&lt;b&gt;quod_CFLAGS = \&lt;/b&gt; -- задаём флаги для конкретного исполняемого файла (quod)&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-DQUOD_LOCALEDIR=\"${QUOD_LOCALEDIR}\" \&lt;/b&gt; -- где лежат наши локали&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(GLIB_CFLAGS) \&lt;/b&gt; -- флаги для компиляции с Glib&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-I$(top_srcdir)&lt;/b&gt; -- путь, с заголовками уровнем выше (обычно для config.h)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;quod_LDADD = \&lt;/b&gt; -- тоже самое, но для линковщика&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(INTLLIBS) \&lt;/b&gt; -- библиотеки intltool&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(GLIB_LIBS)&lt;/b&gt; -- библиотеки Glib&lt;br /&gt;&lt;br /&gt;bin_PROGRAMS = quod&lt;br /&gt;quod_SOURCES = main.c&lt;/div&gt;&lt;p&gt;В &lt;a href="http://vest-one.blogspot.com/2009/02/autotools.html"&gt;предыдущем посте&lt;/a&gt; я описывал, почему я использовал макрос &lt;code class="options"&gt;AM_PROG_CC_C_O&lt;/code&gt;. Именно благодаря ему, я указал для конкретного бинарного файла нужные флаги для компилятора. Теперь следует дописать небольшие файлы в &lt;samp class="file-name"&gt;po&lt;/samp&gt; каталог, и затем приступить к запуску скриптов. Процедура создания файлов немного автоматизирована:&lt;/p&gt;&lt;div class="terminal"&gt;~/gnome-quod$ intltoolize -- этот скрипт создаст файл po/Makefile.in.in&lt;br /&gt;&lt;br /&gt;// вручную создаём po/LINGUAS&lt;br /&gt;# please keep this list sorted alphabetically&lt;br /&gt;#&lt;br /&gt;ru -- по алфавиту указываем какие языки у нас будут присутствовать&lt;br /&gt;&lt;br /&gt;// вручную создаём po/POTFILES.in&lt;br /&gt;# List of source files containing translatable strings.&lt;br /&gt;# Please keep this file sorted alphabetically.&lt;br /&gt;src/main.c -- здесь описываем все файлы, где нужен перевод (даже файлы с ярлыками для рабочего стола)&lt;br /&gt;&lt;br /&gt;// Проверяем:&lt;br /&gt;~/gnome-quod/po$ ls -l&lt;br /&gt;итого 8&lt;br /&gt;-rwxr-xr-x 1 vest vest 51 2008-12-10 10:50 LINGUAS&lt;br /&gt;lrwxrwxrwx 1 vest vest 34 2009-03-04 18:52 Makefile.in.in -&amp;gt; /usr/share/intltool/Makefile.in.in&lt;br /&gt;-rwxr-xr-x 1 vest vest 68 2009-03-04 19:04 POTFILES.in&lt;/div&gt;&lt;p&gt;На самом деле видите, что &lt;samp class="file-name"&gt;Makefile.in.in&lt;/samp&gt; это всего-навсего ссылка. Далее попытаемся создать pot-файл, содержащий строки, нуждающиеся в переводе:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="terminal"&gt;~/gnome-quod/po$ intltool-update --pot -- выполнять это надо внутри каталога po&lt;br /&gt;&lt;br /&gt;~/gnome-quod/po$ cat gnome-quod.pot&lt;br /&gt;# SOME DESCRIPTIVE TITLE.&lt;br /&gt;# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER&lt;br /&gt;# This file is distributed under the same license as the PACKAGE package.&lt;br /&gt;# FIRST AUTHOR &amp;lt;EMAIL@ADDRESS&amp;gt;, YEAR.&lt;br /&gt;#&lt;br /&gt;#, fuzzy&lt;br /&gt;msgid ""&lt;br /&gt;msgstr ""&lt;br /&gt;"Project-Id-Version: PACKAGE VERSION\n"&lt;br /&gt;"Report-Msgid-Bugs-To: \n"&lt;br /&gt;"POT-Creation-Date: 2009-03-04 19:08+0300\n"&lt;br /&gt;"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"&lt;br /&gt;"Last-Translator: FULL NAME &amp;lt;EMAIL@ADDRESS&amp;gt;\n"&lt;br /&gt;"Language-Team: LANGUAGE &amp;lt;LL@li.org&amp;gt;\n"&lt;br /&gt;"MIME-Version: 1.0\n"&lt;br /&gt;"Content-Type: text/plain; charset=CHARSET\n"&lt;br /&gt;"Content-Transfer-Encoding: 8bit\n"&lt;br /&gt;&lt;br /&gt;#: ../src/main.c:13&lt;br /&gt;#, c-format&lt;br /&gt;msgid "Hello World!\n"&lt;br /&gt;msgstr ""&lt;/div&gt;&lt;p&gt;Вот так выглядит шаблон, созданный скриптом. Сам pot-файл не нужен, так как генерируется автоматически. То, что требуется от вас, это сделать копию файла с именем того языка, на который вы будете создавать свою локализацию (в нашем случае &lt;samp class="file-name"&gt;ru.po&lt;/samp&gt;). Сам файл хорошо документирован, вам следует обратить внимание на то, что &lt;code class="options"&gt;CHARSET&lt;/code&gt; следует исправить в &lt;code class="options"&gt;UTF-8&lt;/code&gt;. Есть другой способ создать шаблон нужной локализации средствами gettext (но про &lt;code class="options"&gt;UTF-8&lt;/code&gt; строки следует не забывать. Помните наши изменения в исходном файле &lt;samp class="file-name"&gt;main.c&lt;/samp&gt;):&lt;/p&gt;&lt;div class="terminal"&gt;~/gnome-quod/po$ msginit --locale=ru&lt;br /&gt;Новый каталог сообщений должен содержать ваш адрес электронной почты,&lt;br /&gt;чтобы пользователи могли присылать свои замечания по поводу ваших&lt;br /&gt;передов, а также чтобы сопроводители программ могли связаться с вами в&lt;br /&gt;том случае, если возникнут непредвиденные технические проблемы.&lt;br /&gt;&lt;br /&gt;Which is your email address?&lt;br /&gt;1 Vest@home.tula.net&lt;br /&gt;...&lt;br /&gt;9 vest@vest-desktop&lt;br /&gt;&lt;br /&gt;Please choose the number, or enter your email address.&lt;br /&gt;9 -- я ввёл это чисто (просто так, на самом деле введите либо номер либо свой реальный адрес)&lt;br /&gt;A translation team for your language (ru) does not exist yet.&lt;br /&gt;If you want to create a new translation team for ru, please visit&lt;br /&gt;&amp;nbsp;http://www.iro.umontreal.ca/contrib/po/HTML/teams.html&lt;br /&gt;&amp;nbsp;http://www.iro.umontreal.ca/contrib/po/HTML/leaders.html&lt;br /&gt;&amp;nbsp;http://www.iro.umontreal.ca/contrib/po/HTML/index.html&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Создано ru.po.&lt;/b&gt; -- вот это самое главное.&lt;br /&gt;&lt;br /&gt;~/gnome-quod/po$ cat ru.po&lt;br /&gt;# Russian translations for Gnome Quod package.&lt;br /&gt;# Copyright (C) 2009 THE Gnome Quod'S COPYRIGHT HOLDER&lt;br /&gt;# This file is distributed under the same license as the Gnome Quod package.&lt;br /&gt;# Vladislav Volodin &amp;lt;vest@vest-desktop&amp;gt;, 2009.&lt;br /&gt;#&lt;br /&gt;msgid ""&lt;br /&gt;msgstr ""&lt;br /&gt;"Project-Id-Version: Gnome Quod 0.4.0\n"&lt;br /&gt;"Report-Msgid-Bugs-To: \n"&lt;br /&gt;"POT-Creation-Date: 2009-03-04 19:08+0300\n"&lt;br /&gt;"PO-Revision-Date: 2009-03-04 19:18+0300\n"&lt;br /&gt;"Last-Translator: Vladislav Volodin &amp;lt;vest@vest-desktop&amp;gt;\n"&lt;br /&gt;"Language-Team: Russian\n"&lt;br /&gt;"MIME-Version: 1.0\n"&lt;br /&gt;"Content-Type: text/plain; charset=&lt;b&gt;ASCII&lt;/b&gt;\n" -- как видите, это надо поменять на UTF-8&lt;br /&gt;"Content-Transfer-Encoding: 8bit\n"&lt;br /&gt;"Plural-Forms: nplurals=3; plural=(n%10==1 &amp;amp;&amp;amp; n%100!=11 ? 0 : n%10&amp;gt;=2 &amp;amp;&amp;amp; n%"&lt;br /&gt;"10&amp;lt;=4 &amp;amp;&amp;amp; (n%100&amp;lt;10 || n%100&amp;gt;=20) ? 1 : 2);\n"&lt;br /&gt;&lt;br /&gt;#: ../src/main.c:13&lt;br /&gt;#, c-format&lt;br /&gt;msgid "Hello World!\n"&lt;br /&gt;msgstr ""&lt;/div&gt;&lt;p&gt;Далее переводим строку следующим образом. Оставляем оригинал вверху, нужный перевод внизу, и всё сохраняем в формате UTF-8:&lt;/p&gt;&lt;div class="terminal"&gt;...&lt;br /&gt;"Content-Type: text/plain; charset=&lt;b&gt;UTF-8&lt;/b&gt;\n"&lt;br /&gt;"Content-Transfer-Encoding: 8bit\n"&lt;br /&gt;"Plural-Forms: nplurals=3; plural=(n%10==1 &amp;amp;&amp;amp; n%100!=11 ? 0 : n%10&amp;gt;=2 &amp;amp;&amp;amp; n%"&lt;br /&gt;"10&amp;lt;=4 &amp;amp;&amp;amp; (n%100&amp;lt;10 || n%100&amp;gt;=20) ? 1 : 2);\n"&lt;br /&gt;&lt;br /&gt;#: ../src/main.c:13&lt;br /&gt;#, c-format&lt;br /&gt;msgid "Hello World!\n"&lt;br /&gt;&lt;b&gt;msgstr "Привет Мир!\n"&lt;/b&gt;&lt;/div&gt;&lt;p&gt;И пробуем реконфигурировать наш проект, собирать, и устанавливать. Остаётся проверить:&lt;/p&gt;&lt;div class="terminal"&gt;vest@vest-desktop:~/gnome-quod$ autoreconf &amp;amp;&amp;amp; ./configure &amp;amp;&amp;amp; make&lt;br /&gt;...&lt;br /&gt;checking whether NLS is requested... yes&lt;br /&gt;checking for intltool &amp;gt;= 0.40.4... 0.40.5 found&lt;br /&gt;checking for intltool-update... /usr/bin/intltool-update&lt;br /&gt;checking for intltool-merge... /usr/bin/intltool-merge&lt;br /&gt;checking for intltool-extract... /usr/bin/intltool-extract&lt;br /&gt;checking for xgettext... /usr/bin/xgettext&lt;br /&gt;checking for msgmerge... /usr/bin/msgmerge&lt;br /&gt;checking for msgfmt... /usr/bin/msgfmt&lt;br /&gt;checking for gmsgfmt... /usr/bin/msgfmt&lt;br /&gt;...&lt;br /&gt;checking for GLIB... yes&lt;br /&gt;...&lt;br /&gt;# INTLTOOL_MAKEFILE&lt;br /&gt;make  all-recursive&lt;br /&gt;make[1]: Вход в каталог `/home/vest/gnome-quod'&lt;br /&gt;Making all in src&lt;br /&gt;make[2]: Вход в каталог `/home/vest/gnome-quod/src'&lt;br /&gt;gcc -DHAVE_CONFIG_H -I. -I..    -DQUOD_LOCALEDIR=\"/usr/local/share/locale\" -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include   -I.. -g -O2 -MT quod-main.o -MD -MP -MF .deps/quod-main.Tpo -c -o quod-main.o `test -f 'main.c' || echo './'`main.c&lt;br /&gt;mv -f .deps/quod-main.Tpo .deps/quod-main.Po&lt;br /&gt;gcc -DQUOD_LOCALEDIR=\"/usr/local/share/locale\" -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include   -I.. -g -O2   -o quod quod-main.o  -lglib-2.0  &lt;br /&gt;...&lt;br /&gt;~/gnome-quod$ quod&lt;br /&gt;Привет Мир!&lt;br /&gt;$&lt;/div&gt;&lt;p&gt;Теперь можно вас поздравить с тем, что у вас «интернационализовано» ваше приложение. Далее попробуйте уже сами создать пакет с помощью &lt;samp class="file-name"&gt;make dist&lt;/samp&gt;, и просмотреть какие файлы распространяются с пакетом, а какие нет.&lt;/p&gt;&lt;p&gt;И ещё, не забывайте каждый раз обновлять файл &lt;samp class="file-name"&gt;POTFILES.in&lt;/samp&gt;, когда добавляете новые исходные файлы в &lt;samp class="file-name"&gt;src&lt;/samp&gt; каталог. И затем выполняйте &lt;samp class="file-name"&gt;intltool-update ru&lt;/samp&gt;. Она также обновляет файлы с переводом, если у вас добавляются новые строки, указывая вам на число переведённых или не переведённых строк. Смотрите, что будет если подправить исходный код следующим образом:&lt;/p&gt;&lt;div class="terminal"&gt;// main.c&lt;br /&gt;printf(_("Hello World!&lt;b&gt;!&lt;/b&gt;\n")); -- лишний восклицательный знак&lt;br /&gt;&lt;br /&gt;:~/gnome-quod$ cd po&lt;br /&gt;~/gnome-quod/po$ intltool-update ru&lt;br /&gt;... завершено.&lt;br /&gt;0 переведенных сообщений, 1 неточный перевод.&lt;br /&gt;~/gnome-quod/po$ cat ru.po&lt;br /&gt;&lt;br /&gt;#: ../src/main.c:13&lt;br /&gt;#, &lt;b&gt;fuzzy&lt;/b&gt;, c-format -- здесь он подправил, что наше исходной сообщение теперь другое. После исправления это слово можно стереть&lt;br /&gt;msgid "Hello World!!\n" -- ведь появился восклицательный знак&lt;br /&gt;msgstr "Привет Мир!&lt;b&gt;!&lt;/b&gt;\n" -- добавим его здесь&lt;/div&gt;&lt;p&gt;Вот собственно и всё, жду Ваших комментариев и дополнений.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3068039613872793354-7703831521578532285?l=vest-one.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vest-one.blogspot.com/feeds/7703831521578532285/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3068039613872793354&amp;postID=7703831521578532285' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/7703831521578532285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/7703831521578532285'/><link rel='alternate' type='text/html' href='http://vest-one.blogspot.com/2009/03/gnome-internationalization-glib.html' title='Gnome Internationalization или интернационализация средствами Glib и intltool'/><author><name>Vest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_4Y-F98DPD_0/SXS-6duFvGI/AAAAAAAAAAM/L0zgoDEP8u8/s1600-R/x_801fa864.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3068039613872793354.post-1723818957495050177</id><published>2009-03-04T14:50:00.024+03:00</published><updated>2009-03-04T16:04:04.655+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Web-камера Creative Vista IM (VF0420)</title><content type='html'>&lt;span style="font-family:verdana;"&gt;&lt;p&gt;Небольшое предисловие, мне понадобилась камера, которая работала бы в Linux'е (а именно у меня в Ubuntu 8.10), и упор делался на проприетарный Skype. И я купил камеру, модель &lt;a href="http://ru.europe.creative.com/products/product.asp?category=218&amp;subcategory=846&amp;product=16959"&gt;Creative Vista IM (VF0420)&lt;/a&gt;. Определяется эта камера следующим образом:&lt;/p&gt;&lt;div class="terminal"&gt;$ lsusb&lt;br /&gt;Bus 001 Device 002: ID 041e:4064 Creative Technology, Ltd&lt;/div&gt;&lt;p&gt;Могу сказать, что с нуля, камера на Desktop-машине работала на приложении &lt;a href="http://projects.gnome.org/cheese/"&gt;Cheese&lt;/a&gt; притормаживая, &lt;a href="www.videolan.org/vlc/"&gt;VLC&lt;/a&gt; ничего не открывал. Другие я не пробовал. Сам Skype определяет камеру, но к сожалению во время тестов и вещания вместо изображения рисует шумы в виде зелёных полос и точек.&lt;/p&gt;&lt;p&gt;Говорят, что модуль &lt;samp class="file-name"&gt;gspca&lt;/samp&gt; плохо поддерживает камеру. Готовое решение я сперва отыскал &lt;a href="http://www.rastageeks.org/ov51x-jpeg/index.php/Ov51xJpegHackedInstall"&gt;здесь&lt;/a&gt;, но потом (когда уже всё заработало по первому варианту) обнаружил &lt;a href="http://takeworld.blogspot.com/2008/10/web-creative-vista-im.html"&gt;здесь&lt;/a&gt; (на русском языке). Потому, чтобы не дублироваться решил привести ссылки на эти источники.&lt;/p&gt;&lt;p&gt;Вот, что хочу добавить: после установки модулей у меня перестал работать &lt;samp class="file-name"&gt;cheese&lt;/samp&gt;, плохо заработала &lt;samp class="file-name"&gt;camorama&lt;/samp&gt; (чёрно-белые 4-5 изображений, сжатых в один ряд по-горизонтали). Можно запустить &lt;samp class="file-name"&gt;gstreamer-properties&lt;/samp&gt; и попробовать принудительно выбрать устройство видеозахвата (на  &lt;code class="options"&gt;v4l&lt;/code&gt; работало, на &lt;code class="options"&gt;v4l2&lt;/code&gt; — нет)&lt;/p&gt;&lt;p&gt;Ещё, что не указано в источниках, проверьте принадлежит ли ваш пользователь группе &lt;code class="options"&gt;video&lt;/code&gt;. Название группы можно уточнить, просмотрев аттрибуты на файл &lt;samp class="file-name"&gt;/dev/video0&lt;/samp&gt;. Добавив пользователя в группу и перелогинившись в X у меня заработал Skype (2.0.0.72).&lt;/p&gt;&lt;p&gt;Удачи вам с вашими камерами. Даже купив камеру, которая создала мне по умолчанию видео устройство, мне всё равно пришлось выполнить вышеуказанное.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3068039613872793354-1723818957495050177?l=vest-one.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vest-one.blogspot.com/feeds/1723818957495050177/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3068039613872793354&amp;postID=1723818957495050177' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/1723818957495050177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/1723818957495050177'/><link rel='alternate' type='text/html' href='http://vest-one.blogspot.com/2009/03/web-creative-vista-im-vf0420.html' title='Web-камера Creative Vista IM (VF0420)'/><author><name>Vest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_4Y-F98DPD_0/SXS-6duFvGI/AAAAAAAAAAM/L0zgoDEP8u8/s1600-R/x_801fa864.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3068039613872793354.post-9037841580614552810</id><published>2009-02-27T01:08:00.010+03:00</published><updated>2009-03-05T00:01:46.848+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Autotools с нуля</title><content type='html'>&lt;span style="font-family:verdana;"&gt;&lt;p&gt;На этот раз, я постараюсь объяснить, возможно, знакомую всем по предыдущим постам тему об использовании Autotools. Мне пришлось этот путь пройти заново, и немного по-другому, для того, чтобы мой проект выглядел так, как того требуют &lt;a href="http://live.gnome.org/GnomeGames/"&gt;Gnome Games&lt;/a&gt;. Так получилось, что я написал им письмо о том, что у меня есть игра &lt;a href="http://sourceforge.net/projects/gquod"&gt;Gnome Quod&lt;/a&gt; (для Ubuntu вы сможете использовать мой автоматический репозиторий на &lt;a href="https://launchpad.net/%7Evest-84/+archive/ppa"&gt;PPA&lt;/a&gt;), и я бы хотел привести её к виду, соответствующему Gnome Games. Автор сборника игр, выделил мне ряд требований, решив которые, я смогу попробовать заново попросить его о включении моей игры в их пакет. Ну да ладно, это будет не скоро, и я сомневаюсь в этом, но давайте приступим к подготовке нового пакета, прежней игры.&lt;/p&gt;&lt;p&gt;Здесь я буду описывать конкретные вещи, что я делал, и по-возможности, что получал. Для подробной информации по тому или иному макросу, советую вам поискать в мануалах.&lt;/p&gt;&lt;p&gt;Для начала создадим папку с названием &lt;samp class="file-name"&gt;gnome-quod&lt;/samp&gt;. Так будет называться мой каталог, где будут находиться все исходники, весь пакет, откуда потом, мы будем создавать пакеты. Затем, создаём файл-шаблон &lt;samp class="file-name"&gt;configure.ac&lt;/samp&gt;. Его будет просматривать скрипт Autotools с названием &lt;samp class="file-name"&gt;autoreconf&lt;/samp&gt;. Этот скрипт занимает одно из главных положений, в нашем проекте. Первоначальное содержание &lt;samp class="file-name"&gt;configure.ac&lt;/samp&gt; будет следующим (комментарии только для осмысления.):&lt;/p&gt;&lt;div class="terminal"&gt;# ======================== initialization ===============================&lt;br /&gt;Здесь будет описываться инициализация проекта: имя, начальный каталог и пр.&lt;br /&gt;&lt;br /&gt;# ==================== basic compiler settings ==========================&lt;br /&gt;Основные опции компилятора (например, используемый язык)&lt;br /&gt;&lt;br /&gt;# ==================== checks for libraries =============================&lt;br /&gt;Проверка существования библиотек&lt;br /&gt;&lt;br /&gt;# ==================== checks for header files ==========================&lt;br /&gt;Проверка существования заголовочных файлов (если нужно)&lt;br /&gt;&lt;br /&gt;# ===== checks for typedefs, structures and compiler characteristics ====&lt;br /&gt;Проверка типов, структур, особенностей компилятора&lt;br /&gt;&lt;br /&gt;# ==================== checks for library functions =====================&lt;br /&gt;Проверка функций библиотек. Полезно, когда версия библиотеки мало ли соответствует требуемой, но в ней нет функции, или, например, вы не уточняете версию библиотеки, и потому в случае отсутствия функции, можете реализовать её сами.&lt;br /&gt;&lt;br /&gt;# ==================== generate files ===================================&lt;br /&gt;Здесь создаются файлы, которые потом используются make'ом&lt;br /&gt;&lt;br /&gt;AC_OUTPUT -- эта строка даёт всему начало&lt;/div&gt;&lt;p&gt;Порядок, который я описал, важен, но не существенно. Но главное не путать конец с началом. А вообще лучше придерживаться этого шаблона. Я встречал его во многих исходных файлах. Так что, будет у вас как у всех , если конечно, вам это не мешает. Теперь давайте добавим, в отдельные группы следующие макросы. Они должны описывать наш проект так, чтобы он работал.&lt;/p&gt;&lt;div class="terminal"&gt;# ======================== initialization ===============================&lt;br /&gt;AC_INIT([Gnome Quod],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[0.4.0],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[vest@mail.com],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[gnome-quod]) -- длинное имя, версия пакета, адрес куда стоит писать bug-репорты, краткое имя пакета&lt;br /&gt;&lt;br /&gt;AC_CONFIG_SRCDIR([src/main.c]) -- проверка безопасности, что по этому адресу находится заведомо известный исходный файл&lt;br /&gt;AC_CONFIG_HEADERS([config.h]) -- здесь создаётся заголовочный конфигурационный файл, который может быть использован в исходных файлах (в частности, там определена директива NDEBUG, см. ниже)&lt;br /&gt;AM_INIT_AUTOMAKE([-Wall -Werror dist-bzip2]) -- включаем компилятору все предостережения и ошибки, чтобы подробно видеть всё на экране, о процессе компилции, дистрибутив распространяется в виде упакованного файла bz2&lt;br /&gt;AC_DEFINE([NDEBUG], [], [Disable debugging information]) -- эта строка нужна лично мне, так как я использую assert функции, и если что, мне их нужно отключать&lt;br /&gt;&lt;br /&gt;# ==================== basic compiler settings ==========================&lt;br /&gt;AC_PROG_CC -- используем только Си компилятор&lt;br /&gt;AM_PROG_CC_C_O -- нужно использовать вместо AC_PROG_CC_C_O, позволяет использовать флаги для каждой цели в Makefile&lt;br /&gt;AC_HEADER_STDC -- проверка стандартных заголовочных файлов "stdlib.h", "stdarg.h", "string.h", "float.h". Это уже не нужно, так как они всегда есть, можно не проверять.&lt;br /&gt;&lt;br /&gt;# ==================== generate files ===================================&lt;br /&gt;AC_CONFIG_FILES([&lt;br /&gt;&amp;nbsp;&amp;nbsp;Makefile&lt;br /&gt;&amp;nbsp;&amp;nbsp;src/Makefile&lt;br /&gt;]) -- происходит вызов AC_OUTPUT для каждого файла.&lt;br /&gt;AC_OUTPUT -- создаёт много файлов, которые нам нужны&lt;/div&gt;&lt;p&gt;Далее создаём файлы-шаблоны &lt;samp class="file-name"&gt;Makefile.am&lt;/samp&gt; и &lt;samp class="file-name"&gt;src/Makefile.am&lt;/samp&gt;:&lt;/p&gt;&lt;div class="terminal"&gt;# Makefile.am&lt;br /&gt;SUBDIRS = src&lt;br /&gt;&lt;br /&gt;# src/Makefile.am&lt;br /&gt;bin_PROGRAMS = quod&lt;br /&gt;quod_SOURCES = main.c&lt;/div&gt;&lt;p&gt;Конечно же нам нужно создать &lt;samp class="file-name"&gt;main.c&lt;/samp&gt;, с неким Hello World'ом.&lt;/p&gt;&lt;div class="terminal"&gt;#include &amp;lt;config.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int main(int argc, char** argv)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf("Hello World!\n");&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 0;&lt;br /&gt;}&lt;/stdio.h&gt;&lt;/config.h&gt;&lt;/div&gt;&lt;p&gt;Вот собственно и всё, на данный момент, далее выполняем следующие команды:&lt;/p&gt;&lt;div class="terminal"&gt;~/gnome-quod$ autoreconf --install&lt;br /&gt;/usr/share/aclocal/lf_x11.m4:33: warning: underquoted definition of LF_PATH_XLIB&lt;br /&gt;/usr/share/aclocal/lf_x11.m4:33:   run info '(automake)Extending aclocal'&lt;br /&gt;/usr/share/aclocal/lf_x11.m4:33:   or see http://sources.redhat.com/automake/automake.html#Extending-aclocal&lt;br /&gt;configure.ac:14: installing `./compile'&lt;br /&gt;configure.ac:9: installing `./install-sh'&lt;br /&gt;configure.ac:9: installing `./missing'&lt;br /&gt;src/Makefile.am: installing `./depcomp'&lt;br /&gt;Makefile.am: installing `./INSTALL'&lt;br /&gt;Makefile.am: required file `./NEWS' not found&lt;br /&gt;Makefile.am: required file `./README' not found&lt;br /&gt;Makefile.am: required file `./AUTHORS' not found&lt;br /&gt;Makefile.am: required file `./ChangeLog' not found&lt;br /&gt;Makefile.am: installing `./COPYING'&lt;br /&gt;autoreconf: automake failed with exit status: 1&lt;/div&gt;&lt;p&gt;Как вы видите, получили ошибки. Связаны они с тем, что наш проект полностью соответствует GNU стандарту, согласно &lt;samp class="file-name"&gt;configure.ac&lt;/samp&gt;, но на деле таковым не является. Требуется создать самому следующие файлы, и желательно заполнить их. Вы можете посмотреть пример заполнения в любом серьёзном проекте, либо обратившись к &lt;a href="http://autotoolset.sourceforge.net/tutorial.html#SEC45"&gt;Learning the GNU development tools&lt;/a&gt;. Создадим их и попробуем ещё раз (я ещё создал файл &lt;samp class="file-name"&gt;THANKS&lt;/samp&gt;, название говорит само за себя):&lt;/p&gt;&lt;div class="terminal"&gt;$ ls&lt;br /&gt;AUTHORS  ChangeLog  configure.ac  Makefile.am  NEWS  README  THANKS src&lt;br /&gt;&lt;br /&gt;$ autoreconf --install&lt;br /&gt;/usr/share/aclocal/lf_x11.m4:33: warning: underquoted definition of LF_PATH_XLIB&lt;br /&gt;/usr/share/aclocal/lf_x11.m4:33:   run info '(automake)Extending aclocal'&lt;br /&gt;/usr/share/aclocal/lf_x11.m4:33:   or see http://sources.redhat.com/automake/automake.html#Extending-aclocal&lt;br /&gt;configure.ac:14: installing `./compile'&lt;br /&gt;configure.ac:9: installing `./install-sh'&lt;br /&gt;configure.ac:9: installing `./missing'&lt;br /&gt;src/Makefile.am: installing `./depcomp'&lt;br /&gt;Makefile.am: installing `./INSTALL'&lt;br /&gt;Makefile.am: installing `./COPYING'&lt;/div&gt;&lt;p&gt;Каждый раз, когда меняется один из шаблонов, следует вызывать &lt;samp class="file-name"&gt;autoreconf&lt;/samp&gt; без параметров. Иногда вы встретите в пакетах файл &lt;samp class="file-name"&gt;autogen.sh&lt;/samp&gt;, по идеи он похож с предыдущим. Не вдаваясь в подробности этапов конфигурирования, здесь осуществляется поочерёдный вызов некоторых скриптов, входящих в состав Autotools.&lt;/p&gt;&lt;p&gt;Можно избежать проблем с тем, что не существует файлов, для этого стоит "сказать", что мы не соответствуем стандарту, для этого следует изменить макрос &lt;code class="options"&gt;AM_INIT_AUTOMAKE&lt;/code&gt; следующим образом:&lt;/p&gt;&lt;div class="terminal"&gt;...&lt;br /&gt;AM_INIT_AUTOMAKE([-Wall -Werror dist-bzip2 foreign])&lt;br /&gt;...&lt;/div&gt;&lt;p&gt;Теперь поочерёдно выполним следующие команды, и взглянем на результат:&lt;/p&gt;&lt;div class="terminal"&gt;$ ./configure&lt;br /&gt;checking for a BSD-compatible install... /usr/bin/install -c&lt;br /&gt;checking whether build environment is sane... yes&lt;br /&gt;....&lt;br /&gt;checking for ANSI C header files... yes&lt;br /&gt;configure: creating ./config.status&lt;br /&gt;config.status: creating Makefile&lt;br /&gt;config.status: creating src/Makefile&lt;br /&gt;config.status: creating config.h&lt;br /&gt;config.status: config.h is unchanged&lt;br /&gt;config.status: executing depfiles commands&lt;br /&gt;&lt;br /&gt;$ make&lt;br /&gt;make  all-recursive&lt;br /&gt;make[1]: Вход в каталог `/home/vest/gnome-quod'&lt;br /&gt;Making all in src&lt;br /&gt;make[2]: Вход в каталог `/home/vest/gnome-quod/src'&lt;br /&gt;gcc -DHAVE_CONFIG_H -I. -I..     -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c&lt;br /&gt;mv -f .deps/main.Tpo .deps/main.Po&lt;br /&gt;gcc  -g -O2   -o quod main.o&lt;br /&gt;make[2]: Выход из каталога `/home/vest/gnome-quod/src'&lt;br /&gt;make[2]: Вход в каталог `/home/vest/gnome-quod'&lt;br /&gt;make[2]: Выход из каталога `/home/vest/gnome-quod'&lt;br /&gt;make[1]: Выход из каталога `/home/vest/gnome-quod'&lt;br /&gt;&lt;br /&gt;$ src/quod&lt;br /&gt;Hello World!&lt;/div&gt;&lt;p&gt;Здесь я решил не урезать вывод, чтобы вы могли заметить. Тут поэтапно проходит конфигурирование, компиляция программы и последующий её запуск. Если вам нужен распространяемый пакет, выполните следующую команду &lt;samp class="file-name"&gt;make dist&lt;/samp&gt;, в текущем каталоге вы получите следующие два файла:&lt;/p&gt;&lt;div class="terminal"&gt;$ ls -l gnome-quod-*&lt;br /&gt;-rw-r--r-- 1 vest vest 73173 2009-02-27 01:01 gnome-quod-0.4.0.tar.bz2&lt;br /&gt;-rw-r--r-- 1 vest vest 87568 2009-02-27 01:01 gnome-quod-0.4.0.tar.gz&lt;/div&gt;&lt;p&gt;Итак, на сегодня это пока всё. Вся вышеперечисленная информация, чуть более чем подробно объясняется в &lt;a href="http://www.lrde.epita.fr/%7Eadl/dl/autotools.pdf"&gt;этой&lt;/a&gt; презентации (&lt;a href="http://www.lrde.epita.fr/%7Eadl/autotools.html"&gt;http://www.lrde.epita.fr/~adl/autotools.html&lt;/a&gt;). Советую с ней ознакомиться.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3068039613872793354-9037841580614552810?l=vest-one.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vest-one.blogspot.com/feeds/9037841580614552810/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3068039613872793354&amp;postID=9037841580614552810' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/9037841580614552810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/9037841580614552810'/><link rel='alternate' type='text/html' href='http://vest-one.blogspot.com/2009/02/autotools.html' title='Autotools с нуля'/><author><name>Vest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_4Y-F98DPD_0/SXS-6duFvGI/AAAAAAAAAAM/L0zgoDEP8u8/s1600-R/x_801fa864.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3068039613872793354.post-915623957427056899</id><published>2009-01-25T22:58:00.006+03:00</published><updated>2009-01-25T23:37:58.034+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='KDE'/><category scheme='http://www.blogger.com/atom/ns#' term='Talks'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Игра на КДЕ. День последний.</title><content type='html'>&lt;span style="font-family:verdana;"&gt;&lt;p&gt;Вот собственно игра окончилась, можно сказать, по-честному, прошла она не очень, но в то же время всё-таки прошла.&lt;/p&gt;&lt;p&gt;Короче... я стёр KDE и поставил себе &lt;a href="http://www.psychocats.net/ubuntu/puregnome"&gt;Чистый Gnome&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Как высказались мои друзья, после KDE я потерял всякую мораль, стал замкнутым и отчуждённым. Глупо, но такое ощущение, что KDE может повлиять на человека не в лучшую сторону... не в лучшую.&lt;/p&gt;&lt;p&gt;Вы спросите буду ли я играть на KDE вновь? — Быть может, быть может. Я не хочу обещать, может быть это будет традицией, неделя Gnome, неделя KDE. Но если честно, KDE меня нервирует.&lt;/p&gt;&lt;p&gt;Я сожалею о том, что играл на KDE...&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3068039613872793354-915623957427056899?l=vest-one.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vest-one.blogspot.com/feeds/915623957427056899/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3068039613872793354&amp;postID=915623957427056899' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/915623957427056899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/915623957427056899'/><link rel='alternate' type='text/html' href='http://vest-one.blogspot.com/2009/01/blog-post_25.html' title='Игра на КДЕ. День последний.'/><author><name>Vest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_4Y-F98DPD_0/SXS-6duFvGI/AAAAAAAAAAM/L0zgoDEP8u8/s1600-R/x_801fa864.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3068039613872793354.post-2433098108124341352</id><published>2009-01-23T12:49:00.024+03:00</published><updated>2009-01-23T14:05:51.189+03:00</updated><title type='text'>Игра на КДЕ. День пятый.</title><content type='html'>&lt;span style="font-family:verdana;"&gt;&lt;p&gt;Вот идёт ещё один день моего смелого пребывания в KDE. Что у меня изменилось за последнее время? Я начинаю привыкать к проблемам со звуком и постоянно вылетающими теперь Konqueror и Firefox. Вчера Firefox удивил меня тем, что когда я заходил на какой-то из сайтов он тихо закрылся. Причем эту ошибку отследить было нельзя, потому я запустил его в консольном режиме, и вот что я получил:&lt;/p&gt;&lt;div class="terminal"&gt;$ firefox&lt;br /&gt;QPixmap: Invalid pixmap parameters&lt;br /&gt;&lt;br /&gt;(firefox:10500): GLib-GObject-CRITICAL **: g_object_unref: assertion `G_IS_OBJECT (object)' failed  &lt;-- многократное появление таких строчек&lt;br /&gt;&lt;br /&gt;The program 'firefox' received an X Window System error.&lt;br /&gt;This probably reflects a bug in the program.&lt;br /&gt;The error was 'RenderBadPicture (invalid Picture parameter)'.&lt;br /&gt;  (Details: serial 3472708 error_code 169 request_code 155 minor_code 7)&lt;br /&gt;  (Note to programmers: normally, X errors are reported asynchronously;&lt;br /&gt;   that is, you will receive the error a while after causing it.&lt;br /&gt;   To debug your program, run it with the --sync command line&lt;br /&gt;   option to change this behavior. You can then get a meaningful&lt;br /&gt;   backtrace from your debugger if you break on the gdk_x_error() function.)&lt;br /&gt;Locking assertion failure.  Backtrace:&lt;br /&gt;#0 /usr/lib/libxcb-xlib.so.0 [0xb80347c7]&lt;br /&gt;#1 /usr/lib/libxcb-xlib.so.0(xcb_xlib_lock+0x2e) [0xb803496e]&lt;br /&gt;#2 /usr/lib/libX11.so.6 [0xb6b2b619]&lt;br /&gt;#3 /usr/lib/libXrender.so.1(XRenderFreePicture+0x41) [0xb6bdcf41]&lt;br /&gt;#4 /usr/lib/libQtGui.so.4 [0xb41d86bf]&lt;br /&gt;... многократное появление похожих строчек связанных с этой библиотекой]&lt;br /&gt;#17 /usr/lib/libQtGui.so.4 [0xb41d2d5a]&lt;br /&gt;#18 /lib/tls/i686/cmov/libc.so.6(exit+0x89) [0xb7dc2d69]&lt;br /&gt;#19 /usr/lib/libgdk-x11-2.0.so.0 [0xb66e26b7]&lt;br /&gt;Segmentation fault&lt;/div&gt;&lt;p&gt;Меня насторожила строка, сразу же после выполнения команды. Похоже имеется какая-то проблема с QPixmap. И это мне не понравилось. Потому я решил обновиться на KDE 4.2-rc-1. Воспользовавшись ссылкой, так "заботливо" предоставленной моими друзьями, которые они аргументировали следующим образом:&lt;/p&gt;&lt;p&gt;&lt;b&gt;Один:&lt;/b&gt; &lt;a href="http://www.kubuntu.org/news/kde-4.2-rc1"&gt;http://www.kubuntu.org/news/kde-4.2-rc1&lt;/a&gt;&lt;br /&gt;Вест&lt;br /&gt;сделайте этот смертельный номер&lt;br /&gt;один хрен потом вам кеды сносить, а то и всю ось переставлять :)&lt;br /&gt;&lt;b&gt;Другой:&lt;/b&gt; Да, поставьте бету, ведь вам уже всё равно :)&lt;/p&gt;&lt;p&gt;Заодно и помогли ссылкой. Аргументы были весомые, я не мог ничего сказать плохого в сторону KDE и решил обновиться. Скачивать пришлось около 250 мб пакетов, что собственно я и сделал.&lt;/p&gt;&lt;p&gt;Надо добавить, что обновление может не пройти с первого раза, по разным причинам, возможно надо было делать это при закрытом KDE. Но обновиться можно, нужно быть настойчивее. Одна из причин может быть такой:&lt;/p&gt;&lt;div class="terminal"&gt;E: /var/cache/apt/archives/kdebase-workspace-data_4%3a4.1.96-0ubuntu4~intrepid1~ppa1_all.deb: попытка перезаписать /usr/share/doc/kde4/HTML/en/kcontrol/windowspecific/index.cache.bz2, который уже имеется в пакете kde-window-manager&lt;/div&gt;&lt;p&gt;Итак, обновление прошло почти с первого раза... После гламурного, красивого и приятного глазу моего KDE 4.1.4 я получил почти не изменившееся окно:&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4Y-F98DPD_0/SXmWYqAbTTI/AAAAAAAAACQ/XZDtPfwK1O8/s1600-h/snapshot26png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://1.bp.blogspot.com/_4Y-F98DPD_0/SXmWYqAbTTI/AAAAAAAAACQ/XZDtPfwK1O8/s320/snapshot26png" border="0" alt=""id="BLOGGER_PHOTO_ID_5294428187287833906" /&gt;&lt;/a&gt;&lt;p&gt;Что сразу хочется отметить: изменилось меню в красивую сторону, иконки раньше имеющие баг на протяжении года жизни KDE в System Tray'e, связаный с некорректным отображением прозрачности в виде чёрного квадрата вокруг них, сейчас исправились. Почему-то пришла идея, что на чёрном чёрный квадрат не видно, и потому решили в Tray'е "вырезать" прямоугольник и закрасить его чёрным цветом, что по-моему сделано почти правильно. Ведь это же KDE! Меню тоже похорошело, приобрело красивую рамочку. Кстати сказать о плазмоидах. Теперь плазмоиды могут масштабировать так, как нормальные окна, то есть один из углов становится фиксированным, а другой перемещается за мышью (раньше это было от центра плазмоида, и он постоянно уходил за пределы экрана). Ещё хочется добавить то, что при масштабировании не происходит увеличения или уменьшения иконок, то есть всё вроде бы даже хорошо и KDE могло бы заполучить ещё одного пользователя, но... Как вы видите, справа внизу я оставил ошибку, связанную с Phonon'ом. Но у меня звук продолжал работать, Amarok играл, как? Не знаю, наверное через PulseAudio.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Удивительная вещь №5&lt;/b&gt; заключается в том, что можно вытянуть уведомление, что я и сделал, но после чего остался маленький квадратик, тоже плазмоид. Промастабировав его и развернув, видно, что antialiasing по-прежнему не работает. Причём на некоторые рамки распространяется, но на шрифты нет. Вообще-то, вращение плазмоидов является основной фишкой KDE4, так как до этого я нигде похожего не видел. Зачем это нужно? Я пока не решил, наверняка это требует ресурсов (раз уж это у меня даже на выключенных эффектах подтормаживает). Зато представьте, у вас немного перекошен стол, на котором стоит монитор и "о чудо!", вы можете внести поправку на все плазмоиды, которые есть на рабочем столе. Вращение окон пока остаётся за гранью мыслемого... Подождём.&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4Y-F98DPD_0/SXmYYarUdVI/AAAAAAAAACY/MHC0q4TpPiI/s1600-h/snapshot27png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://1.bp.blogspot.com/_4Y-F98DPD_0/SXmYYarUdVI/AAAAAAAAACY/MHC0q4TpPiI/s320/snapshot27png" border="0" alt=""id="BLOGGER_PHOTO_ID_5294430382196028754" /&gt;&lt;/a&gt;&lt;p&gt;Ах да! Я вспомнил, опять же вчера, то есть на четвёртый день, меня поразило то, что безопасность KDE может быть под угрозой. Не верите? Итак, &lt;b&gt;Удивительная вещь №6&lt;/b&gt;. Включив однажды компьютер, залогинившисть в KDE, мне предстало следующее окошко:&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4Y-F98DPD_0/SXmaQJgzr5I/AAAAAAAAACg/z_uLRfTOr-E/s1600-h/snapshot16png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://3.bp.blogspot.com/_4Y-F98DPD_0/SXmaQJgzr5I/AAAAAAAAACg/z_uLRfTOr-E/s320/snapshot16png" border="0" alt=""id="BLOGGER_PHOTO_ID_5294432439172837266" /&gt;&lt;/a&gt;&lt;p&gt;Не знаю как вы, но я испугался, хорошо, что у меня есть KDE и оно мена предупредило, что моя мышка может быть &lt;a href="http://uk.youtube.com/watch?v=qItugh-fFgg"&gt;захвачена&lt;/a&gt;. Теперь моя безопасность уже выросла. Кстати сказать, Konqueror не стал стабильней и по-прежнему аварийно завершался... и не он один, другие, неизвестные мне приложения, закрывались тоже. Вот, например, что происходит при завершении System Tray'a (GTK приложения остаются обделёнными, в то время как QT'шные нет. KDE - единоличник!):&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_4Y-F98DPD_0/SXmbhMrqrQI/AAAAAAAAACo/89XU2rhgnNA/s1600-h/snapshot23png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://2.bp.blogspot.com/_4Y-F98DPD_0/SXmbhMrqrQI/AAAAAAAAACo/89XU2rhgnNA/s320/snapshot23png" border="0" alt=""id="BLOGGER_PHOTO_ID_5294433831593094402" /&gt;&lt;/a&gt;&lt;p&gt;Но и эта вещь легко исправляется, достаточно закрыть эти окошки, как они тут же радостные, что я их освободил от оконного плена, возвращаются назад к себе в tray. Но радость Gajim'a была больше чем у Pidgin'a. Он показал мне уведомление о том, что пришло новое сообщение (конвертик), но на радостях забыл, что при этом "человечек" должен скрыться. То есть теперь это человечек с конвертиком в руках (кстати были случаи, когда конвертик был прикреплён к незадачливому почтальону сзади, как у Карлсона):&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4Y-F98DPD_0/SXmcnZvGf-I/AAAAAAAAACw/1QOy1-zKIlU/s1600-h/snapshot21png.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 76px;" src="http://3.bp.blogspot.com/_4Y-F98DPD_0/SXmcnZvGf-I/AAAAAAAAACw/1QOy1-zKIlU/s320/snapshot21png.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5294435037688004578" /&gt;&lt;/a&gt;&lt;p&gt;Запустив так привычный мне inkscape (мне нужно было подрисовать один градиент в SVG-файле) я получил &lt;b&gt;Удивительную вещь №7&lt;/b&gt;. В чём она заключается? Это в том, что настройка градиента не работает так, как мне того надо. Там, где вы не видите шкалу цветов учтите, что она на самом деле есть!&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4Y-F98DPD_0/SXmkMrvrfTI/AAAAAAAAAC4/8yRu55LZ7II/s1600-h/snapshot28png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://1.bp.blogspot.com/_4Y-F98DPD_0/SXmkMrvrfTI/AAAAAAAAAC4/8yRu55LZ7II/s320/snapshot28png" border="0" alt=""id="BLOGGER_PHOTO_ID_5294443374758821170" /&gt;&lt;/a&gt;&lt;p&gt;В довершении хочется привести фразу одного из моих друзей, конечно же за вычетом идиоматических выражений: "оно кривое, с ****ным юзабилити и для него фактически нет родных приложений на куте4, а те вменяемые, что есть на куте4, работают и без кде4 на ура и вообще никак к нему не относятся"&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3068039613872793354-2433098108124341352?l=vest-one.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vest-one.blogspot.com/feeds/2433098108124341352/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3068039613872793354&amp;postID=2433098108124341352' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/2433098108124341352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/2433098108124341352'/><link rel='alternate' type='text/html' href='http://vest-one.blogspot.com/2009/01/blog-post_23.html' title='Игра на КДЕ. День пятый.'/><author><name>Vest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_4Y-F98DPD_0/SXS-6duFvGI/AAAAAAAAAAM/L0zgoDEP8u8/s1600-R/x_801fa864.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4Y-F98DPD_0/SXmWYqAbTTI/AAAAAAAAACQ/XZDtPfwK1O8/s72-c/snapshot26png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3068039613872793354.post-1748599100894611235</id><published>2009-01-21T10:01:00.022+03:00</published><updated>2009-01-23T12:26:17.280+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='KDE'/><category scheme='http://www.blogger.com/atom/ns#' term='Talks'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Игра на КДЕ. День третий.</title><content type='html'>&lt;span style="font-family:verdana;"&gt;&lt;p&gt;Вот и наступил третий день моего пребывания в KDE 4.1.4. Что я могу сказать? В битве с KDE чувство победы плавно переходило от меня к KDE, и от KDE ко мне: как только я зашёл в этот DE, первым делом я обнаружил пропажу звука в музыкальных приложениях, так заботливо запущенного день назад. О звуке я расскажу попозже. Для начала мне стоит сказать, что как только я открыл &lt;a href="http://packages.ubuntu.com/intrepid/konqueror"&gt;konqueror&lt;/a&gt; на страничке моего блога, мне не понравился цвет шрифта вкладок, который я захотел изменить. Конечно же я полез в &lt;samp class="file-name"&gt;systemsettings&lt;/samp&gt; (теперь уже локализованный в "Параметры Системы"). "Завоеватель" этого перепугался и выдал мне последовательных два окна:&lt;/p&gt;&lt;a href="http://1.bp.blogspot.com/_4Y-F98DPD_0/SXbK1PLQDiI/AAAAAAAAABo/KwT7rK34UZM/s1600-h/fatal.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 306px; height: 320px;" src="http://1.bp.blogspot.com/_4Y-F98DPD_0/SXbK1PLQDiI/AAAAAAAAABo/KwT7rK34UZM/s320/fatal.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5293641427976195618" /&gt;&lt;/a&gt;&lt;p&gt;Ну ничего, эта проблема всего-навсего с &lt;samp class="file-name"&gt;konquer&lt;/samp&gt;'ом у меня бывала всего два раза за два дня, так, что я думаю это не страшно. Теперь вернёмся к звуку. Основная проблема была в том, что у меня пропало воспроизведение музыкальных файлов. В моём Gnome для воспроизведения использовался backend Xine, в то время как здесь его не было. Чтобы голову себе не забивать, признаюсь откровенно, я установил метапакет &lt;a href="http://packages.ubuntu.com/intrepid/kubuntu-desktop"&gt;kubuntu-desktop&lt;/a&gt;. Что это даёт? Собственно там прилагаются всевозможные попытке по тому, чтобы всё работало. В частности звук. Проблема вроде решилась, но остаются некоторые нюансы. Могу сказать, что звук работает теперь. Но для этого приходится сперва закрыть все приложения его использующие (в том числе и GTK+), потом на всякий случай перегрузить &lt;samp class="file-name"&gt;alsa-utils&lt;/samp&gt; и &lt;samp class="file-name"&gt;pulseaudio&lt;/samp&gt;. Собственно после этих преобразований, у меня получилось всё перенаправить через PulseAudio. Запустив &lt;samp class="file-name"&gt;pavucontrol&lt;/samp&gt;, вы можете это проверить:&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4Y-F98DPD_0/SXbmPEM6ynI/AAAAAAAAABw/kcj-9Y49BxM/s1600-h/snapshot14png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://3.bp.blogspot.com/_4Y-F98DPD_0/SXbmPEM6ynI/AAAAAAAAABw/kcj-9Y49BxM/s320/snapshot14png" border="0" alt=""id="BLOGGER_PHOTO_ID_5293671558520949362" /&gt;&lt;/a&gt;&lt;p&gt;Если вы заметили, здесь видно, что сейчас воспроизводится Skype, Amarok, Gajim (paplay). То есть, я позволяю себе использование Звукового Сервера &lt;a href="http://ru.wikipedia.org/wiki/PulseAudio"&gt;PulseAudio&lt;/a&gt;, который разрешает мне одновременное использование звуковой карточки приложениями разных типов.&lt;/p&gt;&lt;p&gt;Теперь, &lt;b&gt;Удивительная вещь №4&lt;/b&gt;. Даже после установки метапакета &lt;a href="http://packages.ubuntu.com/intrepid/kubuntu-desktop"&gt;kubuntu-desktop&lt;/a&gt; у меня с предыдущего сайта про PulseAudio произошла загрузка вот такого SVG-файла. Да-да, именно, почему-то KDE пока не умеет отображать SVG-файлы ни в konqueror'e, ни в firefox'e:&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4Y-F98DPD_0/SXbnmf3-tTI/AAAAAAAAAB4/inY53vRUmmE/s1600-h/snapshot16.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 226px; height: 320px;" src="http://4.bp.blogspot.com/_4Y-F98DPD_0/SXbnmf3-tTI/AAAAAAAAAB4/inY53vRUmmE/s320/snapshot16.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5293673060597937458" /&gt;&lt;/a&gt;&lt;p&gt;Хорошо, хоть есть &lt;a href="http://www.inkscape.org/"&gt;inkscape&lt;/a&gt;, он помог мне исправить ситуацию. Я качал картинку и открыл её руками. А также, немного погуглив, обнаружил интересный проект &lt;a href="http://svg.kde.org/"&gt;KSVG&lt;/a&gt;. Очень интересно, но к сожалению мне не хочется его компилировать, так как в репозиториях его нет. Равно как и версии для KDE4 пока тоже видимо нет. А ещё хочу снова сказать, что konqueror у меня опять закрылся. Видимо он не выдерживает более 4-ёх вкладок при открытии 5-ой Google. Ниже приводится правильный оригинал верхнего изображения:&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4Y-F98DPD_0/SXbqT8QZRcI/AAAAAAAAACA/4gRpMwNROaM/s1600-h/PulseAudio_diagram_linux_ru.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 226px; height: 320px;" src="http://1.bp.blogspot.com/_4Y-F98DPD_0/SXbqT8QZRcI/AAAAAAAAACA/4gRpMwNROaM/s320/PulseAudio_diagram_linux_ru.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5293676040333903298" /&gt;&lt;/a&gt;&lt;p&gt;Напоследок покажу вам текущий рабочий стол, который я решил допилить себе именно так, чтобы мне стало удобно. Но, хочу сказать... &lt;b&gt;Удивительная вещь №5&lt;/b&gt;: те, кто столкнётся с установкой тем под KDE4 обнаружат "приятную" новость, оказывается, так просто скачать и поставить тему или plasmoid под DE не так уж и просто. "Почему?" - спросите вы. Потому что, их так просто не установить. &lt;a href="http://risto.kurppa.fi/blog/easier-installation-of-kde4-themes-a-deb-package-and-a-repository/"&gt;Здесь&lt;/a&gt; я нашёл одну статью, которая "обещает" быструю установку тем под Plasma, а вот &lt;a href="http://pramodrt.wordpress.com/2008/05/20/changing-the-kde4-plasma-theme/"&gt;здесь&lt;/a&gt; "чуть медленнее". По итогам проделанной работы я поломал внешний вид KDE полностью, и посетовал, что не существует более простого способа установки тем как в Gnome из tar архивов. Но зато, я нашёл у KDE встроенный менеджер по управлению внешним видом, виджетами и прочим. Назвать его точно не могу, одно из предположений это &lt;samp class="file-name"&gt;superkaramba&lt;/samp&gt;, он позволяет скачивать апплеты с &lt;a href="http://www.kde-look.org"&gt;KDE-look.org&lt;/a&gt;, но почему-то количество доступных в этом приложении апплетов, несравнимо меньше чем имеется оных на сайте. Решение проблемы снова просто - нужно либо скомпилировать всё, что вам понравится, либо попробовать поискать скомпилированный кем-нибудь пакет. Я, к сожалению ничего подходящего не нашёл, возможно вам повезёт больше, так как я решил не тратить на это время свыше 10 минут. Потому смотрите на то, что у меня получилось хотя бы так:&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4Y-F98DPD_0/SXbtS9NRteI/AAAAAAAAACI/hqU3C00bxWE/s1600-h/Red_eyed_KDE.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://1.bp.blogspot.com/_4Y-F98DPD_0/SXbtS9NRteI/AAAAAAAAACI/hqU3C00bxWE/s320/Red_eyed_KDE.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5293679321944274402" /&gt;&lt;/a&gt;&lt;p&gt;Комментарий по этой картинке было тоже много, как и по первой, которая, по мнению "неназвавшихся" порочит славное имя KDE. Однако здесь было недовольство по поводу синеватости рабочего стола. Ну что ж, пусть, мне так удобно, благодаря таким нежным цветам и яркостью моего монитора, я постарался снизить риск развития заболевания "Красноглазия", которое могу в скором будущем подхватить, если конечно не потру KDE раньше. Хотя с музыкой и Firefox'ом KDE не так страшно (konqueror меня разочаровал своими аварийными завершениями и постоянным беспокойством о том, что я отправляю гнусные скриншоты в этот блог, волнуясь либо за мою, либо за его безопасность).&lt;/p&gt;&lt;p&gt;Но всё равно, несмотря на всяческие ухищрения оно всё ещё имеет популярность у пользователей&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3068039613872793354-1748599100894611235?l=vest-one.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vest-one.blogspot.com/feeds/1748599100894611235/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3068039613872793354&amp;postID=1748599100894611235' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/1748599100894611235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/1748599100894611235'/><link rel='alternate' type='text/html' href='http://vest-one.blogspot.com/2009/01/blog-post_21.html' title='Игра на КДЕ. День третий.'/><author><name>Vest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_4Y-F98DPD_0/SXS-6duFvGI/AAAAAAAAAAM/L0zgoDEP8u8/s1600-R/x_801fa864.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4Y-F98DPD_0/SXbK1PLQDiI/AAAAAAAAABo/KwT7rK34UZM/s72-c/fatal.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3068039613872793354.post-8753743656655838349</id><published>2009-01-19T20:59:00.023+03:00</published><updated>2009-01-19T23:15:10.533+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='KDE'/><category scheme='http://www.blogger.com/atom/ns#' term='Talks'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Игра на КДЕ. Предисловие</title><content type='html'>&lt;span style="font-family:verdana;"&gt;&lt;p&gt;Это и последующие сообщения появились в результате одного или нескольких событий. Да, к сожалению, я хотел описывать в своём блоге только то, что может быть полезно людям, столкнувшимся с Ubuntu, программированием, то есть всем тем, что связано с компьютером.&lt;br /&gt;В один, прекрасный день, один из друзей по переписке отыскал в интернете флеш-игру под названием &lt;a href="http://www.globulos.com"&gt;Globulos&lt;/a&gt;. Рассказывать про эту игру можно долго, но это не являлось темой текущего сообщения. Единственное, что можно выделить, что при соответствующей небольшой тренировке вполне можно устраивать соревнования. Главное, чтобы была причина...&lt;/p&gt;&lt;p&gt;... И вот причина появилась. Моими друзьями в количестве 2 "штук" (дабы их не деанонимизировать, не буду приводить их имена и ники), была разработана и предложена, а потом принята причина игры на "что-то". И как вы поняли из темы поста, это что-то было — установка проигравшим менеджера рабочего стола KDE 4, по возможности, последней версией (на время написания статьи, у меня в локальном репозитарии Бунты была версия 4.1.4).&lt;/p&gt;&lt;p&gt;Игра была напряжённой, сперва побеждал я со счётом 2:1. Кстати сказать, по комментариям моих друзей и по статистике, у меня были неплохие шансы на победу, всем казалось, что у меня есть транспортир. Так как игра шла до 3 очков, мне достаточно было забить один гол, но...&lt;/p&gt;&lt;p&gt;... но судьба-злодейка не позволила мне забить этот мячик ни разу, и потому, методично проигрывая, сперва 2:2, потом 3:2, я, можно сказать, стал &lt;i&gt;счастливым обладателем&lt;/i&gt; пакета &lt;a href="http://packages.ubuntu.com/intrepid/kde"&gt;kde&lt;/a&gt;, а потом уже и &lt;a href="http://packages.ubuntu.com/intrepid/kdebase"&gt;kdebase&lt;/a&gt;. Первый пакет это установка базового KDE, а второй — его основных приложений (ведь это было бы не по правилам уговора, поставить KDE и продолжать пользоваться Nautilus'ом).&lt;/p&gt;&lt;p&gt;Если учесть то, что я никогда в жизни не сидел и не ставил KDE с нуля, мне пришлось это сделать. Ставятся пакеты относительно быстро, если локальный репозиторий, и занимают где-то 700-800 мб свободного пространства. Первое, что бросается в глаза, это интерфейс чем-то сравнимый с Windows Vista. Вы уведите его чёрные рамочки до тех пор, пока я не найду как это всё можно сменить. На рисунке ниже, вы видите "коробочный" интерфейс, где одновременно помещены разные приложения, без предварительной настройки их внешнего вида:&lt;/p&gt;&lt;a href="http://3.bp.blogspot.com/_4Y-F98DPD_0/SXTRMJYcU5I/AAAAAAAAAAw/Nu0_Md2QOkA/s1600-h/snapshot1yc1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://3.bp.blogspot.com/_4Y-F98DPD_0/SXTRMJYcU5I/AAAAAAAAAAw/Nu0_Md2QOkA/s320/snapshot1yc1.png" border="0" alt="Знакомство с КДЕ"id="BLOGGER_PHOTO_ID_5293085468674249618" /&gt;&lt;/a&gt;&lt;p&gt;Вообще, внешний вид, это всего лишь мелочь, подумал я, как оказалось не совсем, мало того, что мои Gnome-приложения, потеряли свой первоначальный вид, так оказалось, что KDE со своим декоратором тормозит у меня так сильно, что я начал жалеть об этой игре вообще.&lt;/p&gt;&lt;p&gt;Пока я решал проблемы с увеличением производительности моей, я столкнулся с &lt;b&gt;Удивительными вещами&lt;/b&gt;. Они могут быть неудивительны для вас, но я, ни разу не видевший KDE больше 10 минут, после использования Gnome в течении полутора лет, начал удивляться.&lt;/p&gt;&lt;p&gt;Итак &lt;b&gt;Удивительная вещь №1&lt;/b&gt;: в Gnome, когда происходит выбор темы или цветов рабочего окружения, окна изменяют свой окрас мгновенно. В KDE для этого нужно смотреть в маленький прямоугольник наверху, что на мой взгляд очень неудобно. Ведь, получается, что мне нужно вообразить как будет выглядеть моё окно, после применения параметров. Конечно, можно сохранить промежуточный профиль с цветами, чтобы попробовать подбирать дальше, но это решение не для меня.&lt;/p&gt;&lt;a href="http://4.bp.blogspot.com/_4Y-F98DPD_0/SXTUYBN1wHI/AAAAAAAAAA4/J309pW7Akyk/s1600-h/snapshot2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://4.bp.blogspot.com/_4Y-F98DPD_0/SXTUYBN1wHI/AAAAAAAAAA4/J309pW7Akyk/s320/snapshot2.png" border="0" alt="Вот и цвета"id="BLOGGER_PHOTO_ID_5293088971175608434" /&gt;&lt;/a&gt;&lt;p&gt;&lt;b&gt;Удивительная вещь №2&lt;/b&gt; заключается в том, что оказывается чтобы применить сглаживание к шрифтам (а я скажу вам, что оно по-умолчанию ужасно) мне нужно перезапустить приложения, если только не само KDE. Ах да, ещё можно ввести дополнение к этой удивительной вещи. Взгляните, оказывается в KDE не хватает места для сообщений в маленьких диалоговых окнах. Поэтому там существует полоса прокрутки. Жаль, конечно, что создатели не предусмотрели этого и не вставили перевод строки (ведь Gnome сам переносит и всё умещает. Такая вот у них политика):&lt;/p&gt;&lt;a href="http://3.bp.blogspot.com/_4Y-F98DPD_0/SXTXfYibpYI/AAAAAAAAABA/TU1Urqj6WK0/s1600-h/snapshot4.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://3.bp.blogspot.com/_4Y-F98DPD_0/SXTXfYibpYI/AAAAAAAAABA/TU1Urqj6WK0/s320/snapshot4.png" border="0" alt=""id="BLOGGER_PHOTO__5293092396229961090" /&gt;&lt;/a&gt;&lt;p&gt;&lt;b&gt;Удивительная вещь №3&lt;/b&gt;: KDE поражает своими настройками графического интерфейса (это первое, с чем я столкнулся). Вы можете менять тут ВСЁ, вплоть до бесполезных, на мой взгляд, вещей. Можно взять красивую тему, и испортить её настройками KDE, либо взять плохую тему, и настройки KDE, думаю, вам не помогут. Можно убирать кнопки управления экраном, можно их добавить, удалить, переместить, можно изменить даже толщину бордюра окон, причем безо всяких мыслимых ограничений. Такое ощущение, что скрипту, где содержится команда &lt;samp class="file-name"&gt;'rm -rf /'&lt;/samp&gt; дали права root'а:&lt;/p&gt;&lt;a href="http://1.bp.blogspot.com/_4Y-F98DPD_0/SXTaZS-p31I/AAAAAAAAABI/mBLPu-giJkE/s1600-h/snapshot11png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://1.bp.blogspot.com/_4Y-F98DPD_0/SXTaZS-p31I/AAAAAAAAABI/mBLPu-giJkE/s320/snapshot11png" border="0" alt=""id="BLOGGER_PHOTO__5293095590193389394" /&gt;&lt;/a&gt;&lt;p&gt;Напоследок, мне понравилось не только то, что Wine после завершения полноэкранного OpenGl приложения "упорядочил" мне окна:&lt;/p&gt;&lt;a href="http://3.bp.blogspot.com/_4Y-F98DPD_0/SXTbzR8TIxI/AAAAAAAAABQ/YsHivBdKIiA/s1600-h/snapshot3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://3.bp.blogspot.com/_4Y-F98DPD_0/SXTbzR8TIxI/AAAAAAAAABQ/YsHivBdKIiA/s320/snapshot3.png" border="0" alt=""id="BLOGGER_PHOTO__5293097136103301906" /&gt;&lt;/a&gt;&lt;p&gt;но и то, что пока я писал эту статью я получил вот это:&lt;/p&gt;&lt;a href="http://2.bp.blogspot.com/_4Y-F98DPD_0/SXTdAV0m5nI/AAAAAAAAABg/-GsqX_GzXrg/s1600-h/snapshot10png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://2.bp.blogspot.com/_4Y-F98DPD_0/SXTdAV0m5nI/AAAAAAAAABg/-GsqX_GzXrg/s320/snapshot10png" border="0" alt=""id="BLOGGER_PHOTO__5293098459994711666" /&gt;&lt;/a&gt;&lt;p&gt;Я думаю, на сегодня пока всё. У меня на тот день, осталось много неразрешённых проблем, таких как отсутствие звука в системе (похоже это связано с использованием мной PulseAudio, отключение декораций, увеличение производительности всего, что тормозит). А ещё, мне хочется закончить эту статью мыслью: "Мне стыдно, что я поставил KDE". Но неделя ещё длинная, я успею исправить все эти проблемы.&lt;/p&gt;&lt;p&gt;Мне кажется, или мои глаза становятся красными...&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3068039613872793354-8753743656655838349?l=vest-one.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vest-one.blogspot.com/feeds/8753743656655838349/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3068039613872793354&amp;postID=8753743656655838349' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/8753743656655838349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/8753743656655838349'/><link rel='alternate' type='text/html' href='http://vest-one.blogspot.com/2009/01/blog-post.html' title='Игра на КДЕ. Предисловие'/><author><name>Vest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_4Y-F98DPD_0/SXS-6duFvGI/AAAAAAAAAAM/L0zgoDEP8u8/s1600-R/x_801fa864.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4Y-F98DPD_0/SXTRMJYcU5I/AAAAAAAAAAw/Nu0_Md2QOkA/s72-c/snapshot1yc1.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3068039613872793354.post-2306321025962332312</id><published>2008-11-16T14:21:00.005+03:00</published><updated>2008-11-16T14:30:39.059+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Создаём пакет для Ubuntu. Часть 6. Использование Autotools</title><content type='html'>&lt;span style="font-family:verdana;"&gt;&lt;p&gt;Итак, небольшое вступление... После многочисленных поисков, был найден небольшой, первый, я бы сказал, шаг к тому, чтобы осознать как же все-таки создаются распространяемые дистрибутивы. Для меня, основной сложностью в усвоении этой методики - это была проблема в познании языка M4, равно как и сама концепция файла &lt;samp class="file-name"&gt;configure.in&lt;/samp&gt;. Видите ли, чтобы создать пакет требуется всего немного: написать вручную файл &lt;samp class="file-name"&gt;configure.in&lt;/samp&gt;, в каждом используемом каталоге создать свой файл &lt;samp class="file-name"&gt;Makefile.am&lt;/samp&gt;, потом выполнить ряд скриптов, сконфигурировать пакет и, если все прошло удачно, собрать его командой &lt;samp class="file-name"&gt;make&lt;/samp&gt;.&lt;/p&gt;&lt;p&gt;Возможно, в этом нет ничего сложного, но многие конфигурационные шаблоны отличаются друг от друга, и для меня оказалось сложным просмотреть некоторую идею языка m4. Ведь, условно, нужно описать пакет, проверить зависимости, указать цели назначения и т.д... Ниже, я опишу простой способ создания пакета, который можно собрать, скомпилировать и даже установить. Если честно, этот способ прост, но во всяком случае позволил мне сдвинуться с, почти, мертвой точки.&lt;/p&gt;&lt;p&gt;Продолжим. Для следующего метода вам понадобятся так называемые &lt;samp class="file-name"&gt;autotools&lt;/samp&gt; или &lt;samp class="file-name"&gt;autotoolset&lt;/samp&gt;. Найти их можно по этому адресу &lt;a href="http://autotoolset.sourceforge.net/"&gt;http://autotoolset.sourceforge.net/&lt;/a&gt;. Здесь пакет доступен в качестве либо исходных кодов, либо в виде rpm пакета. Я думаю вам не составит труда воспользоваться утилитой &lt;samp class="file-name"&gt;alien&lt;/samp&gt; для преобразования rpm пакета в deb.&lt;/p&gt;&lt;p&gt;После того, как вы установите его, вам следует изменить некоторые скрипты с помощью текстового редактора. А именно, исправить первую строку, где встречается использование &lt;samp class="file-name"&gt;sh&lt;/samp&gt; на &lt;samp class="file-name"&gt;bash&lt;/samp&gt;:&lt;/p&gt;&lt;div class="terminal"&gt;Вместо&lt;br /&gt;#!/bin/sh&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;Записать&lt;br /&gt;#!/bin/bash&lt;br /&gt;...&lt;/div&gt;&lt;p&gt;Если так не сделать, то возможна работа с ошибками таких скриптов, как &lt;samp class="file-name"&gt;acmkdir&lt;/samp&gt; и &lt;samp class="file-name"&gt;gpl&lt;/samp&gt;, генерирующих необходимые файлы и директории.&lt;/p&gt;&lt;p&gt;Далее, когда вы все сделали, и имеете систему подготовленной к использованию, давайте попробуем создать наш первый распространяемый пакет, который так и назовем Hello. Кстати сказать, если вам нужен первоисточник, где я почерпнул необходимую информацию, то советую вам ознакомится с документом &lt;a href="http://www.amath.washington.edu/~lf/tutorials/autoconf/toolsmanual_toc.html"&gt;Developing software with GNU&lt;/a&gt; раздел &lt;a href="http://www.amath.washington.edu/~lf/tutorials/autoconf/toolsmanual.html#SEC40"&gt;Hello world with acmkdir&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Перейдите в любой каталог, где бы вы хотели начать создание своего приложения. В моем примере, я решил использовать каталог &lt;samp class="file-name"&gt;/tmp&lt;/samp&gt; и выполните в нем команду &lt;samp class="file-name"&gt;acmkdir hello&lt;/samp&gt;. В качестве аргумента я указал название моего пакета &lt;samp class="file-name"&gt;hello&lt;/samp&gt;. Далее, оно задаст вам ряд вопросов, касающихся разработчика, и, в итоге, вам нужно согласиться с тем, что вы ввели. Вы должны получить на экране следующее:&lt;/p&gt;&lt;div class="terminal"&gt;$ acmkdir hello&lt;br /&gt;Ready to create a new distribution skeleton directory.&lt;br /&gt;The current working directory is: &lt;br /&gt; --&gt; /tmp&lt;br /&gt;If you make a mistake and need to abort, press ctrl-C.&lt;br /&gt; &lt;br /&gt;Name of distribution: hello&lt;br /&gt;Your full name:       Vest&lt;br /&gt;Your email address:   just@ask.me&lt;br /&gt; &lt;br /&gt;Do you want to proceed? (y/n) y&lt;br /&gt;+ Mode is default&lt;br /&gt;+ Making directory hello&lt;br /&gt;+ Making src directory&lt;br /&gt;+ Making doc directory&lt;br /&gt;+ Making m4 directory&lt;br /&gt;+ Making config directory&lt;br /&gt;+ Making default text files&lt;br /&gt;+ Making INSTALL file link&lt;br /&gt;+ Running reconf&lt;br /&gt;- aclocal.&lt;br /&gt;/usr/share/aclocal/lf_x11.m4:33: warning: underquoted definition of LF_PATH_XLIB&lt;br /&gt;/usr/share/aclocal/lf_x11.m4:33:   run info '(automake)Extending aclocal'&lt;br /&gt;/usr/share/aclocal/lf_x11.m4:33:   or see http://sources.redhat.com/automake/automake.html#Extending-aclocal&lt;br /&gt;- autoconf.&lt;br /&gt;- autoheader.&lt;br /&gt;autoheader: warning: missing template: CXX_HAS_BUGGY_FOR_LOOPS&lt;br /&gt;autoheader: Use AC_DEFINE([CXX_HAS_BUGGY_FOR_LOOPS], [], [Description])&lt;br /&gt;autoheader: warning: missing template: CXX_HAS_NO_BOOL&lt;br /&gt;autoheader: warning: missing template: NDEBUG&lt;br /&gt;autoheader: warning: missing template: YOUR_OS&lt;br /&gt;- automake.&lt;br /&gt;configure.ac:21: installing `config/config.guess'&lt;br /&gt;configure.ac:21: installing `config/config.sub'&lt;br /&gt;configure.ac:17: installing `config/install-sh'&lt;br /&gt;configure.ac:17: installing `config/missing'&lt;br /&gt;Makefile.am: installing `./INSTALL'&lt;br /&gt;Makefile.am: installing `./COPYING'&lt;br /&gt;configure.ac:16: required file `config.h.in' not found&lt;br /&gt;&lt;br /&gt;Distribution directory is ready.&lt;br /&gt;Please make sure to keep the files AUTHORS, NEWS, README, THANKS up to&lt;br /&gt;date before cutting a distribution.&lt;/div&gt;&lt;p&gt;В 4-ой строке снизу (или 5-ой, если считать по символам /n :) ), видно, что в автоматически созданном файле &lt;samp class="file-name"&gt;configure.ac&lt;/samp&gt; в строке 16 отсутствует шаблон &lt;samp class="file-name"&gt;config.h.in&lt;/samp&gt;. Нам он, собственно не нужен, потому эту строку можно смело комментировать командой &lt;code class="options"&gt;dnl&lt;/code&gt;, или совсем удалить её.&lt;/p&gt;&lt;p&gt;После каждого изменения файла &lt;samp class="file-name"&gt;configure.ac&lt;/samp&gt; всегда следует выполнять скрипт &lt;samp class="file-name"&gt;reconf&lt;/samp&gt;&lt;/p&gt;&lt;div class="terminal"&gt;$ ./reconf &lt;br /&gt;- aclocal.&lt;br /&gt;/usr/share/aclocal/lf_x11.m4:33: warning: underquoted definition of LF_PATH_XLIB&lt;br /&gt;/usr/share/aclocal/lf_x11.m4:33:   run info '(automake)Extending aclocal'&lt;br /&gt;/usr/share/aclocal/lf_x11.m4:33:   or see http://sources.redhat.com/automake/automake.html#Extending-aclocal&lt;br /&gt;- autoconf.&lt;br /&gt;- autoheader.&lt;br /&gt;autoheader: error: AC_CONFIG_HEADERS not found in configure.ac&lt;br /&gt;- automake.&lt;/div&gt;&lt;p&gt;Для того, чтобы пересобрать все зависящие от него скрипты. Потом можно выполнить сам скрипт &lt;samp class="file-name"&gt;./configure&lt;/samp&gt; и &lt;samp class="file-name"&gt;make&lt;/samp&gt;. В результате этого должно пройти конфигурирование и компиляция/сборка несуществующих исходных кодов. Теперь давайте создадим некоторый файл в каталоге &lt;samp class="file-name"&gt;src&lt;/samp&gt;, с которого будет выполняться запуск нашего "Привет Мира".&lt;/p&gt;&lt;div class="terminal"&gt;/tmp/hello$ gedit src/main.cxx&lt;br /&gt;// Vest (c) 2008&lt;br /&gt;// Hello World&lt;br /&gt;// main.cxx&lt;br /&gt;&lt;br /&gt;#include &lt;iostream&gt;&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;  std::cout &lt;&lt; "Hello World!" &lt;&lt; std::endl;&lt;br /&gt;  return 0;&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;А потом, подправим шаблон &lt;samp class="file-name"&gt;Makefile.am&lt;/samp&gt;, который по-умолчанию пуст. Приведем некоторые возможные опции файла &lt;samp class="file-name"&gt;Makefile.am&lt;/samp&gt;:&lt;/p&gt;&lt;table id="general-table"&gt;&lt;tr&gt;&lt;th&gt;Переменная&lt;/th&gt;&lt;th&gt;Описание&lt;/th&gt;&lt;/tr&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code class="options"&gt;bin_PROGRAMS = prog1 prog2 ...&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Список исполняемых файлов, которые будут скомпилированы с помощью &lt;samp class="file-name"&gt;'make'&lt;/samp&gt;, и установлены с помощью &lt;samp class="file-name"&gt;'make install'&lt;/samp&gt; в каталог &lt;samp class="file-name"&gt;'/prefix/bin'&lt;/samp&gt;, где &lt;samp class="file-name"&gt;'prefix'&lt;/samp&gt;, обычно, это &lt;samp class="file-name"&gt;'/usr/local'&lt;/samp&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code class="options"&gt;lib_LIBRARIES = libfoo1.a libfoo2.a ...&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Список всех библиотек, которые будут скомпилированы с помощью &lt;samp class="file-name"&gt;'make'&lt;/samp&gt;, и установлены с помощью &lt;samp class="file-name"&gt;'make install'&lt;/samp&gt; в каталог &lt;samp class="file-name"&gt;'/prefix/lib'&lt;/samp&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code class="options"&gt;prog_SOURCES = foo1.c foo2.c ... header1.h header2.h ...&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Список всех файлов, которые образовывают исходный код программы, включая заголовочные файлы. Присутствие заголовочных файлов не подразумевает того, что они будут установлены в &lt;samp class="file-name"&gt;'/prefix/include'&lt;/samp&gt;, но означает то, что они будут добавлены в дистрибутив (&lt;samp class="file-name"&gt;'make dist'&lt;/samp&gt;). Если вы хотите установки публичных заголовочных файлов, вы должны упомянуть их в &lt;code class="options"&gt;'include_HEADERS'&lt;/code&gt;. Automake генерирует абстрактные правила для файлов C, C++ и Fortran. Для других языков, Вы должны предоставлять свои собственные правила.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code class="options"&gt;prog_LDADD = $(top_builddir)/dir1/libfoo.a -lbar1 -lbar2 ...&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Список библиотек, которые должны быть подлинкованы с вашим исходным кодом. Установленные библиотеки должны использоваться с флагами '-l'. Удаляемые библиотеки должны упоминаться с использованием абсолютных имён (пример указан в предыдущем столбце).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code class="options"&gt;prog_LDFLAGS = -L/dir1 -L/dir2 -L/dir3 ...&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Добавляет флаги '-L', которые нужны для поиска установленных библиотек, которые вы хотите подлинковать в &lt;code class="options"&gt;'prog_LDADD'&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Файл &lt;samp class="file-name"&gt;Makefile.am&lt;/samp&gt; будет иметь вид:&lt;/p&gt;&lt;div class="terminal"&gt;/tmp/hello$ gedit src/Makefile.am&lt;br /&gt;# Copyright (C) 2008 Vest &lt;ваш@почтовый.ящик&gt;&lt;br /&gt;#  &lt;br /&gt;# This file is free software; as a special exception the author gives&lt;br /&gt;# unlimited permission to copy and/or distribute it, with or without &lt;br /&gt;# modifications, as long as this notice is preserved.&lt;br /&gt;# &lt;br /&gt;# This program is distributed in the hope that it will be useful, but&lt;br /&gt;# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the&lt;br /&gt;# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.&lt;br /&gt;&lt;br /&gt;bin_PROGRAMS = hello&lt;br /&gt;hello_SOURCES = main.cxx&lt;/div&gt;&lt;p&gt;Теперь пакет можно реконфигурировать, и собирать (далее я приведу только последнюю, нужную информацию о том, что компиляция прошла успешно)&lt;/p&gt;&lt;div class="terminal"&gt;$ ./reconf&lt;br /&gt;$ ./configure&lt;br /&gt;$ make&lt;br /&gt;...&lt;br /&gt;Making all in src&lt;br /&gt;make[1]: Вход в каталог `/tmp/hello/src'&lt;br /&gt;g++ -DPACKAGE_NAME=\"hello\" -DPACKAGE_TARNAME=\"hello\" -DPACKAGE_VERSION=\"0.0.1\" -DPACKAGE_STRING=\"hello\ 0.0.1\" -DPACKAGE_BUGREPORT=\"Vest\ just@ask.me\" -DPACKAGE=\"hello\" -DVERSION=\"0.0.1\" -DCXX_HAS_BUGGY_FOR_LOOPS=1 -DYOUR_OS=\"i686-pc-linux-gnu\" -I.     -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.cxx&lt;br /&gt;mv -f .deps/main.Tpo .deps/main.Po&lt;br /&gt;g++  -g -O2   -o hello main.o  &lt;br /&gt;make[1]: Выход из каталога `/tmp/hello/src'&lt;br /&gt;...&lt;br /&gt;$ make distcheck&lt;br /&gt;...&lt;br /&gt;=============================================&lt;br /&gt;hello-0.0.1 archives ready for distribution: &lt;br /&gt;hello-0.0.1.tar.gz&lt;br /&gt;hello-0.0.1.tar.bz2&lt;br /&gt;=============================================&lt;/div&gt;&lt;p&gt;Как вы видите, было создано два архива. Внутри каждого из них лежат наши исходные файлы, доступные для распространения. Кстати сказать, внутри архивов наша программа будет лежать в каталоге &lt;samp class="file-name"&gt;'hello-0.0.1'&lt;/samp&gt;. Это пригодится нам при создании распространяемого пакета скомпилированного приложения. Проверить то, что наше приложение установится и запустится в системе можно следующим образом:&lt;/p&gt;&lt;div class="terminal"&gt;$ sudo make install&lt;br /&gt;...&lt;br /&gt;$ hello&lt;br /&gt;Hello World!&lt;br /&gt;$ whereis hello&lt;br /&gt;hello: /usr/local/bin/hello&lt;br /&gt;$ sudo make uninstall&lt;br /&gt;...&lt;br /&gt;$ hello&lt;br /&gt;bash: /usr/local/bin/hello: No such file or directory&lt;/div&gt;&lt;p&gt;Вот собственно и все. В дальнейшем, я постараюсь описать более сложный пример, равно как и понять, почему после удаления приложения, присутствовала неизвестная ссылка, при повторном его запуске :) Похоже, что она где-то успела прописаться в системе или профиле пользователя.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3068039613872793354-2306321025962332312?l=vest-one.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vest-one.blogspot.com/feeds/2306321025962332312/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3068039613872793354&amp;postID=2306321025962332312' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/2306321025962332312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/2306321025962332312'/><link rel='alternate' type='text/html' href='http://vest-one.blogspot.com/2008/11/ubuntu-6-autotools.html' title='Создаём пакет для Ubuntu. Часть 6. Использование Autotools'/><author><name>Vest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_4Y-F98DPD_0/SXS-6duFvGI/AAAAAAAAAAM/L0zgoDEP8u8/s1600-R/x_801fa864.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3068039613872793354.post-4320083793269292706</id><published>2008-08-20T12:52:00.018+04:00</published><updated>2008-11-13T23:10:33.331+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Создаём пакет для Ubuntu. Часть 5a. Пример из helloworld.</title><content type='html'>&lt;span style="font-family:verdana;"&gt;&lt;p&gt;Как вы, возможно, видели, некоторых каталогов, описанных в предыдущем разделе у вас в Ubuntu не существует. Это связано с тем, что структура файловой системы различается от дистрибутива к дистрибутиву, сохраняя, конечно, определённую концепцию описанную в &lt;a href="http://www.pathname.com/fhs/pub/fhs-2.3.pdf"&gt;Filesystem Hierarchy Standard&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;На сайте FTP консорциума GNU лежит программа &lt;a href="http://ftp.gnu.org/gnu/hello/hello-2.1.1.tar.gz"&gt;Hello world&lt;/a&gt; основное назначение её в том, чтобы просто посмотреть продукт полностью удовлетворяющий GNU стандарту. Но мы его попробуем использовать для того, чтобы просто узнать значения некоторых переменных.&lt;/p&gt;&lt;p&gt;Скачайте и распакуйте эту программу куда-нибудь в /tmp. Для того, чтобы нам не жалко было её стереть. Зайдите туда из-под консоли и выполните команду:&lt;/p&gt;&lt;div class="terminal"&gt;$ ./configure&lt;br /&gt;checking for a BSD-compatible install... /usr/bin/install -c&lt;br /&gt;checking whether build environment is sane... yes&lt;br /&gt;...&lt;br /&gt;configure: creating ./config.status&lt;br /&gt;config.status: creating Makefile  -- вот это нам понадобится&lt;br /&gt;...&lt;br /&gt;&lt;/div&gt;&lt;p&gt;Eсли у вас возникнет ошибка, что не возможно создать "executable file", поставьте из репозитария пакет &lt;samp class="file-name"&gt;build-essential&lt;/samp&gt;.&lt;/p&gt;&lt;p&gt;Итак, вы возможно обратили внимание на то, что вместо отсутствующего &lt;samp class="file-name"&gt;Makefile&lt;/samp&gt; скрипт &lt;samp class="file-name"&gt;configure&lt;/samp&gt; создал нам новый. Если вы его просмотрите то увидите следующее (нам отсюда нужна только верхняя часть:&lt;/p&gt;&lt;div class="terminal"&gt;$ cat Makefile&lt;br /&gt;... (тут лежат комментарии)&lt;br /&gt;SHELL = /bin/bash&lt;br /&gt;&lt;br /&gt;srcdir = .&lt;br /&gt;top_srcdir = .&lt;br /&gt;&lt;br /&gt;prefix = /usr/local&lt;br /&gt;exec_prefix = ${prefix}&lt;br /&gt;... (а здесь остальной автоматически сгенерированный код)&lt;br /&gt;&lt;/div&gt;&lt;p&gt;Как вы видите префикс равен &lt;code class="options"&gt;'prefix = /usr/local'&lt;/code&gt;. В документе &lt;a href="http://www.pathname.com/fhs/pub/fhs-2.3.pdf"&gt;Filesystem Hierarchy Standard&lt;/a&gt; об этом сказано, что (4.8.2.1): "Иерархия &lt;samp class="file-name"&gt;/usr/local&lt;/samp&gt; используется системным администратором при локальной установки программного обеспечения. Она не должна перезаписываться при обновлении системного программного обеспечения. Она может быть использована для программ и данных, которые совместно используются среди групп хостов, но которые не найдены в &lt;samp class="file-name"&gt;/usr&lt;/samp&gt;. Локально установленное ПО должно быть помещено, предпочтительнее, в &lt;samp class="file-name"&gt;/usr/local&lt;/samp&gt;, чем в &lt;samp class="file-name"&gt;/usr&lt;/samp&gt;, если конечно оно не было установлено для замены или обновления ПО в &lt;samp class="file-name"&gt;/usr&lt;/samp&gt;."&lt;/p&gt;&lt;p&gt;Так как я на своей памяти не встречал пакеты, которые записывались бы в &lt;samp class="file-name"&gt;/usr/local&lt;/samp&gt; (тем более мы с вами будем делать наш собственный пакет, который в дальнейшем будет обновляться). Для этого выполним конфигурационный скрипт следующим образом, и просмотрим наш &lt;samp class="file-name"&gt;Makefile&lt;/samp&gt;:&lt;/p&gt;&lt;div class="terminal"&gt;$ ./configure --prefix=/usr&lt;br /&gt;checking for a BSD-compatible install... /usr/bin/install -c&lt;br /&gt;checking whether build environment is sane... yes&lt;br /&gt;...&lt;br /&gt;&lt;/div&gt;&lt;div class="terminal"&gt;$ cat Makefile&lt;br /&gt;... (тут лежат комментарии)&lt;br /&gt;SHELL = /bin/bash&lt;br /&gt;&lt;br /&gt;srcdir = .&lt;br /&gt;top_srcdir = .&lt;br /&gt;&lt;br /&gt;prefix = /usr&lt;br /&gt;exec_prefix = ${prefix}&lt;br /&gt;&lt;br /&gt;bindir = ${exec_prefix}/bin&lt;br /&gt;sbindir = ${exec_prefix}/sbin&lt;br /&gt;libexecdir = ${exec_prefix}/libexec&lt;br /&gt;datadir = ${prefix}/share&lt;br /&gt;sysconfdir = ${prefix}/etc&lt;br /&gt;sharedstatedir = ${prefix}/com&lt;br /&gt;localstatedir = ${prefix}/var&lt;br /&gt;libdir = ${exec_prefix}/lib&lt;br /&gt;infodir = ${prefix}/info&lt;br /&gt;mandir = ${prefix}/man&lt;br /&gt;includedir = ${prefix}/include&lt;br /&gt;oldincludedir = /usr/include&lt;br /&gt;pkgdatadir = $(datadir)/hello&lt;br /&gt;pkglibdir = $(libdir)/hello&lt;br /&gt;pkgincludedir = $(includedir)/hello&lt;br /&gt;top_builddir = .&lt;br /&gt;... (а здесь остальной автоматически сгенерированный код)&lt;/div&gt;&lt;p&gt;Теперь уже всё можно свести в таблицу, чтобы было проще воспринять:&lt;/p&gt;&lt;table id="general-table"&gt;&lt;tr&gt;&lt;th width="18%"&gt;Переменная&lt;/th&gt;&lt;th width="20%"&gt;Путь&lt;/th&gt;&lt;th&gt;Описание&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code class="options"&gt;srcdir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;samp class="file-name"&gt;.&lt;/samp&gt;&lt;/td&gt;&lt;td&gt;Исходные коды&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code class="options"&gt;top_srcdir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;samp class="file-name"&gt;.&lt;/samp&gt;&lt;/td&gt;&lt;td&gt;Родительский каталог с исходными кодами (во вложенных директориях его значение равно &lt;samp class="file-name"&gt;'..'&lt;/samp&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code class="options"&gt;prefix&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;samp class="file-name"&gt;/usr&lt;/samp&gt;&lt;/td&gt;&lt;td&gt;Каталог, содержащий данные, совместно используемые несколькими машинами. Любая информация, меняющаяся со временем должна располагаться в другом каталоге&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code class="options"&gt;bindir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;samp class="file-name"&gt;/usr/bin&lt;/samp&gt;&lt;/td&gt;&lt;td&gt;Первичная директория для исполняемых файлов&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;&lt;code class="options"&gt;sbindir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;samp class="file-name"&gt;/usr/sbin&lt;/samp&gt;&lt;/td&gt;&lt;td&gt;Директория содержащая незначительные файлы, обычно используемые системным администратором: восстановление системы, монтирование /usr раздела и т.д.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code class="options"&gt;libexecdir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;samp class="file-name"&gt;/usr/libexec&lt;/samp&gt;&lt;/td&gt;&lt;td&gt;Директория для установки исполняемых программ, которые чаще запускаются другими программами, чем пользователями&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code class="options"&gt;datadir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;samp class="file-name"&gt;/usr/share&lt;/samp&gt;&lt;/td&gt;&lt;td&gt;Иерархия для всех архитектурно-независимых данных, используемых совместно различными хостами&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code class="options"&gt;sysconfdir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;samp class="file-name"&gt;/usr/etc&lt;/samp&gt;&lt;/td&gt;&lt;td&gt;Каталог с файлами для конфигурирования хоста. Предпочтительно использование &lt;samp class="file-name"&gt;/etc&lt;/samp&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code class="options"&gt;sharedstatedir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;samp class="file-name"&gt;/usr/com&lt;/samp&gt;&lt;/td&gt;&lt;td&gt;Директория для установки файлов с архитектурно независимыми данными, которые могут быть изменены программой&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code class="options"&gt;localstatedir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;samp class="file-name"&gt;/usr/var&lt;/samp&gt;&lt;/td&gt;&lt;td&gt;Директория для установки файлов с данными, которые могут быть изменены программами в процессе работы, и которые принадлежат одной конкретной машине&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code class="options"&gt;libdir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;samp class="file-name"&gt;/usr/lib&lt;/samp&gt;&lt;/td&gt;&lt;td&gt;Содержит объектные файлы, библиотеки, внутренние бинарные файлы. Подразумевается, что они не используются напрямую пользователем или скриптами шелл&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code class="options"&gt;infodir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;samp class="file-name"&gt;/usr/info&lt;/samp&gt;&lt;/td&gt;&lt;td&gt;Директория для установки Info-файлов для этого пакета&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code class="options"&gt;mandir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;samp class="file-name"&gt;/usr/man&lt;/samp&gt;&lt;/td&gt;&lt;td&gt;Каталог верхнего уровня для установки страниц man для текущего пакета&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code class="options"&gt;includedir&lt;br&gt;oldincludedir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;samp class="file-name"&gt;/usr/include&lt;/samp&gt;&lt;/td&gt;&lt;td&gt;Сюда помещаются все заголовочные файлы языка C&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code class="options"&gt;pkgdatadir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;samp class="file-name"&gt;/usr/share/&lt;i&gt;hello&lt;/i&gt;&lt;/samp&gt;&lt;/td&gt;&lt;td&gt;Здесь хранятся данные приложения &lt;i&gt;hello&lt;/i&gt;. Например, Glade формы&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code class="options"&gt;pkglibdir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;samp class="file-name"&gt;/usr/lib/&lt;i&gt;hello&lt;/i&gt;&lt;/samp&gt;&lt;/td&gt;&lt;td&gt;Здесь хранятся данные библиотеки &lt;i&gt;hello&lt;/i&gt;. Например, вспомогательные библиотеки&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code class="options"&gt;pkgincludedir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;samp class="file-name"&gt;/usr/include/&lt;i&gt;hello&lt;/i&gt;&lt;/samp&gt;&lt;/td&gt;&lt;td&gt;Здесь хранятся заголовочные файлы библиотеки &lt;i&gt;hello&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Здесь ещё можно добавить следующее, в каталоге &lt;samp class="file-name"&gt;/usr/include/pixmaps&lt;/samp&gt; лежат различные картинки, используемые программой в процессе её жизнедеятельности. Про другие каталоги, такие как &lt;samp class="file-name"&gt;/usr/include/doc&lt;/samp&gt; я ничего верно сказать не могу, так как не видел обобщённой информации по этому поводу. Скорее всего структура файловой системы основана на FHS, а потом идёт собственно набивка различными пакетами.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3068039613872793354-4320083793269292706?l=vest-one.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vest-one.blogspot.com/feeds/4320083793269292706/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3068039613872793354&amp;postID=4320083793269292706' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/4320083793269292706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/4320083793269292706'/><link rel='alternate' type='text/html' href='http://vest-one.blogspot.com/2008/08/ubuntu-5a-helloworld.html' title='Создаём пакет для Ubuntu. Часть 5a. Пример из helloworld.'/><author><name>Vest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_4Y-F98DPD_0/SXS-6duFvGI/AAAAAAAAAAM/L0zgoDEP8u8/s1600-R/x_801fa864.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3068039613872793354.post-2251098914290036627</id><published>2008-08-06T22:48:00.007+04:00</published><updated>2008-08-21T18:03:20.489+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Создаём пакет для Ubuntu. Часть 5. Переменные директорий для установки</title><content type='html'>&lt;span style="font-family:verdana;"&gt;&lt;p&gt;Директории для установки должны всегда именоваться с помощью переменных, для того чтобы облегчить установку программы в нестандартное место. Стандартные имена этих переменных описаны ниже. Они основаны на стандартном расположении файловой системы; эти варианты используются в SVR4, 4.4BSD, Linux, Ultrix v4 и других современных операционных системах.&lt;/p&gt;&lt;p&gt;Эти две переменные устанавливаются суперпользователем для установки. Все другие инсталляционные директории должны быть подкаталогами одного из этих двух и ничего не должно устанавливаться напрямую в эти два каталога.&lt;/p&gt;&lt;dl&gt;&lt;dt&gt;&lt;code class="options"&gt;'prefix'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Префикс используется в построении значений переменных указаных ниже по умолчанию. По умолчанию, &lt;code class="options"&gt;'prefix'&lt;/code&gt; должен быть равен &lt;samp class="file-name"&gt;'/usr/local'&lt;/samp&gt;. Когда происходит сборка полной GNU системы, префикс должен быть пустым и &lt;samp class="file-name"&gt;'/usr'&lt;/samp&gt; должна быть символической ссылкой в &lt;samp class="file-name"&gt;'/'&lt;/samp&gt;. (Если вы используете Autoconf, записывайте его как &lt;code class="options"&gt;'@prefix@'&lt;/code&gt;.)&lt;/dd&gt;&lt;dt&gt;&lt;code class="options"&gt;'exec_prefix'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Префикс также используется в построении значений переменных указанных ниже по умолчанию. По умолчанию, &lt;code class="options"&gt;'exec_prefix'&lt;/code&gt; должен быть равен &lt;samp class="file-name"&gt;$(prefix)&lt;/samp&gt;. (Если вы используете Autoconf, записывайте его как &lt;code class="options"&gt;'@exec_prefix@'&lt;/code&gt;.) Как правило, &lt;samp class="file-name"&gt;$(exec_prefix)&lt;/samp&gt; используется для каталогов, которые содержат машинно-специфичные файлы (такие как исполняемые или библиотеки подпрограмм), в то время как &lt;samp class="file-name"&gt;$(prefix)&lt;/samp&gt; напрямую используется для других директорий.&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;Исполняемые программы устанавливаются в одну из следующих директорий (обратите внимание, это важно для решения нашей с вами задачи):&lt;/p&gt;&lt;dl&gt;&lt;dt&gt;&lt;code class="options"&gt;'bindir'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Директория для установки исполняемых программ, которые пользователь может запускать. Обычно это &lt;samp class="file-name"&gt;'/usr/local/bin'&lt;/samp&gt;, но записывается как &lt;samp class="file-name"&gt;'$(exec_prefix)/bin'&lt;/samp&gt;.&lt;br&gt;(Если вы используете Autoconf, записывайте его как &lt;code class="options"&gt;'@bindir@'&lt;/code&gt;.)&lt;/dd&gt;&lt;dt&gt;&lt;code class="options"&gt;'sbindir'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Директория для установки исполняемых программ, которые пользователь может запускать из шелла, они обычно полезны системным администраторам. Обычно это &lt;samp class="file-name"&gt;'/usr/local/sbin'&lt;/samp&gt;, но записывается как &lt;samp class="file-name"&gt;'$(exec_prefix)/sbin'&lt;/samp&gt;.&lt;br&gt;(Если вы используете Autoconf, записывайте его как &lt;code class="options"&gt;'@sbindir@'&lt;/code&gt;.)&lt;/dd&gt;&lt;dt&gt;&lt;code class="options"&gt;'libexecdir'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Директория для установки исполняемых программ, которые чаще запускаются другими программами, чем пользователями. Обычно это &lt;samp class="file-name"&gt;'/usr/local/libexec'&lt;/samp&gt;, но записывается как &lt;samp class="file-name"&gt;'$(exec_prefix)/libexec'&lt;/samp&gt;.&lt;br&gt;(Если вы используете Autoconf, записывайте его как &lt;code class="options"&gt;'@libexecdir@'&lt;/code&gt;.)&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;Файлы с данными, используемые программами на протяжении своей работы подразделяются на категории по двум направлениям:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Файлы, которые обычно изменяются программами;  другие никогда обычно не изменяются (хотя пользователи могут редактировать некоторые из них).&lt;/li&gt;&lt;li&gt;Архитектурно-независимые файлы и могут использоваться всеми машинами участка; некоторые архитектурно-зависимые и могут использоваться только машинами с таким же типом операционной системы; другие которые никогда не могут быть "расшарены" между двумя машинами.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Всё это создаёт 6 различных возможностей. Однако, мы хотим предостеречь вас от использования архитектурно-зависимых файлов, в отношении от объектных файлов и библиотек. Будет гораздо чище делать другие файлы с данными архитектурно-независимыми, и это, в общем, не так сложно.&lt;/p&gt;&lt;p&gt;Вот почему, здесь предлагаются переменные, которые должны использовать мейкфайлы для указания каталогов:&lt;/p&gt;&lt;dl&gt;&lt;dt&gt;&lt;code class="options"&gt;'datadir'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Директория для установки файлов с архитектурно независимыми данными, доступными только для чтения. Обычно это &lt;samp class="file-name"&gt;'/usr/local/share'&lt;/samp&gt;, но записывается как &lt;samp class="file-name"&gt;'$(prefix)/share'&lt;/samp&gt;.В качестве особого исключения смотрите ниже&lt;samp class="file-name"&gt;'$(infodir)'&lt;/samp&gt; и &lt;samp class="file-name"&gt;'$(includedir)'&lt;/samp&gt;.&lt;br&gt;(Если вы используете Autoconf, записывайте его как &lt;code class="options"&gt;'@datadir@'&lt;/code&gt;.)&lt;/dd&gt;&lt;dt&gt;&lt;code class="options"&gt;'sysconfdir'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Директория для установки файлов с данными, имеющими отношение к одной машине, доступными только для чтения. В общем это файлы для конфигурирования хоста. Файлы конфигурации почтовой программы и сети, &lt;samp class="file-name"&gt;'/etc/passwd'&lt;/samp&gt; и всё подобное этому. Все файлы в этой директории должны быть обычными текстовыми файлами с кодировкой ASCII. Обычно это &lt;samp class="file-name"&gt;'/usr/local/etc'&lt;/samp&gt;, но записывается как &lt;samp class="file-name"&gt;'$(prefix)/etc'&lt;/samp&gt;.&lt;br&gt;(Если вы используете Autoconf, записывайте его как &lt;code class="options"&gt;'@sysconfdir@'&lt;/code&gt;.)&lt;br&gt;&lt;br&gt;Не устанавливайте исполняемые файлы в этот каталог (они возможно принадлежат &lt;samp class="file-name"&gt;'$(libexecdir)'&lt;/samp&gt; или &lt;samp class="file-name"&gt;'$(sbindir)'&lt;/samp&gt;). Также &lt;b&gt;не&lt;/b&gt; устанавливайте файлы, которые могут изменяться в процессе работы (здесь исключаются программы предназначенные для &lt;b&gt;изменения конфигурации системы&lt;/b&gt;). Они возможно пренадлежат &lt;samp class="file-name"&gt;'$(localstatedir)'&lt;/samp&gt;.&lt;/dd&gt;&lt;dt&gt;&lt;code class="options"&gt;'sharedstatedir'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Директория для установки файлов с архитектурно независимыми данными, которые могут быть изменены программой. Обычно это &lt;samp class="file-name"&gt;'/usr/local/com'&lt;/samp&gt;, но записывается как &lt;samp class="file-name"&gt;'$(prefix)/com'&lt;/samp&gt;.&lt;br&gt;(Если вы используете Autoconf, записывайте его как &lt;code class="options"&gt;'@sharedstatedir@'&lt;/code&gt;.)&lt;/dd&gt;&lt;dt&gt;&lt;code class="options"&gt;'localstatedir'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Директория для установки файлов с данными, которые могут быть изменены программами в процессе работы, и которые принадлежат одной конкретной машине. Пользователи не должны никогда их изменять в этом каталоге, чтобы конфигурировать действия пакета; помещайте такую настраиваемую информацию в отдельные файлы, в &lt;samp class="file-name"&gt;'$(datadir)'&lt;/samp&gt; или &lt;samp class="file-name"&gt;'$(sysconfdir)'&lt;/samp&gt;. Обычно &lt;samp class="file-name"&gt;'$(localstatedir)'&lt;/samp&gt; это &lt;samp class="file-name"&gt;'$(/usr/local/var)'&lt;/samp&gt;, но записывается как &lt;samp class="file-name"&gt;'$(prefix)/var'&lt;/samp&gt;.&lt;br&gt;(Если вы используете Autoconf, записывайте его как &lt;code class="options"&gt;'@localstatedir@'&lt;/code&gt;.)&lt;/dd&gt;&lt;dt&gt;&lt;code class="options"&gt;'libdir'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Директория для объектных файлов и библиотек. Не устанавливайте исполняемые файлы сюда, они возможно должны лежать в &lt;samp class="file-name"&gt;'$(libexecdir)'&lt;/samp&gt;. Обычно это &lt;samp class="file-name"&gt;'/usr/local/lib'&lt;/samp&gt;, но записывается как &lt;samp class="file-name"&gt;'$(exec_prefix)/lib'&lt;/samp&gt;.&lt;br&gt;(Если вы используете Autoconf, записывайте его как &lt;code class="options"&gt;'@libdir@'&lt;/code&gt;.)&lt;/dd&gt;&lt;dt&gt;&lt;code class="options"&gt;'infodir'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Директория для установки Info-файлов для этого пакета. Обычно это &lt;samp class="file-name"&gt;'/usr/local/info'&lt;/samp&gt;, но записывается как &lt;samp class="file-name"&gt;'$(prefix)/info'&lt;/samp&gt;.&lt;br&gt;(Если вы используете Autoconf, записывайте его как &lt;code class="options"&gt;'@infodir@'&lt;/code&gt;.)&lt;/dd&gt;&lt;dt&gt;&lt;code class="options"&gt;'lispdir'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Директория для установки любых Emacs Lisp-файлов для этого пакета. Обычно это &lt;samp class="file-name"&gt;'/usr/local/share/emacs/site-lisp'&lt;/samp&gt;, но записывается как &lt;samp class="file-name"&gt;'$(prefix)/share/emacs/site-lisp'&lt;/samp&gt;.&lt;br&gt;(Если вы используете Autoconf, записывайте его как &lt;code class="options"&gt;'@lispdir@'&lt;/code&gt;.) В добавок, чтобы &lt;code class="options"&gt;'@lispdir@'&lt;/code&gt; работало, вам нужно добавить следующие файлы в ваш &lt;samp class="file-name"&gt;'configure.in'&lt;/samp&gt; файл:&lt;div class="terminal"&gt;lispdir='${datadir}/emacs/site-lisp'&lt;br /&gt;AC_SUBST(lispdir)&lt;/div&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code class="options"&gt;'includedir'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Директория для установки заголовочных файлов, которые включаются в пользовательские программы с помощью директивы препроцессора C &lt;code class="options"&gt;'#include'&lt;/code&gt;. Обычно это &lt;samp class="file-name"&gt;'/usr/local/include'&lt;/samp&gt;, но записывается как &lt;samp class="file-name"&gt;'$(prefix)/include'&lt;/samp&gt;.&lt;br&gt;(Если вы используете Autoconf, записывайте его как &lt;code class="options"&gt;'@includedir@'&lt;/code&gt;.)&lt;br&gt;Большинство компиляторов, отличных от GCC не просматирвают заголовочные файлы в &lt;samp class="file-name"&gt;'/usr/local/include'&lt;/samp&gt;. Поэтому установка заголовочных файлов этим путём полезна только для GCC. Иногда, это не является проблемой, потому что некоторые библиотеки действительно предназначены работать с GCC, но некоторые могут работать с другими компиляторами. Они должны устанавилвать свои заголовочные файлы в два места: &lt;code class="options"&gt;includedir&lt;/code&gt; и &lt;code class="options"&gt;oldincludedir&lt;/code&gt;.&lt;/dd&gt;&lt;dt&gt;&lt;code class="options"&gt;'oldincludedir'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Директория для установки заголовочных файлов, которые включаются в пользовательские программы с помощью директивы препроцессора C &lt;code class="options"&gt;'#include'&lt;/code&gt;. Обычно это &lt;samp class="file-name"&gt;'/usr/include'&lt;/samp&gt;.&lt;br&gt;(Если вы используете Autoconf, записывайте его как &lt;code class="options"&gt;'@oldincludedir@'&lt;/code&gt;.)&lt;br&gt;Команды &lt;samp class="file-name"&gt;Makefile&lt;/samp&gt; должны проверять пустое ли значение &lt;code class="options"&gt;'@oldincludedir@'&lt;/code&gt;. Если да, то они не должны использовать его и прервать вторичную установку заголовочных файлов.&lt;br&gt;Пакет не должен заменять существующие заголовочные файлы в этой директории, если он не из этого пакета (установленного ранее). Таким образом, если ваш пакет (например, Foo) предоставляет файл &lt;samp class="file-name"&gt;'foo.h'&lt;/samp&gt;, то он должен устанавливать заголовочный файл в каталог &lt;code class="options"&gt;oldincludedir&lt;/code&gt;, если, &lt;b&gt;первое&lt;/b&gt;, здесь нет &lt;samp class="file-name"&gt;'foo.h'&lt;/samp&gt; файла, или, &lt;b&gt;второе&lt;/b&gt;, существующий файл принадлежит пакету Foo.&lt;br&gt;Для определения того, что файл &lt;samp class="file-name"&gt;'foo.h'&lt;/samp&gt; "пришёл" из пакета Foo, поместите "магическую строку" (просто, некоторую уникальную) в файл, как часть комментария, и выполните для неё &lt;samp class="file-name"&gt;grep&lt;/samp&gt;.&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;man-страницы в стиле Unix устанавливаются в следующие каталоги:&lt;/p&gt;&lt;dl&gt;&lt;dt&gt;&lt;code class="options"&gt;'mandir'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Каталог верхнего уровня для установки страниц man (если имеется) для текущего пакета. Обычно это &lt;samp class="file-name"&gt;'/usr/local/man'&lt;/samp&gt;, но записывается как &lt;samp class="file-name"&gt;'$(prefix)/man'&lt;/samp&gt;.&lt;br&gt;(Если вы используете Autoconf, записывайте его как &lt;code class="options"&gt;'@mandir@'&lt;/code&gt;.)&lt;/dd&gt;&lt;dt&gt;&lt;code class="options"&gt;'man1dir'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Каталог верхнего уровня для установки страниц man секции 1. Записывайте как &lt;samp class="file-name"&gt;'$(mandir)/man1'&lt;/samp&gt;.&lt;/dd&gt;&lt;dt&gt;&lt;code class="options"&gt;'man2dir'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Каталог верхнего уровня для установки страниц man секции 2. Записывайте как &lt;samp class="file-name"&gt;'$(mandir)/man2'&lt;/samp&gt;.&lt;/dd&gt;&lt;dt&gt;&lt;code class="options"&gt;'...'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;/dd&gt;&lt;i&gt;Не делайте первичную документацию любого GNU программного обеспечения в качестве man страницы. Вместо этого, записывайте руководство (мануал) в Texinfo. Страницы man предназначены для людей, запускающих ПО под Unix.&lt;/i&gt;&lt;dt&gt;&lt;code class="options"&gt;'manext'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Расширение файла для установленной страницы man. Оно должно содержать точку и следующую за ней соответствующую цифру: &lt;samp class="file-name"&gt;'.1'&lt;/samp&gt;.&lt;/dd&gt;&lt;dt&gt;&lt;code class="options"&gt;'man1ext'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Расширение файла для установленных страниц man секции 1.&lt;/dd&gt;&lt;dt&gt;&lt;code class="options"&gt;'man2ext'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Расширение файла для установленных страниц man секции 2.&lt;/dd&gt;&lt;dt&gt;&lt;code class="options"&gt;'...'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;/dd&gt;Используйте эти имена вместо &lt;code class="options"&gt;'manext'&lt;/code&gt;, если пакету требуется установить страницы man в более, чем одной секции мануала.&lt;/dl&gt;&lt;p&gt;И, в конце, вы должны установить следующую переменную:&lt;/p&gt;&lt;dl&gt;&lt;dt&gt;&lt;code class="options"&gt;'srcdir'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Каталог исходных файлов, которые следует компилировать. Значение этой переменно обычно вставляется скриптом &lt;samp class="file-name"&gt;configure&lt;/samp&gt;.&lt;br&gt;(Если вы используете Autoconf, используйте &lt;code class="options"&gt;'srcdir = @srcdir@'&lt;/code&gt;.)&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;Например:&lt;/p&gt;&lt;div class="terminal"&gt;# Общий префикс для директорий пути установки.&lt;br /&gt;# NOTE: Эта директория должна существовать к моменту начала установки.&lt;br /&gt;prefix = /usr/local&lt;br /&gt;exec_prefix = $(prefix)&lt;br /&gt;# Куда помещать исполняемые файлы для команды 'gcc'.&lt;br /&gt;bindir = $(exec_prefix)/bin&lt;br /&gt;# Куда помещать директории используемые компилятором.&lt;br /&gt;libexecdir = $(exec_prefix)/libexec&lt;br /&gt;# Куда помещать Info-файлы.&lt;br /&gt;infodir = $(prefix)/info&lt;/div&gt;&lt;p&gt;Если ваша программа устанавливает большое число файлов в одну из стандартных пользовательских директорий, будет полезным разгруппировать их в подкаталог, относящийся к этой программе. Если вы поступаете так, то должны записать в правило &lt;code class="options"&gt;install&lt;/code&gt; создание этих подкаталогов.&lt;/p&gt;&lt;p&gt;Не ожидайте, что пользователь включит название подкаталога в значение любой из перечисленных выше переменных. Идея наличия унифицированного набора имён переменных для директорий установки существует для того, чтобы пользователь указывал одинаковые значения для разных GNU пакетов. В общем, это полезно, чтобы пакеты были спроектированы способными работать разумно.&lt;/p&gt;&lt;p&gt;В довершении, я бы от себя добавил, что унификация во всём была важна, чтобы не было путаницы, чтобы всё работало слаженно и если вы знаете, что все (условно все) бинарники лежат в /usr/bin, вы всегда сможете их легко найти. Спасибо за внимание...&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3068039613872793354-2251098914290036627?l=vest-one.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vest-one.blogspot.com/feeds/2251098914290036627/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3068039613872793354&amp;postID=2251098914290036627' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/2251098914290036627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/2251098914290036627'/><link rel='alternate' type='text/html' href='http://vest-one.blogspot.com/2008/08/ubuntu-4_06.html' title='Создаём пакет для Ubuntu. Часть 5. Переменные директорий для установки'/><author><name>Vest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_4Y-F98DPD_0/SXS-6duFvGI/AAAAAAAAAAM/L0zgoDEP8u8/s1600-R/x_801fa864.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3068039613872793354.post-4449263946219968198</id><published>2008-08-06T14:29:00.004+04:00</published><updated>2008-08-06T15:56:23.533+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Создаём пакет для Ubuntu. Часть 4. Переменные для указанных команд</title><content type='html'>&lt;span style="font-family:verdana;"&gt;&lt;p&gt;Мейкфайлы должны предоставлять переменные для переопределения определённых команд, опций и так далее. В частности, вы должны запускать большинство утилит через переменные. Так, например, если вы используете Bison, имеете переменную &lt;code class="options"&gt;BISON&lt;/code&gt;, чьё значение по умолчанию устанавливается в &lt;code class="options"&gt;'BISON = bison'&lt;/code&gt;, и вы должны ссылаться на неё с помощью &lt;samp class="file-name"&gt;$(BISON)&lt;/samp&gt;, когда используете.&lt;/p&gt;&lt;p&gt;Утилиты для управления файлами, такие как &lt;samp class="file-name"&gt;ln&lt;/samp&gt;, &lt;samp class="file-name"&gt;rm&lt;/samp&gt;, &lt;samp class="file-name"&gt;mv&lt;/samp&gt; и так далее не нуждаются в ссылке через переменные, так как пользователи обычно не заменяют их другими программами.&lt;/p&gt;&lt;p&gt;Каждая переменная с именем программы должна сопровождаться переменной с опциями, которые используются с ней. Добавьте в конце &lt;code class="options"&gt;'FLAGS'&lt;/code&gt; к имени переменной, например, &lt;code class="options"&gt;BISONFLAGS&lt;/code&gt;. Исключением является &lt;code class="options"&gt;CFLAGS&lt;/code&gt; (из-за стандарта). Используйте &lt;code class="options"&gt;CPPFLAGS&lt;/code&gt; в любой другой команде компиляции, использующей препроцессор, равно как &lt;code class="options"&gt;LDFLAGS&lt;/code&gt;, которая используется в компоновщике (linker), например &lt;samp class="file-name"&gt;ld&lt;/samp&gt;.&lt;/p&gt;&lt;p&gt;Если есть какие-нибудь опции, особенные для того или иного файла, не используйте их в &lt;code class="options"&gt;CFLAGS&lt;/code&gt;, так как пользователи могут подумать, что её можно свободно менять. Старайтесь записывать эти опции непосредственно в само правило:&lt;/p&gt;&lt;div class="terminal"&gt;CFLAGS = -g&lt;br /&gt;ALL_CFLAGS = -I. $(CFLAGS)&lt;br /&gt;.c.o:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $&amp;lt;&lt;/div&gt;&lt;p&gt;Не включайте опцию &lt;code class="options"&gt;'-g'&lt;/code&gt; в &lt;code class="options"&gt;CFLAGS&lt;/code&gt;, потому что она не является &lt;em&gt;необходимой&lt;/em&gt; для правильной компиляции (это ведь опция о включении отладочной информации). Если пакет настроен для сборки GCC по умолчанию, то вы можете включить опцию &lt;code class="options"&gt;'-O'&lt;/code&gt; &lt;code class="options"&gt;CFLAGS&lt;/code&gt; по умолчанию (правильно, почему бы не поставлять пакет готовым к оптимизации).&lt;/p&gt;&lt;p&gt;Помещайте опциию &lt;code class="options"&gt;CFLAGS&lt;/code&gt; последней в команде компиляции, после других переменных, содержащих опции компилятора, так, чтобы пользователь мог использовать &lt;code class="options"&gt;CFLAGS&lt;/code&gt; для перегрузки других опций (ну, например, отменить ту же самую оптимизацию, которая была добавлена ранее другой переменной).&lt;/p&gt;&lt;p&gt;Каждый &lt;samp class="file-name"&gt;Makefile&lt;/samp&gt; должен определять переменную &lt;code class="options"&gt;INSTALL&lt;/code&gt;, являющуюся базовой командой для установки файла в систему. Также каждый &lt;samp class="file-name"&gt;Makefile&lt;/samp&gt; должен определять переменную &lt;code class="options"&gt;INSTALL_PROGRAM&lt;/code&gt; и &lt;code class="options"&gt;INSTALL_DATA&lt;/code&gt; (значение по умолчанию у них должно быть равно &lt;samp class="file-name"&gt;$(INSTALL)&lt;/samp&gt;). Затем, он должен использовать эти переменные в качестве команд установки исполняемых и не исполняемых файлов отдельно. Используйте их следующим образом:&lt;/p&gt;&lt;div class="terminal"&gt;$(INSTALL_PROGRAM) foo $(bindir)/foo&lt;br /&gt;$(INSTALL_DATA) libfoo.a $(libdir)/libfoo.a&lt;/div&gt;&lt;p&gt;Всегда используйте имя файла, а не название каталога, в качестве второго аргумента команды инсталляции. Используйте отдельную команду для каждого файла для установки.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3068039613872793354-4449263946219968198?l=vest-one.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vest-one.blogspot.com/feeds/4449263946219968198/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3068039613872793354&amp;postID=4449263946219968198' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/4449263946219968198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/4449263946219968198'/><link rel='alternate' type='text/html' href='http://vest-one.blogspot.com/2008/08/ubuntu-4.html' title='Создаём пакет для Ubuntu. Часть 4. Переменные для указанных команд'/><author><name>Vest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_4Y-F98DPD_0/SXS-6duFvGI/AAAAAAAAAAM/L0zgoDEP8u8/s1600-R/x_801fa864.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3068039613872793354.post-3140813495946810226</id><published>2008-08-05T22:31:00.004+04:00</published><updated>2008-08-06T13:44:45.874+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Создаём пакет для Ubuntu. Часть 3. Утилиты в Makefile'ах</title><content type='html'>&lt;span style="font-family:verdana;"&gt;&lt;p&gt;В своих мейкфайлах вы можете использовать всевозможные команды для выполнения тех или иных задач. Ниже приводится информация о том, какие именно утилиты и когда вам рекомендуется их использовать.&lt;/p&gt;&lt;p&gt;Записывайте комманды &lt;samp class="file-name"&gt;Makefile&lt;/samp&gt; (и любые шелл скрипты, такие как &lt;samp class="file-name"&gt;configure&lt;/samp&gt;), чтобы они работали в &lt;samp class="file-name"&gt;sh&lt;/samp&gt; шелле, а не &lt;samp class="file-name"&gt;csh&lt;/samp&gt;. Не используйте любые специальные возможности &lt;samp class="file-name"&gt;ksh&lt;/samp&gt; или &lt;samp class="file-name"&gt;bash&lt;/samp&gt;.&lt;/p&gt;&lt;p&gt;Скрипт &lt;samp class="file-name"&gt;configure&lt;/samp&gt;, правила от мейкфайла, и команды установки не должны использовать утилиты за исключением следующих:&lt;/p&gt;&lt;div class="terminal"&gt;cat cmp cp diff echo egrep expr false grep install-info ln ls mkdir mv pwd rm rmdir sed sleep sort tar test touch true&lt;/div&gt;&lt;p&gt;Архиватор &lt;samp class="file-name"&gt;gzip&lt;/samp&gt; может использоваться в правиле &lt;samp class="file-name"&gt;dist&lt;/samp&gt;.&lt;/p&gt;&lt;p&gt;Привыкайте к использованию общих опций у этих программ. Например, не используйте &lt;samp class="file-name"&gt;'mkdir -p'&lt;/samp&gt;, даже если это удобно, так как большинство систем этого не поддерживают. Также избегайте создания символических ссылок, по понятным причинам.&lt;/p&gt;&lt;p&gt;Правила мейкфайлов для сборки и установки также могут использовать компиляторы или похожие программы, но должны делать это через переменные &lt;samp class="file-name"&gt;make&lt;/samp&gt;, которые пользователь может заменять на альтернативные. Вот несколько программ:&lt;/p&gt;&lt;div class="terminal"&gt;ar bison cc flex install ld ldconfig lex make makeinfo ranlib texi2dvi yacc&lt;/div&gt;&lt;p&gt;Используйте следующие переменные &lt;samp class="file-name"&gt;make&lt;/samp&gt; для запуска этих программ:&lt;/p&gt;&lt;div class="terminal"&gt;$(AR) $(BISON) $(CC) $(FLEX) $(INSTALL) $(LD) $(LDCONFIG) $(LEX) $(MAKE) $(MAKEINFO) $(RANLIB) $(TEXI2DVI) $(YACC)&lt;/div&gt;&lt;p&gt;При использовании &lt;samp class="file-name"&gt;ranlib&lt;/samp&gt; или &lt;samp class="file-name"&gt;ldconfig&lt;/samp&gt;, убедитесь, что ничего плохого не случится если система не имеет программу, о которой идёт речь. Игнорируйте ошибку от этой комманды и выводите сообщение перед вызовом комманды, чтобы сообщить пользователю, что ошибка этой комманды не считается проблемной. (Макрос Autoconf'а &lt;code class="options"&gt;'AC_PROG_RANLIB'&lt;/code&gt; может помочь с этим.)&lt;/p&gt;&lt;p&gt;Если вы используете символические ссылки, вы должны реализовать альтернативный путь для систем, этого не имеющих.&lt;/p&gt;&lt;p&gt;Дополнительные утилиты, которые могут быть использованы через переменные Make следующие:&lt;/p&gt;&lt;div class="terminal"&gt;chgrp chmod chown mknod&lt;/div&gt;&lt;p&gt;Это нормально использовать другие утилиты в частях мейкфайла (или скриптах) предназначенных только для конкретных систем, где заведомо известно о существовании этих утилит&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3068039613872793354-3140813495946810226?l=vest-one.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vest-one.blogspot.com/feeds/3140813495946810226/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3068039613872793354&amp;postID=3140813495946810226' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/3140813495946810226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/3140813495946810226'/><link rel='alternate' type='text/html' href='http://vest-one.blogspot.com/2008/08/ubuntu-3-makefile.html' title='Создаём пакет для Ubuntu. Часть 3. Утилиты в Makefile&apos;ах'/><author><name>Vest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_4Y-F98DPD_0/SXS-6duFvGI/AAAAAAAAAAM/L0zgoDEP8u8/s1600-R/x_801fa864.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3068039613872793354.post-5676885605910354376</id><published>2008-08-05T19:45:00.006+04:00</published><updated>2008-08-05T22:47:22.091+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Создаём пакет для Ubuntu. Часть 2. Общие соглашения о Makefile'ах</title><content type='html'>&lt;span style="font-family:verdana;"&gt;&lt;p&gt;Вы, я думаю, поняли основную идею &lt;samp class="file-name"&gt;configure&lt;/samp&gt; файла. Здесь я постараюсь раскрыть структуру &lt;samp class="file-name"&gt;Makefile&lt;/samp&gt;, воспользовавшись тем же документом что и раньше, &lt;a href="hsampp://www.amath.washington.edu/%7Elf/tutorials/autoconf/standards/standards_toc.html"&gt;GNU Coding Standards&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Вы, если увлекаетесь программированием, или компилируя чужие исходные коды, в процессе своей компьютерной жизнедеятельности должны были столкнуться с "мейкфайлами" (&lt;samp class="file-name"&gt;Makefile&lt;/samp&gt;). В чем заключается их смысл? Их назначение состоит в том, чтобы автоматизировать процесс сборки вашего проекта. Как вы знаете простая программа может быть скомпилирована с помощью одной лишь строчки &lt;samp class="file-name"&gt;gcc main.cpp&lt;/samp&gt;. На выходе вы получите файл &lt;samp class="file-name"&gt;a.out&lt;/samp&gt; который потом можете запустить или переименовать.&lt;/p&gt;&lt;p&gt;А что делать, если ваш проект содержит несколько исходных файлов, и вы хотите имя отличное от стандартного? Можно конечно написать некий скрипт, который будет за вас вызывать, копировать и устанавливать ваши файлы. Вот таким стандартизованным методом и является &lt;samp class="file-name"&gt;Makefile&lt;/samp&gt;, обычно располагающийся в корне вашего проекта.&lt;/p&gt;&lt;p&gt;Каждый &lt;samp class="file-name"&gt;Makefile&lt;/samp&gt; должен содержать эту строку:&lt;/p&gt;&lt;div class="terminal"&gt;SHELL = /bin/sh&lt;/div&gt;&lt;p&gt;Для того, чтобы избежать проблем связанных с использованием переменной среды &lt;code class="options"&gt;SHELL&lt;/code&gt; по умолчанию.&lt;/p&gt;&lt;p&gt;Различные &lt;samp class="file-name"&gt;make&lt;/samp&gt; программы имеют несовместимые списки суффиксов и неявных правил, что порой создаёт некоторые неудобства и неправильное поведение. Поэтому будет неплохо, если вы укажите этот набор суффиксов явным образом, например:&lt;/p&gt;&lt;div class="terminal"&gt;.SUFFIXES:&lt;br /&gt;.SUFFIXES: .c .o&lt;/div&gt;&lt;p&gt;Первая линия очищает существующий список суффиксов, вторая показывает все суффиксы, которые могут являться предметом для неявных правил (я счтиаю, что здесь  разговор идёт в первую очередь о том, что множество промежуточных объектов, файлов и прочего оканчиваются по-разному: *.c, *.cpp, *.cc, *.o, *.obj Поэтому чтобы компилятор не путался мы ограничиваем этот список)&lt;/p&gt;&lt;p&gt;Не делайте предположения о том, что &lt;samp class="file-name"&gt;'.'&lt;/samp&gt; является путём для вызова команды. Когда вам требуется запустить программы, являющиеся частью вашего пакета в процессе работы &lt;samp class="file-name"&gt;make&lt;/samp&gt;, убедитесь, что она использует путь &lt;samp class="file-name"&gt;'./'&lt;/samp&gt; (если программа собирается как часть &lt;samp class="file-name"&gt;make&lt;/samp&gt;), или &lt;samp class="file-name"&gt;'$(srcdir)/'&lt;/samp&gt; (если файл - не изменяющаяся часть исходного кода). Без этих префиксов используется текущий путь поиска (ну то, есть по всем /usr/bin и прочим пробежится, а не там где надо).&lt;/p&gt;&lt;p&gt;Различие между &lt;samp class="file-name"&gt;'./'&lt;/samp&gt; (директория, где собирается программа) и &lt;samp class="file-name"&gt;'$(srcdir)/'&lt;/samp&gt; (директория с иходными файлами) важно, так как пользователи могут собирать программу в отдельный каталог, используя &lt;code class="options"&gt;'--srcdir'&lt;/code&gt; опцию &lt;samp class="file-name"&gt;configure&lt;/samp&gt; скрипта. Следующее правило:&lt;/p&gt;&lt;div class="terminal"&gt;foo.1 : foo.man sedscript&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sed -e sedscript foo.man &amp;gt; foo.1&lt;/div&gt;&lt;p&gt;будет ошибочным если директория сборки будет отличаться от директории с исходными файлами, так как &lt;samp class="file-name"&gt;'foo.man'&lt;/samp&gt; и &lt;samp class="file-name"&gt;'sedscript'&lt;/samp&gt; располагаются в каталоге с исходниками (то есть видите что перед ними нет никаких приставок с абсолютными значениями пути?).&lt;/p&gt;&lt;p&gt;При использовании GNU &lt;samp class="file-name"&gt;make&lt;/samp&gt;, полагаясь на то, что &lt;samp class="file-name"&gt;'VPATH'&lt;/samp&gt; укажет на исходный файл и компиляция будет работать, только в случае единичного файла. Для этого существует автоматическая переменная &lt;code class="options"&gt;'$&amp;lt;'&lt;/code&gt;, представляющая сам исходный файл (что-то вроде псевдонима). Много версий &lt;samp class="file-name"&gt;make&lt;/samp&gt; устанавливают &lt;code class="options"&gt;'$&amp;lt;'&lt;/code&gt; только в неявных правилах. Цель &lt;samp class="file-name"&gt;Makefile&lt;/samp&gt; вида&lt;/p&gt;&lt;div class="terminal"&gt;foo.o : bar.c&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(CC) -I. -I$(srcdir) $(CFLAGS) -c bar.c -o foo.o&lt;/div&gt;&lt;p&gt;должна быть переписана как&lt;/p&gt;&lt;div class="terminal"&gt;foo.o : bar.c&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(CC) -I. -I$(srcdir) $(CFLAGS) -c $&amp;lt; -o $@&lt;/div&gt;&lt;p&gt;чтобы позволить переменной &lt;samp class="file-name"&gt;'VPATH'&lt;/samp&gt; корректно работать. Когда цель имеет несколько зависимостей, используйте явное &lt;samp class="file-name"&gt;'$(srcdir)/'&lt;/samp&gt; в качестве легчайшего пути, чтобы ваше правило работало. Например, для цели выше &lt;samp class="file-name"&gt;'foo.1'&lt;/samp&gt; напишите следующее:&lt;/p&gt;&lt;div class="terminal"&gt;foo.1 : foo.man sedscript&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sed -e $(srcdir)/sedscript $(srcdir)/foo.man &amp;gt; $@&lt;/div&gt;&lt;p&gt;Дистрибутивы GNU обычно содержат некоторые файлы, которые не являются исходными файлами: info файлы, вывод из &lt;samp class="file-name"&gt;Autoconf&lt;/samp&gt;, &lt;samp class="file-name"&gt;Automake&lt;/samp&gt;, &lt;samp class="file-name"&gt;Bision&lt;/samp&gt; или &lt;samp class="file-name"&gt;Flex&lt;/samp&gt;. Эти файлы обычно появляются в директории с исходными файлами, и потому они должны всегда появляться там, а не в каталоге сборки. Поэтому правила &lt;samp class="file-name"&gt;Makfile&lt;/samp&gt; обновляющие их должны класть их в исходный каталог.&lt;/p&gt;&lt;p&gt;Однако, если файл не появляется в дистрибутиве, то &lt;samp class="file-name"&gt;Makfile&lt;/samp&gt; не должен помещать его в каталог с исходными файлами, потому что процесс сборки программы при обычных условиях не должен ни при каких обстоятельствах модифицировать исходный каталог (Мне это кажется правильным, иначе либо пришлось бы очищать все изменения перед повторной сборкой, либо всегда хранить копию исходнков. Запомните, ваши исходные файлы должны быть неизменимы, лучше деалйте копии и работайте с ними, чем с оригиналом).&lt;/p&gt;&lt;p&gt;Постарайтесь сделать цели сборки и установки, по меньшей мере (и все их подцели) так, чтобы они работали с параллельным &lt;samp class="file-name"&gt;make&lt;/samp&gt; (скорее всего разговор идёт о том, чтобы ваши файлы не конфликтовали в случае параллельной компиляции и сборки).&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3068039613872793354-5676885605910354376?l=vest-one.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vest-one.blogspot.com/feeds/5676885605910354376/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3068039613872793354&amp;postID=5676885605910354376' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/5676885605910354376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/5676885605910354376'/><link rel='alternate' type='text/html' href='http://vest-one.blogspot.com/2008/08/ubuntu-2-makefile.html' title='Создаём пакет для Ubuntu. Часть 2. Общие соглашения о Makefile&apos;ах'/><author><name>Vest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_4Y-F98DPD_0/SXS-6duFvGI/AAAAAAAAAAM/L0zgoDEP8u8/s1600-R/x_801fa864.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3068039613872793354.post-2535181165133270321</id><published>2008-08-03T09:19:00.050+04:00</published><updated>2011-08-01T13:45:23.836+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Создаём пакет для Ubuntu. Часть 1. Что такое конфигурирование</title><content type='html'>&lt;span style="font-family:verdana;"&gt;&lt;h4&gt;Введение&lt;/h4&gt;&lt;p&gt;Столкнувшись с темой программирования под ОС Linux, передо мной возник вопрос о публикации исходных файлов таким образом, чтобы из них можно было скомпилировать и создать пакет, в частности deb пакет для операционной системы Ubuntu.&lt;/p&gt;&lt;p&gt;Программирования под ОС Windows, мне как-то не приходилось сталкиваться с программами типа &lt;samp class="file-name"&gt;make&lt;/samp&gt;, а потому знания в области создания &lt;samp class="file-name"&gt;Makefile&lt;/samp&gt;'ов у меня пока ещё нет. На руках имеется всего лишь набор исходных файлов моего небольшого проекта &lt;a href="hsampps://sourceforge.net/projects/gquod"&gt;Gnome Quod&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Поискав в интернете некоторую информацию об этом процессе, я наткнулся на статью &lt;a href="http://www.gnu.org/prep/standards/html_node/Directory-Variables.html"&gt;GNU Coding Standards&lt;/a&gt;. Возможно вы подумаете: "Вот! Ещё один перевод". Хорошо, пусть так и будет, но это лучше чем ничего, тем более, я не собираюсь переводить всю статью, так как она очень большая, и  не всё мне оттуда пригодится для решения поставленной задачи. Здесь я постараюсь по пунктам перевести и описать всё, что следует делать, чтобы ваши программы смогли в конце-концов быть "инсталлируемыми".&lt;/p&gt;&lt;h4&gt;Процесс создания релиза&lt;/h4&gt;&lt;p&gt;Создание релиза отличается от простого сжатия ваших исходных файлов в tar и размещение их на FTP. Вам следует настроить ваш софт таким образом, чтобы он мог быть сконфигурирован для различных систем. Ваш &lt;samp class="file-name"&gt;Makefile&lt;/samp&gt; должен соответствовать GNU стандартам, описанным ниже, и расположение директорий также должно соответствовать стандартам. Сделав это, ваш пакет сможет быть легко встроен в большую инфраструктуру всего программного обеспечения GNU.&lt;/p&gt;&lt;h4&gt;Как должно работать конфигурирование&lt;/h4&gt;&lt;p&gt;Каждый дистрибутив GNU должен снабжаться скриптом &lt;samp class="file-name"&gt;configure&lt;/samp&gt;. Этому скрипту предоставляются аргументы, каждый из которых описывает ту или иную машину, для которой вы хотите скомпилировать программу (вы наверное часто встречали файлы &lt;samp class="file-name"&gt;./configure.sh&lt;/samp&gt;, так вот разговор идёт о них).&lt;/p&gt;&lt;p&gt;Скрипт &lt;samp class="file-name"&gt;configure&lt;/samp&gt; должен записывать конфигурационные опции так, чтобы они затрагивали процесс компиляции.&lt;/p&gt;&lt;p&gt;Один путь сделать это - это создать ссылку от стандартного имени, такого как &lt;samp class="file-name"&gt;config.h&lt;/samp&gt; к нужному конфигурационному файлу, для выбранной системы. Если вы используете эту технику, то дистрибутив не должен содержать файла названного &lt;samp class="file-name"&gt;'config.h'&lt;/samp&gt;. Это сделано для того, чтобы не смогли создать программу без предварительного её конфигурирования.&lt;/p&gt;&lt;p&gt;Другой путь, который может быть выполнен с помощью &lt;samp class="file-name"&gt;configure&lt;/samp&gt; это редактировать файл &lt;samp class="file-name"&gt;Makefile&lt;/samp&gt;. То есть, он должен включать файл &lt;samp class="file-name"&gt;'Makefile.in'&lt;/samp&gt;, который содержит входящий шаблон, используемый для редактирования, и не содержать &lt;samp class="file-name"&gt;Makefile&lt;/samp&gt;. Снова, это сделано для того, чтобы люди не смогли создать программу без предварительного конфигурирования.&lt;/p&gt;&lt;p&gt;Если &lt;samp class="file-name"&gt;configure&lt;/samp&gt; выполняет запись &lt;samp class="file-name"&gt;'Makefile'&lt;/samp&gt;, то &lt;samp class="file-name"&gt;'Makefile'&lt;/samp&gt; должен иметь цель, которая называется &lt;samp class="file-name"&gt;'Makefile'&lt;/samp&gt;. Это заставит &lt;samp class="file-name"&gt;configure&lt;/samp&gt; перезапуститься, установить ту же конфигурацию, которая была установлена в прошлый раз. Файлы, которые читает скрипт &lt;samp class="file-name"&gt;configure&lt;/samp&gt; должны быть прописаны в качестве зависимостей &lt;samp class="file-name"&gt;'Makefile'&lt;/samp&gt;&lt;/p&gt;&lt;p&gt;Все файлы, которые получаются от скрипта &lt;samp class="file-name"&gt;configure&lt;/samp&gt; должны иметь в начале комментарии, поясняющие то, что они были созданы автоматически с использованием скрипта. Это избавит пользователей от заблуждения и попытки редактирования этих файлов вручную.&lt;/p&gt;&lt;p&gt;Скрипт &lt;samp class="file-name"&gt;configure&lt;/samp&gt; должен записывать файл с названием &lt;samp class="file-name"&gt;'config.status'&lt;/samp&gt;, который описывает какие опции конфигурирования были указаны с последнего запуска скрипта. Этот файл должен быть скриптом shell, при запуске которого воссоздастся такая же конфигурация.&lt;/p&gt;&lt;p&gt;Скрипт &lt;samp class="file-name"&gt;configure&lt;/samp&gt; должен принимать опцию вида &lt;code class="options"&gt;'--srcdir=&lt;var&gt;dirname&lt;/var&gt;'&lt;/code&gt; чтобы указать каталог, где находятся исходные файлы (если это не текущая директория). Это делает возможным сборку программы в отдельный каталог, поэтому текущая директория с исходными файлами не изменяется.&lt;/p&gt;&lt;p&gt;Если пользователь не указывает &lt;code class="options"&gt;'--srcdir'&lt;/code&gt;, то &lt;samp class="file-name"&gt;configure&lt;/samp&gt; должен просмотреть оба каталога '.' и '..' в поисках исходных файлов. Если он находит исходники в одном из этих мест, то он должен использовать их отсюда, иначе - сообщить, что не может найти исходные файлы, и выйти с ненулевым статусом.&lt;/p&gt;&lt;p&gt;Обычно, легчайший путь для предоставления &lt;code class="options"&gt;'--srcdir'&lt;/code&gt; - это редактировать директиву &lt;code class="options"&gt;VPATH&lt;/code&gt; в &lt;samp class="file-name"&gt;Makefile&lt;/samp&gt;. Некоторые правила могут нуждаться в явном указании исходной директории. Чтобы сделать это возможным, &lt;samp class="file-name"&gt;configure&lt;/samp&gt; может добавить переменную с именем &lt;code class="options"&gt;srcdir&lt;/code&gt; в &lt;samp class="file-name"&gt;Makefile&lt;/samp&gt;, чьё значение точно указывает директорию.&lt;/p&gt;&lt;p&gt;Скрипт &lt;samp class="file-name"&gt;configure&lt;/samp&gt; должен также принимать аргумент, указывающий тип ОС для которой собирается программа. Этот аргумент выглядет как &lt;var&gt;cpu&lt;/var&gt;-&lt;var&gt;company&lt;/var&gt;-&lt;var&gt;system&lt;/var&gt;. Например, для Sun 3 - это &lt;code class="options"&gt;'m68k-sun-sunos4.1'&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Когда я выполнил конфигурирование любого готового пакета, то на моей Ubuntu-машине я увидел следующие строки:&lt;/p&gt;&lt;div class="terminal"&gt;$ ./configure.sh&lt;br /&gt;...&lt;br /&gt;checking build system type... i686-pc-linux&lt;br /&gt;checking host system type... i686-pc-linux&lt;br /&gt;...&lt;/div&gt;&lt;p&gt;Покопавшись в файле &lt;samp class="file-name"&gt;config.sub&lt;/samp&gt; можно найти большой перечень систем и процессоров.&lt;/p&gt;&lt;p&gt;Другие опции, предназначены для детального указания наличия программного или аппаратного обеспечения на машине, и включения (или исключения) отдельных частей пакета (например, поддержка шифрования или нет).&lt;/p&gt;&lt;dl&gt;&lt;dt&gt;&lt;code class="options"&gt;'--enable-&lt;var&gt;feature&lt;/var&gt;[=&lt;var&gt;parameter&lt;/var&gt;]'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Конфигурирует пакет для сборки и установки пользовательской возможности, называемой функцией (&lt;var&gt;feature&lt;/var&gt;). Это позволяет пользователям выбрать какие функции следует включать. Передавая необязательный параметр &lt;code class="options"&gt;'no'&lt;/code&gt;, должно отключать возможность, если она встроена по-умолчанию. Опция &lt;code class="options"&gt;'--enable'&lt;/code&gt; &lt;b&gt;не&lt;/b&gt; должна быть причиной замены одной возможности на другую. Также опция &lt;code class="options"&gt;'--enable'&lt;/code&gt; даже &lt;b&gt;не&lt;/b&gt; должна заменять одно полезное поведение на другое. Единственное корректное использование для &lt;code class="options"&gt;'--enable'&lt;/code&gt; это опрос того, какая часть программы должна включаться, а какая исключаться.&lt;/dd&gt;&lt;dt&gt;&lt;code class="options"&gt;'--with-&lt;var&gt;package&lt;var&gt;'&lt;/var&gt;&lt;/var&gt;&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Пакет &lt;var&gt;package&lt;/var&gt; будет установлен, поэтому сконфигурируйте вашу сборку для работы с &lt;var&gt;package&lt;/var&gt;. Возможные значения &lt;code class="options"&gt;'x'&lt;/code&gt;, &lt;code class="options"&gt;'x-toolkit'&lt;/code&gt;, &lt;code class="options"&gt;'gnu-as'&lt;/code&gt; (или &lt;code class="options"&gt;'gas'&lt;/code&gt;), &lt;code class="options"&gt;'gnu-ld'&lt;/code&gt;, &lt;code class="options"&gt;'gnu-libc'&lt;/code&gt; и &lt;code class="options"&gt;'gdb'&lt;/code&gt;. Не используйте опцию &lt;code class="options"&gt;'--with'&lt;/code&gt;, чтобы указывать имя файла для использования некоторых файлов, так как это выходит за пределы области видимости.&lt;/dd&gt;&lt;dt&gt;&lt;code class="options"&gt;'--nfp'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Машина назначения не имеет процессора для вычислений с плавующей точкой.&lt;/dd&gt;&lt;dt&gt;&lt;code class="options"&gt;'--gas'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Ассемблер машины назначения - GAS (GNU assembler). Эта опция устарела, пользователи вместо неё должны использовать &lt;code class="options"&gt;'--with-gnu-as'&lt;/code&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code class="options"&gt;'--x'&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;На машине назначение имеется установленная система X Window. Эта опция устарела, пользователи вместо неё должны использовать &lt;code class="options"&gt;'--with-x'&lt;/code&gt;.&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;Все скрипты  &lt;samp class="file-name"&gt;configure&lt;/samp&gt; должны принимать опции "детально", так или иначе они осуществляют любое различие пакета. В частности, они должны принимать любую опцию начинающуюся с &lt;code class="options"&gt;'--with-'&lt;/code&gt; или &lt;code class="options"&gt;'--enable-'&lt;/code&gt;. Это позволит пользователям конфигурировать всё дерево исходников GNU одним набором опций.&lt;/p&gt;&lt;p&gt;Вы заметите, что категории &lt;code class="options"&gt;'--with-'&lt;/code&gt; или &lt;code class="options"&gt;'--enable-'&lt;/code&gt; узки: они не предоставляют места для любого другого вида опций, о которых вы можете подумать. Это неслучайно. Мы (я о группе GNU) хотим ограничить возможное число опций конфигурирования в программном обеспечении GNU. Мы не хотим, чтобы GNU программы имели уникальные конфигурационные опции.&lt;/p&gt;&lt;p&gt;Пакеты, которые выполняют часть процесса компиляции могут поддерживать кросс-платформенность. В таком случае, исходная (host) и машина назначения (target) для программы могут быть различными. Конфигурационный скрипт должен нормально обрабатывать указанные типы систем как первой, так и второй, таким образом создавая программу, которая работает на машине того же типа, откуда он и был запущен.&lt;/p&gt;&lt;p&gt;Способ для сборки кросс-компилятора, кросс-ассемблера или того, что есть у вас, это указать опцию &lt;code class="options"&gt;'--host=&lt;var&gt;hosttype&lt;var&gt;'&lt;/var&gt;&lt;/var&gt;&lt;/code&gt; при запуске &lt;samp class="file-name"&gt;configure&lt;/samp&gt;. Это указывает исходную систему, без изменеия системы назначения. Синтаксис для &lt;var&gt;hosttype&lt;/var&gt; такой же как было описано выше.&lt;/p&gt;&lt;p&gt;Улучшение кросс-компилятора требует компилирование его на машине отличной от той, на которой он будет работать. Пакеты компиляции принимают опцию &lt;code class="options"&gt;'--host=&lt;var&gt;hosttype&lt;var&gt;'&lt;/var&gt;&lt;/var&gt;&lt;/code&gt; для назначения конфигурации, что вы будете собирать их на машине, отличной от хоста (другими словами, как я понимаю, если вы будете использовать компилятор на Sun машине, а на руках у вас другая *nix машина, то вам нужно собрать компилятор для Sun сперва, а потом его уже использовать там.)&lt;/p&gt;&lt;p&gt;Программы, для которых кросс-операции не являются значащими, не нуждаются в опции &lt;code class="options"&gt;'--host'&lt;/code&gt;, потому что конфигурирование целой операционной системы для межплатформенных операций не является значительным.&lt;/p&gt;&lt;p&gt;Некоторые программы имеют способы автоматического конфигурирования себя. Если ваша программа настроена, чтобы выполнять это, ваш &lt;samp class="file-name"&gt;configure&lt;/samp&gt; скрипт может просто игнорировать большинство своих аргументов.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3068039613872793354-2535181165133270321?l=vest-one.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vest-one.blogspot.com/feeds/2535181165133270321/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3068039613872793354&amp;postID=2535181165133270321' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/2535181165133270321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/2535181165133270321'/><link rel='alternate' type='text/html' href='http://vest-one.blogspot.com/2008/08/ubuntu-1.html' title='Создаём пакет для Ubuntu. Часть 1. Что такое конфигурирование'/><author><name>Vest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_4Y-F98DPD_0/SXS-6duFvGI/AAAAAAAAAAM/L0zgoDEP8u8/s1600-R/x_801fa864.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3068039613872793354.post-1137277564340753585</id><published>2008-07-28T19:05:00.035+04:00</published><updated>2008-08-05T03:14:36.390+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='Sane'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Epson Perfection 1270 и Ubuntu</title><content type='html'>&lt;span style="font-family:verdana;"&gt;&lt;p&gt;Когда я перешёл на Ubuntu 7.04, у меня возникла потребность установки сканера Epson Perfection 1270. Но на тот момент у меня опыта в линксе было немного, потому лишь спустя продолжительное время, я решил написать этот туториал для тех, кто испытывает затруднения со своими сканнерами.&lt;/p&gt;&lt;p&gt;То, что я опишу ниже, было произведено на Ubuntu версиях 7.10 и 8.04. Насчёт других моделей, не знаю, пробуйте и описывайте по шагам, как это делали Вы.&lt;/p&gt;&lt;br&gt;&lt;p&gt;Этот сканер, будучи подключённым к интерфейсу, определяется следующим образом:&lt;div class="terminal"&gt;$ lsusb&lt;br /&gt;Bus 005 Device 005: ID 04b8:0120 Seiko Epson Corp.&lt;/div&gt;&lt;p&gt;Далее следует установить пакеты sane и sane-utils, если они уже не стоят у вас:&lt;/p&gt;&lt;div class="terminal"&gt;$ sudo aptitude install sane sane-utils&lt;/div&gt;&lt;p&gt;После этого следует выполнить команду для предварительного обнаружения вашего сканера:&lt;/p&gt;&lt;div class="terminal"&gt;$ sane-find-scanner&lt;br /&gt;found USB scanner (vendor=0x04b8 [EPSON], product=0x0120 [EPSON Scanner]) at libusb:005:005&lt;/div&gt;&lt;p&gt;Окончание, в каком месте был найден сканер, может отличаться от приведённого примера. Оно меняется, стоит Вам вытащить, и снова вставить интерфейс в компьютер.&lt;/p&gt;&lt;p&gt;После того, как вы установили пакеты от sane, отредактируйте файл &lt;samp class="file-name"&gt;/etc/sane.d/snapscan.conf&lt;/samp&gt;:&lt;/p&gt;&lt;div class="terminal"&gt;$ sudo nano /etc/sane.d/snapscan.conf&lt;/div&gt;&lt;p&gt;В самом начале вы увидете следующую строку (комментарий переводить не буду, но не будет лишним ознакомится со смыслом сказанного):&lt;/p&gt;&lt;div class="terminal"&gt;firmware /usr/share/sane/snapscan/your-firmwarefile.bin&lt;/div&gt;&lt;p&gt;Основная идея прошивки (firmware) состоит в том, что она закачивается в ваш сканер в момент сканирования, для того, чтобы это сканирование непосредственно выполнять. Firmware у Epson Perfection 1270 имеет имя &lt;samp class="file-name"&gt;ESFW3E.BIN&lt;/samp&gt;&lt;/p&gt;&lt;p&gt;Для его получения следует распаковать и установить драйвера для сканера из установочного диска. Я, например, это сделал с помощью Wine, хотя вы можете использовать рабочую версию OS Windows или же попытаться распаковать их вручную.&lt;/p&gt;&lt;p&gt;Каталог, который содержит драйвера лежит в корне компакт диска с названием &lt;samp class="file-name"&gt;escan&lt;/samp&gt;. После установки, в каталоге &lt;samp class="file-name"&gt;windows/system&lt;/samp&gt; Вы должны обнаружить файл &lt;samp class="file-name"&gt;ESFW3E.BIN&lt;/samp&gt;&lt;/p&gt;&lt;p&gt;Приведу его контрольную сумму, для чего, скажу ниже:&lt;/p&gt;&lt;div class="terminal"&gt;$ ls -l ESFW3E.BIN&lt;br /&gt;-rw-r--r-- 1 vest vest  64000 2003-09-14 18:00 ESFW3E.BIN&lt;br /&gt;&lt;br /&gt;$ md5sum ESFW3E.BIN&lt;br /&gt;486fe0266b3f11c9bad14ccbf5ce87bf  ESFW3E.BIN&lt;/div&gt;&lt;p&gt;Если использовать прошивку, написанную &lt;b&gt;именно&lt;/b&gt; маленькими буквами (она содержится в новых драйверах для сканера с оффициального сайта), то сканер может не запуститься, это выглядит так, что сканирующая головка дёрнется и не поедет дальше. В общем, выходом является только использование стандартных драйверов, поставляемых со сканером.&lt;/p&gt;&lt;p&gt;Я, прежде чем это осознать, перепробовал версии три-четыре.&lt;/p&gt;&lt;p&gt;После этого, следует скопировать firmware в любой каталог, я, например, решил скопировать его туда, где производился первоначальный поиск, в &lt;samp class="file-name"&gt;/usr/share/sane/snapscan/&lt;/samp&gt; и после исправить путь на следующий:&lt;/p&gt;&lt;div class="terminal"&gt;firmware /usr/share/sane/snapscan/ESFW3E.BIN&lt;/div&gt;&lt;p&gt;Для дальнейшего определения сканера, следует запустить команду:&lt;/p&gt;&lt;div class="terminal"&gt;$ scanimage -L&lt;br /&gt;&lt;br /&gt;No scanners were identified. If you were expecting something different,&lt;br /&gt;check that the scanner is plugged in, turned on and detected by the&lt;br /&gt;sane-find-scanner tool (if appropriate). Please read the documentation&lt;br /&gt;which came with this software (README, FAQ, manpages). &lt;/div&gt;&lt;p&gt;Вы видите, что сканер не определился. Это связано с тем, что в файле &lt;samp class="file-name"&gt;snapscan.conf&lt;/samp&gt; (который исправляли выше) следует добавить строки идентифицирующие наш сканер. Похожие строки имеются по всему файлу. Информация должна вводится та, которую получили после ввода &lt;samp class="file-name"&gt;lsusb&lt;/samp&gt;:&lt;/p&gt;&lt;div class="terminal"&gt;# Epson Perfection 1270&lt;br /&gt;usb 0x04b8 0x011f&lt;/div&gt;&lt;p&gt;Далее проверим ещё раз:&lt;/p&gt;&lt;div class="terminal"&gt;$ scanimage -L&lt;br /&gt;device `snapscan:libusb:005:005' is a EPSON EPSON Scanner flatbed scanner &lt;/div&gt;&lt;p&gt;Сканер определился. Теперь попробуем произвести тестовое сканирование:&lt;/p&gt;&lt;div class="terminal"&gt;$ scanimage -d snapscan &gt; /tmp/test.pnm&lt;br /&gt;[snapscan] Scanner warming up - waiting 9 seconds.&lt;br /&gt;[snapscan] Scanner warming up - waiting 35 seconds. &lt;/div&gt;&lt;p&gt;Несколько раз сканер попробует прогреться, потом двинется на несколько миллиметров и остановится. Снова возникла "какая-то" неизвестная ошибка. Связана она с тем, что как кто-то писал на форуме, у производителей Sane не дошли руки, чтобы исправить ошибку, связанную с калибровкой качества. Поэтому нам следует сперва её найти, а потом отключить:&lt;/p&gt;&lt;div class="terminal"&gt;$ scanimage —help&lt;br /&gt;List of available devices:&lt;br /&gt;snapscan:libusb:005:005&lt;br /&gt;&lt;br /&gt;--quality-cal[=(yes|no)] [yes]&lt;br /&gt;   Do a quality white-calibration&lt;/div&gt;&lt;p&gt;Видите, по умолчанию она включена, [yes]. потому её следует отключать:&lt;/p&gt;&lt;div class="terminal"&gt;$ scanimage -d snapscan --quality-cal=no &gt; /tmp/test.pnm&lt;/div&gt;&lt;p&gt;И всё, пожалуйста, в каталоге &lt;samp class="file-name"&gt;/tmp&lt;/samp&gt; ищите свой файл &lt;samp class="file-name"&gt;test.pnm&lt;/samp&gt;&lt;/p&gt;&lt;/p&gt;В том же самом &lt;samp class="file-name"&gt;gimp&lt;/samp&gt;'e можно сканировать с помощью &lt;samp class="file-name"&gt;xsane&lt;/samp&gt;, но главное не забыть, чтобы была &lt;b&gt; отключена&lt;/b&gt; автоматическая калибровка качества.&lt;/p&gt;&lt;br&gt;&lt;p&gt;Удачи.&lt;/p&gt;&lt;p&gt;p.s. для отладочных целей можете использовать комманду&lt;/p&gt;&lt;div class="terminal"&gt;$ export SANE_DEBUG_DLL=255&lt;br /&gt;$ scanimage -d snapscan --quality-cal=no &gt; /tmp/test.pnm&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3068039613872793354-1137277564340753585?l=vest-one.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vest-one.blogspot.com/feeds/1137277564340753585/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3068039613872793354&amp;postID=1137277564340753585' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/1137277564340753585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3068039613872793354/posts/default/1137277564340753585'/><link rel='alternate' type='text/html' href='http://vest-one.blogspot.com/2008/07/epson-perfection-1270-ubuntu.html' title='Epson Perfection 1270 и Ubuntu'/><author><name>Vest</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_4Y-F98DPD_0/SXS-6duFvGI/AAAAAAAAAAM/L0zgoDEP8u8/s1600-R/x_801fa864.jpg'/></author><thr:total>6</thr:total></entry></feed>
