Makefile只执行第一个目标

时间:2016-02-11 21:30:37

标签: makefile gnu-make

尝试执行默认目标时,只会执行setupo1目标。剩下的目标没有执行,我不明白为什么。

另一个潜在的线索:make总是会重新编译,而不是make不需要做任何事情。

如果创建了目录,则可以成功完成o1 o2 o3os目标。

# 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)

1 个答案:

答案 0 :(得分:1)

Makefile为 make 提供依赖图。 你的makefile告诉make:

  • all取决于o1
    • o1取决于tco.srecurs.siter.s
  • all还取决于o2
    • o2还取决于tco.srecurs.siter.s

make 构建tco.srecurs.siter.s后, 然后它已尽其所能确保o1o2o3os是最新的。

BTW你应该必须声明与真实文件不对应的目标.PHONY