BSDPORTAL.RU
http://bsdportal.ru/

Как правильно сделать порт
http://bsdportal.ru/viewtopic.php?f=9&t=28669
Страница 1 из 1

Автор:  Abyrvalg [ Чт 12 апр, 2018 5:34 pm ]
Заголовок сообщения:  Как правильно сделать порт

Привет, All!

Готовлю порт одной линуксовой программы. Как и советовала документация, проверил файлы утилитой portlint и добился того, что никаких fatal errors нет.
Однако сбивает с толку вот что. Если набрать команду make, то происходит не только сбор порта, но и попытка его установки. Притом, хотя pkg-plist имеется, попытка установки завершается фейлом:

Код:
gmake[1]: *** No rule to make target 'install'.  Stop.


(да, там используется gmake вместо make)

Где могут быть грабли?

Автор:  arrowdodger [ Пт 13 апр, 2018 11:07 am ]
Заголовок сообщения:  Re: Как правильно сделать порт

Все правильно. Когда `make` вызывается без таргета, то порт билдится (build) и инсталлится (install) в ${STAGEDIR}. А `make install` просто копирует установленную прогу из STAGEDIR в LOCALBASE.

Судя по тексту ошибки, прога, которую вы собираете просто не имеет таргета `install`. Надо разбираться почему.

Автор:  AMDmi3 [ Пт 13 апр, 2018 12:37 pm ]
Заголовок сообщения:  Re: Как правильно сделать порт

Abyrvalg писал(а):
Готовлю порт одной линуксовой программы. Как и советовала документация, проверил файлы утилитой portlint и добился того, что никаких fatal errors нет.
Однако сбивает с толку вот что. Если набрать команду make, то происходит не только сбор порта, но и попытка его установки. Притом, хотя pkg-plist имеется, попытка установки завершается фейлом:

Код:
gmake[1]: *** No rule to make target 'install'.  Stop.


(да, там используется gmake вместо make)

Где могут быть грабли?

Очевидно в том что makefile программы не имеер install таргета, а вызов его - действие по умолчанию для цели установки. Обычно в таких случаях нужно переопределить в Makefile порта цель do-install и выполнить там установку файлов пакета в stagedir вручную, т.е.
Код:
 ${INSTALL_PROGRAM} ${WRKSRC}/foo ${STAGEDIR}${PREFIX}/bin
и т.д. Можете сразу показать порт.

Автор:  Abyrvalg [ Пт 13 апр, 2018 7:28 pm ]
Заголовок сообщения:  Re: Как правильно сделать порт

Вот написанный мной Makefile для порта:
Код:
# $FreeBSD$

PORTNAME=         mptsd
PORTVERSION=      1.1
PORTREVISION=      0
PORTEPOCH=         0
CATEGORIES=         multimedia
MASTER_SITES=      https://georgi.unixsol.org/programs/mptsd/
# EXTRACT_SUFX=      .tar.bz2

MAINTAINER=         my_email@mydomain.com
COMMENT=            MPEG TS stream muxer

LICENSE=            BSD3CLAUSE

USES=               gmake tar:bzip2
USE_BZIP2=         yes
USE_GCC=            any

# USE_GITHUB=     yes
# GH_ACCOUNT=     freebsd

# USE_LDCONFIG=   ${PREFIX}/lib/compat/pkg

.include <bsd.port.mk>


Действительно, в Makefile исходной программы нет цели install. Похоже, её автор не заморачивался и предполагал, что пользователи будут запускать программу из того каталога, где происходила сборка, или при необходимости скопируют собранный бинарник куда им надо.

Вписал в свой Makefile строчки:
Код:
do-install:
   ${INSTALL_PROGRAM} ${WRKSRC}/mptsd ${STAGEDIR}${PREFIX}/bin

И действительно, теперь сборка происходит без ошибок. Бинарник копируется куда надо.

Но у этой программы есть ещё и конфиги. Нужно какую-то отдельную строчку прописывать для их копирования? А какую роль тогда играет файл pkg-plist?

Автор:  AMDmi3 [ Пт 13 апр, 2018 9:43 pm ]
Заголовок сообщения:  Re: Как правильно сделать порт

Abyrvalg писал(а):
Но у этой программы есть ещё и конфиги. Нужно какую-то отдельную строчку прописывать для их копирования?

Да, для каждого файла. Можно сразу для *.conf. Только команда может понадобиться другая - для конфигов и других данных ${INSTALL_DATA}, ещё есть ${INSTALL_MAN} для man-страниц и ${INSTALL_LIB} для shared библиотек.

Abyrvalg писал(а):
А какую роль тогда играет файл pkg-plist?

Просто список файлов которые попадут в пакет.

Если собираетесь засылать в дерево могу сказать что ещё нужно будет поправить.

