簡體   English   中英

Makefile不允許增量構建

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM