shell - 如何根据环境变量的值更新 Makefile 目标?
问题描述
我有一个 make 目标,该目标将根据环境变量的值具有不同的输出。
我怎样才能:
- 如果环境变量未更改上次运行,则跳过依赖项并且不重新创建目标
- 如果环境变量未设置或已更改,则制作或重新制作目标
我认为我可以使用当前环境变量值创建或有条件地更新文件,然后将该文件用作 make 依赖项。我找不到使用本机工具的优雅方法。(sed -i
总是更新文件的时间戳,也许 awk 是可能的)
解决方案
使用 shell 脚本更新包含变量值的文件怎么样?
SHELL = /bin/bash
var_file := var.txt
var_name := NAME
is_var_updated = [[ ! -e $(var_file) ]] || [[ "$$(< $(var_file))" != "$($(var_name))" ]]
update_var_file = echo "$($(var_name))" > $(var_file)
$(shell $(is_var_updated) && $(update_var_file))
output.txt: $(var_file)
echo "Name is $$NAME" > $@
这就像这样工作。
$ ls
Makefile
$ NAME=foo make
echo "Name is $NAME" > output.txt
$ NAME=foo make
make: `output.txt' is up to date.
$ NAME=bar make
echo "Name is $NAME" > output.txt
推荐阅读
- c++ - 使用 assimp 将 3d 模型转换为 2d
- html - 在 font-family 中使用两种不同的字体
- python - 将像素坐标从相机图像转换为二维鸟瞰图
- javascript - 从角度上传多个包含图像数据数组的 FormField 对象以表达
- r - 如何根据边缘属性为 R 中 igraph 图中的边缘分配颜色范围?
- json - Xamarin 形成 Json 反序列化
- reactjs - 无法从创建的用户 firebase 传递 uid
- c - 返回变量在c中保存一个字符串并将其打印出来
- reactjs - 传递传播道具与 html 样式属性时的打字差异
- ios - React Native IOS Ajax 比 Android 需要更长的时间