Jump to content

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


Recommended Posts

8. Если не ошибаюсь - не собирать пакет (ipk) - например если используется статическая, а не динамическая библиотека при сборке зависимого пакета. Или просто нужны хедеры.

  • Thanks 1
Link to comment
Share on other sites

@zyxmon благодарю Вас за ответы.

Цитата

4. Почему в варианте "статики" указана переменная PKG_FIXUP:=autoreconf, а в варианте "динамики" ее нет?

Цитата

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

Тогда поясните пожалуйста, какой смысл использования этой переменной именно в первом варианте?

 

Цитата

6. Как понять, какие mk-файлы необходимо включать в файл манифеста и в каких случаях? Речь идет о конструкциях include $(INCLUDE_DIR)/*.mk.
Цитата

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

Где можно найти описание целей использования данных файлов при сборке пакетов?

 

Цитата

2. Как работают секции типа define Build/* при сборке нескольких приложений сразу (как в нашем случае)? Эти секции будут исполняться для всех приложений, которые прописаны в секциях define Package/*? В документации ответа на этот вопрос не нашел. Прошу пояснить данный вопрос.
52 минуты назад, zyxmon сказал:

2. Вы указываете как собрать пакет, бинарники (приложения) дело десятое.

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

Link to comment
Share on other sites

При сборке под mips возникла проблема следующая (под остальные две платформы - собралось без ошибок):

 checking whether <wchar.h> uses 'inline' correctly... no
 configure: error: <wchar.h> cannot be used with this compiler (mips-openwrt-linux-gnu-gcc -EB -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-mips_mips32r2_gcc-8.4.0_glibc-2.27/include ).
 This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in
 C99 mode. You have four options:
   - Add the flag -fgnu89-inline to CC and reconfigure, or
   - Fix your include files, using parts of
     <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b037a293a48718af30d706c2e18c929d0e69a621>, or
   - Use a gcc version older than 4.3, or
   - Don't use the flags -std=c99 or -std=gnu99.
 Configuration aborted.

Прошу подсказать, какой блок if необходимо включить в файл манифеста для mips и какой из 4 предложенных вариантов выбрать для решения данного вопроса. Если подставить флаг -fgnu89-inline, под остальные платформы пакет соберется?

Link to comment
Share on other sites

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

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

Без разницы. Это идеология Openwrt делить одну сборку на маленькие ipk. Экономят место на флешке.

 

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

 PKG_FIXUP:=autoreconf

Пакет можно собирать по разному в зависимости от того, как задумал разработчик. Инструкция означает, что сначала выполняется https://www.geeksforgeeks.org/autoreconf-command-in-linux-with-examples/

  • Thanks 1
Link to comment
Share on other sites

0. Намерено приведено неск. вариантов, чтоб показать разные способы.

1. Всё от Вас зависит. Выкинуть из проекта сборку libhttpserver (отдельно собирать статикой, см. BUILDONLY (gerbera+libebml+libmatroska+...)), изменить флаги сборки.

2. Выполняется последовательно, шаг за шагом. Как распишите, так и будет собираться.

3. Уже ответили. Для защиты файлов от перезаписи/удаления (если вносились изменения) при обновлении/удалении пакета (`opkg --force-overwrite` перезапишет).

4. Автогенерация. Используется, если отсутствует файл "configure" (чтоб сгенерировать) или патчатся configure.{ac,in} (чтоб переконфигурировать). Или расписываете ручками (2-4 Makefile`ы).

5. Уже ответили. А CMAKE_INSTALL служит для другого - аналог Build/InstallDev.

6. Уже ответили. По аналогии. Второй пост в теме: определить язык/систему сборки (см. пакеты:  perl-*, php8-pecl-*, python*, samba4(waf), serf(scons), gensio(swig), mariadb(cmake), mpd(meson), torrserver(go), ...)

7. Т.к. производятся доп. действия (распаковка внешней зависимости и генерация файлов). Если перенесёте их в др. секцию, этап Build/Prepare можно выкинуть (будут выполнены действия по умолчанию).

8. Уже ответили. Собрать что-то, но без создания пакета.

9. Cм., во что разворачивается URL запроса (удалите dl/libhttpserver*, удалите знак "?" и попробуйте собрать пакет).

Втыкание по ссылкам и насилование Makefile`ов категорически приветствуется )))

  • Thanks 1
Link to comment
Share on other sites

Отвечу сам себе, возможно пригодится кому-либо.

5 часов назад, Zeleza сказал:

Прошу подсказать, какой блок if необходимо включить в файл манифеста для mips и какой из 4 предложенных вариантов выбрать для решения данного вопроса. Если подставить флаг -fgnu89-inline, под остальные платформы пакет соберется?

Под mips флаг  -fgnu89-inline решил проблему. Добавление следующего кода помогло:

ifeq ($(findstring mips,$(ARCH)),)
	TARGET_CFLAGS += -fgnu89-inline
endif

 

Edited by Zeleza
Link to comment
Share on other sites

Статика )))

1. libhttpserver

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

 

2. 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:=libhttpserver

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

Build/Configure:=:

TARGET_LDFLAGS += -lhttpserver -lmicrohttpd

define Build/Compile
	( cd $(PKG_BUILD_DIR); \
		$(TARGET_CXX) $(TARGET_CPPFLAGS) $(TARGET_CXXFLAGS) \
		-o my-super-prog my-super-prog.cpp $(TARGET_LDFLAGS); \
	)
endef

define Package/my-super-prog/install
	$(INSTALL_DIR) $(1)/opt/sbin
	$(INSTALL_BIN) $(PKG_BUILD_DIR)/my-super-prog $(1)/opt/sbin/my-super-cool-prog
endef

$(eval $(call BuildPackage,my-super-prog))

 

 

Скрытый текст
root@Entware:~# opkg install my-super-prog_0.0.0-1_mips-3.4.ipk 
Installing my-super-prog (0.0.0-1) to root...
Installing libgcrypt (1.10.1-1) to root...
Downloading http://bin.entware.net/mipssf-k3.4/libgcrypt_1.10.1-1_mips-3.4.ipk
Installing libmicrohttpd-ssl (0.9.75-1) to root...
Downloading http://bin.entware.net/mipssf-k3.4/libmicrohttpd-ssl_0.9.75-1_mips-3.4.ipk
Configuring libgcrypt.
Configuring libmicrohttpd-ssl.
Configuring my-super-prog.
root@Entware:~# 
root@Entware:~# ldd /opt/sbin/my-super-cool-prog 
	linux-vdso.so.1 (0x77381000)
	libmicrohttpd.so.12 => /opt/lib/libmicrohttpd.so.12 (0x7731a000)
	libstdc++.so.6 => /opt/lib/libstdc++.so.6 (0x77176000)
	libm.so.6 => /opt/lib/libm.so.6 (0x7706e000)
	libgcc_s.so.1 => /opt/lib/libgcc_s.so.1 (0x77048000)
	libc.so.6 => /opt/lib/libc.so.6 (0x76eb4000)
	libpthread.so.0 => /opt/lib/libpthread.so.0 (0x76e86000)
	libgnutls.so.30 => /opt/lib/libgnutls.so.30 (0x76c7e000)
	/opt/lib/ld.so.1 (0x77350000)
	libnettle.so.8 => /opt/lib/libnettle.so.8 (0x76c28000)
	libhogweed.so.6 => /opt/lib/libhogweed.so.6 (0x76bd6000)
	libgmp.so.10 => /opt/lib/libgmp.so.10 (0x76b4e000)
root@Entware:~# 
root@Entware:~# opkg info my-super-prog
Package: my-super-prog
Version: 0.0.0-1
Depends: libc, libssp, librt, libpthread, libmicrohttpd, libstdcpp
Status: install user installed
Architecture: mips-3.4
Installed-Time: 1674216789

root@Entware:~# 
root@Entware:~# curl -XGET -v http://localhost:8080/hello
Note: Unnecessary use of -X or --request, GET is already inferred.
* Failed to connect to localhost port 8080 after 1 ms: Connection refused
curl: (7) Failed to connect to localhost port 8080 after 1 ms: Connection refused
root@Entware:~# 
root@Entware:~# my-super-cool-prog &
root@Entware:~# 
root@Entware:~# ps | grep -v grep | grep my-super 
 7253 root     52940 S    my-super-cool-prog
root@Entware:~# 
root@Entware:~# curl -XGET -v http://localhost:8080/hello
Note: Unnecessary use of -X or --request, GET is already inferred.
> GET /hello HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.82.0
> Accept: */*
> 
Data was: 
Now data is:no data passed!!!
< HTTP/1.1 200 OK
< Date: Fri, 20 Jan 2023 12:45:53 GMT
< Content-Type: text/plain
< Content-Length: 14
< 
Hello World!!!root@Entware:~# 
root@Entware:~#

 

 

