LINUX.ORG.RU

Отладка Makefile. *** missing separator

 ,


0

1

Исходные. Портирую OpenWrt на архитектуру RISCV64, несколько платформ (одноплатник, стенд, изделие). Для пакета U-Boot заведен Makefile в <package/u-boot/uboot-riscv64>. В «make menuconfig» что там прописано видится, выбирается.


include $(TOPDIR)/rules.mk

include $(INCLUDE_DIR)/kernel.mk
include $(INCLUDE_DIR)/u-boot.mk
include $(INCLUDE_DIR)/package.mk
include $(INCLUDE_DIR)/host-build.mk

define U-Boot/Default
        BUILD_TARGET:=riscv64
        UBOOT_IMAGE:=spl/boot.bin u-boot.img
        UBOOT_CONFIG:=sipeed_maix_bitm
        UENV:=default
endef

#  UBOOT_CONFIG:=riscv64_$(1)
#  HIDDEN:=1

define U-Boot/sipeed_maix_bitm
        NAME:=Sipeed Allwinner D1 board
        BUILD_DEVICES:=sipeed
endef

# ToDo. For each platform

# Note. Just u-boot targets that could be found in packages/boot/u-boot
UBOOT_TARGETS:= \
        sipeed_maix_bitm

#       onyx \
#       kwnic

define Build/InstallDev
        $(INSTALL_DIR) $(STAGING_DIR_IMAGE)
        $(CP) $(PKG_BUILD_DIR)/spl/boot.bin $(STAGING_DIR_IMAGE)/$(BUILD_DEVICES)-boot.bin
        $(CP) $(PKG_BUILD_DIR)/u-boot.img $(STAGING_DIR_IMAGE)/$(BUILD_DEVICES)-u-boot.img
endef

#    $(CP) ./files/uEnv-$(UENV).txt $(STAGING_DIR_IMAGE)/$(BUILD_DEVICES)-uEnv.txt

#define Build/Compile
#endef

#define Package/u-boot/install/default
#endef

$(warning "===== UBOOT_TARGETS=" $(UBOOT_TARGETS))
$(warning "===== BUILD_VARIANT=" $(BUILD_VARIANT))
#$(warning $(call BuildPackage/U-Boot))
$(eval $(call BuildPackage/U-Boot))

BuildPackage/U-Boot определен в <build_dir/target-riscv64_riscv64_musl/openwrt-imagebuilder-riscv64-sipeed.Linux-x86_64/include>

PKG_NAME ?= u-boot

ifndef PKG_SOURCE_PROTO
PKG_SOURCE = $(PKG_NAME)-$(PKG_VERSION).tar.bz2
PKG_SOURCE_URL = \
        https://mirror.cyberbits.eu/u-boot \
        https://ftp.denx.de/pub/u-boot \
        ftp://ftp.denx.de/pub/u-boot
endif

PKG_BUILD_DIR = $(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)

PKG_TARGETS := bin
PKG_FLAGS:=nonshared

PKG_LICENSE:=GPL-2.0 GPL-2.0+
PKG_LICENSE_FILES:=Licenses/README

PKG_BUILD_PARALLEL:=1

export GCC_HONOUR_COPTS=s

define Package/u-boot/install/default
        $(CP) $(patsubst %,$(PKG_BUILD_DIR)/%,$(UBOOT_IMAGE)) $(1)/
endef

Package/u-boot/install = $(Package/u-boot/install/default)

define U-Boot/Init
  BUILD_TARGET:=
  BUILD_SUBTARGET:=
  BUILD_DEVICES:=
  NAME:=
  DEPENDS:=
  HIDDEN:=
  DEFAULT:=
  VARIANT:=$(1)
  UBOOT_CONFIG:=$(1)
  UBOOT_IMAGE:=u-boot.bin
endef

TARGET_DEP = TARGET_$(BUILD_TARGET)$(if $(BUILD_SUBTARGET),_$(BUILD_SUBTARGET))

