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
Сообщения: 767
Все правильно. Когда `make` вызывается без таргета, то порт билдится (build) и инсталлится (install) в ${STAGEDIR}. А `make install` просто копирует установленную прогу из STAGEDIR в LOCALBASE.

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


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

Зарегистрирован: Сб 11 сен, 2004 6:33 am
Сообщения: 5178
Откуда: Москва
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
Сообщения: 5178
Откуда: Москва
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
Сообщения: 5178
Откуда: Москва
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
Сообщения: 5178
Откуда: Москва
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
Сообщения: 5178
Откуда: Москва
Тогда засылайте 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
Сообщения: 5178
Откуда: Москва
Это 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
Сообщения: 5178
Откуда: Москва
Нужна ещё одна итерация. Мог бы и сам исправить, но вам этот порт поддерживать.

  • Закомментированные строки из 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
Сообщения: 5178
Откуда: Москва
Закоммичено, спасибо! Только перенёс в категорию net (multimedia осталась как дополнительная категория).


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

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


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

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


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

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