免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4305 | 回复: 4

学习中遇到一个make中的问题:Makefile‘混和的隐含和普通规则’ [复制链接]

论坛徽章:
0
发表于 2012-01-13 18:03 |显示全部楼层
开始学习LINUX下的环境编程了,所以把系统也换了,换成了“Fedora 16”,运行速度还蛮快的。但是我遇到了一些关于:Makefile‘混和的隐含和普通规则’错误的问题,写到下面,老大们帮看看,这到底是些什么意思的错误?


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

   make时的错误如下:
-----------------------------------------------------------------
make[1]: 进入目录“/work/SDK3050_old/source/vendors”
Makefile:28: *** 混和的隐含和普通规则。 停止。
make[1]: 离开目录“/work/SDK3050_old/source/vendors”
make: *** [romfs.subdirs] 错误 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了,学到了很多东西。有讲“%”,但这里的这个错误,要怎么去理解呢?
谢谢

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
发表于 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 $@
试试呢?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
发表于 2012-01-15 03:13 |显示全部楼层
%是通配符,匹配任意字符串

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
发表于 2012-01-16 10:38 |显示全部楼层
我遇到过这种错误,这是因为旧的make不支持将普通规则和隐含规则放在一起使用。将它们拆分开就可以了。

论坛徽章:
0
发表于 2012-02-02 18:04 |显示全部楼层
新年快乐!
谢谢老大!我后来好像明白了,按老大说的那样直接拆开就好了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP