*** recipe commences before first target. Stop. 解决方案
Linux的makefile文件对target: recipe有格式要求,也就是在target下面的每一条recipe开头都必须有一个。如果没有,会报错,编译失败退出。
在编译时,提示如下错误:
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的格式不对。改正后发现解决了。从这里得出一个经验,就是可以通过观察字体颜色异常来找到编程语言的问题。
更多推荐
所有评论(0)