Автор:  Abyrvalg [ Пт 13 апр, 2018 11:14 pm ]
Заголовок сообщения:  Re: Как правильно сделать порт

Вот так поправил:
Код:
do-install:
   ${INSTALL_PROGRAM} ${WRKSRC}/${PORTNAME} ${STAGEDIR}${PREFIX}/bin
   ${INSTALL_DATA} ${WRKSRC}/*.conf ${STAGEDIR}${PREFIX}/etc

Вроде получилось. Хотя конфигов там несколько, поэтому, наверное, имеет смысл под них специальный каталог заводить.
Ещё в исходном дистрибутиве болтаются какие-то rc-скрипты, но за них браться как-то боязно...
Конечно, буду рад любым советам. Хотелось бы довести порт до ума и выложить в дерево, чтобы и другим пригодилось.

Автор:  AMDmi3 [ Сб 14 апр, 2018 12:34 am ]
Заголовок сообщения:  Re: Как правильно сделать порт

Abyrvalg писал(а):
Вроде получилось. Хотя конфигов там несколько, поэтому, наверное, имеет смысл под них специальный каталог заводить.

Тошда так:
Код:
    ${MKDIR} ${STAGEDIR}${ETCDIR}
    ${INSTALL_DATA} ${WRKSRC}/mptsd*.conf ${STAGEDIR}${ETCDIR}

plist поправить соответственно.

Abyrvalg писал(а):
Ещё в исходном дистрибутиве болтаются какие-то rc-скрипты, но за них браться как-то боязно...

Это к FreeBSD не имеет отношения. Можно написать родной rc скрипт.

Abyrvalg писал(а):
Конечно, буду рад любым советам. Хотелось бы довести порт до ума и выложить в дерево, чтобы и другим пригодилось.

  • PORTREVISION, PORTEPOCH, USE_BZIP2, закомментированные строки кроме первой убрать, добавить реальный email.
  • Лицензия там не BSD3CLAUSE а GPLv2 и MIT. Не забудьте LICENSE_COMB=multi
  • Нужно как следует пропатчить кривые апстримовские Makefile:
    • Должен использоваться системный компилятор, т.е. строки
      Код:
      CC =
      из всех makefile нужно убрать (патчем или через REINPLACE_CMD)
    • То же для флагов, т.е. CFLAGS только с += и без -O/-g флагов
    • Команды выполняемые Makefile должны быть видно, т.е. как минимум убрать Q=@.
    • Во время сборки не должно вызываться никаких git и date - GIT_VER задать через VERSION, в BUILD_ID любую константную строку.
  • Это всё позволит также избавиться от USE_GCC

Автор:  Abyrvalg [ Пн 16 апр, 2018 6:13 pm ]
Заголовок сообщения:  Re: Как правильно сделать порт

Цитата:
PORTREVISION, PORTEPOCH, USE_BZIP2, закомментированные строки кроме первой убрать, добавить реальный email.
Лицензия там не BSD3CLAUSE а GPLv2 и MIT. Не забудьте LICENSE_COMB=multi


Ага, это сделал.
А вот дальше уже плаваю...

Цитата:
Должен использоваться системный компилятор, т.е. строки
CC =
из всех makefile нужно убрать (патчем или через REINPLACE_CMD)
То же для флагов, т.е. CFLAGS только с += и без -O/-g флагов
Команды выполняемые Makefile должны быть видно, т.е. как минимум убрать Q=@.


Годится ли так?
Код:
post-patch:
   for i in ${WRKSRC}/Makefile ${WRKSRC}/libfuncs/Makefile ${WRKSRC}/libtsfuncs/Makefile
   do
      @${REINPLACE_CMD} -i -e '/^CC =/d' -e '/^CFLAGS =/d' -e '/Q=@/d' $i
   done


Цитата:
Во время сборки не должно вызываться никаких git и date - GIT_VER задать через VERSION, в BUILD_ID любую константную строку.

Вот тут точно не знаю, как делать...

Автор:  AMDmi3 [ Пн 16 апр, 2018 6:26 pm ]
Заголовок сообщения:  Re: Как правильно сделать порт

Abyrvalg писал(а):
Годится ли так?
Код:
post-patch:
   for i in ${WRKSRC}/Makefile ${WRKSRC}/libfuncs/Makefile ${WRKSRC}/libtsfuncs/Makefile
   do
      @${REINPLACE_CMD} -i -e '/^CC =/d' -e '/^CFLAGS =/d' -e '/Q=@/d' $i
   done

Для CC и Q так в принципе можно было бы сделать, но вот CFLAGS удалять не нужно, там есть полезные (-W*) и может даже критичные для сборки флаги (-D*, -std). Там нужно поменять = на += и убрать -O* и -g*.
Это уже более сложные изменения которые сложно изобразить на sed, так что лучше отказаться от REINPLACE в сторону патчей. Тем более что их проще (хотя бы частично) отправить в апстрим.

Abyrvalg писал(а):
Цитата:
Во время сборки не должно вызываться никаких git и date - GIT_VER задать через VERSION, в BUILD_ID любую константную строку.

Вот тут точно не знаю, как делать...

Как-то так:
Код:
-BUILD_ID = $(shell date +%F_%R)
 VERSION="v1.1"
-GIT_VER = $(shell git describe --tags --dirty --always 2>/dev/null)
-CFLAGS = -ggdb -Wall -Wextra -Wshadow -Wformat-security -Wno-strict-aliasing -O2 -D_GNU_SOURCE -DBUILD_ID=\"$(BUILD_ID)\"
+CFLAGS += -Wall -Wextra -Wshadow -Wformat-security -Wno-strict-aliasing -D_GNU_SOURCE -DBUILD_ID=\"FreeBSD_port\"                                                                                                                                         

Автор:  Abyrvalg [ Вт 17 апр, 2018 12:30 am ]
Заголовок сообщения:  Re: Как правильно сделать порт

Как ни странно, получилось... Пропатчил все три Makefile, убрал USE_GCC. При сборке, конечно, куча всяких варнингов, но таки собралось и даже выглядит работоспособным.

Автор:  AMDmi3 [ Вт 17 апр, 2018 12:57 am ]
Заголовок сообщения:  Re: Как правильно сделать порт

Тогда засылайте shar в багзиллу и amdmi3@freebsd.org в CC:

Автор:  Abyrvalg [ Вт 17 апр, 2018 3:55 pm ]
Заголовок сообщения:  Re: Как правильно сделать порт

Цитата:
Тогда засылайте shar в багзиллу


А это где? Вот тут сказано про send-pr...

Автор:  AMDmi3 [ Вт 17 апр, 2018 4:45 pm ]
Заголовок сообщения:  Re: Как правильно сделать порт

Это https://bugs.freebsd.org/. Не читайте русскую документацию.

Автор:  Abyrvalg [ Вт 17 апр, 2018 5:24 pm ]
Заголовок сообщения:  Re: Как правильно сделать порт

Вот: https://bugs.freebsd.org/bugzilla/show_ ... ?id=227582
Как там в копию добавлять, не понял. Могу отдельно послать shar...

Автор:  AMDmi3 [ Ср 18 апр, 2018 4:03 pm ]
Заголовок сообщения:  Re: Как правильно сделать порт

Нужна ещё одна итерация. Мог бы и сам исправить, но вам этот порт поддерживать.

  • Закомментированные строки из Makefile нужно убрать
  • Принятое выравнивание в Makefile - два таба ширины 8, у вас получилось так как оно выглядит тут https://bz-attachments.freebsd.org/atta ... ?id=192592
  • Нельзя мешать sed и патчи, это сложно поддерживать. post-patch нужно выкинуть, тем более что он, похоже, дублирует патчи.
  • В pkg-descr должны быть нормально перенесённые строки длины < 80, достаточно прогнать через |fmt
  • В pkg-descr нужно добавить WWW: с ссылкой на домашнюю страницу (github, вероятно)
  • Не нужны такие сложности в patch-libtsfuncs-crc.c - просто заменить u_int32_t на uint32_t, это опечатка.
  • Содержимое stagedir должно совпадать с pkg-plist, иначе будут ругаться автоматические проверки:
    Цитата:
    ====> Running Q/A tests (stage-qa)
    ====> Checking for pkg-plist issues (check-plist)
    ===> Parsing plist
    ===> Checking for items in STAGEDIR missing from pkg-plist
    Error: Orphaned: %%ETCDIR%%/rc.mptsd.conf
    ===> Checking for items in pkg-plist which are not in STAGEDIR
    ===> Error: Plist issues found.
    *** Error code 1

    Достаточно его просто не устанавливать: как я уже писал, ${INSTALL_DATA} mptsd*.conf, а не *.conf.
  • Совсем не нужно убирать версию программы из program_id - если пропатчить корневой Makefile как я написал выше и BUILD_ID и GIT_VER (взятый из VERSION) будут заполнены корректно, патч для Makefile будет проще, patch-mptsd.c не понадобится.

Вроде всё. Собирается нормально под всеми версиями и архитектурами. Посмотрим жив ли автор, а том можно было бы и warning'и починить.

Автор:  Abyrvalg [ Вс 20 май, 2018 10:29 pm ]
Заголовок сообщения:  Re: Как правильно сделать порт

Кажись, всё поправил. Залил на трекер.

Upd. Правда, мог с табуляциями второпях напутать :(

Страница 1 из 1 Часовой пояс: UTC + 4 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/