5190|10

61

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

Makefile语法小问题 [复制链接]

嵌入式U-boot的Makefile中有这么一句
smdk2410_config        :        unconfig
        @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0

课本解释
$(@:_config=)的结果就是去掉smdk2410 _config中的_config
所以执行make smdk2410 _config实际就是执行
./mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0

课本只是说了结果,问题是怎么搞的
@$是怎么什么语法

最新回复

var:a=b的意思是把var变量的后部的a部分替换成b 例如 var=xxxxa 这里运算后把a替换成b 这样就是xxxxb了 这个例子里面@代表smdk2410_config 就是var=smdk2410_config (var:_config=) 这里var后面的_config被替换成=后面的 后面什么都没有就是 空 把@理解成这里的var吧 否则老感觉要先跟$合在一起  详情 回复 发表于 2010-5-13 18:35
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你理解错了,第一个@是抑制输出符号,$(MKCONFIG)是变量MKCONFIG 的引用,
$(@:_config=),这个我没有用过,但$@表示当前目标也就是smdk2410_config,从效果看就和substr的作用一样
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 foxxml 的回复:
你理解错了,第一个@是抑制输出符号,$(MKCONFIG)是变量MKCONFIG 的引用,
$(@:_config=),这个我没有用过,但$@表示当前目标也就是smdk2410_config,从效果看就和substr的作用一样

哦!!!太感谢了,茅塞顿开了一半!!!

这些代码就是uboot源码里面的,应该没有什么错误
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 
MARK,学习啦。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 
mark
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

6
 
看完这个帖我也茅塞顿开

有例子就是好,看书都看到晕晕的.
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 anjie4402211 的回复:

看完这个帖我也茅塞顿开

有例子就是好,看书都看到晕晕的.


那你看明白我没有开的那半茅塞了吗?
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

8
 
在网上搜搜很多解释的,第一开始搜索错关键字了!
改改放在这大家一起学习吧!


smdk2410_config : unconfig

#这里目标是smdk2410_config也就是定义变量@的值  即$@=smdk2410_config
#(smdk2410_config:_config=)运算结果是smdk2410
#根据第一行变量定义可以知道$(@:_config=)=smdk2410

@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0

第一个@表示不回显,即该命令并不直接出现在console中,而只是执行过程出现在console里
第二个
1.@并不是单独的,而是和$一起构成$@,表示目标(smdk2410_config),在这里的意思就是$@=smdk2410_config,可以把@看成变量名
2.var:a=b的意思是把var中的a用b替换(这个朋友解释不太准确,不是var中应该是var最后,参看下面的manual),这样就很清楚了,$(@:_config=)等价于(smdk2410_config:_config=),很显然这是要把smdk2410_config转变为smdk2410

也就是第二个用了两个语法,这里把GUN make的manual贴出来,大家看看吧,还是不熟啊!

1.
10.5.3 Automatic Variables

Suppose you are writing a pattern rule to compile a `.c' file into a `.o' file: how do you write the `cc' command so that it operates on the right source file name? You cannot write the name in the command, because the name is different each time the implicit rule is applied.

What you do is use a special feature of make, the automatic variables. These variables have values computed afresh for each rule that is executed, based on the target and prerequisites of the rule. In this example, you would use `$@' for the object file name and `$<' for the source file name.

It's very important that you recognize the limited scope in which automatic variable values are available: they only have values within the command script. In particular, you cannot use them anywhere within the target list of a rule; they have no value there and will expand to the empty string. Also, they cannot be accessed directly within the prerequisite list of a rule. A common mistake is attempting to use $@ within the prerequisites list; this will not work. However, there is a special feature of GNU make, secondary expansion (see Secondary Expansion), which will allow automatic variable values to be used in prerequisite lists.

Here is a table of automatic variables:

$@
    The file name of the target of the rule. If the target is an archive member, then `$@' is the name of the archive file. In a pattern rule that has multiple targets (see Introduction to Pattern Rules), `$@' is the name of whichever target caused the rule's commands to be run.
2.
6.3.1 Substitution References

A substitution reference substitutes the value of a variable with alterations that you specify. It has the form `$(var:a=b)' (or `${var:a=b}') and its meaning is to take the value of the variable var, replace every a at the end of a word with b in that value, and substitute the resulting string.

When we say “at the end of a word”, we mean that a must appear either followed by whitespace or at the end of the value in order to be replaced; other occurrences of a in the value are unaltered. For example:

     foo := a.o b.o c.o
     bar := $(foo:.o=.c)

sets `bar' to `a.c b.c c.c'. See Setting Variables.

A substitution reference is actually an abbreviation for use of the patsubst expansion function (see Functions for String Substitution and Analysis). We provide substitution references as well as patsubst for compatibility with other implementations of make.

Another type of substitution reference lets you use the full power of the patsubst function. It has the same form `$(var:a=b)' described above, except that now a must contain a single `%' character. This case is equivalent to `$(patsubst a,b,$(var))'. See Functions for String Substitution and Analysis, for a description of the patsubst function.


For example:

     
     foo := a.o b.o c.o
     bar := $(foo:%.o=%.c)

sets `bar' to `a.c b.c c.c'.
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

9
 
对不起在这里面例如
$@=smdk2410_config
$(@:_config=)=smdk2410
用符号不够规范 这里的“=”想表示“为”的意思
应该写成“==”
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

10
 
#(smdk2410_config:_config=)运算结果是smdk2410

$@=smdk2410_config
$(@:_config=)应该$0啊
????
还是不懂啊

 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 9 楼 cd4514 的回复:
#(smdk2410_config:_config=)运算结果是smdk2410

$@=smdk2410_config
$(@:_config=)应该$0啊
????
还是不懂啊


var:a=b的意思是把var变量的后部的a部分替换成b
例如 var=xxxxa 这里运算后把a替换成b 这样就是xxxxb了

这个例子里面@代表smdk2410_config
就是var=smdk2410_config
(var:_config=)
这里var后面的_config被替换成=后面的 后面什么都没有就是 空

把@理解成这里的var吧
否则老感觉要先跟$合在一起
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

开源项目 更多>>
    查找数据手册?

    EEWorld Datasheet 技术支持

    相关文章 更多>>
    关闭
    站长推荐上一条 1/7 下一条

     
    EEWorld订阅号

     
    EEWorld服务号

     
    汽车开发圈

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表