【问题标题】:Run a python script from makefile and return output of python script to variable inside makefile从 makefile 运行 python 脚本并将 python 脚本的输出返回到 makefile 中的变量
【发布时间】:2019-11-11 10:39:47
【问题描述】:

很可能从嵌入在 makefile 中的目标中的规则运行 python 脚本(以便对 mkaefile 组件的输出进行后处理)。但是是否有可能从 python 脚本返回一些值到 makefile 并将其分配给 makefile 中的一些变量。

所以我认为可以通过两种方式完成: 过程1: 1.从makefile调用python脚本 2.允许python脚本将输出存储在某个已知文件中 3. 从makefile中读取值并赋值给里面的变量

我已经尝试过这种方法,并且已经能够执行 Step1 和 Step2 但无法执行 Step 3。

过程 2: 1.从makefile调用python脚本 2.让python脚本返回一些值,这些值被分配给makefile中的一个变量

我无法尝试,因为我找不到任何示例

----------------- makefile----------------
help:  detect_term_type

file := term_type
TERM_TYPE := $(cat ${file})

detect_term_type:
    python configure_things.py



-------configure_things.py-----
import platform

class TerminalType:

    def __init__(self):
        self.find_terminal_name()

    def find_terminal_name(self):
        f= open("term_type","w+")
        f.write(platform.system())
        f.write('\n')
        f.close()

我希望将可能是“Linux”或“Cygwin”的python脚本的输出分配给makefile变量TERM_TYPE。

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    很可能从嵌入的规则运行 python 脚本 在makefile中的一个目标内(为了对输出进行后处理 mkaefile 组件)。但是是否有可能从 python脚本返回makefile并将其分配给内部的一些变量 生成文件。

    make 的 POSIX 规范未定义任何可用于此目的的功能。但是,如果您碰巧专门依赖 GNU make,它有一个 $(shell) 函数可以达到目的:

    TERM_TYPE := $(shell python figure_it_out.py)
    

    在任何情况下,您都不能通过构建一个文件然后将其读回来做到这一点,因为变量在构建任何东西之前就获得了它们的值。

    【讨论】:

    • The POSIX specifications for make do not define any capability var != command 呢?
    • 我正在使用 Cygwin 运行 makefile 命令。我应该使用“TERM_TYPE := $(shell python figure_it_out.py)”作为某些目标的规则还是我应该将它用作变量。
    • 怎么样,@Matt? The current POSIX specification for make不要说这种宏定义的形式。
    • @Prakash,它是一个宏(变量)定义。
    【解决方案2】:

    在 makefile 的规则中使用以下内容将值重新分配给变量。在这种情况下,TERM_TYPE 将使用存储在文件“term_type”(python 存储输出的文件名)中的值重新分配。

    run_python: 
        @python configure_things.py 
    
    detect_term_type:run_python
        $(info xyz)
        $(eval TERM_TYPE=$(shell cat term_type|head -1))
        $(info $(TERM_TYPE))
    

    【讨论】:

    • 使用$(eval) 在规则的配方中嵌入变量定义是非常糟糕的形式。完全没有必要这样做,因为它不会影响我推断您认为的操作顺序。
    • 您能否提出一些方法来确保分配变量以及脚本在变量分配之前运行。
    • 查看我的回答,@Deepak,包括但不限于最终评论。简而言之,您将脚本的输出直接分配给变量,而不是通过构建文件间接分配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    相关资源
    最近更新 更多