一、filter-out:什麼是filter-out
在makefile中,filter-out函數是過濾掉一個列表中的某些元素。
filter-out函數的語法為:
$(filter-out pattern…,text)
其中,pattern為要過濾掉的模式,text為要過濾的文本。filter-out函數返回的是從text中過濾掉了包含pattern的元素之後得到的結果。
二、filter-out:如何使用filter-out
filter-out函數可以配合其他函數使用,比如wildcard函數、patsubst函數等。以下是一個例子:
SOURCES := $(wildcard src/*.cpp)
OBJECTS := $(patsubst src/%.cpp,obj/%.o,$(SOURCES))
TARGET := main
$(TARGET): $(filter-out obj/main.o,$(OBJECTS))
$(CC) $^ -o $@
在這個例子中,SOURCES表示所有src目錄下的.cpp文件,OBJECTS表示把所有SOURCES的.cpp文件生成對應的.o文件,TARGET表示最終的可執行文件。$(filter-out obj/main.o,$(OBJECTS))表示從OBJECTS中排除obj/main.o文件。
三、filter-out:常見用途
1. 同時編譯多個可執行文件
在一個項目中,可能會有多個可執行文件,那麼我們就需要構建多個目標,使用filter-out可以方便的過濾掉指定的目標文件。
EXECUTABLES := foo bar baz main
TARGETS := $(filter-out main,$(EXECUTABLES))
all: $(TARGETS) # 編譯 targets
$(TARGETS): %: %.c
$(CC) $^ -o $@
在這個例子中,我們有四個可執行文件,分別是foo、bar、baz和main。我們使用TARGETS變量來存儲需要編譯的目標,使用filter-out函數來過濾掉main目標。最終使用all來編譯TARGETS目標。
2. 排除依賴文件
在makefile中,TARGET: prerequisites規則表示TARGET目標依賴於prerequisites中的文件。使用filter-out函數可以方便的排除某些依賴文件。
TARGET := main
PREREQUISITES := foo.o bar.o main.o
OBJECTS := $(filter-out main.o,$(PREREQUISITES))
$(TARGET): $(OBJECTS)
$(CC) $^ -o $@
在這個例子中,我們定義了TARGET和PREREQUISITES兩個變量,表示目標和所有依賴項,OBJECTS表示從所有依賴項中排除main.o的目標物件。最終使用$(CC)命令把OBJECTS鏈接成可執行文件。
3. 過濾掉系統環境變量
有時候在makefile中需要過濾掉系統環境變量,這時候,可以使用filter-out函數。
SYSTEM_ENV := HOME PATH TERM
VARS := $(filter-out $(SYSTEM_ENV),$(.VARIABLES))
$(info $(VARS))
在這個例子中,我們使用$(.VARIABLES)來獲取makefile中的所有變量,使用filter-out函數過濾掉SYSTEM_ENV中的變量。最終使用$(info)函數把過濾結果輸出到終端。
四、filter-out:小結
filter-out函數是makefile的一個重要函數,可以配合其他函數使用,比如wildcard函數、patsubst函數等。它的常見用途包括同時編譯多個可執行文件、排除依賴文件和過濾掉系統環境變量等。學會使用filter-out函數,可以更加方便的進行makefile的編寫。
原創文章,作者:VYPXN,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/368644.html