一、makefilefilter-out的概述
makefilefilter-out是GNU Makefile中的一個函數,可以用來過濾掉指定的字元串。
該函數的基本語法如下:
$(filter-out pattern...,text)
其中,pattern為需要過濾掉的模式,可以是單個字元串或者模式匹配規則;text則是需要被過濾的字元串。
下面我們通過多個方面來詳細了解該函數。
二、使用makefilefilter-out實現排除指定文件
對於一個項目,可能會有多個相關的文件,但是我們在進行編譯時,並不需要編譯所有的文件。此時可以使用makefilefilter-out函數來排除不需要編譯的文件。
下面展示一個很簡單的示例:
FILES = foo.c bar.c baz.c SRCS = $(filter-out bar.c,$(FILES)) OBJS = $(SRCS:.c=.o) program: $(OBJS) $(CC) $(LDFLAGS) -o $@ $^
以上代碼會編譯除bar.c之外的所有c文件,將其鏈接成可執行文件。
三、使用makefilefilter-out實現根據CPU類型編譯不同的源代碼
在不同的CPU環境下,可能需要編譯不同的源代碼,這時可以使用makefilefilter-out函數來進行判斷和處理。
下面展示一個簡單的例子:
ifeq ($(CPU_TYPE),arm) SOURCES := $(wildcard src/*.c) SOURCES := $(filter-out src/x86/*.c,$(SOURCES)) else SOURCES := $(wildcard src/*.c) SOURCES := $(filter-out src/arm/*.c,$(SOURCES)) endif all: $(SOURCES) $(CC) $(CFLAGS) -o program $^
以上代碼在CPU_TYPE等於arm時,就會排除掉src/x86目錄下的所有c文件;否則,就排除掉src/arm目錄下的所有c文件。
四、使用makefilefilter-out實現在指定平台下使用指定編譯器
在多個平台環境下,可能需要使用不同的編譯器進行編譯,這時可以使用makefilefilter-out函數進行處理。
下面是一個例子:
ifeq ($(TARGET_OS),Windows) CC := gcc CFLAGS := -Wall -O2 LDFLAGS := -lws2_32 else CC := clang CFLAGS := -Wall -O2 LDFLAGS := -lpthread endif SOURCES := $(wildcard src/*.c) SOURCES := $(filter-out src/utils.c,$(SOURCES)) all: $(SOURCES) $(CC) $(CFLAGS) -o program $^ $(LDFLAGS)
以上代碼在TARGET_OS為Windows時,會使用gcc編譯器進行編譯,並且鏈接ws2_32庫;否則會使用clang編譯器進行編譯,並且鏈接pthread庫。
另外,該代碼中使用了makefilefilter-out函數,將src/utils.c從SOURCES中排除。
五、使用makefilefilter-out實現在編譯時排除指定的頭文件
在編譯時,可能需要排除指定的頭文件,這時候可以使用makefilefilter-out函數來處理。
下面是一個例子:
HEADERS = main.h foo.h bar.h baz.h SOURCES = main.c foo.c bar.c baz.c all: $(SOURCES) $(CC) $(CFLAGS) -o program $^ ifdef NO_BAZ SOURCES := $(filter-out baz.c,$(SOURCES)) else ifdef NO_FOO SOURCES := $(filter-out foo.c,$(SOURCES)) endif endif .PHONY: clean clean: rm -f program
以上代碼排除指定的頭文件,是通過指定NO_BAZ或者NO_FOO來實現的。
六、小結
makefilefilter-out函數是GNU Makefile中非常實用的函數之一,可以用於過濾指定的字元串,應用場景十分廣泛。通過具體的例子,我們了解了makefilefilter-out在不同場景下的應用,這些例子可以作為學習和使用該函數的參考。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/182307.html