Zeleza Posted January 14 Share Posted January 14 (edited) Доброго всем дня Уважаемые гуру подскажите пожалуйста, как собрать пакет который отсутствует в entware репозитории? Входные данные: Имеется собранный toolchain для entware. Имеется готовый пакет на гитхабе под другие архитектуры, отличные от архитектур keenetic. В качестве примера, пусть будет пакет libhttpserver. Задача собрать пакет для mipsel. Как собрать toolchain уже разобрался. Как собрать с нуля пакет - тоже понятно. Но вот как собрать уже готовый пакет с различными зависимостями под entware, пока не могу осилить. Под Mac OS X и Linux сборку осилил. Буду признателен за помощь в решении двух задач: Сборку libhttpserver. Желательно под все архитектуры, или как минимум под mipsel. Объяснить популярно или указать на источники пояснений о том, как самостоятельно из готового пакета собрать свой файл манифеста Makefile (куда смотреть и что делать) и собственно, как по шагам собрать сам пакет с его зависимостями. Это пожалуй самый важный пункт, так как по идее, если понять основные принципы, то далее собирать можно будет любой пакет самостоятельно. Буду признателен за любую посильную помощь по существу моего вопроса. Edited January 14 by Zeleza Quote Link to comment Share on other sites More sharing options...
TheBB Posted January 14 Share Posted January 14 https://openwrt.org/docs/guide-developer/packages#buildpackage_variables язык - с++; сист. сборки - autotools; зависимости - libstdcpp (точняк) + libmicrohttpd (">= 0.9.64") + gnutls ("[Optionally]: for TLS (HTTPS) support") + м.б. ещё что-то (см. в configure.ac) Quote Link to comment Share on other sites More sharing options...
Zeleza Posted January 14 Author Share Posted January 14 6 минут назад, TheBB сказал: язык - с++; сист. сборки - autotools; зависимости - libstdcpp (точняк) + libmicrohttpd (">= 0.9.64") + gnutls ("[Optionally]: for TLS (HTTPS) support") + м.б. ещё что-то (см. в configure.ac) Благодарю Вас. Если верно понимаю, то libstdcpp + libmicrohttpd нужно установить в файл манифеста в переменную DEPENDS DEPENDS:=+libstdcpp +librt +libpthread +libmicrohttpd +libgnutls Все верно? 11 минуту назад, TheBB сказал: + м.б. ещё что-то (см. в configure.ac) Вот тут прошу Вас дать пояснения. Как понять, что это что-то нужно и куда это нужное внести? Quote Link to comment Share on other sites More sharing options...
Zeleza Posted January 14 Author Share Posted January 14 (edited) Да и вопрос в догонку - как понять куда и какие файлы библиотек и заголовочные файлы необходимо устанавливать в разделе?: define Package/libhttpserver/install Edited January 14 by Zeleza Quote Link to comment Share on other sites More sharing options...
TheBB Posted January 14 Share Posted January 14 Скрытый текст # SPDX-License-Identifier: WTFPL include $(TOPDIR)/rules.mk PKG_NAME:=libhttpserver PKG_VERSION:=0.18.2 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/etr/libhttpserver/tar.gz/refs/tags/$(PKG_VERSION)? PKG_HASH:=1dfe548ac2add77fcb6c05bd00222c55650ffd02b209f4e3f133a6e3eb29c89d PKG_FIXUP:=autoreconf PKG_LICENSE:=LGPL-2.1-or-later PKG_LICENSE_FILES:=LICENSE PKG_INSTALL:=1 include $(INCLUDE_DIR)/package.mk define Package/libhttpserver SECTION:=libs CATEGORY:=Libraries TITLE:=C++ library for creating an embedded Rest HTTP server URL:=https://github.com/etr/libhttpserver DEPENDS:=+libmicrohttpd +libstdcpp endef define Package/libhttpserver/description libhttpserver is a C++ library for building high performance RESTful web servers. endef CONFIGURE_ARGS += \ --disable-doxygen-doc \ --disable-examples \ --enable-same-directory-build 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 $(eval $(call BuildPackage,libhttpserver)) Quote Link to comment Share on other sites More sharing options...
TheBB Posted January 14 Share Posted January 14 1 час назад, Zeleza сказал: +librt +libpthread не нужно - https://github.com/Entware/Entware/blob/master/include/package-defaults.mk#L5 1 час назад, Zeleza сказал: +libgnutls уже - https://github.com/Entware/entware-packages/blob/master/libs/libmicrohttpd/Makefile#L45 35 минут назад, Zeleza сказал: как понять куда и какие файлы библиотек и заготовочные файлы 6 минут назад, 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 ~ # 1 Quote Link to comment Share on other sites More sharing options...
Zeleza Posted January 14 Author Share Posted January 14 16 минут назад, 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 этого не нашел. Quote Link to comment Share on other sites More sharing options...
TheBB Posted January 14 Share Posted January 14 и это простейший пакет... ((( в сгенерированные 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 дальше раскидывать на упаковку что нужно (бибки, бинарники, ...) 2 часа назад, TheBB сказал: define Package/libhttpserver/install нужна dev-секция для включение в др. пакеты (заголовки,бибки, ...), добавляем 2 часа назад, TheBB сказал: define Build/InstallDev 1 час назад, Zeleza сказал: В документации по libhttpserver этого не нашел. изучать систему сборки 1 Quote Link to comment Share on other sites More sharing options...
Zeleza Posted January 15 Author Share Posted January 15 Доброго утра, Большое спасибо за информацию. 10 часов назад, TheBB сказал: изучать систему сборки К сожалению, нет путного мануала для конкретного случая на внятном русском. Опыт приходит через знания подтвержденные практикой и только тогда, когда есть конкретная задача, т.е. имеется соотвествующий уровень мотивации. Полагаю, Вы тоже через это прошли и не сразу обрели соотвествующий уровень компетенций в данном направлении. Потому не судите строго. Еще раз, благодарю за помощь. Quote Link to comment Share on other sites More sharing options...
Mamay Posted January 15 Share Posted January 15 4 минуты назад, Zeleza сказал: К сожалению, нет путного мануала для конкретного случая на внятном русском. Такое бывает в 99% случаев... Quote Link to comment Share on other sites More sharing options...
zyxmon Posted January 15 Share Posted January 15 Сейчас гуглопереводчик даже с китайского переводит прилично. На английском вполне внятная инструкция. Нужно 1. Попробовать собрать уже имеющийся знакомый пакет (например, mc), чтобы понять, как происходит сборка. Как собираются зависимости. 2. Посмотреть, как устроены готовые пакеты (3000+) и по аналогии сделать свой. Никто не говорит, что все выйдет за несколько часов..... Quote Link to comment Share on other sites More sharing options...
Zeleza Posted January 15 Author Share Posted January 15 17 часов назад, 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 Подскажите пожалуйста, с какой целью дублируются, отмеченные стрелками секции копирования? Quote Link to comment Share on other sites More sharing options...
Александр Рыжов Posted January 15 Share Posted January 15 define Package/libhttpserver/install - попадёт в итоговый пакет, define Build/InstallDev - попадёт в ./staging_dir/<arch> и в будущем будет востребовано при сборке зависимых пакетов. 1 Quote Link to comment Share on other sites More sharing options...
zyxmon Posted January 15 Share Posted January 15 @Zeleza еще раз порекомендую запустить сборку готового пакета (с дебагом V=s) и будет видно, что и куда идет. Quote Link to comment Share on other sites More sharing options...
zyxmon Posted January 15 Share Posted January 15 Рекомендуется к прочтению wiki от openwrt https://openwrt.org/ru/doc/devel/packages на русском! https://openwrt.org/docs/guide-developer/package-policies Quote Link to comment Share on other sites More sharing options...
TheBB Posted January 15 Share Posted January 15 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 5 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 (почти по шен-фуй) Скрытый текст # SPDX-License-Identifier: WTFPL include $(TOPDIR)/rules.mk PKG_NAME:=libhttpserver PKG_VERSION:=0.19.0 PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_VERSION:=f91406798381435b46e0880a49a2325d67f8166a PKG_SOURCE_URL:=https://github.com/etr/libhttpserver PKG_MIRROR_HASH:=7fc1e9d89a9f1d76e3f14b38b9eb634a76727b4856f1b67f1b6cf33ee065204b PKG_LICENSE:=LGPL-2.1-or-later PKG_LICENSE_FILES:=LICENSE include $(INCLUDE_DIR)/package.mk define Package/libhttpserver SECTION:=libs CATEGORY:=Libraries TITLE:=C++ library for creating an embedded Rest HTTP server URL:=https://github.com/etr/libhttpserver DEPENDS:=+libmicrohttpd +libstdcpp endef define Package/libhttpserver/description libhttpserver is a C++ library for building high performance RESTful web servers. endef CONFIGURE_ARGS += \ --disable-doxygen-doc \ --disable-examples define Build/Prepare $(call Build/Prepare/Default) ( cd $(PKG_BUILD_DIR); ./bootstrap; ) $(INSTALL_DIR) $(PKG_BUILD_DIR)/build endef define Build/Configure ( cd $(PKG_BUILD_DIR)/build; ../configure $(CONFIGURE_ARGS); ) endef define Build/Compile $(MAKE) -C $(PKG_BUILD_DIR)/build all $(MAKE) -C $(PKG_BUILD_DIR)/build DESTDIR="$(PKG_INSTALL_DIR)" install endef 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 $(eval $(call BuildPackage,libhttpserver)) 3 Quote Link to comment Share on other sites More sharing options...
Zeleza Posted January 15 Author Share Posted January 15 (edited) Благодарю, только ошибку дает - не находит bootstrap при компиляции gnutls: Скрытый текст make package/libhttpserver/compile -j6 Collecting package info: done Collecting target info: done make[2]: Entering directory '/apps/entware/scripts/config' make[2]: 'conf' is up to date. make[2]: Leaving directory '/apps/entware/scripts/config' make[1] package/libhttpserver/compile make[2] -C package/libs/toolchain compile make[2] -C package/libs/gettext-full host-compile make[2] -C package/libs/gmp compile make[2] -C feeds/packages/libs/libgpg-error compile make[2] -C package/libs/nettle compile make[2] -C feeds/packages/libs/gnutls compile make[2] -C feeds/packages/libs/libgcrypt compile ERROR: package/feeds/packages/gnutls failed to build. make -r package/libhttpserver/compile: build failed. Please re-run make with -j1 V=s or V=sc for a higher verbosity level to see what's going on make: *** [/apps/entware/include/toplevel.mk:231: package/libhttpserver/compile] Error 1 + make package/libhttpserver/compile -j1 V=sc make[2]: Entering directory '/apps/entware/scripts/config' make[2]: 'conf' is up to date. make[2]: Leaving directory '/apps/entware/scripts/config' make[1]: Entering directory '/apps/entware' make[2]: Entering directory '/apps/entware/package/libs/toolchain' echo "libc" >> /apps/entware/staging_dir/target-mipsel_mips32r2_glibc-2.27/pkginfo/toolchain.default.install echo "libgcc" >> /apps/entware/staging_dir/target-mipsel_mips32r2_glibc-2.27/pkginfo/toolchain.default.install echo "libatomic" >> /apps/entware/staging_dir/target-mipsel_mips32r2_glibc-2.27/pkginfo/toolchain.default.install echo "libssp" >> /apps/entware/staging_dir/target-mipsel_mips32r2_glibc-2.27/pkginfo/toolchain.default.install echo "libpthread" >> /apps/entware/staging_dir/target-mipsel_mips32r2_glibc-2.27/pkginfo/toolchain.default.install echo "librt" >> /apps/entware/staging_dir/target-mipsel_mips32r2_glibc-2.27/pkginfo/toolchain.default.install make[2]: Leaving directory '/apps/entware/package/libs/toolchain' time: package/libs/toolchain/compile#0.16#0.13#0.25 make[2]: Entering directory '/apps/entware/package/libs/gettext-full' make[2]: Leaving directory '/apps/entware/package/libs/gettext-full' time: package/libs/gettext-full/host-compile#0.25#0.20#0.36 make[2]: Entering directory '/apps/entware/package/libs/gmp' echo "libgmp" >> /apps/entware/staging_dir/target-mipsel_mips32r2_glibc-2.27/pkginfo/gmp.default.install make[2]: Leaving directory '/apps/entware/package/libs/gmp' time: package/libs/gmp/compile#0.21#0.19#0.32 make[2]: Entering directory '/apps/entware/package/libs/nettle' echo "libnettle" >> /apps/entware/staging_dir/target-mipsel_mips32r2_glibc-2.27/pkginfo/nettle.default.install make[2]: Leaving directory '/apps/entware/package/libs/nettle' time: package/libs/nettle/compile#0.16#0.14#0.25 make[2]: Entering directory '/apps/entware/feeds/packages/libs/gnutls' rm -f /apps/entware/build_dir/target-mipsel_mips32r2_glibc-2.27/gnutls-3.7.8/.built touch /apps/entware/build_dir/target-mipsel_mips32r2_glibc-2.27/gnutls-3.7.8/.built_check CFLAGS="-O2 -pipe -mno-branch-likely -mips32r2 -mtune=mips32r2 -fno-caller-saves -fhonour-copts -Wno-error=unused-but-set-variable -Wno-error=unused-result -msoft-float -I/apps/entware/staging_dir/toolchain-mipsel_mips32r2_gcc-8.4.0_glibc-2.27/include " CXXFLAGS="-O2 -pipe -mno-branch-likely -mips32r2 -mtune=mips32r2 -fno-caller-saves -fhonour-copts -Wno-error=unused-but-set-variable -Wno-error=unused-result -msoft-float -I/apps/entware/staging_dir/toolchain-mipsel_mips32r2_gcc-8.4.0_glibc-2.27/include " LDFLAGS="-Wl,--dynamic-linker=/opt/lib/ld.so.1 -Wl,-rpath=/opt/lib -L/apps/entware/staging_dir/toolchain-mipsel_mips32r2_gcc-8.4.0_glibc-2.27/lib " make -C /apps/entware/build_dir/target-mipsel_mips32r2_glibc-2.27/gnutls-3.7.8/. AR="mipsel-openwrt-linux-gnu-gcc-ar" AS="mipsel-openwrt-linux-gnu-gcc -c -O2 -pipe -mno-branch-likely -mips32r2 -mtune=mips32r2 -fno-caller-saves -fhonour-copts -Wno-error=unused-but-set-variable -Wno-error=unused-result -msoft-float" LD=mipsel-openwrt-linux-gnu-ld NM="mipsel-openwrt-linux-gnu-gcc-nm" CC="mipsel-openwrt-linux-gnu-gcc" GCC="mipsel-openwrt-linux-gnu-gcc" CXX="mipsel-openwrt-linux-gnu-g++" RANLIB="mipsel-openwrt-linux-gnu-gcc-ranlib" STRIP=mipsel-openwrt-linux-gnu-strip OBJCOPY=mipsel-openwrt-linux-gnu-objcopy OBJDUMP=mipsel-openwrt-linux-gnu-objdump SIZE=mipsel-openwrt-linux-gnu-size CROSS="mipsel-openwrt-linux-gnu-" ARCH="mipsel" ; make[3]: Entering directory '/apps/entware/build_dir/target-mipsel_mips32r2_glibc-2.27/gnutls-3.7.8' ./bootstrap make[3]: ./bootstrap: No such file or directory make[3]: *** [cfg.mk:63: autoreconf] Error 127 make[3]: Leaving directory '/apps/entware/build_dir/target-mipsel_mips32r2_glibc-2.27/gnutls-3.7.8' make[2]: *** [Makefile:270: /apps/entware/build_dir/target-mipsel_mips32r2_glibc-2.27/gnutls-3.7.8/.built] Error 2 make[2]: Leaving directory '/apps/entware/feeds/packages/libs/gnutls' time: package/feeds/packages/gnutls/compile#0.17#0.14#0.26 ERROR: package/feeds/packages/gnutls failed to build. make[1]: *** [package/Makefile:116: package/feeds/packages/gnutls/compile] Error 1 make[1]: Leaving directory '/apps/entware' make: *** [/apps/entware/include/toplevel.mk:231: package/libhttpserver/compile] Error 2 Будет возможность подсказать, как решить проблему? Edited January 15 by Zeleza Quote Link to comment Share on other sites More sharing options...
zyxmon Posted January 15 Share Posted January 15 24 минуты назад, Zeleza сказал: как решить проблему? Давайте так. Выполните `make package/gnutls/clean` и потом снова выложите лог `make package/gnutls/compile V=s` Напишите, под каким дистрибутивом идет сборка. Выхлопы удобно публиковать на pastebin и подобных сервисах. Quote Link to comment Share on other sites More sharing options...
TheBB Posted January 15 Share Posted January 15 Не `./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`ы выше - не готовое решение, а болванки-заготовки (вариации на тему) Quote Link to comment Share on other sites More sharing options...
Zeleza Posted January 15 Author Share Posted January 15 (edited) В 15.01.2023 в 16:13, zyxmon сказал: Давайте так. Выполните `make package/gnutls/clean` и потом снова выложите лог `make package/gnutls/compile V=s` Напишите, под каким дистрибутивом идет сборка. Выхлопы удобно публиковать на pastebin и подобных сервисах. Моя вина, собирал на старом тулчейне от другого пакета, простите. Пересобрал по новой - все завелось и установилось. Спасибо большое за помощь посильную. Вот только вопрос возник следующий - посоветуйте, данная библиотека нужна для написания своей программы, как собирать свой пакет на основе собранной libhttpserver библиотеки? Отдельно или можно внутри этой сборки? А если отдельно, то если нет пакета в репозитории, как указать зависимость от него? Edited January 20 by Zeleza Quote Link to comment Share on other sites More sharing options...
TheBB Posted January 15 Share Posted January 15 cd в/каталог/системы и `find ./package -type d -name "src"` (напр., package/network/ipv6/464xlat или package/utils/zyxel-bootconfig) примеров вагон. Нифига не понял, вероятно, libhttpserver надо собирать статикой, типа Скрытый текст # SPDX-License-Identifier: WTFPL include $(TOPDIR)/rules.mk PKG_NAME:=libhttpserver PKG_VERSION:=0.19.0 PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_VERSION:=f91406798381435b46e0880a49a2325d67f8166a PKG_SOURCE_URL:=https://github.com/etr/libhttpserver PKG_MIRROR_HASH:=7fc1e9d89a9f1d76e3f14b38b9eb634a76727b4856f1b67f1b6cf33ee065204b PKG_LICENSE:=LGPL-2.1-or-later PKG_LICENSE_FILES:=LICENSE include $(INCLUDE_DIR)/package.mk define Package/libhttpserver SECTION:=libs CATEGORY:=Libraries TITLE:=C++ library for creating an embedded Rest HTTP server URL:=https://github.com/etr/libhttpserver DEPENDS:=+libmicrohttpd +libstdcpp BUILDONLY:=1 endef define Package/libhttpserver/description libhttpserver is a C++ library for building high performance RESTful web servers. endef CONFIGURE_ARGS += \ --disable-doxygen-doc \ --disable-examples \ --disable-shared define Build/Prepare $(call Build/Prepare/Default) ( cd $(PKG_BUILD_DIR); ./bootstrap; ) $(INSTALL_DIR) $(PKG_BUILD_DIR)/build endef define Build/Configure ( cd $(PKG_BUILD_DIR)/build; ../configure $(CONFIGURE_ARGS); ) endef define Build/Compile $(MAKE) -C $(PKG_BUILD_DIR)/build all $(MAKE) -C $(PKG_BUILD_DIR)/build DESTDIR="$(PKG_INSTALL_DIR)" install endef 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 $(1)/opt/lib $(INSTALL_DIR) $(1)/opt/lib/pkgconfig $(CP) $(PKG_INSTALL_DIR)/opt/lib/pkgconfig/*.pc $(1)/opt/lib/pkgconfig endef $(eval $(call BuildPackage,libhttpserver)) переписывать лень, diff поможет Quote Link to comment Share on other sites More sharing options...
Zeleza Posted January 16 Author Share Posted January 16 (edited) Доброго дня 19 часов назад, TheBB сказал: Нифига не понял, вероятно, libhttpserver надо собирать статикой Поясняю, пакет libhttpserver собрался на ура - спасибо. Но этот пакет мне необходим, чтобы на его основе (используя его библиотеку) собрать свой пакет, пусть будет MyAPI. Так как, данного пакета libhttpserver - нет в стандартном репозитории, то не ясно мне, как на него ссылаться в своем проекте MyAPI? Как должен выглядеть файл манифеста в этом случае? Edited January 16 by Zeleza Quote Link to comment Share on other sites More sharing options...
TheBB Posted January 16 Share Posted January 16 Что ж, не хотите статику (см. выше), будет динамика (один из вариантов) Скрытый текст # SPDX-License-Identifier: WTFPL include $(TOPDIR)/rules.mk PKG_NAME:=my-super-prog PKG_VERSION:=0.0.0 PKG_RELEASE:=1 PKG_LICENSE:=WTFPL PKG_LICENSE_FILES:=LICENSE.txt PKG_BUILD_DEPENDS:=libmicrohttpd include $(INCLUDE_DIR)/package.mk define Package/my-super-prog SECTION:=My section CATEGORY:=My utils SUBMENU:=Super TITLE:=My super cool proga URL:= DEPENDS:=+libmicrohttpd +libstdcpp endef define Package/my-super-prog/description My super cool program. endef FILE_NAME:=libhttpserver FILE_VERSION:=0.18.2 FILE_SOURCE:=$(FILE_NAME)-$(FILE_VERSION).tar.gz define Download/libhttpserver FILE:=$(FILE_SOURCE) URL:=https://codeload.github.com/etr/libhttpserver/tar.gz/refs/tags/$(FILE_VERSION)? HASH:=1dfe548ac2add77fcb6c05bd00222c55650ffd02b209f4e3f133a6e3eb29c89d endef $(eval $(call Download,libhttpserver)) define Build/Prepare mkdir -p $(PKG_BUILD_DIR) $(HOST_TAR) -xzf $(DL_DIR)/$(FILE_SOURCE) -C $(PKG_BUILD_DIR) ( cd $(PKG_BUILD_DIR)/$(FILE_NAME)-$(FILE_VERSION); \ $(MAKE) -f Makefile.cvs; \ ) endef define Build/Configure ( cd $(PKG_BUILD_DIR)/$(FILE_NAME)-$(FILE_VERSION); \ ./configure \ --disable-doxygen-doc \ --disable-examples \ --disable-static \ --enable-same-directory-build \ $(CONFIGURE_ARGS); \ ) endef define Build/Compile $(MAKE) -C $(PKG_BUILD_DIR)/$(FILE_NAME)-$(FILE_VERSION) all endef define Package/my-super-prog/install $(INSTALL_DIR) $(1)/opt/lib $(CP) $(PKG_BUILD_DIR)/$(FILE_NAME)-$(FILE_VERSION)/src/.libs/lib*.so* \ $(1)/opt/lib endef $(eval $(call BuildPackage,my-super-prog)) Скрытый текст xxx:...-mipsel_mips32r2_glibc-2.27/my-super-prog-0.0.0 ➜ ls -a1 . .. .built .built_check .configured_68b329da9893e34099c7d8ad5cb9c940 .pkgdir .prepared_e35f0301a323d88a69e74bc774b8aa56_6664517399ebbbc92a37c5bb081b5c53 .prepared_e35f0301a323d88a69e74bc774b8aa56_6664517399ebbbc92a37c5bb081b5c53_check ipkg-mipsel-3.4 libhttpserver-0.18.2 xxx:...-mipsel_mips32r2_glibc-2.27/my-super-prog-0.0.0 ➜ ls -a1 ipkg-mipsel-3.4/*/*/* ipkg-mipsel-3.4/my-super-prog/CONTROL/control ipkg-mipsel-3.4/my-super-prog/opt/lib: . .. libhttpserver.so libhttpserver.so.0 libhttpserver.so.0.18.1 xxx:...-mipsel_mips32r2_glibc-2.27/my-super-prog-0.0.0 ➜ cat ipkg-mipsel-3.4/my-super-prog/CONTROL/control Package: my-super-prog Version: 0.0.0-1 Depends: libc, libssp, librt, libpthread, libmicrohttpd, libstdcpp Source: package/9999/tmpl-skel SourceName: my-super-prog License: WTFPL LicenseFiles: LICENSE.txt Section: My section SourceDateEpoch: 1661329733 Architecture: mipsel-3.4 Installed-Size: 99656 Description: My super cool program. xxx:...-mipsel_mips32r2_glibc-2.27/my-super-prog-0.0.0 1 Quote Link to comment Share on other sites More sharing options...
Zeleza Posted January 16 Author Share Posted January 16 Спасибо большое. 15 минут назад, 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 или здесь? Quote Link to comment Share on other sites More sharing options...
zyxmon Posted January 16 Share Posted January 16 2 часа назад, Zeleza сказал: PKG_BUILD_DEPENDS:=libmicrohttpd Нет. Нужно в сам пакет прописать зависимость (выше так сделано). PKG_BUILD_DEPENDS нужно указывать, когда сам пакет не зависит, а для сборки нужно. Начнете собирать - поймете. 1 Quote Link to comment Share on other sites More sharing options...
TheBB Posted January 16 Share Posted January 16 Если libmicrohttpd собирать статикой, тогда PKG_BUILD_DEPENDS:=libmicrohttpd , чтоб собрался до того как (поиск по BUILDONLY). Если включать в свой проект динамикой (my-super-prog), можно не нужно (если отдельно не паковать libmicrohttpd, зачем?). Собсна, всё зависит от конечной цели. Вариантов много - от простого и неприхотливого до сложного и ненужного... чем проще, тем надёжней. Quote Link to comment Share on other sites More sharing options...
Zeleza Posted January 18 Author Share Posted January 18 (edited) Доброго дня Поясните пожалуйста, как собрать пакет my-super-prog (что вписать в файл манифеста), чтобы он смог запускаться самостоятельно? Куда нужно скопировать исходные файлы пакета и как его необходимо скомпилировать, чтобы получить исполняемый файл? В указанном Вами варианте устанавливается только библиотека, но не исполняемый файл. Скрытый текст # SPDX-License-Identifier: WTFPL include $(TOPDIR)/rules.mk PKG_NAME:=my-super-prog PKG_VERSION:=0.0.0 PKG_RELEASE:=1 PKG_LICENSE:=WTFPL PKG_LICENSE_FILES:=LICENSE.txt PKG_BUILD_DEPENDS:=libmicrohttpd include $(INCLUDE_DIR)/package.mk define Package/my-super-prog CATEGORY:=Utilites TITLE:=my-super-prog заголовок SECTION:=utils DEPENDS:=+libmicrohttpd +libstdcpp endef define Package/samovar/description Детали можно найти в документации: https://github.com/ endef FILE_NAME:=libhttpserver FILE_VERSION:=0.18.2 FILE_SOURCE:=$(FILE_NAME)-$(FILE_VERSION).tar.gz define Download/libhttpserver FILE:=$(FILE_SOURCE) URL:=https://codeload.github.com/etr/libhttpserver/tar.gz/refs/tags/$(FILE_VERSION)? HASH:=1dfe548ac2add77fcb6c05bd00222c55650ffd02b209f4e3f133a6e3eb29c89d endef $(eval $(call Download,libhttpserver)) define Build/Prepare mkdir -p $(PKG_BUILD_DIR)/$(FILE_NAME)-$(FILE_VERSION)/my-super-prog $(HOST_TAR) -xzf $(DL_DIR)/$(FILE_SOURCE) -C $(PKG_BUILD_DIR) +++ cp -rf /apps/my-super-prog/code/src/. $(PKG_BUILD_DIR)/$(FILE_NAME)-$(FILE_VERSION)/src ( cd $(PKG_BUILD_DIR)/$(FILE_NAME)-$(FILE_VERSION); \ $(MAKE) -f Makefile.cvs; \ ) endef define Build/Configure ( cd $(PKG_BUILD_DIR)/$(FILE_NAME)-$(FILE_VERSION); \ ./configure \ --disable-doxygen-doc \ --disable-examples \ --disable-static \ --enable-same-directory-build \ $(CONFIGURE_ARGS); \ ) endef define Build/Compile $(MAKE) -C $(PKG_BUILD_DIR)/$(FILE_NAME)-$(FILE_VERSION) all +++ $(MAKE) -C $(PKG_BUILD_DIR)/$(FILE_NAME)-$(FILE_VERSION)/src CC="$(TARGET_CXX)" CFLAGS="$(TARGET_CXXFLAGS) -Wall" LDFLAGS="$(TARGET_LDFLAGS)" endef define Package/my-super-prog/install $(INSTALL_DIR) $(1)/opt/lib $(CP) $(PKG_BUILD_DIR)/$(FILE_NAME)-$(FILE_VERSION)/src/.libs/lib*.so* \ $(1)/opt/lib +++ $(INSTALL_DIR) $(1)/opt/bin +++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(FILE_NAME)-$(FILE_VERSION)/src/my-super-prog $(1)/opt/bin/ endef $(eval $(call BuildPackage,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. Строки с +++ это новые строки относительно Вашего варианта. Буду Вам признателен за помощь в решении этой проблемы. Edited January 20 by Zeleza Quote Link to comment Share on other sites More sharing options...
TheBB Posted January 18 Share Posted January 18 (edited) 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) ~ # Edited January 18 by TheBB log 2 Quote Link to comment Share on other sites More sharing options...
Zeleza Posted January 20 Author Share Posted January 20 (edited) Уважаемые гуру, доброго утра Большое Вам спасибо за оказанную помощь, все удалось собрать. Правда, остались неясными некоторые вопросы, хотя я по честному проштудировал все указанные выше источники. В них есть ответы на некоторые вопросы ниже, но, либо они скудны по своему содержанию, либо я их не понял, в следствии плохого перевода или в следствии своей пока некомпетентности. Мои вопросы, возможно, могут показаться Вам нелепыми или абсурдными, но с моей точки зрения самый нелепый вопрос - тот который не задан. Потому прошу Вас, ответить на вопросы ниже, и если возможно в развернутом виде. Не поленитесь пожалуйста это сделать, тем более, что вопросы точечные, а не общего порядка: @TheBB привел два варианта файла манифеста: статический и динамический. С динамическим справился и все собралось. Не ясно, можно ли использовать статический вариант в данном, конкретном случае: при необходимости собрать запускаемую программу, на основе отсутствующей в стандартном репозитрории библиотеки? Я не нашел в статической версии манифеста команд по загрузке библиотеки и ее распаковки из гитхаба, потому не представляю - возможно в статическом варианте это делается по умолчанию на лету? Прошу пояснить. Если есть возможность сборки "статики" для данного случая - прошу Вас подскажите, как будет выглядеть файл манифеста? Как работают секции типа define Build/* при сборке нескольких приложений сразу (как в нашем случае)? Эти секции будут исполняться для всех приложений, которые прописаны в секциях define Package/*? В документации ответа на этот вопрос не нашел. Прошу пояснить данный вопрос. Для чего служит секция Package/conffiles? О каких файлах конфигурации идет речь и зачем из перечислять здесь отдельно? Ведь мы все фейлы конфигурации, по идее, копируем и перечисляем в секции Package/*/install ? Почему в варианте "статики" указана переменная PKG_FIXUP:=autoreconf, а в варианте "динамики" ее нет? Прошу пояснить более подробно использование переменной PKG_INSTALL в связке с переменной PKG_INSTALL_DIR. В документации, перевод очень невнятный по этому поводу. Как понять, какие mk-файлы необходимо включать в файл манифеста и в каких случаях? Речь идет о конструкциях include $(INCLUDE_DIR)/*.mk. Где можно найти описание целей использования данных файлов при сборке пакетов? Почему в секции define Build/Prepare вызывается функция подготовки по умолчанию $(call Build/Prepare/Default), а в других секциях define Build/* вызовов таких функций по умолчанию не делается? О чем говорит переменная BUILDONLY:=1, такой переменной в документации не нашел вовсе. В секции define Download/libhttpserver (в крайнем запакованном Вами варианте Makefile), есть такая строка URL:=https://codeload.github.com/etr/libhttpserver/tar.gz/refs/tags/$(FILE_VERSION)? - для чего необходимо исользовать в конце знак вопроса? Спасибо. Edited January 20 by Zeleza Quote Link to comment Share on other sites More sharing options...
zyxmon Posted January 20 Share Posted January 20 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 или экзотика 1 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.