Перейти к содержанию

Рекомендуемые сообщения

Опубликовано (изменено)

Доброго всем дня

Уважаемые гуру подскажите пожалуйста, как собрать пакет который отсутствует в entware репозитории?
Входные данные:

  1. Имеется собранный toolchain для entware.
  2. Имеется готовый пакет на гитхабе под другие архитектуры, отличные от архитектур keenetic. В качестве примера, пусть будет пакет libhttpserver.  

Задача собрать пакет для mipsel.

Как собрать toolchain уже разобрался. Как собрать с нуля пакет - тоже понятно. Но вот как собрать уже готовый пакет с различными зависимостями под entware, пока не могу осилить. Под Mac OS X и Linux сборку осилил. Буду признателен за помощь в решении двух задач:

  1. Сборку  libhttpserver. Желательно под все архитектуры, или как минимум под mipsel. 
  2. Объяснить популярно или указать на источники пояснений о том, как самостоятельно из готового пакета собрать свой файл манифеста Makefile (куда смотреть и что делать) и собственно, как по шагам собрать сам пакет с его зависимостями. Это пожалуй самый важный пункт, так как по идее, если понять основные принципы, то далее собирать можно будет любой пакет самостоятельно.

Буду признателен за любую посильную помощь по существу моего вопроса.

Изменено пользователем Zeleza
Опубликовано

https://openwrt.org/docs/guide-developer/packages#buildpackage_variables

язык - с++; сист. сборки - autotools; зависимости - libstdcpp (точняк) + libmicrohttpd (">= 0.9.64") + gnutls ("[Optionally]: for TLS (HTTPS) support") + м.б. ещё что-то (см. в configure.ac)

Опубликовано
  В 14.01.2023 в 13:00, TheBB сказал:

язык - с++; сист. сборки - autotools; зависимости - libstdcpp (точняк) + libmicrohttpd (">= 0.9.64") + gnutls ("[Optionally]: for TLS (HTTPS) support") + м.б. ещё что-то (см. в configure.ac)

Показать  

Благодарю Вас.
Если верно понимаю, то libstdcpp + libmicrohttpd нужно установить в файл манифеста в переменную DEPENDS

DEPENDS:=+libstdcpp +librt +libpthread +libmicrohttpd +libgnutls

 Все верно?

  В 14.01.2023 в 13:00, TheBB сказал:

+ м.б. ещё что-то (см. в configure.ac)

Показать  

Вот тут прошу Вас дать пояснения. Как понять, что это что-то нужно и куда это нужное внести?

Опубликовано (изменено)

Да и вопрос в догонку - как понять куда и какие файлы библиотек и заголовочные файлы необходимо устанавливать в разделе?:

define Package/libhttpserver/install

 

Изменено пользователем Zeleza
Опубликовано
  Показать контент

 

Опубликовано
  В 14.01.2023 в 13:14, Zeleza сказал:
+librt +libpthread
Показать  

не нужно  - https://github.com/Entware/Entware/blob/master/include/package-defaults.mk#L5

  В 14.01.2023 в 13:14, Zeleza сказал:
+libgnutls
Показать  

уже - https://github.com/Entware/entware-packages/blob/master/libs/libmicrohttpd/Makefile#L45

  В 14.01.2023 в 13:41, Zeleza сказал:

как понять куда и какие файлы библиотек и заготовочные файлы

Показать  
  В 14.01.2023 в 14:10, TheBB сказал:
PKG_INSTALL:=1
Показать  
~ # ls opt/*
opt/include:
httpserver  httpserver.hpp  httpserverpp

opt/lib:
libhttpserver.a  libhttpserver.la  libhttpserver.so  libhttpserver.so.0  libhttpserver.so.0.18.1  pkgconfig

opt/share:
cmake
~ # 

 

Опубликовано
  В 14.01.2023 в 14:22, TheBB сказал:
~ # ls opt/*
opt/include:
httpserver  httpserver.hpp  httpserverpp

opt/lib:
libhttpserver.a  libhttpserver.la  libhttpserver.so  libhttpserver.so.0  libhttpserver.so.0.18.1  pkgconfig

