[英]Makefile doesn't permit incremental build
我有一個示例項目的makefile,不幸的是,當項目中的任何單個文件發生更改時,它會強制重新構建。 我對makefile沒有很多經驗,所以我不知道如何解決這個問題。
makefile定義要編譯為單個變量SRCS
的文件,如下所示。 當然,這個列表中有大約40個文件,在很多不同的目錄中。
SRCS = \
../../src/file1.c \
../../src/file2.c
然后,它定義了從每個.c
文件生成的每個.o
文件的構建規則。
$(OBJ_PATH)/%.o: $(SRCS)
$(CC) $(FLAGS) $(filter %/$(subst .o,.c,$(notdir $@)), $(SRCS)) -o $@
根據make運行-d
選項,當單個.c
文件發生更改時,必須再次編譯所有目標文件,因為$(SRCS)
被定義為上面的依賴項。
如何更改此設置,如果單個文件只更改1 .o
文件必須再次編譯?
你的食譜是由熟悉makefile的人寫的; 這幾乎是正確的。 一個更正是將$(filter)
語句移動到先決條件行。 在這種情況下,這就是它需要的地方。
一旦它存在,您需要進行一些額外的調整,您可以在手冊中閱讀。 所以,像這樣:
PERCENT := %
.SECONDEXPANSION:
$(OBJ_PATH)/%.o: $$(filter $$(PERCENT)/$$(subst .o,.c,$$(notdir $$@)), $(SRCS))
$(CC) $(FLAGS) $< -o $@
像這樣的東西也會起作用。
SRCS = \
../../src/file1.c \
../../src/file2.c
# Set prerequisites for each output .o file from the matching .c file
$(foreach src,$(SRCS),$(eval $(OBJ_PATH)/$(notdir $(src:.c=.o)): $(src)))
# Create pattern rule with no additional prerequisites.
$(OBJ_PATH)/%.o:
$(CC) $(FLAGS) $< -o $@
所以在我看來,在某種意義上,更微小的改變將是:
$(OBJ_PATH)/%.o: $(SRCS)
file='$(filter %/$(subst .o,.c,$(notdir $@)), $?)'; [ "$$file" ] && \
$(CC) $(FLAGS) "$$file" -o $@
另一種解決方案是使用vpath
。 示例代碼:
OBJ_PATH := build
SRCS := \
src/foodir/foo.c \
src/bardir/bar.c
OBJS := $(addprefix $(OBJ_PATH)/,$(notdir $(SRCS:%.c=%.o)))
vpath %.c $(dir $(SRCS))
all: $(OBJS)
$(OBJ_PATH)/%.o: %.c
$(CC) $(FLAGS) $< -o $@
通常在Makefile中,您不會將特定的.c文件作為依賴項。
通常,您將.o文件列為主可執行文件的依賴項。
Make有內部規則來確定如何從.c文件構建.o文件,您可以使用自己的特殊規則覆蓋它們,或者通常只需更改一些配置變量就足夠了。
關於make的完整教程比我在這個框中輸入要長,但是有很多可用的快速網絡搜索。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.