1

我使用 aMakefile对我的文件进行字节编译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,第二次是添加MISC_REQREQfor时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

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

自动依赖检测omake会很好。

4

1 回答 1

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 的目标特定设置

于 2013-04-17T09:25:50.563 回答