adgentleman 2020-08-26 10:10 采纳率: 50%
浏览 58

嵌套Makefile自动生成依赖问题

我构建了这样一个目录树,顶层Makefile调用world/Makefile和main/Makefile.

我尝试修改world/headers/world.h的内容,在顶层make的时候没有重新编译world.c。
我疑惑的是单个Makefile自动生成依赖项是有效的,但是如果嵌套makefile就无效了。

图片说明

顶层Makefile内容:

export EXE_OUTPUT_DIR = $(shell pwd)/build
export LIB_OUTPUT_DIR = $(EXE_OUTPUT_DIR)/lib

modules = world main
all:
    @for subdir in $(modules);  \
    do                          \
        $(MAKE) -C "$$subdir";  \
    done

clean:
    @for subdir in $(modules);  \
    do $(MAKE) -C "$$subdir" $@; \
    done

.PHONY:clean

world/Makefile:

# VPATH = src
SRC_FILE = $(wildcard src/*.c)
SRC_OBJ = $(SRC_FILE:.c=.o)
TARGET = libworld.a

CFLAGS += -g -Wall -Werror
CPPFLAGS += -I. -I./headers

$(TARGET): $(SRC_OBJ)
    $(AR) rcs $@ $^
    cp $@ $(LIB_OUTPUT_DIR)

%.d:%.c
    @$(CC) -MM $(CPPFLAGS) $< > $@.$$$$; \
    sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
    rm -f $@.$$$$

-include $(SRC_OBJ:.o=.d)

clean:
    $(RM) $(SRC_OBJ) $(TARGET) $(LIB_OUTPUT_DIR)/$(TARGET)
    $(RM) $(SRC_OBJ:.o=.d)

main/Makefile:

SRC_FILE = $(wildcard *.c)
SRC_OBJ = $(SRC_FILE:.c=.o)

TARGET=target

CFLAGS += -g -Wall -Werror
CPPFLAGS += -I. -I../world/headers
LDFLAGS += -lpthread -L$(LIB_OUTPUT_DIR) -lworld

$(TARGET): $(SRC_OBJ)
    $(CC) -o $@ $^ $(LDFLAGS)
    cp $@ $(EXE_OUTPUT_DIR)

clean:
    $(RM) $(SRC_OBJ) $(TARGET) $(EXE_OUTPUT_DIR)/$(TARGET)
  • 写回答

1条回答 默认 最新

  • dabocaiqq 2020-08-26 11:09
    关注
    评论

报告相同问题?

悬赏问题

  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!