我有一个很大的Makefile,基本上可以随心所欲地工作
问题:我遇到的问题是,makefile只检查第一个.o
是否需要更新,而不检查其他是否需要更新。我不确定我的makefile的哪个部分出错了。
上下文:我有这样的项目结构:
quendor
src
main.c
options.c
quendor.h
Makefile
当我的Makefile构建时,它构建了一个build
目录,如下所示:
quendor
build
src
main.d
main.o
options.d
options.o
src
main.c
options.c
quendor.h
Makefile
查看问题:现在假设我不更改main.c
,但更改了options.c
文件。在这种情况下,当我再次运行make时,我得到的是:
make: 'build/./src/main.o' is up to date.
我不确定这是否是因为它正在构建到build/src
目录中,而不仅仅是我想要的build
。
这是完整的Makefile,我把它包括在内,只是因为我不确定什么可能是问题,我不想做出不必要的假设。
.PHONY : all clean
NAME := quendor
PLATFORM := windows
CC := gcc
LINK := gcc
BUILD_DIR ?= ./build
SRC_DIR ?= ./src
ifeq ($(PLATFORM), windows)
TARGET ?= quendor.exe
else
TARGET ?= quendor
endif
ifeq ($(CC), gcc)
CFLAGS += -std=c11 -Wall -Wextra -Wpedantic -Wconversion -Wmissing-prototypes -Wshadow -MMD -MP
LDFLAGS +=
OPT +=
endif
SRCS := $(wildcard $(SRC_DIR)/*.c)
OBJS := $(SRCS:%.c=$(BUILD_DIR)/%.o)
DEPS := $(OBJS:%.o=%.d)
MKDIR_P ?= @mkdir -p $(dir $@)
-include $(DEPS)
all : $(TARGET)
@echo "Building $(TARGET)"
$(TARGET) : $(OBJS)
$(LINK) $(OPT) -o $@ $^ $(LDFLAGS)
$(BUILD_DIR)/%.o : %.c
$(MKDIR_P)
$(CC) $(CFLAGS) -c $< -o $@
clean:
$(RM) $(TARGET) -r $(BUILD_DIR)
这可能是StackOverflow如何解析我的Makfile的一个工件,但我确实注意到它在这一行之后显示了不同的语法突出显示:
SRCS := $(wildcard $(SRC_DIR)/*.c)
问题是,在定义all
规则之前,您要包含依赖项:
-include $(DEPS)
all : $(TARGET)
如果您没有在命令行上指定要构建的特定目标(例如,如果您没有运行make all
(,那么make会选择makefile中的第一个显式目标(以及任何包含的makefile!!(作为要构建的目标。
我假设$(DEPS)
变量中的依赖项定义将main.o
定义为目标,因为它位于all
之前,所以它是默认情况下唯一运行的东西。
稍后在makefile中移动-include
语句(我通常将这些语句都放在makefile的末尾(,它就会起作用。