在编译时,提示如下错误:

drivers/net/wireless/MT79XX/Makefile:407: *** recipe commences before first target.  Stop. 

运行vim打开该Makefile文件,并打开行号。 

$vim drivers/net/wireless/MT79XX/Makefile 

显示: 

391 LINUX:
392 ifeq ($(TCSUPPORT_WLAN_MT7915_BUILD_IN),1)
393 obj-y   += ../os/linux/
394 endif
395 #       cp -f $(RT28xx_OS_DIR)/linux/Makefile.6 $(RT28xx_OS_DIR)/linux/Makefile
396 ifneq ($(TCSUPPORT_WLAN_MT7915_BUILD_IN),1)
397         cp -f $(RT28xx_OS_DIR)/linux/Makefile.mt_wifi_ap $(RT28xx_OS_DIR)/linux/Makefile
398 endif
399 ifeq ($(PLATFORM),DM6446)
400         $(MAKE)  ARCH=arm CROSS_COMPILE=arm_v5t_le- -C  $(LINUX_SRC) SUBDIRS=$(RT28xx_OS_DIR)/linux modules
401 #mark for kernel clean fail---econet mark
402 #else ifeq ($(PLATFORM),FREESCALE8377)
403 #       $(MAKE) ARCH=powerpc CROSS_COMPILE=$(CROSS_COMPILE) -C  $(LINUX_SRC) SUBDIRS=$(RT28xx_OS_DIR)/linux modules
404 #else ifeq ($(PLATFORM), $(filter $(PLATFORM), MT7622 MT7621))
405 #       $(MAKE) ARCH=$(ARCH) CROSS_COMPILE="$(CROSS_COMPILE)" -C $(LINUX_SRC) SUBDIRS=$(RT28xx_OS_DIR)/linux modules
406 else
407         $(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_OS_DIR)/linux modules
408 endif
409 ifeq ($(RT28xx_MODE),AP)
410         cp -f $(RT28xx_OS_DIR)/linux/$(MODULE)_ap.ko $(RT28xx_OS_DIR)/linux/mt_single_driver_ap.ko
411 endif
412 ifeq ($(RT28xx_MODE),STA)
413         cp -f $(RT28xx_OS_DIR)/linux/$(MODULE)_sta.ko $(RT28xx_OS_DIR)/linux/mt_single_driver_sta.ko
414 endif

 错误在于: Linux makefile要求格式:

target: [deps...]

<tab> recipe 1

<tab> recipe 2

也就是target下面的每一个recipe都要求前面有一个<tab>

而我们看到上面的target, 即391行的Linux:下面的 if..else..endif都是顶在最前面,没有留任何空间。因此,在每一行插入<tab>。 

391 LINUX:
392         ifeq ($(TCSUPPORT_WLAN_MT7915_BUILD_IN),1)
393                 obj-y   += ../os/linux/
394         endif
395 #       cp -f $(RT28xx_OS_DIR)/linux/Makefile.6 $(RT28xx_OS_DIR)/linux/Makefile
396         ifneq ($(TCSUPPORT_WLAN_MT7915_BUILD_IN),1)
397                 cp -f $(RT28xx_OS_DIR)/linux/Makefile.mt_wifi_ap $(RT28xx_OS_DIR)/linux/Makefile
398         endif
399         ifeq ($(PLATFORM),DM6446)
400                 $(MAKE)  ARCH=arm CROSS_COMPILE=arm_v5t_le- -C  $(LINUX_SRC) SUBDIRS=$(RT28xx_OS_DIR)/linux modules
401 #mark for kernel clean fail---econet mark
402 #else ifeq ($(PLATFORM),FREESCALE8377)
403 #       $(MAKE) ARCH=powerpc CROSS_COMPILE=$(CROSS_COMPILE) -C  $(LINUX_SRC) SUBDIRS=$(RT28xx_OS_DIR)/linux modules
404 #else ifeq ($(PLATFORM), $(filter $(PLATFORM), MT7622 MT7621))
405 #       $(MAKE) ARCH=$(ARCH) CROSS_COMPILE="$(CROSS_COMPILE)" -C $(LINUX_SRC) SUBDIRS=$(RT28xx_OS_DIR)/linux modules
406         else
407                 $(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_OS_DIR)/linux modules
408         endif
409         ifeq ($(RT28xx_MODE),AP)
410                 cp -f $(RT28xx_OS_DIR)/linux/$(MODULE)_ap.ko $(RT28xx_OS_DIR)/linux/mt_single_driver_ap.ko
411         endif
412         ifeq ($(RT28xx_MODE),STA)
413                 cp -f $(RT28xx_OS_DIR)/linux/$(MODULE)_sta.ko $(RT28xx_OS_DIR)/linux/mt_single_driver_sta.ko
414         endif

完美解决该问题。 

解决这个问题花了我一些时间。因为报错指向的是407行,我也在网上查到了recipe是需要在前面插入<tab>的,但是407行本身是有<tab>的。然后我把这个<tab>去掉后,报错:missing separator。 后面我把makefile的前后都浏览了一下,发现这些行(if .. else .. endif)的字体颜色明显和其它的target下不同,而且其它taget的if都是有插入<tab>的。于是我醒悟到是整个if..else..endif的格式不对。改正后发现解决了。从这里得出一个经验,就是可以通过观察字体颜色异常来找到编程语言的问题。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