W tym przykładowym skrypcie pokazano, w jaki sposób możesz uzyskać dostęp do numeru wersji oprogramowania kontrolnego wersji twojego projektu. Numer wersji można napisać w pliku projektowym skompilowanym w twoim projekcie FPGA. Dzięki dodatkowej logice projektowej numer wersji może zostać zgłoszony przez FPGA. Informacje te mogą być bardzo przydatne podczas debugowania, zwłaszcza jeśli przełączasz się między wieloma plikami programowania. Możesz z łatwością dowiedzieć się, która wersja projektu działa na FPGA, na podstawie numeru wersji na FPGA.
W tym przykładzie użyto numeru wersji subwersji dla Twojego projektu. Wykorzystuje polecenie svn info, aby uzyskać informacje o określonym pliku. Polecenie svn info drukuje informacje o elementach w Kopii roboczej i zawiera linię z numerem wersji w następującym formularzu:
Wersja: numer <oddziału>
W tym przykładzie zastosowano dwie procedury, aby uruchomić polecenie svn info i analizować dane wyjściowe, aby uzyskać numer wersji. Procedura get_subversion_revision uruchamia polecenie informacji svn. Wezwij procedurę o nazwie pliku do użycia z poleceniem svn info. Procedura zwraca się z błędem, jeśli polecenie nie może zostać uruchomione. W innym przypadku procedura nie zwraca żadnego zwrotu, lecz ustawia pewne zmienne globalne. Jeśli limit czasu polecenia svn info, wartość wykonanej zmiennej globalnej wynosi -1. Jeśli znaleziono numer wersji, wartość wykonanej zmiennej globalnej wynosi 1, a numer wersji znajduje się w revision_number zmiennej globalnej. Numer wersji można wyświetlić w wiadomości, tak jak w tym przykładzie, lub zapisać go w pliku projektowym.
Procedura get_version_info jest procedurą pomocniczą, która analizuje polecenie wyjściowe wiersza na raz. Zawiera wyrażenie regularne odpowiadające wierszowi numeru wersji i wyodrębnia numer wersji.
proc get_subversion_revision { file_name } { global done # Maksymalna liczba sekund na oczekiwanie na info svn # polecenie ukończenia zestawu timeout_seconds 30 # Polecenie informacji svn z nazwy pliku, który jest uruchomiony, ustawić cmd "svn info ${file_name}" # Próba uzyskania informacji o wersji. # Jeśli polecenia nie można uruchomić, zwróć błąd. # W przeciwnym razie skonfiguruj zdarzenie pliku w celu przetworzenia danych wyjściowych poleceń. if { [catch {open "|$cmd"} input] } { return -code error $input } else { fileevent $input readable [list get_revision_info $input ] # Skonfiguruj limit czasu, aby proces nie mógł się zawiesić, jeśli repozytorium # jest wyładowane. ustaw limit czasu [po [ expr { $timeout_seconds * 1000 } ] \ [zestaw listy wykonany -1] ] # Nie kontynuuj, dopóki nie zostanie znaleziony numer wersji, liczba lub limit czasu operacji. I tak anuluj limit czasu. aktualizacja wykonywana po anulowaniu $timeout } } get_revision_info proc { inp } { globalne revision_number, jeśli { [eof $inp] } { catch {close $inp} set done 1 } elseif { $done } { gets $inp line } else { gets $inp line # Użyj wyrażenia regularnego, aby dopasować linię do numeru wersji # if { [regexp {^Revision:\s+(\d+)\s*$} $line match revision_number] } { set done 1 } } set done 0 set revision_number "" # Nazwa pliku jest zazwyczaj plikiem projektu. Zestaw .qpf file_name [lindex $quartus(args) 0], jeśli { [catch { get_subversion_revision $file_name } msg] } { post_message —type critical_warning "Nie uruchamiaj polecenia, aby uzyskać numer wersji\ $msg" } inaczej { jeśli { -1 == $done } { post_message -wpisz critical_warning "Limit czasu uzyskiwania numeru wersji." } elseif { [string equal "" $revision_number] } { post_message $msg critical_warning —typem critical_warning \ "Nie można znaleźć numeru wersji w danych wyjściowych informacji svn $file_name." } jeszcze { post_message "Wersja dla $file_name to $revision_number" } }
Skrypt można uruchomić w wierszu poleceń systemowych za pomocą następującego polecenia (przy założeniu, że skrypt znajduje się w pliku o nazwie svn_revision.tcl):
quartus_sh -t svn_revision.tcl myproject.qpf
Skrypt generuje taki komunikat, aby wyświetlić tę wersję:
Informacje: wersja dla myproject.qpf to 417
Możesz wyświetlić wiadomość z numerem wersji w globalnej zmiennej revision_number, tak jak w tym przykładzie, lub zapisać ją w pliku projektowym.