BSDPORTAL.RU

На этом сайте обсуждаются вопросы использования ОС FreeBSD
 Портал  •  Статьи  •  Форум  •  Wiki  •  Поиск  •  FAQ  •  Обои  •   Официальная документация  •  Новые темы 

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 17 ] 
Автор Сообщение
 Заголовок сообщения: Как правильно сделать порт
СообщениеДобавлено: Чт 12 апр, 2018 5:34 pm 
Не в сети

Зарегистрирован: Чт 03 янв, 2008 3:16 pm
Сообщения: 180
Откуда: Москва
Привет, All!

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

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


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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно сделать порт
СообщениеДобавлено: Пт 13 апр, 2018 11:07 am 
Не в сети

Зарегистрирован: Чт 14 май, 2009 6:56 pm
Сообщения: 761
Все правильно. Когда `make` вызывается без таргета, то порт билдится (build) и инсталлится (install) в ${STAGEDIR}. А `make install` просто копирует установленную прогу из STAGEDIR в LOCALBASE.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно сделать порт
СообщениеДобавлено: Пт 13 апр, 2018 12:37 pm 
Не в сети
Модератор

Зарегистрирован: Сб 11 сен, 2004 6:33 am
Сообщения: 5167
Откуда: Москва
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
и т.д. Можете сразу показать порт.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно сделать порт
СообщениеДобавлено: Пт 13 апр, 2018 7:28 pm 
Не в сети

Зарегистрирован: Чт 03 янв, 2008 3:16 pm
Сообщения: 180
Откуда: Москва
Вот написанный мной 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?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно сделать порт
СообщениеДобавлено: Пт 13 апр, 2018 9:43 pm 
Не в сети
Модератор

Зарегистрирован: Сб 11 сен, 2004 6:33 am
Сообщения: 5167
Откуда: Москва
Abyrvalg писал(а):
Но у этой программы есть ещё и конфиги. Нужно какую-то отдельную строчку прописывать для их копирования?

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

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно сделать порт
СообщениеДобавлено: Пт 13 апр, 2018 11:14 pm 
Не в сети

Зарегистрирован: Чт 03 янв, 2008 3:16 pm
Сообщения: 180
Откуда: Москва
Вот так поправил:
Код:
do-install:
   ${INSTALL_PROGRAM} ${WRKSRC}/${PORTNAME} ${STAGEDIR}${PREFIX}/bin
   ${INSTALL_DATA} ${WRKSRC}/*.conf ${STAGEDIR}${PREFIX}/etc

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно сделать порт
СообщениеДобавлено: Сб 14 апр, 2018 12:34 am 
Не в сети
Модератор

Зарегистрирован: Сб 11 сен, 2004 6:33 am
Сообщения: 5167
Откуда: Москва
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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно сделать порт
СообщениеДобавлено: Пн 16 апр, 2018 6:13 pm 
Не в сети

Зарегистрирован: Чт 03 янв, 2008 3:16 pm
Сообщения: 180
Откуда: Москва
Цитата:
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 любую константную строку.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно сделать порт
СообщениеДобавлено: Пн 16 апр, 2018 6:26 pm 
Не в сети
Модератор

Зарегистрирован: Сб 11 сен, 2004 6:33 am
Сообщения: 5167
Откуда: Москва
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\"                                                                                                                                         


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно сделать порт
СообщениеДобавлено: Вт 17 апр, 2018 12:30 am 
Не в сети

Зарегистрирован: Чт 03 янв, 2008 3:16 pm
Сообщения: 180
Откуда: Москва
Как ни странно, получилось... Пропатчил все три Makefile, убрал USE_GCC. При сборке, конечно, куча всяких варнингов, но таки собралось и даже выглядит работоспособным.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно сделать порт
СообщениеДобавлено: Вт 17 апр, 2018 12:57 am 
Не в сети
Модератор

Зарегистрирован: Сб 11 сен, 2004 6:33 am
Сообщения: 5167
Откуда: Москва
Тогда засылайте shar в багзиллу и amdmi3@freebsd.org в CC:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно сделать порт
СообщениеДобавлено: Вт 17 апр, 2018 3:55 pm 
Не в сети

Зарегистрирован: Чт 03 янв, 2008 3:16 pm
Сообщения: 180
Откуда: Москва
Цитата:
Тогда засылайте shar в багзиллу


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно сделать порт
СообщениеДобавлено: Вт 17 апр, 2018 4:45 pm 
Не в сети
Модератор

Зарегистрирован: Сб 11 сен, 2004 6:33 am
Сообщения: 5167
Откуда: Москва
Это https://bugs.freebsd.org/. Не читайте русскую документацию.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно сделать порт
СообщениеДобавлено: Вт 17 апр, 2018 5:24 pm 
Не в сети

Зарегистрирован: Чт 03 янв, 2008 3:16 pm
Сообщения: 180
Откуда: Москва
Вот: https://bugs.freebsd.org/bugzilla/show_ ... ?id=227582
Как там в копию добавлять, не понял. Могу отдельно послать shar...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно сделать порт
СообщениеДобавлено: Ср 18 апр, 2018 4:03 pm 
Не в сети
Модератор

Зарегистрирован: Сб 11 сен, 2004 6:33 am
Сообщения: 5167
Откуда: Москва
Нужна ещё одна итерация. Мог бы и сам исправить, но вам этот порт поддерживать.

  • Закомментированные строки из 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'и починить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно сделать порт
СообщениеДобавлено: Вс 20 май, 2018 10:29 pm 
Не в сети

Зарегистрирован: Чт 03 янв, 2008 3:16 pm
Сообщения: 180
Откуда: Москва
Кажись, всё поправил. Залил на трекер.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно сделать порт
СообщениеДобавлено: Чт 07 июн, 2018 8:26 pm 
Не в сети
Модератор

Зарегистрирован: Сб 11 сен, 2004 6:33 am
Сообщения: 5167
Откуда: Москва
Закоммичено, спасибо! Только перенёс в категорию net (multimedia осталась как дополнительная категория).


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Зарегистрированные пользователи: Google [Bot], Google Feedfetcher


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB
Яндекс.Метрика