微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > 微电子学习交流 > 请教一个关于makefile的问题

请教一个关于makefile的问题

时间:12-12 整理:3721RD 点击:
我的shell环境是tcshell, make版本是gmake 3.80
我把问题简化了一下,用一些简短的代码表示如下:
一开始我的的makefile内容为:
all :
    @set hi = Hello; \
        echo $${hi} ; \
        echo # "Hello, china!" ; \
        echo "Hello world!"  
当我执行make all命令是,运行结果为空。 这个可以理解, #后都是注释,而且由于\作为连行符,最后一行也是注释
然后我在第一行增加一行代码
export SHELL = /bin/tcsh -f
那么,makefile的运行结果会变成
Hello
# Hello, china!
Hello world!
也就是说此时#不再起到注释的作用,最后一行也被执行了
我困惑的地方就是,第一行的export SHELL= /bin/tcsh -f 起了什么作用呢?毕竟我terminal的shell环境本来就是tcsh的,这一行也没有改变什么东西啊。 加上这个东西之后,为什么 # 就直接被输出而不是作为注释了?
上网搜了一下,也没有看到毕竟靠谱的解答,求大侠赐教一下。谢谢了。
===========================================================
更新, 来自第5楼:
谢谢你们的回复。真的是shell选择的问题。
我也试了一下,3.81和3.80的输出是有些不同。但是,为什么shell的选择,会导致这样的输出,我还是有些不解。  
为了测试shell选择的影响,我重新做了这个试验, 因为不在公司,这次是在自己电脑上用make3.81做的,步骤如下:
总三个文件:
第一个文件: makefile bash版本:
all :  
      @set hi = Hello; \  
          echo $${hi} ; \  
          echo # "Hello, china!" ; \  
          echo "Hello world!"    
第二个文件, makefile tc shell 版本:
   1 export SHELL = /bin/tcsh -f
   2  
   3 all :
   4     @set hi = Hello; \
   5         echo $${hi} ; \
   6         echo # "Hello, china!" ; \
   7         echo "Hello world!"
第三个文件, shell脚本,用于测试tc shell 和 bash直接运行结果。
set hi = Hello ; \
     echo ${hi} ; \
     echo # "hello world!" ; \
     echo "hello China!"
  
第一个文件运行结果给make3.80的运行结果不一样,为:
  
  
Hello world!
即两个空行,第三行为 Hello world!
第二个文件运行结果仍为:
Hello
# Hello, china!
Hello world!
  
第三个文件,我分别使用bash和tc shell 运行,运行平台为ubuntu 12.04LTS, bash版本为4.2.25,tcsh版本为 6.17.06
使用bash运行结果与第一个文件的运行结果相同,即为两个空行,加一行Hello world!
第三个文件使用tc shell运行时, 我使用的命令为 /bin/tcsh -f test.sh (test.sh为第三个文件的名字),运行结果为:
Hello
echo hello China!
运行结果与第二个文件的运行结果并不相同。
  
所以现在我的困惑的现象就是:
第二个文件运行时为什么会输出 # Hello, China! 这一行呢?
如果这一行是gmake解析输出的,那么第一个文件为什么没有输出?如果是因为tc shell 输出的,那么使用tc shell运行第三个文件时,也没有这个输出啊。
还有一个困惑的现象就是第三个文件使用tc shell运行时,输出含有 echo 这个单词。
  
我猜测这些现象的产生,可能是因为gmake,tc shell和bash对注释符和联行符的解释是不同的,但是具体如何不同,我就不太清楚了,期望能够得到一些解答,谢谢~

export SHELL = /bin/tcsh -f    
把-f去掉看看是啥结果?........

因为makefile默认的shell不是tcsh,而是sh/bash;
你可以用 make -n -p > x 来看看 SHELL的默认设置。

make的默认shell是/bin/sh,后面设了SHELL变量以后才是tcsh,

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top