R& Makefile:如何继承依赖项?

时间:2013-04-16 15:23:07

标签: r makefile dependency-management

我使用Makefile对我的R文件进行字节编译(主要用于检测代码的潜在问题)。在编译文件时,我加载了library个要求和loadcmp其本地依赖项:

R = R --quiet
MISC_REQ = entropy igraph data.table
misc.Rc : REQ = $(MISC_REQ)
import.Rc : import.R misc.Rc
import.Rc : REQ = $(MISC_REQ)
modeling-functions.Rc : modeling-functions.R misc.Rc
modeling-functions.Rc : REQ = $(MISC_REQ) plyr Matrix e1071

%.Rc : %.R
    $(R) $(foreach f,$(REQ),-e 'library("$f")') \
        $(foreach f,$(filter %.Rc, $^),-e 'loadcmp("$f")') \
        -e 'source("$<"); cmpfile("$<"); checkUsageEnv(.GlobalEnv)'

我想知道是否有办法让我避免指定依赖两次:一次当我提到import.Rc取决于misc.Rc时我第二次添加<{1}} MISC_REQ的{​​{1}}到REQ

编辑: 对于我非常简单的依赖树,我可以通过以下简化来逃避:

import.Rc

但是,我想要一个更通用的解决方案。

沿REQ = entropy igraph data.table misc.Rc : share-click-import.Rc : share-click-import.R misc.Rc modeling-functions.Rc : modeling-functions.R misc.Rc modeling-functions.Rc : REQ += plyr Matrix e1071 行进行自动依赖检测会很不错。

1 个答案:

答案 0 :(得分:0)

我认为没有任何合理的方法可以做到这一点。请注意,即使您将两个事物都称为“依赖关系”,但只有第一个(import.Rc:import.R misc.Rc)实际上是Make的意义上的依赖关系。第二件事是设置特定于目标的变量。我担心不可能在一条规则中设置这两件事。

原则上你可以编写一个函数,比如'gendeps',它可以为你生成规则,但对我而言,它似乎过于复杂,归结为键入完全相同的信息。无论如何,该功能可能如下所示:

# Generate dependency rules
# usage:
#  $(eval $(call gendeps,targetfile,prerequisites,packages))
define gendeps
$1: $2

$1: REQ+=$3
endef

然后用它作为,说:

$(eval $(call gendeps,misc.Rc,import.R misc.R,plyr))

这将使import.R成为misc.Rc的先决条件,并将plyr包添加到所需包的列表中。

在您的示例中,您还可以设置REQ的默认值

REQ=$(MISC_REQ)

并删除import.Rc和misc.Rc

的特定于目标的设置