首页 > 解决方案 > 在 Makefile 中使用条件指令

问题描述

我正在为一个简单的 Makefile 苦苦挣扎。

简化版如下所示:

all : data/file1.RData

data/file1.RData : scripts/file1.R
  Rscript $<

scripts/file1.R只想在没有调用文件的情况下执行目标,data/file1.RData并且我认为条件句法能够帮助我实现该目标。

从这篇文章中,我注意到看起来像这样的结构:

target :
ifeq (...)
    ...
endif

但是我对 Makefile 的语法缺乏理解阻碍了我的用例的翻译。如何执行此操作?

标签: makefileconditional-statements

解决方案


最好不要ifeq用于此;这将在解析生成文件时运行。在您准备好运行规则之前,您可能不想进行此检查。

一个简单的方法是使用$(if ...)函数。像这样的东西会起作用:

data/file1.RData : scripts/file1.R
        $(if $(wildcard $@),,Rscript $<)

我应该指出,RData一旦更新,文件将始终被认为(通过 make)过期scripts/file1.R,因为它一旦创建就永远不会更新。

文档可用于通配符功能

参数模式是文件名模式,通常包含通配符(如在 shell 文件名模式中)。通配符的结果是以空格分隔的与模式匹配的现有文件的名称列表。

(因此,如果模式(在这种情况下只是一个简单的文件名)与现有文件不匹配,则结果是空字符串)。

if 函数

第一个参数,条件,首先去除所有前面和后面的空格,然后展开。如果它扩展为任何非空字符串,则该条件被认为是真的。如果它扩展为空字符串,则该条件被认为是错误的。

如果条件为真,则评估第二个参数 then-part,并将其用作整个 if 函数的评估结果。

如果条件为假,则评估第三个参数 else-part,这是 if 函数的结果。如果没有第三个参数,则 if 函数的计算结果为空(空字符串)。


推荐阅读