我有一个 Makefile 规则,要求将 shell 命令的结果存储到变量中以供以后使用。由于某种原因,似乎$(shell)
一旦我的规则匹配,调用就会执行,而不是在执行过程中遇到它时。
文件内容如下:
TMPDEV=/tmp/disk.img
$(TMPDEV):
fallocate -l 806354944 $(TMPDEV)
sudo parted --script $(TMPDEV) unit s mklabel msdos \
mkpart primary fat16 2048 526335 \
mkpart primary fat32 526336 1050623 \
mkpart primary NTFS 1050624 1574911 \
quit
$(eval TMPDISK := $(shell sudo partx --verbose -a $(TMPDEV) | tail -1 | cut -d':' -f1))
echo $(TMPDISK)
sudo mkfs.fat -F 16 -n FAT16 $(TMPDISK)p1
无法知道其价值是什么TMPDISK
至少会持续到之后fallocate
称呼;这就是为什么$(eval)
语句被延迟到磁盘映像分区之后。
我收到的输出是:
$ make
partx: stat failed /tmp/disk.img: No such file or directory
fallocate -l 806354944 /tmp/disk.img || dd if=/dev/zero of=/tmp/disk.img bs=1b count=1574912
sudo parted --script /tmp/disk.img unit s mklabel msdos \
mkpart primary fat16 2048 526335 \
mkpart primary fat32 526336 1050623 \
mkpart primary NTFS 1050624 1574911 \
quit
echo
事实是partx
错误输出(因此TMPDISK
设置为空)在执行任何其他命令之前让我认为$(shell)
比预期更早被调用。有没有办法延迟 shell 调用和分配TMPDISK
直到合适的行?
不可能就这样拖延扩张。 Make 总是先扩展整个配方中的所有变量,然后再将配方的任何部分发送到 shell。没有办法“推迟”到以后。
一般来说,不典型使用$(shell ...)
在配方中,因为配方已经在 shell 中运行。并通过以下方式在配方中设置 make 变量$(eval ...)
也是极不寻常的。
我建议您重写此配方以使用 shell 变量,而不是 make 变量;这会更容易理解:
TMPDEV=/tmp/disk.img
$(TMPDEV):
fallocate -l 806354944 $(TMPDEV)
sudo parted --script $(TMPDEV) unit s mklabel msdos \
mkpart primary fat16 2048 526335 \
mkpart primary fat32 526336 1050623 \
mkpart primary NTFS 1050624 1574911 \
quit
TMPDISK=$$(sudo partx --verbose -a $(TMPDEV) | tail -1 | cut -d':' -f1); \
echo $$TMPDISK; \
sudo mkfs.fat -F 16 -n FAT16 $${TMPDISK}p1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)