opt/share:
cmake
~ # 
Показать  

Куда нужно смотреть чтобы понять, что именно эти файлы библиотек и заголовочных файлов необходимо устанавливать и именно в эти обозначенные директории? 
В документации по libhttpserver этого не нашел.

Опубликовано

и это простейший пакет...  (((

в сгенерированные Makefile`ы  */build_dir/target-*/libhttpserver-*/* (что ставится в includedir, что ставится в libdir, что ставится в pkgconfigdir и т.д.)

make install (PKG_INSTALL:=1)

~ # cd build_dir/target-mipsel*
~ # ls libhttpserver-0.18.2/ipkg-install/opt/*/*
libhttpserver-0.18.2/ipkg-install/opt/include/httpserver.hpp
libhttpserver-0.18.2/ipkg-install/opt/include/httpserverpp
libhttpserver-0.18.2/ipkg-install/opt/lib/libhttpserver.a
libhttpserver-0.18.2/ipkg-install/opt/lib/libhttpserver.la
libhttpserver-0.18.2/ipkg-install/opt/lib/libhttpserver.so
libhttpserver-0.18.2/ipkg-install/opt/lib/libhttpserver.so.0
libhttpserver-0.18.2/ipkg-install/opt/lib/libhttpserver.so.0.18.1

libhttpserver-0.18.2/ipkg-install/opt/include/httpserver:
basic_auth_fail_response.hpp   http_request.hpp
create_webserver.hpp	       http_resource.hpp
deferred_response.hpp	       http_response.hpp
details			       http_utils.hpp
digest_auth_fail_response.hpp  string_response.hpp
file_response.hpp	       webserver.hpp

libhttpserver-0.18.2/ipkg-install/opt/lib/pkgconfig:
libhttpserver.pc

libhttpserver-0.18.2/ipkg-install/opt/share/cmake:
Modules

дальше раскидывать на упаковку что нужно (бибки, бинарники, ...)

  В 14.01.2023 в 14:10, TheBB сказал:
define Package/libhttpserver/install
Показать  

нужна dev-секция для включение в др. пакеты (заголовки,бибки, ...), добавляем

  В 14.01.2023 в 14:10, TheBB сказал:
define Build/InstallDev
Показать  

 

  В 14.01.2023 в 14:42, Zeleza сказал:

В документации по libhttpserver этого не нашел.

Показать  

изучать систему сборки

Опубликовано

Доброго утра,
Большое спасибо за информацию.

  В 14.01.2023 в 16:25, TheBB сказал:

изучать систему сборки

Показать  

К сожалению, нет путного мануала для конкретного случая на внятном русском.
Опыт приходит через знания подтвержденные практикой и только тогда, когда есть конкретная задача, т.е. имеется соотвествующий уровень мотивации. Полагаю, Вы тоже через это прошли и не сразу обрели соотвествующий уровень компетенций в данном направлении.

Потому не судите строго.
Еще раз, благодарю за помощь.
 
 

Опубликовано
  В 15.01.2023 в 03:26, Zeleza сказал:

К сожалению, нет путного мануала для конкретного случая на внятном русском.

Показать  

Такое бывает в 99% случаев... 

Опубликовано

Сейчас гуглопереводчик даже с китайского переводит прилично. На английском вполне внятная инструкция.

Нужно

1. Попробовать собрать уже имеющийся знакомый пакет (например, mc), чтобы понять, как происходит сборка. Как собираются зависимости.

2. Посмотреть, как устроены готовые пакеты (3000+) и по аналогии сделать свой.

 

Никто не говорит, что все выйдет за несколько часов.....

Опубликовано
  В 14.01.2023 в 14:10, TheBB сказал:
define Build/InstallDev
	$(INSTALL_DIR) $(1)/opt/include
	$(CP) $(PKG_INSTALL_DIR)/opt/include/* $(1)/opt/include

	$(INSTALL_DIR) $(1)/opt/lib
-->>    $(CP) $(PKG_INSTALL_DIR)/opt/lib/libhttpserver.{a,so*} $(1)/opt/lib

	$(INSTALL_DIR) $(1)/opt/lib/pkgconfig
	$(CP) $(PKG_INSTALL_DIR)/opt/lib/pkgconfig/*.pc $(1)/opt/lib/pkgconfig
endef

define Package/libhttpserver/install
	$(INSTALL_DIR) $(1)/opt/lib
-->>    $(CP) $(PKG_INSTALL_DIR)/opt/lib/libhttpserver.so* $(1)/opt/lib
endef
Показать  

Подскажите пожалуйста, с какой целью дублируются, отмеченные стрелками секции копирования?

Опубликовано

https://github.com/etr/libhttpserver/blob/master/INSTALL (autotools)

На "большом пингвине": cd  ./куда-то/в/каталог/исходников; ./configure --чего-то=там; make; make install

Размазано по файлам, для примера (кратко)

1 получение исходного кода (готовый архив или клонирование репы) https://github.com/openwrt/openwrt/blob/master/include/download.mk

2 распаковка (если архивом) https://github.com/openwrt/openwrt/blob/master/include/package-defaults.mk#L65

3 наложение патчей (если нужно) https://github.com/openwrt/openwrt/blob/master/include/package-defaults.mk#L67

4 конфигурирование с заданными параметрами (./configure) https://github.com/openwrt/openwrt/blob/master/include/package-defaults.mk#L112

5 сборка (make) https://github.com/openwrt/openwrt/blob/master/include/package-defaults.mk#L142

6 установка (make install) https://github.com/openwrt/openwrt/blob/master/include/package-defaults.mk#L149

и

1,2,3 https://github.com/openwrt/openwrt/blob/master/include/package.mk#L200

4 https://github.com/openwrt/openwrt/blob/master/include/package.mk#L209

https://github.com/openwrt/openwrt/blob/master/include/package.mk#L218

6 https://github.com/openwrt/openwrt/blob/master/include/package.mk#L220

и т.д.

На "закуску" (diff в помощь) один из возможных вариантов Makefile`a (почти по шен-фуй)

  Показать контент

 

Опубликовано (изменено)

Благодарю, только ошибку дает - не находит bootstrap при компиляции gnutls:

  Показать контент

Будет возможность подсказать, как решить проблему?

Изменено пользователем Zeleza
Опубликовано
  В 15.01.2023 в 12:46, Zeleza сказал:

как решить проблему?

Показать  

Давайте так. Выполните `make package/gnutls/clean` и потом снова выложите лог `make package/gnutls/compile V=s`
Напишите, под каким дистрибутивом идет сборка. Выхлопы удобно публиковать на pastebin и подобных сервисах.

Опубликовано

Не `./bootstrap`, а `./configure` (https://github.com/etr/libhttpserver/blob/master/configure.ac#L97). И это не дошло до `libnicrohttpd` (https://github.com/etr/libhttpserver/blob/master/configure.ac#L100-L138). Скорее всего, сборка с нуля (в $(STAGING_DIR)/opt/{include,lib} нету). Makefile`ы выше - не готовое решение, а болванки-заготовки (вариации на тему)

Опубликовано (изменено)
  В 15.01.2023 в 13:13, zyxmon сказал:

Давайте так. Выполните `make package/gnutls/clean` и потом снова выложите лог `make package/gnutls/compile V=s`
Напишите, под каким дистрибутивом идет сборка. Выхлопы удобно публиковать на pastebin и подобных сервисах.

Показать  

Моя вина, собирал на старом тулчейне от другого пакета, простите.
Пересобрал по новой - все завелось и установилось. Спасибо большое за помощь посильную.

Вот только вопрос возник следующий - посоветуйте, данная библиотека нужна для написания своей программы, как собирать свой пакет на основе собранной libhttpserver библиотеки? Отдельно или можно внутри этой сборки? А если отдельно, то если нет пакета в репозитории, как указать зависимость от него?

Изменено пользователем Zeleza
Опубликовано

cd в/каталог/системы и `find ./package -type d -name "src"` (напр., package/network/ipv6/464xlat или package/utils/zyxel-bootconfig) примеров вагон.

Нифига не понял, вероятно, libhttpserver надо собирать статикой, типа

  Показать контент

переписывать лень, diff поможет

Опубликовано (изменено)

Доброго дня

  В 15.01.2023 в 14:39, TheBB сказал:

Нифига не понял, вероятно, libhttpserver надо собирать статикой

Показать  

Поясняю, пакет libhttpserver собрался на ура - спасибо. Но этот пакет мне необходим, чтобы на его основе (используя его библиотеку) собрать свой пакет, пусть будет MyAPI. Так как, данного пакета libhttpserver - нет в стандартном репозитории, то не ясно мне, как на него ссылаться в своем проекте MyAPI? Как должен выглядеть файл манифеста в этом случае?
 

 

Изменено пользователем Zeleza
Опубликовано

Что ж, не хотите статику (см. выше), будет динамика (один из вариантов)

  Показать контент
  Показать контент

 

Опубликовано

Спасибо большое.

  В 16.01.2023 в 13:53, TheBB сказал:
define Package/my-super-prog
  SECTION:=My section
  CATEGORY:=My utils
  SUBMENU:=Super
  TITLE:=My super cool proga
  URL:=
  DEPENDS:=+libmicrohttpd +libstdcpp
endef
Показать  

Здесь разве не нужно указать для собираемого пакета зависимость от libhttpserver?

PKG_BUILD_DEPENDS:=libmicrohttpd

или здесь?

 

Опубликовано
  В 16.01.2023 в 14:13, Zeleza сказал:
PKG_BUILD_DEPENDS:=libmicrohttpd
Показать  

Нет. Нужно в сам пакет прописать зависимость (выше так сделано). PKG_BUILD_DEPENDS нужно указывать, когда сам пакет не зависит, а для сборки нужно. Начнете собирать - поймете.

Опубликовано

Если libmicrohttpd собирать статикой, тогда PKG_BUILD_DEPENDS:=libmicrohttpd , чтоб собрался до того как (поиск по BUILDONLY). Если включать в свой проект динамикой (my-super-prog), можно не нужно (если отдельно не паковать libmicrohttpd, зачем?). Собсна, всё зависит от конечной цели. Вариантов много - от простого и неприхотливого до сложного и ненужного... чем проще, тем надёжней.

Опубликовано (изменено)

Доброго дня

Поясните пожалуйста, как собрать пакет my-super-prog (что вписать в файл манифеста), чтобы он смог запускаться самостоятельно?
Куда нужно скопировать исходные файлы пакета и как его необходимо скомпилировать, чтобы получить исполняемый файл?
В указанном Вами варианте устанавливается только библиотека, но не исполняемый файл.

  Показать контент

Создал вот такой вариант манифеста, но он не работает - не находит файл #include <httpserver.hpp> , который прописан в моей my-super-prog.cpp.

my-super-prog.cpp:21:10: fatal error: httpserver.hpp: No such file or directory
  #include <httpserver.hpp>
           ^~~~~~~~~~~~~~~~
 compilation terminated.

Не пойму, куда необходимо копировать исходный файл my-super-prog.cpp, чтобы он увидел файлы заголовков пакета libhttpserver.

Строки с +++ это новые строки относительно Вашего варианта.

Буду Вам признателен за помощь в решении этой проблемы.
 

Изменено пользователем Zeleza
Опубликовано (изменено)

tmpl-skel.tarПолучение информации...

---

~ # opkg install my-super-prog_0.0.0-1_mipsel-3.4.ipk 
Installing my-super-prog (0.0.0-1) to root...
Configuring my-super-prog.
~ # 
~ # ldd /opt/sbin/my-super-cool-prog 
	linux-vdso.so.1 (0x77798000)
	libhttpserver.so.0 => /opt/lib/libhttpserver.so.0 (0x7770d000)
	libmicrohttpd.so.12 => /opt/lib/libmicrohttpd.so.12 (0x776d8000)
	libstdc++.so.6 => /opt/lib/libstdc++.so.6 (0x77534000)
	libm.so.6 => /opt/lib/libm.so.6 (0x7742c000)
	libgcc_s.so.1 => /opt/lib/libgcc_s.so.1 (0x77406000)
	libc.so.6 => /opt/lib/libc.so.6 (0x77273000)
	libpthread.so.0 => /opt/lib/libpthread.so.0 (0x77245000)
	libgnutls.so.30 => /opt/lib/libgnutls.so.30 (0x77046000)
	/opt/lib/ld.so.1 (0x77766000)
	libnettle.so.8 => /opt/lib/libnettle.so.8 (0x76fed000)
	libhogweed.so.6 => /opt/lib/libhogweed.so.6 (0x76f9a000)
	libgmp.so.10 => /opt/lib/libgmp.so.10 (0x76f12000)
~ #

 

Изменено пользователем TheBB
log
Опубликовано (изменено)

Уважаемые гуру, доброго утра

Большое Вам спасибо за оказанную помощь, все удалось собрать.

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

Мои вопросы, возможно, могут показаться Вам нелепыми или абсурдными, но с моей точки зрения самый нелепый вопрос - тот который не задан. Потому прошу Вас, ответить на вопросы ниже, и если возможно в развернутом виде. Не поленитесь пожалуйста это сделать, тем более, что вопросы точечные, а не общего порядка:

  1. @TheBB привел два варианта файла манифеста: статический и динамический. С динамическим справился и все собралось. Не ясно, можно ли использовать статический вариант в данном, конкретном случае: при необходимости собрать запускаемую программу, на основе отсутствующей в стандартном репозитрории библиотеки? Я не нашел в статической версии манифеста команд по загрузке библиотеки и ее распаковки из гитхаба, потому не представляю - возможно в статическом варианте это делается по умолчанию на лету? Прошу пояснить.
    Если есть возможность сборки "статики" для данного случая - прошу Вас подскажите, как будет выглядеть файл манифеста?
     
  2. Как работают секции типа define Build/* при сборке нескольких приложений сразу (как в нашем случае)? Эти секции будут исполняться для всех приложений, которые прописаны в секциях define Package/*? В документации ответа на этот вопрос не нашел. Прошу пояснить данный вопрос.
     
  3. Для чего служит секция Package/conffiles? О каких файлах конфигурации идет речь и зачем из перечислять здесь отдельно? Ведь мы все фейлы конфигурации, по идее, копируем и перечисляем в секции Package/*/install ?
     
  4. Почему в варианте "статики" указана переменная PKG_FIXUP:=autoreconf, а в варианте "динамики" ее нет?
     
  5. Прошу пояснить более подробно использование переменной PKG_INSTALL в связке с переменной PKG_INSTALL_DIR. В документации, перевод очень невнятный по этому поводу.
     
  6. Как понять, какие mk-файлы необходимо включать в файл манифеста и в каких случаях? Речь идет о конструкциях include $(INCLUDE_DIR)/*.mk. Где можно найти описание целей использования данных файлов при сборке пакетов?
     
  7. Почему в секции define Build/Prepare вызывается  функция подготовки по умолчанию $(call Build/Prepare/Default), а в других секциях define Build/*  вызовов таких функций по умолчанию не делается?
     
  8. О чем говорит переменная BUILDONLY:=1, такой переменной в документации не нашел вовсе.
     
  9. В секции define Download/libhttpserver (в крайнем запакованном Вами варианте Makefile), есть такая строка 
     URL:=https://codeload.github.com/etr/libhttpserver/tar.gz/refs/tags/$(FILE_VERSION)? - для чего необходимо исользовать в конце знак вопроса?

Спасибо.

Изменено пользователем Zeleza
Опубликовано

3. Файлы, указанные как конфигурационные, не переписываются при обновлении пакета. Остается пользовательский вариант.

4. На мой взгляд тут нет никакой связи.

5.  PKG_INSTALL - Setting it to “1” will call the package's original “make install” with prefix set to PKG_INSTALL_DIR

Что тут непонятного в оригинале? Если задать PKG_INSTALL=1, то будет вызываться `make install` с заданием префикса PKG_INSTALL_DIR

6. По аналогии с другими Makefile - главное что используется для сборки make, cmake или экзотика

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...

Важная информация

На этом сайте используются файлы cookie. Нажимая "Я принимаю" или продолжая просмотр сайта, вы разрешаете их использование: Политика конфиденциальности.