makefile中使用powershell && 使用powershell进行数学计算

在makefile中使用shell命令,格式为:$(shell 命令)。例如:$(shell pwd),用来获取当前路径。

但是只有在Linux下直接使用有效,在Windows下使用会出现错误,不过,GNU/make提供了指定shell的功能。例如,如果想要将cmd作为shell,可以这样:

SHELL=cmd

当然,使用方法也要稍微修改一下,比如获取当前路径,由于cmd中没有pwd命令,但可以使用:echo %cd%。所以要修改为:

$(shell echo %cd%)

我不知道是bug还是我的用法有错误,make似乎不支持将shell修改为powershell,如果设置了“SHELL=powershell”,在使用$(shell pwd)时会出现如下错误:

process_begin: CreateProcess(NULL, pwd, ...) failed.
make: Makefile:156: pipe: No such file or directory

这意味着传递给CreateProcess()函数的参数不正确。此函数的第一个参数为程序,第二个参数为命令。在在错误中可以看到,程序变成了NULL,使得CreateProcess()不知道创建什么进程。要改成如下形式才能正常工作:$(shell powershell pwd),而且这样也不用指定shell了。但是有一个问题是,$(shell powershell pwd)明显要比指定了cmd后使用$(shell echo %cd%)慢,或许是每次执行命令都需要创建一个新的powershell进程所致。我暂时不知道怎么解决,因此只能在cmd不支持的命令时用powershell。

make本事没有计算的功能,需要调用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\')))

#记得引号要使用转义符,"'"=>"\'"。否则执行会出错

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章