mixed implicit and normal rules. Stop.

本文指导用户如何解决在配置Linux内核时遇到的混合隐式规则错误,并提供了详细的修复步骤,包括修改Makefile文件、调整配置选项等,最终使make命令能够正常运行。

当你make menuconfig的时候,很不幸地,出现了以下问题:

(1)$ make menuconfig
Makefile:386: *** mixed implicit and normal rules.  Stop.

按照以下步骤修改:

  • vim Makefile

    修改报错的line 386,linux linux%_only:                      to                 linux:
    然后make menuconfig就貌似可以了.

    (2)make dep,继续报错:

    make[1]: Entering directory `/home/xxx/xxx/linux-2.6.28.10'
    Makefile:1614: *** mixed implicit and normal rules.  Stop.
    make[1]: Leaving directory `/home/xxx/xxx/linux-2.6.28.10'

  • vim linux-2.6.28.10/Makefile

    修改报错的line 1614,/ %/: prepare scripts FORCE            to             %/: prepare scripts FORCE

    (3)make dep,继续报错:

    make[1]: Entering directory `/home/xxx/xxx/linux-2.6.28.10'
    /home/xxx/xxx/linux-2.6.28.10/Makefile:446: *** mixed implicit and normal rules.  Stop.

  • vim linux-2.6.28.10/Makefile

    修改报错的line 446,config %config: scripts_basic outputmakefile FORCE       to             %config: scripts_basic outputmakefile FORCE

    (3)make,继续报错:

    make[3]: Entering directory /home/xxx/xxx/user/busybox'
    Makefile:1269: *** mixed implicit and normal rules.  Stop.
    make[3]: Leaving directory /home/xxx/xxx/user/busybox'

    修改报错的line 1269,/ %/: prepare scripts FORCE                                             to              %/: prepare scripts FORCE

    顺便修改config %config: scripts_basic outputmakefile FORCE       to              %config: scripts_basic outputmakefile FORCE
    (4)make
    make[1]: Entering directory /home/xxx/xxx/vendors'
    Makefile:28: *** mixed implicit and normal rules.  Stop.
    make[1]: Leaving directory /home/xxx/xxx/vendors'

    差不多的改法。而且不一定大家也会在这里出错。

    如果你只是想解决这个问题的话,直接按以下步骤修改,just go on!

    1、vim toolchain/buildroot/package/atk/atk.mk

      ATK_CONF_OPT =  --enable-shared \
                                       --enable-static                   to                  --enable-static \

    2、vim linux-2.6.28.10/Makefile

    config %config: scripts_basic outputmakefile FORCE       to             %config: scripts_basic outputmakefile FORCE
    / %/: prepare scripts FORCE                                             to             %/: prepare scripts FORCE

    3、vim user/busybox/Makefile

    config %config: scripts_basic outputmakefile FORCE       to              %config: scripts_basic outputmakefile FORCE
    / %/: prepare scripts FORCE                                             to              %/: prepare scripts FORCE

    4、vim Makefile

    linux linux%_only:                      to                 linux:

    5、vim vendors/Makefile

    all image clean romfs romfs.post vendor_%:

    to

    all image clean romfs romfs.post:
     $(MAKE) -C $(dir_v) dir_v=$(dir_v) -f $(VEND)/vendors-common.mak $@

    vendor_%:


    6、make menuconfig

    OK

     

<think>我们正在处理一个关于Makefile错误的问题,错误信息是"mixed implicitand normalrules:deprecated syntax"。根据引用资料,这个错误通常发生在较新版本的make工具中,因为它不再支持旧式的混合规则语法。用户的问题:如何解决这个错误?是否有替代方案?根据引用[3]和[5],错误的原因是Makefile中使用了旧式的混合规则(即同时使用了隐式规则和普通规则)。例如,在旧版Makefile中可能这样写:config %config:scripts_basic outputmakefileFORCE在新版make中,这种写法被废弃了。解决方案有两种:1.修改Makefile中的规则,将混合规则拆分开或改为新模式。例如,将上述行改为:%config: scripts_basicoutputmakefile FORCE这样就去掉了前面的普通规则(config)和隐式规则(%config)的混合,只保留一个模式规则。2.降级make版本到3.81(或其他旧版本),因为旧版make支持这种语法。但这种方法可能不推荐,因为旧版make可能缺少新特性或安全更新。因此,推荐的解决方案是修改Makefile,更新过时的规则语法。步骤:1.定位错误信息中提到的行号(例如Makefile:416和Makefile:1449)。2.将混合规则拆分为独立的规则,或者修改为只使用模式规则(即使用%的模式规则)。例如,引用[3]中提到的错误行416:config%config: scripts_basicoutputmakefile FORCE修改为:%config: scripts_basicoutputmakefile FORCE注意:如果原规则中同时有多个目标(如config和%config),修改后可能需要为每个目标单独写规则,或者确保模式规则能够匹配所有需要的情况。另外,引用[5]还提供了降级make的方法,但建议优先修改Makefile。如果用户无法修改Makefile(比如是第三方软件),那么降级make可能是临时解决方案。因此,回答应包含两种方法,并推荐第一种方法(修改Makefile)。生成相关问题:1.如何修改Makefile中的混合规则?2.降级make工具的具体步骤是什么?3.除了混合规则问题,新版本make还有哪些不兼容的变更?4.如何检查Makefile中是否有其他过时的语法?</think>### Makefile中混合隐式和普通规则的过时语法问题及替代方案 当在较新版本的`make`工具(≥4.0)中编译旧项目时,常会遇到错误: ```makefile Makefile:行号: *** mixed implicit and normal rules: deprecated syntax ``` 这表示Makefile中使用了**已废弃的混合规则语法**,即同时包含隐式规则(`%`通配符)和普通规则(具体目标)的声明方式[^2][^3][^5]。 #### 问题原因分析 旧式混合规则语法示例: ```makefile config %config: scripts_basic outputmakefile FORCE # 错误写法 ``` 这种语法在新版`make`中已被废弃,因为: 1. **语义模糊**:同时声明具体目标(`config`)和模式目标(`%config`)会导致规则优先级混乱 2. **兼容性差**:GNU make 4.x+ 严格分离隐式规则和显式规则 3. **维护困难**:混合规则难以调试和扩展[^3][^5] #### 解决方案 **首选方案:修改Makefile语法(推荐)** ```diff - config %config: scripts_basic outputmakefile FORCE + %config: scripts_basic outputmakefile FORCE # 正确写法 ``` 修改要点: 1. **删除具体目标**:移除规则左侧的具体目标名(如`config`) 2. **保留模式规则**:仅使用`%`通配符定义通用规则 3. **拆分独立规则**:若需特殊处理具体目标,单独声明: ```makefile %config: scripts_basic outputmakefile FORCE config: %config # 额外声明具体目标的依赖 ``` **备选方案:降级make工具** 当无法修改Makefile时(如第三方代码): ```bash wget ftp://ftp.gnu.org/gnu/make/make-3.81.tar.gz tar -xvf make-3.81.tar.gz cd make-3.81 ./configure make sudo make install # 安装旧版make[^5] ``` > **注意**:降级可能导致其他兼容性问题,仅作临时方案 #### 验证修改 使用`make -d`调试模式检查规则解析: ```bash make -d | grep "Considering target" # 查看规则匹配过程 ``` 正确输出应显示模式规则被独立应用,无混合规则警告[^3]。 #### 替代语法最佳实践 1. **分离关注点**: ```makefile # 模式规则 %.o: %.c $(CC) -c $< -o $@ # 显式规则 special.o: special.c defs.h $(CC) -c $< -DDEBUG -o $@ ``` 2. **静态模式规则**: ```makefile objects = main.o util.o $(objects): %.o: %.c # 针对特定文件集的模式规则 $(CC) -c $< -o $@ ``` 3. **双冒号规则**(多实现目标): ```makefile config:: scripts_basic @echo "Building config" config:: outputmakefile @echo "Finalizing config" ``` > **关键提示**:现代Makefile应遵循"一个规则仅包含一种目标类型"原则[^3][^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值