Quartus® II Tcl サブバージョン・リビジョン・ナンバーの取得

author-image

投稿者:

このサンプルスクリプトは、プロジェクトのバージョン管理ソフトウェアのバージョンナンバーにアクセスする方法を示します。FPGA デザインでコンパイルされるデザインファイルにバージョンナンバーを書き込むことができます。デザインロジックを追加することで、FPGA からバージョン番号を通知できます。この情報は、特に複数のプログラミング・ファイルを切り替えて使用している場合、デバッグ時に非常に役立ちます。どのバージョンのデザインが FPGA 上で動作しているかは、FPGA 内のバージョンナンバーから簡単に知ることができます。

この例では、プロジェクトのサブバージョン・リビジョン・ナンバーを使用します。指定したファイルの情報の取得には、svn info コマンドが使用されます。svn info コマンドは、ワーキングコピー内の項目に関する情報を出力し、以下のような形式でリビジョンナンバーを記載して行に含めます。

Revision: <リビジョン番号>

この例では、2 つのプロシージャーで svn info コマンドを実行し、その出力を解析してリビジョンナンバーを取得します。get_subversion_revision プロシージャーが svn info コマンドを開始します。svn info コマンドで使用するファイル名を指定してプロシージャーを呼び出します。コマンドを実行できなかった場合、プロシージャーはエラーを返します。そうでない場合、プロシージャーは何も返さず、特定のグローバル変数を設定します。svn info コマンドがタイムアウトした場合、グローバル変数 done の値は -1 になります。リビジョンナンバーが見つかった場合、グローバル変数 done1 となり、リビジョンナンバーはグローバル変数 revision_number に入ります。リビジョンナンバーは、この例のようにメッセージ内に表示したり、デザインファイルに書き込んだりできます。

get_version_info プロシージャーは、コマンド出力を 1 行ずつ解析するヘルパー・プロシージャーです。これには、リビジョンナンバー行にマッチしてリビジョンナンバーを抽出する正規表現が含まれます。

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 にリビジョンナンバーを入れてメッセージを表示したり、デザインファイルに書き込んだりできます。