Edited by TheBB
add to log
  • Thanks 1
Link to comment
Share on other sites

Что-то у меня такого нет...

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

Добавление следующего кода помогло:

или

TARGET_CFLAGS += $(if $(CONFIG_mips),-fgnu89-inline)
Edited by TheBB
  • Upvote 1
Link to comment
Share on other sites

35 минут назад, TheBB сказал:
Build/Configure:=:

^ да, сразу, чтоб закрыть вопрос, отключение (сброс) конфигурирования (косметика, сравнить вывод c/без). )))

Link to comment
Share on other sites

2 часа назад, TheBB сказал:

Статика )))

Получается, что для установки статики необходимо сначала собрать пакет libhttpserver, затем установить его на устройство и только затем собрать и установить my-super-prog? Все верно?

Link to comment
Share on other sites

1 час назад, Zeleza сказал:

установить

???

Создаете каталог libhttpserver и закидываете в него Makefile (libhttpserver) из comment=158866, свой Makefile правите, ориентируясь на Makefile (my-super-prog) из comment=158866. Собираете пакет, Дальше, если хотите, ставите на устройстро для проверки (см. лог из comment=158866).

 

 

Link to comment
Share on other sites

Доброго утра,

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

Я пример с gerbera (см. 1 из comment=158862) не зря привёл (https://github.com/Entware/entware-oldpackages-ports/blob/master/gerbera/Makefile#L22)

В приведенном Вами примере все используемые библиотеки присутствуют в стандартном репозитории, в моем же примере - библиотеки в стандартном репозитории нет, потому ответ Ваш мне не ясен. Если мы собираем по "статике" два пакета и один из них библиотека, то получим на выходе два ipk и тогда пользователю необходимо будет заботится о том, чтобы сначала скачать один пакет и затем второй, я же хочу этого избежать и сделать (как варианте с динамикой) автоматическую сборку библиотеки и затем сборку пакета в одном флаконе. Можно ли такого достичь в варианте со "статикой"? 

-------------

Так же, по возможности, прошу помочь в вопросе повторной компиляции при исправлении ошибок в коде.
Делал make clean, make package./my-super-prog/clean, обновлял feeds, но все едино - возникают ошибки при компиляции, причем при компиляции сопутствующих пакетов, а не целевого. Потому каждый раз приходится собирать все заново после make dirclean. Тогда ошибки появляются только при компиляции целевой программы, если они есть или пакет собирается на ура, но каждый раз ждать по 30-40 минут сборку всего тулчайна дело утомительное, когда меняешь в коде всего несколько строк.
Потому прошу помочь развернутым ответом или ссылкой на источник развернутого ответа по данном вопросу - как ускорить процесс переборки пакета при внесении исправлений в код? 

Edited by Zeleza
Link to comment
Share on other sites

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

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

И это правильно.

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

Можно ли такого достичь в варианте со "статикой"? 

А что Вы называете "статикой" - если статическую линковку - то нужен один пакет с бинарником.

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

Делал make clean, make package./my-super-prog/clean, обновлял feeds

 

make package/<папка_спакетом>/clean
make package/<папка_спакетом>/compile
make package/<папка_спакетом>/prepare
make package/<папка_спакетом>/configure

 

Link to comment
Share on other sites

ЧЯДНТ?

9999.tar

https://pastebin.com/AhueqJYM

my-super-prog_0.0.0-1_aarch64-3.10.ipk

my-super-prog_0.0.0-1_mipsel-3.4.ipk

my-super-prog_0.0.0-1_mips-3.4.ipk

Скрытый текст
~ # 
~ # find /opt -name "*libhttpserver*"
~ # 
~ # opkg install my-super-prog_0.0.0-1_aarch64-3.10.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 (0x0000007f8880f000)
	libmicrohttpd.so.12 => /opt/lib/libmicrohttpd.so.12 (0x0000007f887a9000)
	libstdc++.so.6 => /opt/lib/libstdc++.so.6 (0x0000007f885fd000)
	libm.so.6 => /opt/lib/libm.so.6 (0x0000007f88539000)
	libgcc_s.so.1 => /opt/lib/libgcc_s.so.1 (0x0000007f88514000)
	libc.so.6 => /opt/lib/libc.so.6 (0x0000007f883a4000)
	libpthread.so.0 => /opt/lib/libpthread.so.0 (0x0000007f88376000)
	libgnutls.so.30 => /opt/lib/libgnutls.so.30 (0x0000007f88114000)
	/opt/lib/ld-linux-aarch64.so.1 (0x0000007f887e1000)
	libnettle.so.8 => /opt/lib/libnettle.so.8 (0x0000007f880b9000)
	libhogweed.so.6 => /opt/lib/libhogweed.so.6 (0x0000007f8805f000)
	libgmp.so.10 => /opt/lib/libgmp.so.10 (0x0000007f87fdf000)
~ # 
~ # my-super-cool-prog &
~ # 
~ # curl -GET -v http://localhost:8080/hello
> GET /hello HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.86.0
> Accept: */*
> 
Data was: 
Now data is:no data passed!!!
< HTTP/1.1 200 OK
< Date: Sat, 21 Jan 2023 10:10:47 GMT
< Content-Type: text/plain
< Content-Length: 14
< 
Hello World!!!~ # 
~ # 
~ # ps | grep -v grep | grep my-super
30397 pts/0    00:00:00 my-super-cool-p
~ # 
~ # find /opt -name "*libhttpserver*"
~ # 

 

 

Link to comment
Share on other sites

1 час назад, Zeleza сказал:

В приведенном Вами примере нет библиотек

Действительно нет!

~ # 
~ # opkg list | grep -E '(libebml|libmatroska|pugixml|spdlog)'
~ # 

Они, как тот суслик... Никто не видит, а они есть. )))

Link to comment
Share on other sites

3 часа назад, zyxmon сказал:
make package/<папка_спакетом>/clean
make package/<папка_спакетом>/compile
make package/<папка_спакетом>/prepare
make package/<папка_спакетом>/configure

Прошу пояснить.
После команды make package/<папка_спакетом>/{clean,compile} например, возникает ошибка и после ее возникновения Вы предлагаете  запустить make package/<папка_спакетом>/{prepare,configure}?
Все верно?

 

Link to comment
Share on other sites

17 часов назад, Zeleza сказал:

Все верно?

Нет. Это примеры того, что можно делать. Например нужно добавить патчи - выполняем prepare и делаем патчи. И т.д. Криво работает конфигурация - выполняем configure, исправляем руками, далее compile для проверки.

Link to comment
Share on other sites

  • 1 month later...

Бодрого дня Всем!

При сборке возникла необходимость добавить в пакет библиотеки от boost: boost_system и boost_filesystem.
Вопрос - где и что нужно прописать в Makefile, чтобы их добавить?
Костыль нашел: в секцию 
define Package/my_package/install добавил 
     ...
    $(CP) /apps/entware/staging_dir/target-aarch64_cortex-a53_glibc-2.27/opt/lib/libboost_system.so.* $(1)/opt/lib
    $(CP) /apps/entware/staging_dir/target-aarch64_cortex-a53_glibc-2.27/opt/lib/libboost_filesystem.so.* $(1)/opt/lib


и все собирается и запускается, но это же костыль))
Знающие люди помогите понять, какую нужно использовать автоматическую переменную вместо "/apps/entware/staging_dir/target-aarch64_cortex-a53_glibc-2.27" или нужно делать как-то совсем иначе? 

Edited by Zeleza
Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

В 19.03.2023 в 08:55, Zeleza сказал:

    $(CP) /apps/entware/staging_dir/target-aarch64_cortex-a53_glibc-2.27/opt/lib/libboost_system.so.* $(1)/opt/lib

$(CP) $(STAGING_DIR)/opt/lib/libboost_system.so.* $(1)/opt/lib

STAGING_DIR

  • Thanks 1
Link to comment
Share on other sites

  • 4 weeks later...
В 22.03.2023 в 19:21, TheBB сказал:
$(CP) $(STAGING_DIR)/opt/lib/libboost_system.so.* $(1)/opt/lib

STAGING_DIR

Здравствуйте помогите пожалуйста собрать рабочий v2ray

Вот тут вроде форк рабочий но после установки ошибка

https://github.com/BI7PRK/luci-app-v2ray/releases

Версия прошивки

OpenWrt SNAPSHOT r22557-69812bf8ed / LuCI Master git-23.093.56957-2145121

Версия ядра

5.15.106

Screenshot_2023-04-14-11-15-01-957_com.mi.globalbrowser.jpg

Edited by kvsplz9860
  • Confused 3
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.

  • Recently Browsing   0 members

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