如何根据环境变量的值更新Makefile目标?

时间:2020-01-17 09:43:56

标签: shell awk sed makefile

我有一个make目标,根据环境变量的值,其输出会有所不同。

我如何:

  • 如果环境变量上次运行没有更改,请跳过依赖项,而不重新建立目标
  • 如果未设置或更改环境变量,则制作或重新制作目标

我认为我可以使用当前环境变量值创建或有条件地更新文件,然后将该文件用作make依赖项。我找不到使用本机工具完成此操作的优雅方法。 (sed -i总是更新文件的时间戳,也许可以awk)

2 个答案:

答案 0 :(得分:1)

如何使用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

答案 1 :(得分:0)

使条件条件成为起点:

.PHONY: all

FILE := foobar
ifdef ENV_VAR
OLD_ENV_VAR := $(shell [ -f $(FILE) ] && cat $(FILE))
ifeq ($(ENV_VAR),$(OLD_ENV_VAR))
DONTRUN := 1
endif
endif

ifdef DONTRUN
all:
    @echo 'ENV_VAR unmodified'
else
$(shell printenv ENV_VAR > $(FILE))
all:
    @echo 'ENV_VAR undefined or modified'
endif