我有一组文件,其中包含要根据它们所代表的环境定义的环境变量。我的 Makefile 将使用名为
env
的输入参数运行,这将设置将要使用的文件。
我知道我可以通过以下方式加载相应的文件:
include ./envs/$(env)
.EXPORT_ALL_VARIABLES:
但是我想先检查传递的参数是否有效,如果没有则提示错误消息说明发生了什么。为此,我尝试这样做:
ENVS := dev prod local
.PHONY: all set_env use_env
all: set_env use_env
.EXPORT_ALL_VARIABLES:
set_env:
ifeq ($(filter $(env),$(ENVS)),)
$(error Invalid value por "env" argument: $(env). Accepted values: $(ENVS))
endif
include ./envs/$(env)
@ echo Environment variables loaded
use_env:
@ echo $(MY_VAR)
但我不断收到以下错误
Makefile:14: *** recipe commences before first target. Stop.
。 Bash 命令使用制表符进行缩进和其余空格(为了更好的可视化)。
是否可以在目标内部而不是根目录中使用
include
?
没有。 Makefiles 在两个完全不同的步骤中被解析。首先解析所有 makefile、包含的文件等,并在内存中创建先决条件关系的内部图。其次,遍历图形并在需要时调用配方。我什至不知道在运行食谱之前延迟包含 makefile 意味着什么。
但是我不明白你为什么要把这个放到规则里。如果您总是希望包含该文件,并且只想先检查它,那么为什么不只在
set_env
中做您正在做的事情(显然 echo
除外),而是在全局级别而不是在目标中食谱?