Jump to content

Как собрать самостоятельно пакет который отсутствует в репозитории?


Recommended Posts

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

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

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

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

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

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

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

Edited by Zeleza
Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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)

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

Link to comment
Share on other sites

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

define Package/libhttpserver/install

 

Edited by Zeleza
Link to comment
Share on other sites

Скрытый текст
# 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))

 

 

Link to comment
Share on other sites

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
~ # 

 

  • Thanks 1
Link to comment
Share on other sites

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 этого не нашел.

Link to comment
Share on other sites

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

в сгенерированные 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 этого не нашел.

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

  • Thanks 1
Link to comment
Share on other sites

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

10 часов назад, TheBB сказал:

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

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

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

Link to comment
Share on other sites

4 минуты назад, Zeleza сказал:

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

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

Link to comment
Share on other sites

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

Нужно

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

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

 

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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 (почти по шен-фуй)

Скрытый текст
# 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))

 

 

  • Thanks 3
Link to comment
Share on other sites

Благодарю, только ошибку дает - не находит 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 by Zeleza
Link to comment
Share on other sites

24 минуты назад, Zeleza сказал:

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

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

Link to comment
Share on other sites

Не `./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`ы выше - не готовое решение, а болванки-заготовки (вариации на тему)

Link to comment
Share on other sites

В 15.01.2023 в 16:13, zyxmon сказал:

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

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

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

Edited by Zeleza
Link to comment
Share on other sites

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 поможет

Link to comment
Share on other sites

Доброго дня

19 часов назад, TheBB сказал:

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

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

 

Edited by Zeleza
Link to comment
Share on other sites

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

Скрытый текст
# 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

 

 

  • Thanks 1
Link to comment
Share on other sites

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

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

или здесь?

 

Link to comment
Share on other sites

2 часа назад, Zeleza сказал:
PKG_BUILD_DEPENDS:=libmicrohttpd

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

  • Thanks 1
Link to comment
Share on other sites

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

Link to comment
Share on other sites

Доброго дня

Поясните пожалуйста, как собрать пакет 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 by Zeleza
Link to comment
Share on other sites

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 by TheBB
log
  • Thanks 2
Link to comment
Share on other sites

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

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

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

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

  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)? - для чего необходимо исользовать в конце знак вопроса?

Спасибо.

Edited by Zeleza
Link to comment
Share on other sites

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 или экзотика

  • Thanks 1
Link to comment
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...