Исходные. Портирую 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 под новую платформу? (не сильно надеюсь, что кто-то это делал).