2015-10-07 47 views
0

我正在使用Makefiles进行Python项目。我需要在每个Makefile中包含一些Python配置变量,并且Makefiles可以驻留在项目根目录下的各个子目录中(尽管深度不超过一层)。包含用于执行包含的Makefile的路径

在项目的根,我创建了一个Makefile.inc用,例如,以下内容:

define PYSCRIPT 
from lib.custommodule import VAR1 
print(VAR1) 
endef 
VAR1 := $(shell python -c '$(PYSCRIPT)') 

'custommodule的生活该项目的Python的lib目录内的根,和所有的Makefile文件在包含Makefile.inc的顶层,执行没有错误。

在 '子目录/ Makefile文件',我有:

include ../Makefile.inc 
echo $(VAR1) 

当我cd subdirectory && make,我收到错误:

ImportError: No module named custommodule 

我试图在“Makefile.inc前面加上Python路径'(在define PYSCRIPT块中)包含父目录,认为'子目录/ Makefile'在它自己的路径中对其父路径执行'../Makefile.inc',但这也不起作用。

我是否错过了防止这种情况发生的东西?还是有更好的方法来实现我想要的?

回答

0

怎么样一个Makefile.inc有:

ROOTDIR ?= . 

define PYSCRIPT 
from lib.custommodule import VAR1 
print(VAR1) 
endef 
export PYSCRIPT 

VAR1 := $(shell PYTHONPATH=$(ROOTDIR) python -c "$$PYSCRIPT") 

subdirectory/Makefile有:

ROOTDIR = .. 
include $(ROOTDIR)/Makefile.inc 

all: 
    echo $(VAR1) 

未经测试。

+0

这不会起作用:您正试图将一个make变量赋值添加到python脚本中。 – MadScientist

+0

不完全。我添加到由$'(shell ...)'调用python变量赋值执行的python脚本中。 make扩展将在将脚本传递给python之前进行。如果您有明确的证据表明它无法正常工作,请解释原因。 –

+0

当然,'$(ROOTDIR)'将在python被调用之前展开。但是_assignment_将被python解释,而不是make,因为你将整个脚本传递给'python -c'。你只是将名为'PYTHONPATH'的Python变量设置为'.'或'..',这是Python中的语法错误,无论如何不会做你想要的。你可以这样做:'(shell PYTHONPATH = $(ROOTDIR)python -c'$(PYSCRIPT)')'(并将其从脚本中取出)。要获得明确的证据,只需运行'python -c'PYTHONPATH =。''然后看它失败... – MadScientist