gpt4 book ai didi

makefile - gnu 生成文件 : shell function execution order in a recipe

转载 作者:行者123 更新时间:2023-12-04 12:38:49 26 4
gpt4 key购买 nike

我在 Makefile 配方中使用 $(shell ...) gnu make 函数,它在前几行之前首先运行。为什么?

一个非常简单的例子:

.PHONY: all
all:
@echo 1
@echo $(eval a=$(shell echo 2a 1>&2))2b
@echo 3 $(a)

输出是:
2a
1
2b
3

首先运行 $(shell ...) 行 (2a),然后是其他行。
当 $(shell ...) 函数在配方中运行时,如何按此顺序运行它?
1
2a
2b
3

编辑:

没有 $(shell ...) 它按我的预期工作:
.PHONY: all
all:
@echo 1
$(eval a=a)
@echo 2 $(a)
$(eval a=b)
@echo 3 $(a)

输出:
1
2 a
3 b

编辑2:

这是原始 Makefile 的一部分。 >>> 中的部分显示了我的问题的本质:我想将 udisksctl 的输出放入 make 变量而不是文件 $@.loop 中(并对 $@.mount 执行相同操作)。
$(HDIMG): $(BOOTBLOCK_MBR_BIN) $(BOOTBLOCK_EXT2_BIN) $(LOADER_BIN) | $(DESTDIR)
dd if=/dev/zero of=$@.ext2 bs=1 seek=$(PSIZEB) count=0 2>/dev/null
$(MKFSEXT2) -F $@.ext2 >/dev/null
dd if=$(word 2,$^) of=$@.ext2 conv=notrunc 2>/dev/null
cp $< $@
dd if=/dev/zero of=$@ bs=1 seek=$(HDSIZEB) count=0 2>/dev/null
echo $(PFDISK) | $(TR) | $(FDISK) $@ >/dev/null
dd if=$@.ext2 of=$@ bs=512 seek=$(PSTART) conv=sparse,notrunc iflag=fullblock 2>/dev/null
>>> udisksctl loop-setup --file $@ --offset $(PSTARTB) --size $(PSIZEB) >$@.loop
sed -i -e 's/.* //;s/\.//' $@.loop
cat $@.loop
>>> udisksctl mount --block-device $$(cat $@.loop) >$@.mount
sed -i -e 's/.* //;s/\.//' $@.mount
cat $@.mount
#
mkdir -p $$(cat $@.mount)/boot/
cp $(word 2,$^) $$(cat $@.mount)/boot/
#/sbin/filefrag -b512 -e /
#
udisksctl unmount --block-device $$(cat $@.loop)
udisksctl loop-delete --block-device $$(cat $@.loop)
rm $@.loop

最佳答案

make运行一个配方,它首先扩展其中的所有变量/函数,然后逐行运行 shell 命令。

您可以通过使用 $(shell ...) 执行每个 shell 命令来解决这个问题。 ,或者,在您的情况下,使用 $(info ...)而不是 echo :

.PHONY: all
all:
$(info 1)
$(info $(eval a=$(shell echo 2a 1>&2))2b)
$(info 3 $(a))

输出:
1
2a
2b
3
make: Nothing to be done for 'all'.
Nothing to be done for 'all'.部分原因是在扩展功能后,配方实际上是空的(有 0 个 shell 命令)。向其添加无操作命令(例如 @true )会删除该消息。

关于makefile - gnu 生成文件 : shell function execution order in a recipe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58409731/

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