makefile - 在 Make 中运行延迟的 shell 命令
问题描述
在我的 Makefile 中,我想作为单个目标的一部分执行多个步骤。这些步骤应该按顺序进行,因为它们相互依赖。这是简化的情况:
target:
git archive --remote=some-remote master --format zip -o ./zipfile.zip
echo "$(VARIABLE_IN_MAKE):$(shell unzip -z ./zipfilezip | tail -1)" > ./textfile
$(shell cat ./textfile)
这里的问题是 shell 命令 -$(shell unzip -z ./zipfilezip | tail -1)
一旦规则“加载”就被执行,即在 zipfile 甚至存在之前。这会返回错误。该cat
命令也扩展得太早了。
在上述所有步骤完成之后而不是之前执行子shell的正确方法是什么?我是否必须将所有命令包装在一个bash -c
调用中?或者通过链接它们&&
?
解决方案
摆脱这些$(shell...)
。make recipe 的每一行都已经是一个 shell 脚本:
target:
git archive --remote=some-remote master --format zip -o ./zipfile.zip
echo "$(VARIABLE_IN_MAKE):$$(unzip -z ./zipfilezip | tail -1)" > ./textfile
cat ./textfile
请注意,在第二行中,$$(unzip -z ./zipfilezip | tail -1)
它被扩展了两次:第一次是 make 在将配方传递给 shell 之前,导致$(unzip -z ./zipfilezip | tail -1)
,第二次是 shell 将其视为命令替换。这就是$$
需要的原因:通过 make 逃避第一个扩展。如果您$(unzip -z ./zipfilezip | tail -1)
直接使用,make 会将其扩展为空字符串(除非您有一个名称为 的 make 变量unzip -z ./zipfilezip | tail -1
,但这不太可能)。
推荐阅读
- php - 自定义字段搜索表单、PHP、Wordpress
- spring-boot - 如何在 application.yml 中设置环境变量 - Spring Boot
- php - Laravel Livewire 组件在刷新后不会自动刷新/重新加载
- reactjs - 我可以在依赖数组中使用动态属性来实现 useEffect 吗?
- java - 在 Netbeans 中连接天蓝色数据库的 Java 程序出现错误
- .net - 将大型 vb.net 应用程序从 3.5 移动到 4.5 .net
- python - 在做 scipy.signal.spectrogram 时,我怎么知道会有多少时间段?
- r - 根据两列中的数据转置数据框中的值
- mysql - 无法在 Ubuntu 18.04.4 LTS 中安装 MySQL
- c# - Xamarin 表单 - 网址未在 Webview 中显示