尝试执行默认目标时,只会执行setup
和o1
目标。剩下的目标没有执行,我不明白为什么。
另一个潜在的线索:make总是会重新编译,而不是make不需要做任何事情。
如果创建了目录,则可以成功完成o1
o2
o3
或os
目标。
# tail call test Makefile
# written by mwolf
SRC= tco recurs iter
OBJS= $(SRC:=.o)
ASMS= $(SRC:=.s)
SRC_DIR= src
OUT_DIRS= o1 o2 o3 os
CC=gcc
INCLUDE= -I.
EXECUTABLE=
WARNINGS= -Wall -Wextra -Wfloat-equal -Wundef -Wshadow -Wpointer-arith \
-Wcast-align -Wstrict-overflow=5 -Wwrite-strings \
-Waggregate-return -Wcast-qual -Wswitch-default -Wswitch-enum \
-Wconversion -Wunreachable-code -Wformat=2 -Winit-self \
-Wuninitialized -Werror-implicit-function-declaration
CFLAGS= -c -pedantic $(WARNINGS)
SFLAGS= -S -pedantic $(WARNINGS)
LIBS=
all: setup
all: o1
all: o2
all: o3
setup:
mkdir -p $(OUT_DIRS)
o1: SFLAGS+= -O1
o1: OUT_DIR=o1
o1: $(ASMS)
o2: SFLAGS+= -O2
o2: OUT_DIR=o2
o2: $(ASMS)
o3: SFLATS+= -O3
o3: OUT_DIR=o3
o3: $(ASMS)
os: SFLAGS+= -Os
os: OUT_DIR=os
os: $(ASMS)
%.o: $(SRC_DIR)/%.c
$(CC) $(INCLUDE) $(CFLAGS) -c $< -o $@
%.s: $(SRC_DIR)/%.c
$(CC) $(INCLUDE) $(SFLAGS) -S $< -o $(OUT_DIR)/$@
clean:
rm -f *~
rm -f $(ASMS)
rm -f $(OBJS)
rm -rf $(OUT_DIRS)
答案 0 :(得分:1)
Makefile为 make 提供依赖图。 你的makefile告诉make:
all
取决于o1
o1
取决于tco.s
,recurs.s
和iter.s
all
还取决于o2
o2
还取决于tco.s
,recurs.s
和iter.s
make 构建tco.s
,recurs.s
和iter.s
后,
然后它已尽其所能确保o1
,o2
,o3
和os
是最新的。
BTW你应该必须声明与真实文件不对应的目标.PHONY