提问人:pdid 提问时间:11/13/2023 最后编辑:pdid 更新时间:11/13/2023 访问量:37
具有运行时依赖项的 Makefile
Makefile with runtime dependencies
问:
假设我有一些带有生成源代码的规则的 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
答:
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
评论