Makefile中的wildcard和patsubst
睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接
makefile 里的函數跟它的變量很相似——使用的時候,你用一個 $ 符號跟開括號,函數名,空格后跟一列由逗號分隔的參數,最后用關括號結束。
例如,在 GNU Make 里有一個叫 'wildcard' 的函數,它有一個參數,功能是展開成一列所有符合由其參數描述的文件名,文件間以空格間隔。
你可以像下面所示使用這個命令:
SOURCES = $(wildcard *.c)
這行會產生一個所有以 '.c' 結尾的文件的列表,然后存入變量 SOURCES 里。當然你不需要一定要把結果存入一個變量。
另一個有用的函數是 patsubst ( patten substitude, 匹配替換的縮寫)函數。它需要3個參數——第一個是一個需要匹配的式樣,第二個表示用什么來替換它,第三個是一個需要被處理的由空格分隔的字列。例如,處理那個經過上面定義后的變量,
OBJS = $(patsubst %.c,%.o,$(SOURCES))
這行將處理所有在 SOURCES 字列中的字(一列文件名),如果它的結尾是 '.c' ,就用 '.o' 把 '.c'取代。注意這里的 % 符號將匹配一個或多個字符,而它每次所匹配的字串叫做一個‘柄’(stem) 。 在第二個參數里, %被解讀成用第一參數所匹配的那個柄。
例子:
include /usr/local/AFEPack/Make.global_options
source = $(wildcard *.cpp)
object = $(patsubst %.cpp, %.o, $(source))
LDFLAGS += -L/usr/local/AFEPack/library/lib -lAFEPack
all : main
%.o : %.cpp
$(CXX) -c -o $@ $< $(CXXFLAGS)
main : $(object)
$(CXX) -o $@ $(object) $(LDFLAGS) $(LIBS)
clean :
-rm -rf $(object)
-rm -rf main
-rm -f *.[nes]
-rm -f *.dx
.PHONY : default cleanRFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
SOURCES = $(wildcard *.c)
這行會產生一個所有以 '.c' 結尾的文件的列表,然后存入變量 SOURCES 里。當然你不需要一定要把結果存入一個變量。
另一個有用的函數是 patsubst ( patten substitude, 匹配替換的縮寫)函數。它需要3個參數——第一個是一個需要匹配的式樣,第二個表示用什么來替換它,第三個是一個需要被處理的由空格分隔的字列。例如,處理那個經過上面定義后的變量,
OBJS = $(patsubst %.c,%.o,$(SOURCES))
這行將處理所有在 SOURCES 字列中的字(一列文件名),如果它的結尾是 '.c' ,就用 '.o' 把 '.c'取代。注意這里的 % 符號將匹配一個或多個字符,而它每次所匹配的字串叫做一個‘柄’(stem) 。 在第二個參數里, %被解讀成用第一參數所匹配的那個柄。
例子:
include /usr/local/AFEPack/Make.global_options
source = $(wildcard *.cpp)
object = $(patsubst %.cpp, %.o, $(source))
LDFLAGS += -L/usr/local/AFEPack/library/lib -lAFEPack
all : main
%.o : %.cpp
$(CXX) -c -o $@ $< $(CXXFLAGS)
main : $(object)
$(CXX) -o $@ $(object) $(LDFLAGS) $(LIBS)
clean :
-rm -rf $(object)
-rm -rf main
-rm -f *.[nes]
-rm -f *.dx
.PHONY : default cleanRFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成