在目标定义中包含文件

问题描述 投票:0回答:1

我有一组文件,其中包含要根据它们所代表的环境定义的环境变量。我的 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

makefile gnu-make
1个回答
0
投票

没有。 Makefiles 在两个完全不同的步骤中被解析。首先解析所有 makefile、包含的文件等,并在内存中创建先决条件关系的内部图。其次,遍历图形并在需要时调用配方。我什至不知道在运行食谱之前延迟包含 makefile 意味着什么。

但是我不明白你为什么要把这个放到规则里。如果您总是希望包含该文件,并且只想先检查它,那么为什么不只在

set_env
中做您正在做的事情(显然
echo
除外),而是在全局级别而不是在目标中食谱?

© www.soinside.com 2019 - 2024. All rights reserved.