Dev start faq
Ответы на вопросы, помогающие найти нужные статьи
Я полный ноль в сборке пакетов. С чего мне начать?
Посмотрите статью Сборка пакетов start
Могу ли я попробовать импортировать пакет из другого дистрибутива?
Да, с помощью утилиты srpmimport вы можете симпортрировать и сконвертировать srpm-пакеты из некоторых других RPM-дистрибутивов (ROSA, SUSE и пр.).
Посмотрите статью Импорт "чужого" пакета.
Я не умею пользоваться Git. Что мне почитать?
Почитатйте статью Git start - там описаны базовые команды для новичков.
Как сделать патч?
Как работать с патчами (в т.ч. как создавать их) описано в статье Работа с патчами start.
Как работать с gear?
Если у вас сложности с пониманием работы gear, вам, возможно, поможет статья Gear start.
Можно ли сгенерировать автоматически базовую часть спека?
Да, Андреем Черепановым была написана специальная утилита Genspec.
Чем отличаются статические и динамические библиотеки?
Понять различие библиотек вам поможет статья Типы библиотек start.
Ответы на часто встречающиеся вопросы при разработке для начинающих
Как вывести лог сборки в текстовый файл?
Используйте конструкцию 2>&1:
2>&1 | tee ~/log.txt
Полностью с командой:
$ gear --hasher -- hsh-rebuild -v 2>&1 | tee ~/log.txt
Полезные команды
Описание | Команда |
---|---|
Получить ветку 5.1 с коммитом в репозиторий 5.1 [1] | girar-fetch-build-commit -b 5.1 |
Получить список всех макросов | rpm --showrc |
Чистка спека (в частности, замена путей на макросы) | rpmcs package.spec |
Проставление зависимостей сборки в спеке | buildreq package.spec |
Отменить локальные изменения в git | git reset --hard HEAD |
Преобразовать спек для бранча p8 | rpmbp -b p8 package.spec |
Показать зависимости пакета | rpmquery -R package |
Посмотреть права на пакет erthad | wget -O - http://git.altlinux.org/acl/list.packages.sisyphus | egrep '^erthad' |
Передать права на пакет kicad участнику команды с ником zver | ssh git.alt acl sisyphus kicad leader zver |
Вложенный Git-репозиторий
Если у вас при сборке пакета при структуре:
project ├── .gear ├── .git ├── README.md ├── project.spec └── project-src
Выпадает ошибка:
gear: .gear/rules line 1: tree "project-src" not found in "HEAD"
Значит внутри вашего каталога с исходниками находится вложенный git-репозиторий, который не дает собрать пакет.
Проверить данную теорию можно с помощью команды:
$ git ls-tree HEAD
Выполните ее в git-репозитории вашего проекта.
$ git ls-tree HEAD 040000 tree 9503d98435094b115ff5b10533e7e825b05f7198 .gear 100644 blob 1bc32756139c9859a7daeb0ec3ddb70084cf6a58 README.md 160000 commit 98cd2f96525a0e6d105db69e7715b777ef4e9ecf project-src <-- [! Смотрим сюда!] 100644 blob 7b33945a1aeb0ecfa65a9d7391a002d1705578ac project.spec
У всех файлов и каталогов значения blob (файл) или tree (каталог), а у этого commit.
Значит, возможно склонировав в папку с проектом исходники для сборки (или скопировав каталог с исходниками после клонирования), вы создали вложенный git-репозиторий (сабмодуль [submodule]) - Git апстримовского проекта в Git проекта для ALT. Он-то и не дает собрать проект.
Что делать в данной ситуации?
1. Удаляем сабмодуль
$ git submodule deinit -f project-src $ git rm -f project-src $ rm -rf .git/modules/project-src
2. Добавляем каталог как обычный
$ cp -r path/to/your/project-src . $ git add project-src $ git commit -m "Добавил project-src как обычный каталог"
Что за файлы *.pc?
Расширение .pc в контексте сборки Linux относится к конфигурационным файлам инструмента pkg-config, который используется для помощи при компиляции приложения.
Они относятся к пакету pkg-config.
Файлы PKG-Config обеспечивают механизм для хранения различной информации о библиотеках и пакетах. Информация, хранящаяся в файлах .pc, включает в себя компилятор и флаги компилятора, необходимые для использования указанной библиотеки, а также любые другие соответствующие метаданные.
CMake не может найти модуль проекта, хотя он установлен
При сборке пакета может возникнуть ситуация, когда CMake не может найти один из модулей.
Например, есть проект:
TDE-github/10-tdelibs/10-tdelibs ├── README.md ├── tde-tdelibs │ ├── admin │ ├── arts │ ├── AUTHORS │ ├── catalog.xml │ ├── CMakeL10n.txt │ ├── CMakeLists.txt <-- CMake-файл проекта │ ├── common_texts.cpp │ ├── COMPILING │ ├── COMPILING.html │ ├── config.h.cmake │ ├── configure.in.bot │ ├── configure.in.in │ ├── configure.in.mid │ ├── COPYING │ ├── COPYING.BSD │ ├── COPYING-DOCS │ ├── COPYING.LIB │ ├── dcop <..> │ └── win └── tde-tdelibs.spec
В CMakeLists.txt есть раздел:
##### check for utempter ######################## if( WITH_UTEMPTER ) check_include_file( utempter.h HAVE_UTEMPTER_H ) check_library_exists( utempter addToUtmp "" HAVE_ADDTOUTEMP ) if( NOT DEFINED UTEMPTER_HELPER ) message( STATUS "Looking for utempter helper" ) find_program( UTEMPTER_HELPER utempter PATHS /usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/utempter /usr/lib${LIB_SUFFIX}/utempter /usr/libexec/utempter /usr/libexec /usr/sbin /usr/local/lib/${CMAKE_LIBRARY_ARCHITECTURE}/utempter /usr/local/lib${LIB_SUFFIX}/utempter /usr/local/libexec/utempter /usr/local/libexec /usr/local/sbin ) if( UTEMPTER_HELPER ) message( STATUS "Looking for utempter helper - found" ) else( ) message( STATUS "Looking for utempter helper - not found" ) endif( ) endif( ) if( HAVE_UTEMPTER_H AND HAVE_ADDTOUTEMP AND UTEMPTER_HELPER ) set( HAVE_UTEMPTER 1 ) set( UTEMPTER_LIBRARY utempter ) else( ) message(FATAL_ERROR "\nutempter are requested, but not found on your system" ) endif( ) endif( )
В файле прописано:
find_program( UTEMPTER_HELPER utempter
Данная строка ищет исполняемый файл utempter присваивая ему переменную UTEMPTER_HELPER.
В спеке прописаны зависимости:
# UTEMPTER support BuildRequires: libutempter BuildRequires: libutempter-devel
Но при сборке, hasher ругается на отсутствие даже не библиотеки, а helper-a:
-- Looking for magic_getpath in magic - found -- Looking for utempter.h -- Looking for utempter.h - found -- Looking for addToUtmp in utempter -- Looking for addToUtmp in utempter - found -- Looking for utempter helper -- Looking for utempter helper - not found CMake Error at CMakeLists.txt:719 (message): <-- Не нашел Utempter Helper в CMakeLists.txt
Вы смотрите содержимое пакетов:
Пакет1:
$ rpm -ql libutempter /usr/lib/utempter /usr/lib/utempter/utempter /usr/lib64/libutempter.so.0 /usr/lib64/libutempter.so.1.2.2 /usr/share/doc/libutempter-1.2.2 /usr/share/doc/libutempter-1.2.2/README
Пакет2:
$ rpm -ql libutempter-devel /usr/include/utempter.h /usr/lib64/libutempter.so /usr/share/man/man3/libutempter.3.xz /usr/share/man/man3/utempter.3.xz /usr/share/man/man3/utempter_add_record.3.xz /usr/share/man/man3/utempter_remove_added_record.3.xz /usr/share/man/man3/utempter_remove_record.3.xz /usr/share/man/man3/utempter_set_helper.3.xz
В CMakeLists сборочница пытается найти бинарный, исполняемый файл. Он у нас в пакете №1 - /usr/lib/utempter.
Мы не будем править CMakeLists.txt и делать патч, мы просто добавим в спек, в раздел:
%suse_cmake \ -DCMAKE_BUILD_TYPE="RelWithDebInfo" \ -DCMAKE_C_FLAGS="${RPM_OPT_FLAGS}" \ -DCMAKE_CXX_FLAGS="${RPM_OPT_FLAGS}" \ <...> \ -DWITH_ASPELL=ON \ %{?!with_hspell:-DWITH_HSPELL=OFF} \ -DWITH_TDEICONLOADER_DEBUG=OFF \ ..
Перед .. добавляем строку:
-DUTEMPTER_HELPER=/usr/lib/utempter/utempter \
- -D - параметр
- UTEMPTER_HELPER - имя параметра
- /usr/lib/utempter/utempter - значение
- \ - перенос строки
Конец получается такой:
-DWITH_KDE4_MENU_SUFFIX=OFF \ \ -DWITH_ASPELL=ON \ %{?!with_hspell:-DWITH_HSPELL=OFF} \ -DWITH_TDEICONLOADER_DEBUG=OFF \ -DUTEMPTER_HELPER=/usr/lib/utempter/utempter \ ..
Проблема решена!
Как в параметре CMAKE добавить несколько include-каталогов (для .h/.a/.c и пр)
Пример CMake-раздела в спеке:
%cmake \ -DCMAKE_C_FLAGS="${RPM_OPT_FLAGS}" \ -DCMAKE_CXX_FLAGS="${RPM_OPT_FLAGS}" \ -DCMAKE_SKIP_RPATH=OFF \ -DCMAKE_SKIP_INSTALL_RPATH=OFF \ -DCMAKE_INSTALL_RPATH="%tde_libdir" \ -DCMAKE_NO_BUILTIN_CHRPATH=ON \ -DCMAKE_VERBOSE_MAKEFILE=ON \ -DWITH_GCC_VISIBILITY=ON \ \ -DWITH_ALL_OPTIONS=ON \ -DWITH_ARTS=OFF \ -DWITH_ALSA=ON \ -DWITH_LIBART=ON \ -DWITH_LIBIDN=ON \ -DWITH_SSL=ON \ -DWITH_CUPS=ON \ -DWITH_LUA=OFF \ -DWITH_TIFF=ON \ %{?!with_jasper:-DWITH_JASPER=OFF} \ %{?!with_openexr:-DWITH_OPENEXR=OFF} \ -DWITH_UTEMPTER=ON \ -DWITH_UDEVIL=OFF \ -DWITH_CONSOLEKIT=ON \ %{?with_nm:-DWITH_NETWORK_MANAGER_BACKEND=ON} \ -DWITH_SUDO_TDESU_BACKEND=OFF \ -DWITH_OLD_XDG_STD=OFF \ -DWITH_PCSC=ON \ -DWITH_PKCS=ON \ -DWITH_CRYPTSETUP=ON \ %{?!with_lzma:-DWITH_LZMA=OFF} \ -DWITH_LIBBFD=OFF \ %{?!with_xrandr:-DWITH_XRANDR=OFF} \ -DWITH_XCOMPOSITE=ON \ -DWITH_KDE4_MENU_SUFFIX=OFF \ \ -DWITH_ASPELL=ON \ %{?!with_hspell:-DWITH_HSPELL=OFF} \ -DWITH_TDEICONLOADER_DEBUG=OFF \ -DUTEMPTER_HELPER=/usr/lib/utempter/utempter \ -DCMAKE_INCLUDE_PATH="/usr/include/dbus-1.0/dbus/:/usr/include/libltdl/" \ <-- Обратите внимание на эту строку ..
Обратите внимание на строку
cmake .. -DCMAKE_INCLUDE_PATH="/usr/include:/usr/include/libltdl"
Параметр
-DCMAKE_INCLUDE_PATH="/usr/include/"
указывает CMake, где искать заголовочные файлы, но он не рекурсивный. Это означает, что CMake будет искать заголовки только в указанной папке (/usr/include/), но не в её вложенных подкаталогах.
Если заголовок находится прямо в /usr/include/, например /usr/include/ltdl.h, CMake его найдёт. Если заголовок находится в /usr/include/libltdl/ltdl.h, его нужно подключать как #include <libltdl/ltdl.h>, и CMake не будет искать во вложенных каталогах автоматически.
Как включить вложенные каталоги? Чтобы явно указать все пути если заголовки находятся в /usr/include/libltdl/, можно добавить строчку:
cmake .. -DCMAKE_INCLUDE_PATH="/usr/include:/usr/include/libltdl"
Примечания
- ↑ В пакете girar-nmu