UBOOT_MAKE_FLAGS = \
        HOSTCC="$(HOSTCC)" \
        HOSTCFLAGS="$(HOST_CFLAGS) $(HOST_CPPFLAGS) -std=gnu11" \
        HOSTLDFLAGS="$(HOST_LDFLAGS)" \
        LOCALVERSION="-OpenWrt-$(REVISION)" \
        STAGING_PREFIX="$(STAGING_DIR_HOST)" \
        PKG_CONFIG_PATH="$(STAGING_DIR_HOST)/lib/pkgconfig" \
        PKG_CONFIG_LIBDIR="$(STAGING_DIR_HOST)/lib/pkgconfig" \
        PKG_CONFIG_EXTRAARGS="--static" \
        $(if $(findstring c,$(OPENWRT_VERBOSE)),V=1,V='')

define Build/U-Boot/Target
  $(eval $(call U-Boot/Init,$(1)))
  $(eval $(call U-Boot/Default,$(1)))
  $(eval $(call U-Boot/$(1),$(1)))

 define Package/u-boot-$(1)
    SECTION:=boot
    CATEGORY:=Boot Loaders
    TITLE:=U-Boot for $(NAME)
    VARIANT:=$(VARIANT)
    DEPENDS:=@!IN_SDK $(DEPENDS)
    HIDDEN:=$(HIDDEN)
    ifneq ($(BUILD_TARGET),)
      DEPENDS += @$(TARGET_DEP)
      ifneq ($(BUILD_DEVICES),)
        DEFAULT := y if ($(TARGET_DEP)_Default \
                $(patsubst %,|| $(TARGET_DEP)_DEVICE_%,$(BUILD_DEVICES)) \
                $(patsubst %,|| $(patsubst TARGET_%,TARGET_DEVICE_%,$(TARGET_DEP))_DEVICE_%,$(BUILD_DEVICES)))
      endif
    endif
    $(if $(DEFAULT),DEFAULT:=$(DEFAULT))
    URL:=http://www.denx.de/wiki/U-Boot
  endef

  define Package/u-boot-$(1)/install
        $$(Package/u-boot/install)
  endef
endef

define Build/Configure/U-Boot
        +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) $(UBOOT_CONFIGURE_VARS) $(UBOOT_CONFIG)_config
endef

DTC=$(wildcard $(LINUX_DIR)/scripts/dtc/dtc)

define Build/Compile/U-Boot
        +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) \
                CROSS_COMPILE=$(TARGET_CROSS) \
                $(if $(DTC),DTC="$(DTC)") \
                $(UBOOT_MAKE_FLAGS)
endef

define BuildPackage/U-Boot/Defaults
  Build/Configure/Default = $$$$(Build/Configure/U-Boot)
  Build/Compile/Default = $$$$(Build/Compile/U-Boot)
endef

define BuildPackage/U-Boot
  $(warning ============== BuildPackage/U-Boot ==============)
  $(warning "UBOOT_TARGETS=" $(UBOOT_TARGETS))
  $(warning "BUILD_VARIANT=" $(BUILD_VARIANT))
  $(warning "===== 1" )
  $(eval $(call BuildPackage/U-Boot/Defaults))
  $(foreach type,$(if $(DUMP),$(UBOOT_TARGETS),$(BUILD_VARIANT)), \
    $(eval $(call Build/U-Boot/Target,$(type)))
  )
  $(warning "===== 2" )
  $(eval $(call Build/DefaultTargets))
  $(foreach type,$(if $(DUMP),$(UBOOT_TARGETS),$(BUILD_VARIANT)), \
    $(call BuildPackage,u-boot-$(type))
  )
endef

То есть оно качается в процессе сборки «git clone» или «wget xxx.tar.gz» из сети. И попадает в каталог с этим страшным сгенерированным именем.

$(warning ...) это уже я добавил. Причем, в моем конфиге warning хоть что-то выводит, а в include-нутом нет. Возможно, из всего этого генерится нечто третье, что не чистится «make clean», и возможно только удалением /tmp, /build, /bin, /build_dir.

В итоге сборки по «make -j1 V=sc» (рекомендовано для поиска ошибок) все заканчивается

..........
..........
make[3]: Entering directory '/home/user/PROJECTS/openwrt-riscv/package/boot/uboot-riscv64'
Makefile:49: "===== UBOOT_TARGETS=" sipeed_maix_bitm
Makefile:50: "===== BUILD_VARIANT=" sipeed_maix_bitm
Makefile:52: *** missing separator.  Stop.
make[3]: Leaving directory '/home/user/PROJECTS/openwrt-riscv/package/boot/uboot-riscv64'
time: package/boot/uboot-riscv64/sipeed_maix_bitm/compile#0.08#0.01#0.09
    ERROR: package/boot/uboot-riscv64 failed to build (build variant: sipeed_maix_bitm).
