|
|
Опции темы | Поиск в этой теме | Опции просмотра |
30.01.2018, 16:50 | #1 |
Senior Member
Регистрация: 22.09.2017
Сообщений: 338
Вес репутации: 442 |
Создание Makefile для стороннего пакета от простого к сложному
Решил начать знакомство с Makefile, с простого примера по созданию стороннего пакета в lede: https://istarik.ru/blog/openwrt/49.html
Создал директорию: /home/sana/source/package/kernel/test, в ней папку src и файл Makefile с содержимым: Код:
#===================================== # test Makefile #===================================== include $(TOPDIR)/rules.mk PKG_NAME:=test PKG_VERSION:=1 PKG_RELEASE:=1 PKG_BUILD_DIR:= $(BUILD_DIR)/$(PKG_NAME) include $(INCLUDE_DIR)/package.mk define Package/test SECTION:=kernel CATEGORY:=Kernel modules SUBMENU:=Wireless Drivers TITLE:=test - ddddddddddddddddddddddddddddddd endef define Package/test/description test - ddddddddddddddddddddddddddddddd endef define Build/Prepare mkdir -p $(PKG_BUILD_DIR) $(CP) ./src/* $(PKG_BUILD_DIR)/ endef define Build/Compile $(TARGET_CC) $(TARGET_CFLAGS) -c -o $(PKG_BUILD_DIR)/hello.o $(PKG_BUILD_DIR)/hello.c $(TARGET_CC) $(TARGET_LDFLAGS) -o $(PKG_BUILD_DIR)/test $(PKG_BUILD_DIR)/hello.o endef define Package/test/install $(INSTALL_DIR) $(1)/bin $(INSTALL_BIN) $(PKG_BUILD_DIR)/test $(1)/bin/ endef $(eval $(call BuildPackage,test)) Код:
#include <stdio.h> int main (void) { printf("Hello world, i'm cool hacker!\n"); return 0; make package/test/compile V=s На что получил ответ: Код:
sana@sana ~/source $ make package/test/compile V=s make[1]: Entering directory '/home/sana/source' make[2]: Entering directory '/home/sana/source/package/libs/toolchain' if [ -f /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install.clean ]; then rm -f /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install.clean; fi echo "libc" >> /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install if [ -f /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install.clean ]; then rm -f /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install.clean; fi echo "libgcc" >> /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install if [ -f /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install.clean ]; then rm -f /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install.clean; fi if [ -f /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install.clean ]; then rm -f /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install.clean; fi if [ -f /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install.clean ]; then rm -f /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install.clean; fi if [ -f /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install.clean ]; then rm -f /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install.clean; fi echo "libpthread" >> /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install if [ -f /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install.clean ]; then rm -f /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install.clean; fi if [ -f /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install.clean ]; then rm -f /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install.clean; fi echo "librt" >> /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install if [ -f /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install.clean ]; then rm -f /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install.clean; fi if [ -f /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install.clean ]; then rm -f /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install.clean; fi if [ -f /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install.clean ]; then rm -f /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install /home/sana/source/staging_dir/target-arm_cortex-a9_musl-1.1.16_eabi/pkginfo/toolchain.default.install.clean; fi make[2]: Leaving directory '/home/sana/source/package/libs/toolchain' make[2]: Entering directory '/home/sana/source/package/kernel/test' arm-openwrt-linux-muslgnueabi-gcc -Os -pipe -mcpu=cortex-a9 -fno-caller-saves -fno-plt -fhonour-copts -Wno-error=unused-but-set-variable -Wno-error=unused-result -mfloat-abi=soft -iremap /home/sana/source/build_dir/target-arm_cortex-a9_musl-1.1.16_eabi/test:test -Wformat -Werror=format-security -fstack-protector -D_FORTIFY_SOURCE=1 -Wl,-z,now -Wl,-z,relro -c -o /home/sana/source/build_dir/target-arm_cortex-a9_musl-1.1.16_eabi/test/hello.o /home/sana/source/build_dir/target-arm_cortex-a9_musl-1.1.16_eabi/test/hello.c /home/sana/source/build_dir/target-arm_cortex-a9_musl-1.1.16_eabi/test/hello.c: In function 'main': /home/sana/source/build_dir/target-arm_cortex-a9_musl-1.1.16_eabi/test/hello.c:6:3: error: expected declaration or statement at end of input return 0; ^ Makefile:41: recipe for target '/home/sana/source/build_dir/target-arm_cortex-a9_musl-1.1.16_eabi/test/.built' failed make[2]: *** [/home/sana/source/build_dir/target-arm_cortex-a9_musl-1.1.16_eabi/test/.built] Error 1 make[2]: Leaving directory '/home/sana/source/package/kernel/test' package/Makefile:105: recipe for target 'package/kernel/test/compile' failed make[1]: *** [package/kernel/test/compile] Error 2 make[1]: Leaving directory '/home/sana/source' /home/sana/source/include/toplevel.mk:198: ошибка выполнения рецепта для цели «package/test/compile» make: *** [package/test/compile] Ошибка 2 Последний раз редактировалось sana555; 30.01.2018 в 16:54. |
30.01.2018, 18:12 | #2 | |
Senior Member
Регистрация: 22.10.2015
Адрес: Там где сосны и песок
Сообщений: 1,534
Вес репутации: 1600 |
Очевидная разница - makefile для раздела "Утилиты" в представленном здесь примере: https://istarik.ru/blog/openwrt/49.html отличается от makefile модуля ядра.
Сборка модуля ядра описана здесь: http://h-wrt.com/ru/mini-how-to/autotoolsSimpleModule Цитата:
__________________
Читаю ваши мысли по аватару ... Последний раз редактировалось sunny; 30.01.2018 в 18:15. |
|
30.01.2018, 18:20 | #3 |
Moderator
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 991
Вес репутации: 1031 |
В hello.c кажется нет закрывающей скобки }
ИМХО дилетанта: sunny, там компилятор явно ругается: hello.c:6:3: error: expected declaration or statement at end of input А секция define Package/test указывает в каком месте menuconfig этот пакет светится будет. (дяденька, я не настоящий программист, я листинг кодов в корзине нашел) Последний раз редактировалось Tohin; 30.01.2018 в 18:23. |
30.01.2018, 18:46 | #4 | ||
Senior Member
Регистрация: 22.09.2017
Сообщений: 338
Вес репутации: 442 |
Цитата:
Цитата:
Последний раз редактировалось sana555; 30.01.2018 в 18:48. |
||
31.01.2018, 00:33 | #5 | |
Senior Member
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1311 |
Цитата:
Небольшая выдержка... Модуль ядра Linux — это скомпилированный двоичный код, который вставляется непосредственно в ядро Linux, работая в кольце 0, внутреннем и наименее защищённом кольце выполнения команд в процессоре x86–64. Здесь код исполняется совершенно без всяких проверок... Написание модуля ядра Linux — занятие не для слабонервных. Изменяя ядро, вы рискуете потерять данные. В коде ядра нет стандартной защиты, как в обычных приложениях Linux. Если сделать ошибку, то повесите всю систему... Это я к тому, что Вы в трёх строчках допустили банальную ошибку.
__________________
istarik.ru |
|
31.01.2018, 00:50 | #6 | |
Senior Member
Регистрация: 22.09.2017
Сообщений: 338
Вес репутации: 442 |
Ан нет, поторопил лошадей, перепутал с другой ссылкой, которую вы мне давали: http://h-wrt.com/ru/mini-how-to/autotoolsSimpleProject
Во всех примерах, которые мне удалось посмотреть, рассматривается ситуация, когда файлы находятся непосредственно в папке src, а у меня файлы находятся в: src\wl\sys src\shared src\shared\bcmwifi\include src\include src\include\bcmcrypto src\common\include\proto А, именно, в папке src, кроме вышеперечисленных папок больше нет никаких файлов... Исходя из этого: Цитата:
src\wl\sys\wl_cfg80211_hybrid.c src\wl\sys\wl_iw.c src\wl\sys\wl_linux.c src\shared\linux_osl.c Остальные файлы в этих и других папках, с расширением .h Последний раз редактировалось sana555; 31.01.2018 в 01:10. |
|
31.01.2018, 01:05 | #7 |
Senior Member
Регистрация: 22.09.2017
Сообщений: 338
Вес репутации: 442 |
. Мало того, это еще не я написал, а просто скопировал готовый пример, без закрывающей скобки. А если б сам что нибудь на придумывал, там точно черт ногу сломит... Я думал, чтобы подцепить сторонний драйвер нужно только научиться составить правильный Makefile, а тут на тебе такие страсти.. Даже и не знаю что мне делать, все же хочется на новом роутере, родной работающий wi-fi...
|
31.01.2018, 08:23 | #8 | |
Senior Member
Регистрация: 22.09.2017
Сообщений: 338
Вес репутации: 442 |
Все же решил продолжать, чем черт не шутит, авось с вашей, да божьей помощью что нибудь на ковыряю. Особо не переживаю, рабочий роутер есть, этот можно подвергнуть испытаниям..
Развернуть для просмотраУсложнил задачу, из этого примера:http://h-wrt.com/ru/mini-how-to/autotoolsSimpleProject решил сделать в ручную, там идет три файла:
Цитата:
Код:
#===================================== # test1 Makefile #===================================== include $(TOPDIR)/rules.mk PKG_NAME:=test1 PKG_VERSION:=1 PKG_RELEASE:=1 PKG_BUILD_DIR:= $(BUILD_DIR)/$(PKG_NAME) include $(INCLUDE_DIR)/package.mk define Package/test1 SECTION:=kernel CATEGORY:=Kernel modules SUBMENU:=Wireless Drivers TITLE:=test1 - ddddddddddddddddddddddddddddddd endef define Package/test1/description test1 - ddddddddddddddddddddddddddddddd endef define Build/Prepare mkdir -p $(PKG_BUILD_DIR) $(CP) ./src/* $(PKG_BUILD_DIR)/ endef #Изменения коснулись только этой части, в данном случае в папке src два файла с расширением .c, поэтому запись увеличится на одну строку. Я так понимаю, что файлы с расширением .h мы вообще не трогаем и никуда не вписываем... define Build/Compile $(TARGET_CC) $(TARGET_CFLAGS) -c -o $(PKG_BUILD_DIR)/main.o $(PKG_BUILD_DIR)/main.c $(TARGET_CC) $(TARGET_CFLAGS) -c -o $(PKG_BUILD_DIR)/test.o $(PKG_BUILD_DIR)/test.c #А эта строчка немного изменится $(TARGET_CC) $(TARGET_LDFLAGS) -o $(PKG_BUILD_DIR)/test1 $(PKG_BUILD_DIR)/main.o $(PKG_BUILD_DIR)/test.o endef define Package/test1/install $(INSTALL_DIR) $(1)/bin $(INSTALL_BIN) $(PKG_BUILD_DIR)/test1 $(1)/bin/ endef $(eval $(call BuildPackage,test1)) [свернуть] В итоге пакет скомпилировался без ошибок. Канэчно, особых изменений не произошло, но тем не менее, я доволен... Можете прокомментировать эти строки, что здесь происходит? Код:
define Build/Compile $(TARGET_CC) $(TARGET_CFLAGS) -c -o $(PKG_BUILD_DIR)/main.o $(PKG_BUILD_DIR)/main.c $(TARGET_CC) $(TARGET_CFLAGS) -c -o $(PKG_BUILD_DIR)/test.o $(PKG_BUILD_DIR)/test.c $(TARGET_CC) $(TARGET_LDFLAGS) -o $(PKG_BUILD_DIR)/test1 $(PKG_BUILD_DIR)/main.o $(PKG_BUILD_DIR)/test.o endef |
|
31.01.2018, 14:59 | #9 | |
Senior Member
Регистрация: 22.10.2015
Адрес: Там где сосны и песок
Сообщений: 1,534
Вес репутации: 1600 |
Цитата:
Как минимум самостоятельная сборка приложений будет очень полезна.
__________________
Читаю ваши мысли по аватару ... |
|
31.01.2018, 15:32 | #10 |
Senior Member
Регистрация: 22.09.2017
Сообщений: 338
Вес репутации: 442 |
Решил снова собрать пакет с помощью автоутилит, по этому мануалу:http://h-wrt.com/ru/mini-how-to/autotoolsSimpleProject Вчера все собрал, сегодня затык в первой же команде(проверил все файлы, вроде бы код везде правильный):
Код:
sana@sana ~/test $ autoscan Unescaped left brace in regex is deprecated, passed through in regex; marked by <-- HERE in m/\${ <-- HERE [^\}]*}/ at /usr/bin/autoscan line 361. Код:
sana@sana ~/test $ aclocal aclocal: warning: autoconf input should be named 'configure.ac', not 'configure.in' Код:
sana@sana ~/test $ autoconf sana@sana ~/test $ autoheader sana@sana ~/test $ touch NEWS README AUTHORS ChangeLog Код:
sana@sana ~/test $ automake --add-missing automake: warning: autoconf input should be named 'configure.ac', not 'configure.in' configure.in:12: installing './compile' configure.in:9: installing './install-sh' configure.in:9: installing './missing' Makefile.am: installing './INSTALL' Makefile.am: installing './COPYING' using GNU General Public License v3 file Makefile.am: Consider adding the COPYING file to the version control system Makefile.am: for your code, to avoid questions about which license your project uses src/Makefile.am: installing './depcomp' automake: warning: autoconf input should be named 'configure.ac', not 'configure.in' Код:
sana@sana ~/test $ configure configure: команда не найдена Латна, пошел пешком в директорию и вручную запустил скрипт configure, и о чудо, Makefile -ы создались в директории /test и /test/src. Пробую собрать: Код:
sana@sana ~/test $ make make all-recursive make[1]: вход в каталог «/home/sana/test» Making all in src make[2]: вход в каталог «/home/sana/test/src» gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c mv -f .deps/main.Tpo .deps/main.Po gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT test.o -MD -MP -MF .deps/test.Tpo -c -o test.o test.c mv -f .deps/test.Tpo .deps/test.Po gcc -g -O2 -o hello main.o test.o make[2]: выход из каталога «/home/sana/test/src» make[2]: вход в каталог «/home/sana/test» make[2]: выход из каталога «/home/sana/test» make[1]: выход из каталога «/home/sana/test» Код:
sana@sana ~/test $ src/hello i am test! Только не понятно, получается выше ошибки были не критичные? Последний раз редактировалось sana555; 31.01.2018 в 15:59. |
Здесь присутствуют: 2 (пользователей: 0 , гостей: 2) | |
|
|