本文已参与「新人创作礼」活动,一起开启掘金创作之路。
powershell是windows下的命令程序外壳,类似linux的shell,两者的作用是相同的,但是本质相差很大。powershell的语法更类似高级语言,特性更多,但是shell使用起来更简便。
使用powershell
如果要在Makefile中使用shell命令,格式为:(shell pwd),用来获取当前路径。
此方法只有在Linux中有效,,在Windows下使用会出现错误,不过,GNU/make提供了指定shell的功能。例如,如果想要将CMD作为shell,可以这样:
SHELL=cmd
当然,使用方法也要稍微修改一下,比如获取当前路径,由于cmd中没有pwd命令,但可以使用:echo %cd%。所以要修改为:
$(shell echo %cd%)
但是如果要使用powershell,那就有问题了,make似乎不支持将shell直接修改为powershell,如果写了“SHELL=powershell”,执行时就会出错,比如“$(shell pwd)”,会有如下报错:
process_begin: CreateProcess(NULL, pwd, ...) failed.
make: Makefile:156: pipe: No such file or directory
这意味着传递给CreateProcess()函数的参数不正确。此函数的第一个参数为shell,第二个参数为命令,之后的参数为命令的参数。在错误中可以看到,shell时NULL,空的。
经过测试,要改成如下形式才能正常工作:
$(shell powershell pwd)
而且这样也不用指定shell了。但是有一个问题是,(shell echo %cd%)慢,或许是每次执行命令都需要创建一个新的powershell进程所致。尚未找到解决办法,如果需要cmd不支持的命令时可以考虑使用powershell。
使用powershell计算
由于Makefile本身没有计算能力,需要借助shell命令来实现。 例如:
TEST1=2
TEST2=($(TEST1)*20)
#make没有计算功能,因此TEST2=(2*20),而不是40,如果使用此定义的程序没有计算功能,就可能出错。
如果使用powershell,可以这样处理:
TEST1=2
TEST2=$(shell powershell $(TEST1)*20)
#这样,TEST2=40
powershell默认数值运算输出为10进制,如果要使用16进制,就需要进行转换:
TEST1=0x1234
TEST2=$(shell powershell (TEST1+0x1000).ToString(\'x\'))
#TEST2=2234
#输出带0x的16进制字符串
TEST3=$(shell powershell (\'0x\'+(TEST1+0x1000).ToString(\'x\')))
#记得引号要使用转义符,"'"=>"\'"。否则执行会出错