makefile - 在 Makefile 中使用条件指令
问题描述
我正在为一个简单的 Makefile 苦苦挣扎。
简化版如下所示:
all : data/file1.RData
data/file1.RData : scripts/file1.R
Rscript $<
我scripts/file1.R
只想在没有调用文件的情况下执行目标,data/file1.RData
并且我认为条件句法能够帮助我实现该目标。
从这篇文章中,我注意到看起来像这样的结构:
target :
ifeq (...)
...
endif
但是我对 Makefile 的语法缺乏理解阻碍了我的用例的翻译。如何执行此操作?
解决方案
最好不要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 函数的计算结果为空(空字符串)。
推荐阅读
- bash - Bash - 用于切割字段不同间距的分隔符
- elasticsearch - Elasticsearch - 一个查询的每个索引计数
- c++ - QT 多线程 - 从 mainwindow.cpp 中的线程内调用函数
- javascript - 如何使用删除子项删除特定的附加子项?
- matlab - Matlab中的Appdesigner函数
- mysql - Mysql - 重用计算值,如 st_distance_sphere 值
- python-3.x - 创建两级多索引
- c - /md 不使用 msvc 动态链接 printf
- php - 我的 HTML 表单应该由 PHP 页面处理,但显示的是 PHP 代码而不是执行
- r - 在 R 中,stringr:str_replace_all 不服从 'ignore_case = TRUE'