Vivado で TCLファイルを、シェルスクリプトのように実行することができます。
TL;DR
スクリプトの先頭を以下のようにしておくと、 vivado で TCLスクリプトを簡単に実行することができます。
#!/bin/sh
# Make the next line a comment line for TCL \
exec vivado -mode batch -nolog -nojournal -notrace -tempDir $(mktemp -d /tmp/vivado.XXXXXXXXXX) -source "$0" -tclargs ${1+"$@"}
Details
たとえば、
puts "hello world"
というファイルを tclsh で実行する場合は、
#!/bin/sh
# the next line restarts using tclsh \
exec tclsh "$0" ${1+"$@"}
puts "hello world"
と、します。 実際には シェルスクリプトとして起動されますが、 exec コマンドによって自分を tclsh に置き換えます。このとき、 tclsh には実行しているファイルが第一引数 ($0) として渡され、それ以外の引数があれば、それら (${1+"$@"}) も渡されます。
tclsh としてこのファイルを読みだした場合、 2行目の \ によって 3行目も tclsh にとってはコメント行の扱いとなります。 3行目以降には TCLが書かれているので tclsh はいつも通り TCL を解釈します。
この Hackは tchsh の manページに記載されています。
長々説明しましたが、実は Linux の場合 puts "hello world" くらいであれば、こんな Hack は不要です。
#!/usr/bin/tclsh
puts "hello world"
これで正しく実行できます。
では、なぜこんな面倒な説明をしているのかというと #! ではいくつか制限があるためです。最大の問題は $PATH 環境変数からコマンドを探してくれないという問題です。
現実的には、この問題は env を使うことでほとんどの場合は解決します。 python3 を使う人は よく
#! /usr/bin/env python3 という shebang を見るはずです。 env は歴史的に /usr/bin/env に install されているので、これをつかって python3 を探します。
この解決方法によって、 さらに問題が発生します。 env は (こちらも歴史的に) 引数をまとめて渡すという仕様になっています。最近の GNU coreutils に含まれる env では -S オプションがあるので問題ないのですが、逆に古い env を使っているシステムとの互換性がなくなります。このへんは Wikipedia に詳細がかかれているので、興味がある人は確認してみてください。
で、 env -S に依存しない方法として、一度 shell script として実行し、置き換えるという手法がとられるのでした。
vivado を利用する場合は、以下の通りです。
#!/bin/sh
# Make the next line a comment line for TCL \
exec vivado -mode batch -nolog -nojournal -notrace -tempDir $(mktemp -d /tmp/vivado.XXXXXXXXXX) -source "$0" -tclargs ${1+"$@"}
puts "hello world"
-
-mode:vivadoには 3つのモード(gui,tcl,batch)があります。 script のときはbatchを指定 -
nolog:vivado.logファイルの生成を抑制 -
nojournal:vivado.jouファイルの生成を抑制 -
notrace: TCLの実行トレースの表示を抑制 (指定しても表示されるものはある) -
tempDir:vivadoが使用する temporary directory を指定。これを指定しないと、複数のvivadoコマンドが同じディレクトリを使って、想定外の挙動をすることがある -
source: スクリプトのソースファイルの指定 -
-tclargs: スクリプトファイルへの引数の指定