免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 725 | 回复: 0
打印 上一主题 下一主题

Makefile与Shell的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-21 19:52 |只看该作者 |倒序浏览
大概只要知道Makefile的人,都知道Makefile可以调用Shell脚本。但是在实际使用时,并不那么简单,一些模棱两可的地方可能会让你抓狂。你若不信,可以先看几个例子,想象一下这些这些例子会打印什么内容,记下你想象的结果,然后在计算机上运行这些例子,对照看一下。

   
        
            
            示例一:
            
        
        
            
            if [ "$(BUILD)" = "debug" ]; then  echo "build debug"; else echo "build release"; fi
            all:
                echo "done"
            
        
        
            
            示例二:
            
        
        
            
            all:
                @CC=arm-linux-gcc
                @echo $(CC)
            
        
        
            
            示例三:
            
        
        
            
            CC=arm-linux-gcc
            all:
                @echo $(CC)
            
        
        
            
            示例四:
            
        
        
            
            SUBDIR=src example
            all:
                @for subdir in $(SUBDIR); \
                do\
                    echo "building " $(subdir); \
                done
            
        
   


说明:
1.         Shell脚本在target里才有效,其它地方都被忽略掉了。所以示例一中,”build debug”之类的字符串根本打印不出来。示例一的正确写法是:
   
        
            
            示例一:
            
        
        
            
            all:
                if [ "$(BUILD)" = "debug" ]; then  echo "build debug"; else echo "build release"; fi
                echo "done"
            
        
   

2.         make把每一行Shell脚本当作一个独立的单元,它们在单独的进程中运行。示例二中,两行Shell脚本在两个莫不相干的进程里运行,第一个进程把CC设置为arm-linux-gcc,第二个进程是不知道的,所以打印的结果自然不是arm-linux-gcc了。示例二的正确写法是:
   
        
            
            示例二:
            
        
        
            
            all:
                @CC=arm-linux-gcc; echo $(CC)
            
        
        
            
            或者:
            
        
        
            
            all:
            @CC=arm-linux-gcc; \
            echo $(CC)
            
        
   

3.         make在调用Shell之前先进行预处理,即展开所有Makefile的变量和函数。这些变量和函数都以$开头。示例三中,Shell拿的脚本实际上是echo arm-linux-gcc,所以打印结果正确。

4.         make预处理时,所有以$开头的,它都不会放过。要想引用Shell自己的变量,应该以$$开头。另外要注意,Shell自己的变量是不需要括号的。示例四的正确写法是:
   
        
            
            示例四:
            
        
        
            
            SUBDIR=src example
            all:
                @for subdir in $(SUBDIR); \
                do\
                    echo "building " $$subdir; \
                done
            
        
   

               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/76848/showart_1838137.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP