Python 如何将git版本信息添加到cython Build.so文件中?

Python 如何将git版本信息添加到cython Build.so文件中?,python,c++,git,compilation,cython,Python,C++,Git,Compilation,Cython,我想将我的git提交信息(分支信息和sha1信息)添加到我的cython编译的文件中 例如,我有一个.pyx文件,并将其编译为.so模块。但问题来了,当我需要调试它时,我无法找到它到底是哪个提交的。我需要做些什么来支持像/demo.so--gitinfo这样的操作才能获得像这样的分支:master,Commit:****** 我用cmake搜索了一些关于c/c++可执行文件和git提交信息的网页 以下是一些相关网页: 非常感谢 将修订指示器嵌入由编译源代码生成的对象的方法在很大程度上取决于编

我想将我的git提交信息(分支信息和sha1信息)添加到我的
cython
编译的
文件中

例如,我有一个
.pyx
文件,并将其编译为
.so
模块。但问题来了,当我需要调试它时,我无法找到它到底是哪个提交的。我需要做些什么来支持像
/demo.so--gitinfo
这样的操作才能获得像这样的
分支:master,Commit:******

我用cmake搜索了一些关于c/c++可执行文件和git提交信息的网页

以下是一些相关网页:


非常感谢

将修订指示器嵌入由编译源代码生成的对象的方法在很大程度上取决于编译源代码所使用的工具,当然也取决于用于包含源代码的源代码控制系统。前者决定您可以做什么以及如何运行命令。后者确定哪些信息是重要的,哪些命令提取该信息,以及在某种程度上如何将该信息嵌入源文件(如果可以直接执行)

由于您特别询问了Git,这里有几点:

  • 分支名称基本上是无关的。Git分支名称几乎毫无意义:今天可以通过
    bleek
    命名的提交,明天可能通过
    pribble
    命名

  • git descripe
的输出更有趣,因为它不太可能改变,包括一个附近的带注释的标签,标签本身永远不会改变,尽管这要求制作标签的用户表现自己,并为您提供方便的“与标签的距离”线性计数加上一个后缀,该后缀通常精确定位特定的提交,即使没有其他信息:

v2.12.0-190-ge0688e9
例如,对于ID以
e0688e9
开头的提交,它是一个可读性最好的名称,其“附近的标记”是
v2.12.0
(从某种意义上说,190次提交之后)

  • 原始提交ID本身完整地唯一标识提交

  • 可以使用
    ident
    属性作为过滤器see-将原始提交ID嵌入到源文件中。除非构建系统太原始,无法运行
    git descripe
    ,否则我自己会避免使用这种方法

  • [编辑:修正了一点-您不想像在运行时那样将版本文件作为Python文件“导入”!]

    根据构建系统的不同,您可以让构建者执行以下操作,例如:

    echo 'DESCRIBE = "' $(git describe --dirty) '"' > gitignored.pyx
    
    然后构建文件。文件本身根本不应该提交到存储库中,而是每次都要构建(它总是需要重新生成)

    这种方法适用于大多数编译语言,当然,要定义的变量的形式以及字符串和源文件的语法各不相同

    直接在Cython中执行此操作,无需辅助文件 特别是对于Cython,如果使用
    setup.py
    ,则可以在Python代码中提取Git版本,并在编译期间将其作为
    -D
    参数传递。下面是一个实际的工作示例,它修改了一个基本的
    setup.py
    ,将其格式化为Git提交。
    hello.pyx
    setup.py
    文件几乎都是直接从数据库中导出的

    提交c1a008c1555be451047ff9869abe30c753cfc15d
    作者:Chris Torek
    日期:2017年3月15日星期三02:03:41-0700
    编译时内置Git版本
    diff——git a/hello.pyx b/hello.pyx
    索引da1b827..E3EF9 100644
    ---a/hello.pyx
    +++b/hello.pyx
    @@ -1,2 +1,7 @@
    def向(姓名)问好:
    打印(“你好%s!”%name)
    +
    +cdef外部源*:
    +char*构建版本
    +
    +版本=构建版本
    diff——git a/setup.py b/setup.py
    索引6e6bc70..7c6d07c 100644
    ---a/setup.py
    +++b/setup.py
    @@ -1,7 +1,23 @@
    从distutils.core导入设置
    从Cython.Build导入cythonize
    +从Cython.Distutils.extension导入扩展
    +从Cython.Distutils导入生成\u ext
    +
    +导入子流程
    +导入系统
    +
    +proc=subprocess.Popen(['git','description','--dirty'],stdout=subprocess.PIPE)
    +GIT_VERSION=proc.stdout.read().rstrip().encode('utf-8')
    +如果进程等待():
    +sys.exit('git descripe--dirty failed:退出代码{}'。格式(proc.wait())
    +
    +扩展=[
    +扩展名('hello',['hello.pyx'],
    +额外的编译参数=['-D',构建版本={}'.format(GIT_版本)],
    +]
    设置(
    name='Hello world app',
    -ext_modules=cythonize(“hello.pyx”),
    +cmdclass={'build\u ext':build\u ext},
    +ext_模块=扩展
    )
    
    将修订指示器嵌入由已编译源代码生成的对象的方法在很大程度上取决于用于编译源代码的工具,当然也取决于用于包含源代码的源代码控制系统。前者决定您可以做什么以及如何运行命令。后者确定哪些信息是重要的,哪些命令提取该信息,以及在某种程度上如何将该信息嵌入源文件(如果可以直接执行)

    由于您特别询问了Git,这里有几点:

    • 分支名称基本上是无关的。Git分支名称几乎毫无意义:今天可以通过
      bleek
      命名的提交,明天可能通过
      pribble
      命名

    • git descripe的输出更有趣,因为它不太可能改变,包括一个附近的带注释的标签,标签本身永远不会改变,尽管这要求制作标签的用户表现自己,并为您提供方便的“与标签的距离”线性计数加上一个后缀,该后缀通常精确定位特定的提交,即使没有其他信息:

      v2.12.0-190-ge0688e9
      
      例如,对于ID以