rt5350 发表于 2012-01-13 18:03

学习中遇到一个make中的问题:Makefile‘混和的隐含和普通规则’

开始学习LINUX下的环境编程了,所以把系统也换了,换成了“Fedora 16”,运行速度还蛮快的。但是我遇到了一些关于:Makefile‘混和的隐含和普通规则’错误的问题,写到下面,老大们帮看看,这到底是些什么意思的错误?


   关于其中的 “%” 版主能说明下下面的意思么。

   make时的错误如下:
-----------------------------------------------------------------
make: 进入目录“/work/SDK3050_old/source/vendors”
Makefile:28: *** 混和的隐含和普通规则。 停止。
make: 离开目录“/work/SDK3050_old/source/vendors”
make: *** 错误 1
-----------------------------------------------------------------
   下面我找到源代码处:
***************************************************************
# Note: the all and clean targets are not normally used,
# since user/Makefile jumps directory to the product directory
all image clean romfs romfs.post vendor_%:
        $(MAKE) -C $(dir_v) dir_v=$(dir_v) -f $(VEND)/vendors-common.mak $@

上面这个“all ...... vendor_%:” 就是错误中说的第 28 行。问题就出在“vendor_%”
***************************************************************
    不知道如何去修改,说是不兼容老的makefile语法。


   下面还有一个类似的错误:下面是源makefile
***************************************************************
.PHONY: linux
linux linux%_only: ====> make 中提示错误的就是在这里。
        @if [ $(LINUXDIR) = linux-2.4.x -a ! -f $(LINUXDIR)/.depend ] ; then \
                echo "ERROR: you need to do a 'make dep' first" ; \
                exit 1 ; \
        fi
        $(MAKEARCH_KERNEL) -j$(HOST_NCPU) -C $(LINUXDIR) $(LINUXTARGET) || exit 1
        if [ -f $(LINUXDIR)/vmlinux ]; then \
                ln -f $(LINUXDIR)/vmlinux $(LINUXDIR)/linux ; \
        fi
***************************************************************


    网上还有两处这样的错误解决方法:
============================================================================
工作环境: fedora14
目标平台:s3c2440
开发包内核源码目录:/home/linux-2.6.24-5801

开发包内核版本:2.6.24
交叉编译工具:gcc-3.4.1
用gcc-3.4.6交叉编译3210内核,执行make命令,会提示"*** 混和的隐含和普通规则。 停止。"的错误。这是由于fedora14的Make工具对低版本内核Makefile一些旧的规则兼容不是很好,只需要修改一下开发包内核原码里的Makefile。对文件/home/linux_3210/Makefile修改如下:
把:
/ %/: prepare scripts FORCE
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
    $(build)=$(build-dir)
改成:
/: prepare scripts FORCE
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
    $(build)=$(build-dir)
%/: prepare scripts FORCE
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
    $(build)=$(build-dir)
把:
config %config: scripts_basic outputmakefile FORCE
    $(Q)mkdir -p include/linux include/config
    $(Q)$(MAKE) $(build)=scripts/kconfig $@
改成:
config: scripts_basic outputmakefile FORCE
    $(Q)mkdir -p include/linux include/config
    $(Q)$(MAKE) $(build)=scripts/kconfig $@
%config: scripts_basic outputmakefile FORCE
    $(Q)mkdir -p include/linux include/config
    $(Q)$(MAKE) $(build)=scripts/kconfig $@
=====================================================================

我进在看版主的LINUX系统下C编程,其中讲到Makefile了,学到了很多东西。有讲“%”,但这里的这个错误,要怎么去理解呢?
谢谢:)

cjaizss 发表于 2012-01-13 19:28

安装一个新版本的make呢?
或者
all image clean romfs romfs.post vendor_%:
      $(MAKE) -C $(dir_v) dir_v=$(dir_v) -f $(VEND)/vendors-common.mak $@
=>
all image clean romfs romfs.post :
      $(MAKE) -C $(dir_v) dir_v=$(dir_v) -f $(VEND)/vendors-common.mak $@
vendor_%:
      $(MAKE) -C $(dir_v) dir_v=$(dir_v) -f $(VEND)/vendors-common.mak $@
试试呢?

cjaizss 发表于 2012-01-15 03:13

%是通配符,匹配任意字符串

EricFisher 发表于 2012-01-16 10:38

我遇到过这种错误,这是因为旧的make不支持将普通规则和隐含规则放在一起使用。将它们拆分开就可以了。

rt5350 发表于 2012-02-02 18:04

新年快乐!
谢谢老大!我后来好像明白了,按老大说的那样直接拆开就好了。
页: [1]
查看完整版本: 学习中遇到一个make中的问题:Makefile‘混和的隐含和普通规则’