在Makefile例程中将参数动态插入shell命令



我正在将一个参数传递给Makefile例程,并基于此确定传递给后续shell命令的参数。

target:
if [ "$(tensorflowgpu)" = "false" ]; then 
conda env create -f temp-environment.yaml 
else 
conda env create -f environment.yaml 
fi

我想知道是否有一种方法可以在不使用if else fi语法的情况下将分别为apt.yaml的文件名直接插入到conda create命令中。不将结果分配给变量的三元运算符在shell脚本中似乎不可用。

如果这真的根本不可行,我想知道除了将conda create命令重构为一个函数并将yaml文件传递给它之外,是否还有其他方法可以使这段代码更具可维护性和可读性。

免责声明:我不太精通shell脚本。

你可以这样做:

target:
[ "$(tensorflowgpu)" = "false" ] && prefix=temp- || prefix= ; 
conda env create -f $${prefix}environment.yaml

我不知道你是否更喜欢这样。

或者,由于您在这里使用的是make变量,而不是shell变量,如果您愿意依赖GNU make,您可以使用构造的变量名:

YAMLFILE_false = temp-environment.yaml
YAMLFILE_base = environment.yaml
YAMLFILE = $(firstword $(YAMLFILE_$(tensorflowgpu)) $(YAMLFILE_base))
target:
conda env create -f $(YAMLFILE)

或者您可以使用GNU make的if函数;例如:

target:
conda env create -f $(if $(filter false,$(tensorflowgpu)),temp-)environment.yaml

或者你可以把它放在一个变量中,让它更干净一点:

YAMLFILE = $(if $(filter false,$(tensorflowgpu)),temp-)environment.yaml
target:
conda env create -f $(YAMLFILE)

最新更新