Dev start faq: различия между версиями

Материал из ALT Linux Wiki
м (→‎Что за файлы *.PC?: жизни регистров важны :])
 
(не показано 11 промежуточных версий 1 участника)
Строка 1: Строка 1:
=Ответы на вопросы, помогающие найти нужные статьи=
== Я полный ноль в сборке пакетов. С чего мне начать?==
Посмотрите статью [[Сборка пакетов start]]
== Могу ли я попробовать импортировать пакет из другого дистрибутива? ==
Да, с помощью утилиты {{pkg|srpmimport}} вы можете симпортрировать и сконвертировать srpm-пакеты из некоторых других RPM-дистрибутивов (ROSA, SUSE и пр.).
Посмотрите статью [[ImportAlienPackage|Импорт "чужого" пакета]].
== Я не умею пользоваться 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
== Полезные команды ==
{| class="standard"
|-
!Описание||Команда
|-
|Получить ветку 5.1 с коммитом в репозиторий 5.1 <ref>В пакете  girar-nmu</ref>|| {{cmd|girar-fetch-build-commit -b 5.1}}
|-
|Получить список всех макросов|| {{cmd|rpm --showrc}}
|-
|Чистка спека (в частности, замена путей на макросы)||{{cmd|rpmcs package.spec}}
|-
|Проставление зависимостей сборки в спеке||{{cmd|buildreq package.spec}}
|-
|Отменить локальные изменения в git ||{{cmd|git reset --hard HEAD}}
|-
|Преобразовать спек для бранча p8 || {{cmd|rpmbp -b p8 package.spec}}
|-
|Показать зависимости пакета || {{cmd|rpmquery -R package}}
|-
|Посмотреть права на пакет erthad||{{cmd|wget -O - http://git.altlinux.org/acl/list.packages.sisyphus  {{!!}} egrep '^erthad'}}
|-
|Передать права на пакет <tt>kicad</tt> участнику команды с ником <tt>zver</tt>||{{cmd|ssh git.alt acl sisyphus kicad leader zver}}
|}
==Вложенный Git-репозиторий==
==Вложенный Git-репозиторий==
Если у вас при сборке пакета при структуре:
Если у вас при сборке пакета при структуре:
Строка 39: Строка 94:
  $ git commit -m "Добавил project-src как обычный каталог"
  $ git commit -m "Добавил project-src как обычный каталог"


==Что за файлы *.PC?==
==Что за файлы *.pc?==
Расширение .pc в контексте сборки Linux относится к конфигурационным файлам инструмента pkg-config, который используется для помощи при компиляции приложения.  
Расширение .pc в контексте сборки Linux относится к конфигурационным файлам инструмента pkg-config, который используется для помощи при компиляции приложения.  


Строка 113: Строка 168:
endif( )
endif( )
</pre>
</pre>
В файле прописано:
find_program( UTEMPTER_HELPER utempter
Данная строка ищет исполняемый файл {{cmd|utempter}} присваивая ему переменную UTEMPTER_HELPER.


В спеке прописаны зависимости:
В спеке прописаны зависимости:
Строка 167: Строка 226:
Перед .. добавляем строку:
Перед .. добавляем строку:
   -DUTEMPTER_HELPER=/usr/lib/utempter/utempter \
   -DUTEMPTER_HELPER=/usr/lib/utempter/utempter \
*{{path|-D}} - параметр
*{{path|UTEMPTER_HELPER}} - имя параметра
*/usr/lib/utempter/utempter - значение
*\ - перенос строки


Конец получается такой:
Конец получается такой:
Строка 178: Строка 241:


Проблема решена!
Проблема решена!
==Как в параметре CMAKE добавить несколько include-каталогов (для .h/.a/.c и пр)==
Пример CMake-раздела в спеке:
<pre>
%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/" \ <-- Обратите внимание на эту строку
..
</pre>
Обратите внимание на строку
cmake .. -DCMAKE_INCLUDE_PATH="/usr/include:/usr/include/libltdl"
Параметр
-DCMAKE_INCLUDE_PATH="/usr/include/"
указывает CMake, где искать заголовочные файлы, но он не рекурсивный. Это означает, что CMake будет искать заголовки только в указанной папке ({{path|/usr/include/}}), но не в её вложенных подкаталогах.
Если заголовок находится прямо в {{path|/usr/include/}}, например {{path|/usr/include/ltdl.h}}, CMake его найдёт. Если заголовок находится в {{path|/usr/include/libltdl/ltdl.h}}, его нужно подключать как {{path|<nowiki>#include <libltdl/ltdl.h></nowiki>}}, и CMake не будет искать во вложенных каталогах автоматически.
Как включить вложенные каталоги? Чтобы явно указать все пути если заголовки находятся в {{path|/usr/include/libltdl/}}, можно добавить строчку:
cmake .. -DCMAKE_INCLUDE_PATH="/usr/include:/usr/include/libltdl"
=Примечания=
{{Примечания}}
{{Category navigation|title=Начинающему разработчику|category=Начинающему разработчику|sortkey={{SUBPAGENAME}}}}
{{Category navigation|title=Начинающему разработчику|category=Начинающему разработчику|sortkey={{SUBPAGENAME}}}}
[[Категория:Сборка пакетов]]
[[Категория:Сборка пакетов]]

Текущая версия от 10:09, 18 марта 2025

Ответы на вопросы, помогающие найти нужные статьи

Я полный ноль в сборке пакетов. С чего мне начать?

Посмотрите статью Сборка пакетов 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, потому что в указанном примере спек был импортирован из SUSE
 %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"

Примечания

  1. В пакете girar-nmu