make[2]: *** [package/Makefile:116: package/boot/uboot-riscv64/compile] Error 1
make[2]: Leaving directory '/home/user/PROJECTS/openwrt-riscv'
make[1]: *** [package/Makefile:110: /home/user/PROJECTS/openwrt-riscv/staging_dir/target-riscv64_riscv64_musl/stamp/.package_compile] Error 2
make[1]: Leaving directory '/home/user/PROJECTS/openwrt-riscv'
make: *** [/home/user/PROJECTS/openwrt-riscv/include/toplevel.mk:231: world] Ошибка 2

Был опробован «make --debug=basic ...», «make --debug=all». Ничего вразумительного по поводу происхождения «*** missing separator» это не дает. Какой сепаратор? Хоть бы как в С показывалось «^--вот тут» или «скобки ( где-то не хватает». Это случается на последней строчке 1-го Makefile «$(eval $(call BuildPackage/U-Boot))». В файлах проверил, блоки правил и define кончаются чисто пустой строкой (make к этому неравнодушен). Про саму ошибку в интернетах пишут, что самая распространенная и может значить что угодно.

Собственно вопросы.

Кто как отлаживает Makefile и как тут можно докопаться до причины?

Допиливал ли кто OpenWrt под новую платформу? (не сильно надеюсь, что кто-то это делал).

Ответ на: комментарий от i-rinat

В правилах да. Но в 50 строках я как мартышка повторил стиль чужих конфигов, где табы, где пробелы. И там например в define 2 пробела. Я ставил табы и туда, и пустые строки после.

Это в другой платформе, по 2 пробела

define U-Boot/a64-olinuxino
  BUILD_SUBTARGET:=cortexa53
  NAME:=Olimex A64-OLinuXino
  BUILD_DEVICES:=olimex_a64-olinuxino
  DEPENDS:=+PACKAGE_u-boot-olimex_a64-olinuxino:arm-trusted-firmware-sunxi-a64
  UENV:=a64
  ATF:=a64
endef

bugs-bunny
() автор топика
Ответ на: комментарий от kindof

В корне проекта OpenWrt </home/user/PROJECTS/openwrt-riscv/> запускается «make -j1 V=sc». Он компилит много чего, в том числе и toolchain для RISC-V, gcc из исходников gcc и все-все-все. А далее этим компилит пакеты для корневой ФС будущей системы и собирает ext4 образ корневого диска. Собирал, но теперь доходит до загрузчика u-boot, который является одним из пакетов … и тут вот этот облом.

bugs-bunny
() автор топика
Ответ на: комментарий от bugs-bunny

В корне проекта OpenWrt </home/user/PROJECTS/openwrt-riscv/> запускается «make -j1 V=sc». Он компилит много чего, в том числе и toolchain для RISC-V, gcc из исходников gcc и все-все-все. А далее этим компилит пакеты для корневой ФС будущей системы и собирает ext4 образ корневого диска. Собирал, но теперь доходит до загрузчика u-boot, который является одним из пакетов … и тут вот этот облом.

это все понятно

некорректно форкнули чей-то uboot

проблема вот тут:

$(eval $(call BuildPackage/U-Boot))
kindof
()
Ответ на: комментарий от kindof

Это случается на последней строчке 1-го Makefile «$(eval $(call BuildPackage/U-Boot))».

Я это в 1-м своем сообщении и писал.

Некоректно форкнул? Из репы проекта OpenWrt? Взял «git clone» отсюда свежак https://github.com/openwrt/openwrt и начал добавлять свою платформу, подглядывая что есть в других, почему и как, т.к. прямых инструкций не нашел.

bugs-bunny
() автор топика
Ответ на: комментарий от bugs-bunny

Я это в 1-м своем сообщении и писал.

Некоректно форкнул? Из репы проекта OpenWrt? Взял «git clone» отсюда свежак https://github.com/openwrt/openwrt и начал добавлять свою платформу, подглядывая что есть в других, почему и как, т.к. прямых инструкций не нашел.

Если это master, то должно быть для начала

PKG_NAME:=
PKG_VERSION:=
PKG_RELEASE:=

в Makefile, например

kindof
()
Ответ на: комментарий от bugs-bunny

У make есть опция --debug. Может стоит её попробовать? Не знаю, наследуются ли опции при рекурсивных вызовах make. Если нет, можно попробовать заменить /usr/bin/make на скрипт, который добавляет нужные параметры к вызову настоящего make.

i-rinat ★★★★★
()
Ответ на: комментарий от kindof

Да, в соседних каталогах, в конфигах задано. Нашел, что среди релизов u-boot есть 2022.10, его и прописал перед включением u-boot.mk

make[3]: Entering directory '/home/user/PROJECTS/openwrt-riscv/package/boot/uboot-riscv64'
Makefile:53: "===== UBOOT_TARGETS=" sipeed_maix_bitm
Makefile:54: "===== BUILD_VARIANT=" sipeed_maix_bitm
Makefile:55: "===== PKG_NAME=" u-boot
Makefile:56: "===== PKG_VERSION=" 2022.10
Makefile:57: "===== PKG_RELEASE=" 0
Makefile:58: "===== PKG_BUILD_DIR=" /home/user/PROJECTS/openwrt-riscv/build_dir/target-riscv64_riscv64_musl/u-boot-sipeed_maix_bitm/u-boot-2022.10
Makefile:60: *** missing separator.  Stop.
make[3]: Leaving directory '/home/user/PROJECTS/openwrt-riscv/package/boot/uboot-riscv64'
time: package/boot/uboot-riscv64/sipeed_maix_bitm/compile#0.16#0.02#0.17
    ERROR: package/boot/uboot-riscv64 failed to build (build variant: sipeed_maix_bitm).

Однако, странным путем попадают настройки в сборку. BUILD_VARIANT обновляется только через «make menuconfig», долетает через .config файл. И возможно, выбор вариантов u-boot ограничен тем, что есть в проекте u-boot - придется лезть и в u-boot.

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

И PKG_BUILD_DIR с синтезированным именем при сборке не появился.

bugs-bunny
() автор топика
Ответ на: комментарий от bugs-bunny

Да, в соседних каталогах, в конфигах задано. Нашел, что среди релизов u-boot есть 2022.10, его и прописал перед включением u-boot.mk

прежде всего надо ответить на вопросы: а u-boot 2022.10 поддерживает target board? без патчей?

И PKG_BUILD_DIR с синтезированным именем при сборке не появился.

а он и не определен в вашем Makefile

kindof
()
Ответ на: комментарий от bugs-bunny

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

grem ★★★★★
()
Ответ на: комментарий от kindof

make нужно сказать: что сделать и как сделать. в вашем Makefile нет ни того ни другого.

Ну я плясал от соседнего uboot-sunxi. Вроде прописал те же параметры. Конфиг из u-boot пакета, единственный для RISCV найденный прописал для начала - стал выбираться в menuconfig.

BUILD_TARGET вот не прописал. На PKG_VERSION забил, а по ней видимо вытаскивается tar.gz из реп.

BTW maix bit? 8MiB мало.

Я пока не большой знаток RISC.

bugs-bunny
() автор топика

Немного ответов на свои же вопросы оставлю здесь.

https://openwrt.org/ru/doc/devel/packages - один из немногих переведенных разделов толком объясняющий, как настроить сборку пакета в OpenWrt. Ну и соседние платформы для примера.

make -d (аналог --debug=all)
make --debug=уровень (basic,... all)
make -p

Вываливают кучу инфы, кто кого вызвал и т.п.

define Image/Prepare
        $(warning ========== Image/Prepare ========== )
        @echo ===== KDIR=$(KDIR)
        $(CP) $(KDIR)/vmlinux $(BIN_DIR)/vmlinux
        $(CP) $(STAGING_DIR_IMAGE)/u-boot.bin $(BIN_DIR)/u-boot.bin
        @read -p AnyKey:
endef

Пример печати в лог «контрольных точек». Один раз выводятся $warning-и когда make препроцессит все это месиво OpenWrt, а второй раз когда выполняет. При выполнении можно эхов наставить, а с помощью read приостановить сборку, при препроцессе эти команды не выполняются.

Примерно о том же https://www.oreilly.com/openbook/make3/book/ch12.pdf

bugs-bunny
() автор топика