具有运行时依赖项的 Makefile

Makefile with runtime dependencies

提问人:pdid 提问时间:11/13/2023 最后编辑:pdid 更新时间:11/13/2023 访问量:37

问:

假设我有一些带有生成源代码的规则的 makefile(简化示例)

SRCS = $(shell find src -name "*.c")
OBJS = $(patsubst src/%.c, build/%.o, $(SRCS))

generate-src:
    @echo "int main() {return 0;}" > ./src/x.c

target: generate-src $(OBJS)
    $(CC) -o target $(OBJS)

build/%.o: src/%.c
    @mkdir -p $(@D)
    $(CC) $(CFLAGS) $(CXXFLAGS) -c -o $@ $<

运行时,以下为错误make target

cc -o target  build/x.o
clang: error: no such file or directory: 'build/x.o'
clang: error: no input files
make: *** [target] Error 1

这是因为当我们调用 时,计算结果为空,因为计算结果为空。然后调用 generate-src,创建 .然后被调用,但这次的计算结果为 ,由于它没有被标识为 target 的依赖项,因此未创建。make target$(OBJS)$(SRCS)src/x.c$(CC) -o target $(OBJS)$(OBJS)build/x.o

有没有办法编写这个makefile,以便在运行后进行评估?$(OBJS)generate-srcs

C++ C makefile gnu-make GNU

评论


答:

1赞 n. m. could be an AI 11/13/2023 #1

这是执行此操作的一种方法。

SRCSX = $(shell find src -name "*.c")  src/x.c
uniq = $(if $1,$(firstword $1) $(call uniq,$(filter-out $(firstword $1),$1)))
SRCS = $(call uniq, $(SRCSX))

(从这里偷来的定义uniq)

0赞 Swift - Friday Pie 11/13/2023 #2

你不是在创造,但是,你为什么不(滥用)使用目标机制呢?像这样的东西(未经测试的代码):generate-src./src/x.c

GENERATED_C := ./src/x.c  

SRCS = $(shell find src -name "*.c")
OBJS = $(patsubst src/%.c, build/%.o, $(SRCS))
GENERATED_OBJ := $(patsubst src/%.c, build/%.o, $(GENERATED_C))

target: $(GENERATED_OBJ) $(OBJS)
    $(CC) -o target $(OBJS)

build/%.o: src/%.c
    @mkdir -p $(@D)
    $(CC) $(CFLAGS) -c $@ -o $<

$(GENERATED_OBJ): $(GENERATED_C)
        $(CC) $(CFLAGS) -c $^ -o $@

$(GENERATED_C):
    @echo "int main() {return 0;}" > ./src/x.c