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\')))

#記得引號要使用轉義符,"'"=>"\'"。否則執行會出錯

 

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