gpt4 book ai didi

makefile - gnu make : how to automatically list and build all targets

转载 作者:行者123 更新时间:2023-12-02 22:10:33 25 4
gpt4 key购买 nike

假设我有以下 Makefile:

RM = rm -f
FLAGS = -Cr -O1 -gv -gw -g -vw
builddir = ./build/
TD = ./tasks/

all: example1 example3 example5

example1:

fpc 01_Kreisumfang.pas $(FLAGS) -o$(builddir)01_Kreisumfang

example3:

fpc 03_EuroBetrag3.pas $(FLAGS) -o$(builddir)03_EuroBetrag3

example5:

fpc 05_Dreiecke.pas $(FLAGS) -o$(builddir)05_Dreieck

clean:

$(RM) $(builddir)*

在某个时刻,我的 Makefile 增长到 example112 ...,有没有一种方法可以自动定义所有而无需输入所有目标?我不想这样做:

all: example1 example3 example5 ... example112

我可以做这样的事情吗?

all: (MAGIC to Exclude clean)?

因此,我不想键入所有目标,而是希望 make 能够检测所有目标并排除某个列表。

更新:

我发现以下可能的提示:

 make -rpn | sed -n -e '/^$/ { n ; /^[^ ]*:/p }' |egrep -v -E '(all|clean)' 

我不知道如何使其本身成为目标,我尝试过:

TARGETS =: $(shell make -rpn | sed -n -e '/^$$/ { n ; /^[^ ]*:/p }' |egrep -v -E '(all|clean)')

但是好像是错误的。它不仅是错误的,还会导致愚蠢的递归。

所以这个解决方案只能作为 shell 命令使用,而不是在 Makefile 本身中使用。

嗯,make 在这里似乎很神秘。我发现的最合理的解决方案是创建一个脚本并使用它:

$ cat doall.sh 
#!/bin/bash
for i in `make -rpn | sed -n -e '/^$/ { n ; /^[^ ]*:/p }' | sed -e 's/://' | egrep -v -E '(all|clean)'`;
do make $i;
done

似乎不可能将其创建为 make 目标,或者说这方面的投资返回率非常低......

最佳答案

我使用 for 循环尝试了这一点。检查这个简单的示例是否适合您。从 this 获取命令发布。

RM = rm -f
FLAGS = -Cr -O1 -gv -gw -g -vw
builddir = ./build/
TD = ./tasks/
SHELL := /bin/bash

targets=$(shell for file in `find . -name '*.pas' -type f -printf "%f\n" | sed 's/\..*/\.out/'`; do echo "$$file "; done;)

all: $(targets)

%.out:%.pas
fpc $< $(FLAGS) -o (builddir)$@

clean:
$(RM) $(builddir)*

关于makefile - gnu make : how to automatically list and build all targets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19076482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com