makefile裡經常看到sed指令

2021-06-29 01:07:22 字數 2005 閱讀 7504

問題

這裡,我們給出了乙個模式規則來產生[.d]檔案: 

%.d: %.c 

@set -e; rm -f $@; \ 

$(cc) -m $(cppflags) $< >; $@.$$$$; \ 

sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ >; $@; \ 

rm -f $@.$$$$ 

這個規則的意思是,所有的[.d]檔案依賴於[.c]檔案,「rm -f $@」的意思是刪除所有的目標,也就是[.d]檔案,第二行的意思是,為每個依賴檔案「$<」,也就是[.c]檔案生成依賴檔案,「$@」表示模式「%.d」檔案,如果有乙個c檔案是name.c,那麼「%」就是「name」,「$$$$」意為乙個隨機編號,第二行生成的檔案有可能是「name.d.12345」,第三行使用sed命令做了乙個替換,關於sed命令的用法請參看相關的使用文件。第四行就是刪除臨時檔案。

上面**的解釋1:

%.d: %.c

$(cc) -m $(cppflags) $< > $@.$$$$; \

sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \

rm -f $@.$$$$

p-162:sed替換命令的格式是『s///g』如果沒有g,則sed的替換操作只對文字中的第一次出現的匹配模式進行替換。關於『s///』命令的另乙個注意點是『/』分隔符有許多替換選項。如果正在執行字串替換,並且規則表示式或替換字串中有許多斜槓,則可以通過在』s』之後指定乙個不同的字元來更改分隔符。例如,下列將把所有出現的/usr/local替換成/usr:

sed –e 『s:/usr/local:/usr:g』 mylist.txt

在該例中,使用冒號作為分隔符。如果需要在規則表示式中使用分隔符,可以在它前面加入反斜槓。關於\(\)是保留的模式空間,參見p-70,$* 是makefile中匹配的「莖」,$$$$表示當前程序的程序號,命令列中還運用了輸入輸出重定向。

上面**的解釋2:

這是sed命令的用法了。stream editor

簡單來講就是替換。這裡採用逗號作為基本語法的分隔。一般的形式是sed 's/pattern/new/g'

\($*\)\.o[ :]*替換為\1.o $@ :

後面的g表示全域性替換,就是不止替換一次。

同時又是用在makefile當中,所以要牽扯到$*,$@之類的自動變數。

$*,表示的是target的除去了suffix後的filename,也就是%.d: %.c當中的%部分。

$@,表示的是target,也就是%.d

sed操作的檔案是來自上面命令的生成的臨時檔案$@.$$$$

最後再把sed的輸出定向到零時檔案$@.$$$$

後面的\都是為了和下面的命令連成一行,然後都用用;分隔,所以都是放在乙個subshell當中執行。

沒有猜錯的話,這應該是manage project with gnu make 3rd edition當中的例子。

sed命令例子

在makefile裡經常看到sed指令,經常看到替換功能,今天寫了個makefile來學習下sed的替換功能,makefile如下:

[cpp]view plain

copy

test = abcdefghisdabcjsdlfkj  

test2 = $(test) | sed -e 's/abc/123/g'

debug:  

@echo $(test)  

@echo $(test2)  

然後輸入make debug,看到如下輸入:

[html]view plain

copy

abcdefghisdabcjsdlfkj  

123defghisd123jsdlfkj  

abc被替換成了123,如果不加字母g,結果就變成了只有第乙個abc被替換,另外可以在複雜的makefile裡使用echo指令來顯示一些變數,有助學習makefile

一 Makefile裡有什麼?

makefile裡主要包含了五個東西 顯式規則 隱晦規則 變數定義 檔案指示和注釋。1 顯式規則。顯式規則說明了,如何生成乙個或多的的目標檔案。這是由makefile的書寫者明顯指出,要生成的檔案,檔案的依賴檔案,生成的命令。2 隱晦規則。由於我們的make有自動推導的功能,所以隱晦的規則可以讓我們...

Makefile裡的sed指令

在makefile裡經常看到sed指令,經常看到替換功能,今天寫了個makefile來學習下sed的替換功能,makefile如下 test abcdefghisdabcjsdlfkj test2 test sed e s abc 123 g debug echo test echo test2 然...

Makefile裡呼叫Shell注意點

大家經常編寫和使用makefile,makefile裡面也經常用到shell,但對其中一些需要注意的地方未必 會去留意,這裡列出幾個來,不知是否對大家有用。1.注意makefile的變數和shell變數,看如下示例 dirs src bin lib all for i in dirs do echo...