Мне нужно добавить свой собственный пакет в образ openwrt. В вики проекта я нашел эту статью
Я пытался следовать инструкциям по нему, но в итоге мне не удалось добавить собственный пакет в дерево исходного кода (сборка проигнорировала его наличие).
Из-за этого я попытался найти другой способ. И это оказался этот инструкция. Я последовал инструкциям и собрал свой собственный пакет.
Но, как видите, исходный код этого пакета не зависит от других и не требует каких-либо других файлов заголовков сборки. Кроме того, его Makefile полностью включает инструкции по компиляции.

define Build/Compile
    $(TARGET_CC) $(TARGET_CFLAGS) -o $(PKG_BUILD_DIR)/helloworld.o -c $(PKG_BUILD_DIR)/helloworld.c
    $(TARGET_CC) $(TARGET_LDFLAGS) -o $(PKG_BUILD_DIR)/$1 $(PKG_BUILD_DIR)/helloworld.o
endef

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

define Build/Prepare
    echo $PKG_NAME
    mkdir -p $(PKG_BUILD_DIR)
    cp $(SOURCE_DIR)/* $(PKG_BUILD_DIR)
    $(Build/Patch)
endef

define Build/Compile
    $(PKG_BUILD_DIR) $(MAKE)
endef

Я получаю следующий результат:

    $ make -C package/feeds/mypackages/helloworld compile TOPDIR=$PWD
make: Entering directory '/home/username/mypackages/examples/helloworld'
bash: mkhash: command not found
bash: mkhash: command not found
bash: mkhash: command not found
bash: mkhash: command not found
bash: mkhash: command not found
bash: mkhash: command not found
bash: mkhash: command not found
bash: mkhash: command not found
make: Nothing to be done for 'compile'.
make: Leaving directory '/home/username/mypackages/examples/helloworld'

Мой полный Makefile как для пакета, так и для двоичного файла:

include $(TOPDIR)/rules.mk
PKG_NAME:=helloworld
PKG_VERSION:=1.0
PKG_RELEASE:=1
SOURCE_DIR:=/home/username/helloworld
include $(INCLUDE_DIR)/package.mk
define Package/$(PKG_NAME)
    SECTION:=utils
    DEPENDS:= +libstdcpp
    TITLE:=helloworld
endef
define Package/helloworld/description
    A simple "Hello, world!" -application.
endef
define Build/Prepare
    echo $PKG_NAME
    mkdir -p $(PKG_BUILD_DIR)
    cp $(SOURCE_DIR)/* $(PKG_BUILD_DIR)
    $(Build/Patch)
endef
define Build/Compile
    $(PKG_BUILD_DIR) $(MAKE)
endef
define Package/helloworld/install
    # Install binnary
    #$(INSTALL_DIR) $(1)/usr/bin
    #$(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/usr/bin/
endef
$(eval $(call BuildPackage,$(PKG_NAME)))

,

TARGET = heloworld
OBJS = heloworld.o
CFLAGS += -Wall -Wextra 
LDFLAGS += -lxsacpp -lxsac -lubus -lubox 
CXXFLAGS += $(CFLAGS) -std=c++14

%.o : %.cpp
    $(CXX) -c $(CXXFLAGS) $< -o $@

all: $(TARGET)

$(TARGET): $(OBJS)
    $(CXX) $(LDFLAGS) -o $@ $^

clean:
    rm *.o $(TARGET)

И на самом деле мой вопрос: что нужно установить в Makefile, чтобы правильно копировать файлы и вызывать локальный Makefile для двоичного пакета?

0
plzvtl 20 Май 2021 в 02:17

1 ответ

Лучший ответ

Чтобы скопировать файлы и каталоги, вы можете использовать следующий шаг:

# copy all files and directories using **cp -r -f **
define Build/Prepare
    echo $PKG_NAME
    mkdir -p $(PKG_BUILD_DIR)
    cp -r -f $(SOURCE_DIR)/* $(PKG_BUILD_DIR)
    $(Build/Patch)
endef

Чтобы выполнить локальный make-файл, используйте следующий шаг:

# Execute local makefile by giving path using '-C' option
define Build/Compile
     `$(MAKE) -C $(PKG_BUILD_DIR)`
endef
1
Altaf 20 Май 2021 в 08:06