我有以下Makefile:
CC = gcc
CFLAGS = -ansi -Wall -g -O0 -Wwrite-strings -Wshadow \
-pedantic-errors -fstack-protector-all
PROGS = public01 public02 public03 public04 public05 public06 shell_jr
.PHONY: all clean
all: $(PROGS)
clean:
rm -f *.o $(PROGS) a.out
$(PROGS): shell_jr.c
public0%:
shell_jr < public0%.in > output
cat output每当输入public0X时,都应该显示shell_jr.c在运行时的输出,输入来自public0X.in。public0 0%标签是我实现这一目标的尝试。然而,有三个问题。首先,我只能将public0%.in作为依赖项。可以通过复制粘贴public01、public02、……的单独命令来避免这种情况。其次,当我这样做并执行make时,将立即执行该命令。如何确保在输入public01并按enter之前不会执行该命令?
发布于 2020-04-26 17:34:55
首先,我只能将public0%.in作为一个依赖项。
我将此部分用于询问如何在菜谱中表示与所选目标对应的输入文件的正确名称。模式规则的%仅在目标和先决条件中展开,而不是在菜谱中展开,但在任何make配方中,自动变量$@表示正在构建的完整目标名称。因为想要的输入名是通过在目标名称后缀.in后形成的,所以它可以表示为$@.in。
此外,您没有将public0%目标命名为.PHONY (与clean和all不同),但是您对它们的规则实际上也没有创建它们。如果您同时尝试创建和显示这些文件,则还可以使用$@将输出定向到所需的文件。否则,您也应该将这些目标标记为.PHONY。
此外,如果您打算(重新)创建这些文件,而不管是否有任何更改,那么从先决条件列表中省略输入文件是合适的。否则,将输入文件命名为先决条件将有助于make跳过不必要地重新生成%public0%文件。
第二,当我这样做并执行
时,命令将立即执行。如何确保在输入public01并按enter之前不会执行该命令?
make不是交互式的。如果希望指定要构建的一个或多个特定目标,而不是默认目标,则可以在make命令行中将它们表示为附加参数:
make public01但我认为你想要得到的可能是一个与你实际所说的不同的问题。默认目标将构建以$(PROGS)命名的所有目标,如果先决条件不需要其他条件,则在串行模式下运行的GNU make将尝试按照它们的命名顺序构建目标。您的public0%都依赖于shell_jr程序,但他们并没有将它指定为先决条件。(他们确实将shell_jr.c命名为先决条件,但这实际上并不是一个直接的依赖,而将它指定为一个没有用处的目标。)因此,make将在尝试构建shell_jr之前尝试构建所有public0%目标。
这里要做的正确的事情是表达正确的依赖关系。这个版本是这样做的,假设public0%是实际构建的文件:
CC = gcc
CFLAGS = -ansi -Wall -g -O0 -Wwrite-strings -Wshadow \
-pedantic-errors -fstack-protector-all
PROGS = shell_jr
OUTPUTS = public01 public02 public03 public04 public05 public06
.PHONY: all clean
all: $(PROGS) $(OUTPUTS)
clean:
rm -f *.o $(PROGS) $(OUTPUTS)
# shell_jr is built according to a built-in rule (as was already the case)
public0%: public0%.in shell_jr
shell_jr < $@.in > $@
cat $@请注意,只有当public0%文件的相应输入文件发生更改或需要重建shell_jr时,才会重新生成(并显示)它们。如果您希望在没有任何更改的情况下构建和显示它们,那么您可以添加一个没有先决条件或配方的目标,并将其作为public0%规则的先决条件:
public0%: public0%.in shell_jr FORCE
shell_jr < $@.in > $@
cat $@
FORCE:
.PHONY: FORCEFORCE目标将被认为是在每次make运行时重新构建的,从而触发要重建的public0%目标。
https://stackoverflow.com/questions/61436204
复制相似问题