菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
494
0

makefle-2

原创
05/13 14:22
阅读数 29381

一、变量的定义可能出现的地方只有两种
1、makefile全局变量:一定在target外部
2、出现在target内的shell内部的变量

3、target内部:
3.1:如果是makefile中的关键字语法,前面一定不能出现tab,否则会当成命令处理。
3.2:target内部若用的时shell的语法命令,必然会以tab开始。

举例:
all:
@if [ "debug" = "debug" ];
then
TV3=test3_yes;
echo $$TV3;
else
TV3=test3_no;
fi

TV3=MYTV
all:
@if [ "debug" = "debug" ];
then
TV3=test3_yes;
echo $$TV3;
echo $(TV3); \ #引用的是makefile中的变量
else
TV3=test3_no;
fi

all:
@for i in 1 2 3;
do
echo "building " $$i;
done
@echo "finall"

知识点1:
makefile会将上述内嵌的shell脚本当作一个独立的单元,它们在单独的进程中运行。里边定义的变量,只能在这个shell单独进程进行局部使用。
知识点2:
Shell进程使用自己的变量,应该以$$开头,且自己的变量是不需要括号。
shell进程内也可以引用全局的makefile变量。
知识点3:
Shell脚本在target里才有效,其它地方都被忽略掉了。target外可以用$(shell 语句)方式 ,如:$(PWD)

//makefile中语法关键字+tab(make时直接报错,语法错误)
all:
ifeq (1,1)
@echo "123"
endif

//不加空格(make时不会报错,但不会识别出这是一个shell脚本执行命令(也可以叫执行程序),将不会开启一个shll进程去执行程序,所以什么事情都不会做)
all:
@if [ "debug" = "debug" ];
then
TV3=test3_yes;
echo $$TV3;
else
TV3=test3_no;
fi

//每一条shell脚本都是一个独立的进程,进程间变量不共享
all:
@if [ "debug" = "debug" ];
then
TV3=test3_yes;
echo $$TV3;
else
TV3=test3_no;
fi
echo $$TV3

重点解析:echo $$TV3
执行结果:echo $TV3 + 换行

makefile执行顺序:
1、先将$$TV3 执行一次扩展,第一个$指的时引用变量,后面的$TV3指的是变量,此时回输出:echo $TV3
2、扩展后得到的echo $TV3又被shell解析,此时由于V3在makefile中并没有定义此变量,所以会输出换行。

4、命令前@符号问题

如果不添加@,会将shell命令打印出来。

echo $(KVAL)       
@echo $(LIBS)           //不会把shell本身的命令echo打印出来。

if前已经有了@,及时内部的echo没有@打印时也不会将命令本身打印出来。
all:
@if [ "debug" = "debug" ];
then
TV3=test3_yes;
echo $$TV3;
else
TV3=test3_no;
fi

总结:
上述的shll命令体现了:if then 、 for i in、makefile语法则有ifeq
shll脚本单条语句有;号,以""进行连接。makefile自身语法执行上不加;号。

参考文档:
https://www.cnblogs.com/LiuYanYGZ/p/5438441.html

https://blog.csdn.net/qq_34369618/article/details/52973720

发表评论

0/200
494 点赞
0 评论
收藏