Quartus® II Tcl 获取 Subversion 修订号

author-image

作者

此示例脚本展示了如何访问项目的版本控制软件版本号。可以将版本号写入在 FPGA 设计中编译的设计文件。FPGA 可以使用附加设计逻辑报告版本号。此信息在调试期间非常有用,在多个编程文件之间切换时尤其如此。可以根据 FPGA 中的版本号轻松找到正在 FPGA 上运行的设计版本。

此示例在项目中使用 Subversion 修订号。它使用 svn info 命令获取有关指定文件的信息。svn info 命令打印有关工作副本中各项的信息,其中一行包含修订号,格式如下:

Revision: <revision number>

此示例使用两个程序运行 svn info 命令并解析输出,从而获取修订号。get_subversion_revision 程序运行 svn info 命令。使用在 svn info 命令中使用的文件名调用此程序。如果无法运行此命令,此程序将返回错误。否则,此程序不返回任何信息,但会设置某些全局变量。如果 svn info 命令超时,全局变量 done 的值将为 -1。如果找到修订号,全局变量 done 的值将为 1,修订号位于 revision_number 全局变量中。可以在消息中显示修订号(如此示例所示),或者将其写入设计文件。

get_version_info 程序是一个帮助器程序,一次解析一行命令输出。它包含与修订号所在的行匹配并提取修订号的正则表达式。

proc get_subversion_revision { file_name } {

    global done

    # 等待完成 svn info 命令的
    # 最大秒数
    set timeout_seconds 30

    # 包含已运行文件的文件名的 svn info 命令
    set cmd "svn info ${file_name}"

    # 尝试获取版本信息。
    # 如果无法运行此命令,则返回错误。
    # 否则,设置一个处理命令输出的文件事件。
    if { [catch {open "|$cmd"} input] } {
        return -code error $input
    } else {

        fileevent $input readable [list get_revision_info $input ]

        # 设置超时,使存储库停止运行时此程序
        # 无法挂起。
        set timeout [after [ expr { $timeout_seconds * 1000 } ] \
            [list set done -1] ]

        # 找到修订号或操作超时时
        # 再继续。无论哪种情况,取消超时。
        vwait done
        after cancel $timeout
    }
}

proc get_revision_info { inp  } {

    global done revision_number

    if { [eof $inp] } {
        catch {close $inp}
        set done 1
    } elseif { $done } {
        gets $inp line
    } else {
        gets $inp line
        # 使用正则表达式匹配修订号
        # 所在的行。
        if { [regexp {^Revision:\s+(\d+)\s*$} $line match revision_number] } {
            set done 1
        }
    }
}

set done 0
set revision_number ""

# 文件名通常为项目文件的名称
  
  


.qpf
set file_name [lindex $quartus(args) 0]

if { [catch { get_subversion_revision $file_name } msg] } {
    post_message -type critical_warning "Couldn't run command to get\
        revision number. $msg"
} else {

    if { -1 == $done } {
        post_message -type critical_warning "Timeout getting revision number."
    } elseif { [string equal "" $revision_number] } {
        post_message -type critical_warning \
            "Couldn't find revision number in output of svn info $file_name."
    } else {
        post_message "Revision for $file_name is $revision_number"
    }
}

可以使用以下命令在系统命令提示符下运行脚本(假设脚本位于名为 svn_revision.tcl 的文件中):

quartus_sh -t svn_revision.tcl myproject.qpf

脚本生成如下所示的消息,在其中显示修订号:

Info: Revision for myproject.qpf is 417

可以显示修订号位于全局变量 revision_number 中的消息(如此示例所示),或者将其写入设计文件。