【问题标题】:Include path for executing included Makefile执行包含的 Makefile 的包含路径
【发布时间】:2015-10-07 06:48:19
【问题描述】:

我将 Makefiles 用于 Python 项目。我需要在每个 Makefile 中包含一些 Python 配置变量,并且 Makefile 可能驻留在项目根目录内的各种子目录中(尽管深度不超过一层)。

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

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

'custommodule' 位于项目的 Python lib 目录根目录中,并且包含 Makefile.inc 的所有顶级 Makefile 都可以正常执行。

在“子目录/Makefile”中,我有:

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

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

ImportError: No module named custommodule

我尝试在“Makefile.inc”(在 define PYSCRIPT 块中)中添加 Python 路径以包含父目录,认为“子目录/Makefile”正在执行“../Makefile.inc”自己的路径与其父路径,但这也不起作用。

我是否遗漏了一些阻止它工作的东西?或者有没有更好的方法来实现我想要的?

【问题讨论】:

    标签: python-2.7 makefile


    【解决方案1】:

    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)
    

    未测试。

    【讨论】:

    • 这行不通:您正在尝试将 make 变量赋值添加到 python 脚本中。
    • 不完全是。我在要执行的python 脚本中添加$(shell ...) 调用python 变量赋值。 make 扩展将在将脚本传递给 python 之前进行。如果您有明确的证据表明它不起作用,请解释原因。
    • 当然,$(ROOTDIR) 将在 python 被调用之前被扩展。但是 assignment 将由 python 解释,而不是 make,因为您将整个脚本传递给 python -c。您只是将一个名为 PYTHONPATH 的 Python 变量设置为 ...,这是 Python 中的语法错误,无论如何都不会执行您想要的操作。您可以这样做:$(shell PYTHONPATH=$(ROOTDIR) python -c '$(PYSCRIPT)')(并将其从脚本中删除)。要获得明确的证据,只需运行 python -c 'PYTHONPATH=.' 并看着它失败...
    • 你是对的 PYTHONPATH 应由调用外壳设置。我修正了我的答案(以及原始 makefile 的一些其他问题)。
    • 感谢您的意见。我尝试了这个建议,但没有奏效。我通过在顶级 Makefile 中导出 VAR1 并从那里调用 subdirectory/Makefile 来解决这个问题。这并不理想,因为我不能直接调用subdirectory/Makefile,但它确实让我可以继续前进,直到找到另一个选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多