amalgamationの様子をみる~その6 [SQLite]
前回に続いて、「./tool/mksqlite3h.tcl」を見て行きます。処理のコメントを追って行くと次の様な手順となっている様です。
上記に加えて、数行の記述を加えている様ですね。この辺は、最終的な形をどうするかで決まってくる気もします。
次回は、また、「./tool/mksqlite3c.tcl」に戻ります。
- コマンドラインからソースツリーのルートディレクトリを取得
- 「VERSION」ファイルからSQLiteのバージョン番号(3.6.18とか)を取得
→フォーマットは「%d%03d%03d」となっています。「3.6.18」だと「3006018」になるのか? - 「manifest.uuid」からSCMのバージョン番号を取得
- 「manifest」の「D」カードからSCMへのチェックイン日を取得
- API宣言解釈のためのパターンを作成(内部処理用?)
- 標準出力の行末を「LF」に設定(Windowsでも同様)
- 「src/sqlite.h.in」と「ext/rtree/sqlite3rtree.h」を処理
- 「sqlite3rtree.h」を「sqlite3.h」にコピーする際に「#include <sqlite3.h>」の行を省く
上記に加えて、数行の記述を加えている様ですね。この辺は、最終的な形をどうするかで決まってくる気もします。
次回は、また、「./tool/mksqlite3c.tcl」に戻ります。
amalgamationの様子をみる~その5 [SQLite]
前回の続きを見て行きます。ま、細かい内容はともかく流れを見て行きたいと思います。
まずは「sqlite3.h」を読み込むところから始まる様子。
・・・「sqlite3.h」は「./tool/mksqlite3h.tcl」で自動生成されてますね。こちら、スルーしてましたねぇ・・・。
スクリプトをちょっと見てみたところ、短いのでこの内容から見て行きますか。次のソースから「sqlite3.h」を生成するとのこと。
2) の「VERSION」を見たところ、内容は「3.7.12」の一行のみ。末尾に改行(LF?)が入っています。
3) 4) は意味がわからないんですが、4) の方は見てみたら、ハッシュコードっぽいのが入ってました。
これをソースツリーのルートディレクトリで実行せよとのこと。ちなみに、これはtclのスクリプトです。このスクリプトは「src/sqlite.h.in」に基づいて実行されるらしいですが、このファイルとスクリプトの関係はいまのところよくわかりません・・・。その処理は下記を含む様です。
このスクリプトの出力は標準出力に出力されるとのこと。
次回、一応処理を見て行きましょう。
まずは「sqlite3.h」を読み込むところから始まる様子。
・・・「sqlite3.h」は「./tool/mksqlite3h.tcl」で自動生成されてますね。こちら、スルーしてましたねぇ・・・。
スクリプトをちょっと見てみたところ、短いのでこの内容から見て行きますか。次のソースから「sqlite3.h」を生成するとのこと。
- 「src/sqlite.h」 ←テンプレートになるとのこと
- 「VERSION」 ←SQLiteのバージョンナンバーが入っているとのこと
- 昔のSCMの「manifest」ファイル ←日付を利用(?)
- 昔のSCMの「manifest.uuid」ファイル ←「SHA1」ハッシュを得るとのこと
2) の「VERSION」を見たところ、内容は「3.7.12」の一行のみ。末尾に改行(LF?)が入っています。
3) 4) は意味がわからないんですが、4) の方は見てみたら、ハッシュコードっぽいのが入ってました。
これをソースツリーのルートディレクトリで実行せよとのこと。ちなみに、これはtclのスクリプトです。このスクリプトは「src/sqlite.h.in」に基づいて実行されるらしいですが、このファイルとスクリプトの関係はいまのところよくわかりません・・・。その処理は下記を含む様です。
- グローバル変数の定義の前に「SQLITE_EXTERN」を付加する
- API関数の定義の前に「SQLITE_API」を付加する
- 「--VERS--」と言う文字列を現在のライブラリのバージョン(例えば「3.6.17」と言う書式の文字列)に置き換える
- 「--VERSION-NUMBER--」と言う文字列を現在のライブラリのバージョン(例えば「3006017」と言う書式の文字列)
- 「--SOURCE-ID--」と言う文字列を日付、時刻とハッシュ文字列(SHA1)に置き換える
このスクリプトの出力は標準出力に出力されるとのこと。
次回、一応処理を見て行きましょう。
amalgamationの様子をみる~その4 [SQLite]
前回で、「target_source」のルールについてざ~っとみたので、次は、やっと大元の「sqlite3.c」のルールまで戻ります。
まずは「./tool/mksqlite3c.tcl」を見て行きます。冒頭のコメントから・・・。
*
「target_source」の生成等、これまで実行されていた内容が書かれていますが、「parse.c」「parse.h」が「parse.y」からlemonと言う構文解析器生成プログラムで作成して「./tsrc」に追加されると書かれています。そんな箇所あったっけ?と思ったところ、その1の記事に該当の箇所がありました。
「keywordhash.h」は「mkkeywordhash」と言うコマンドで作成されるとのこと。「./tool」ディレクトリを見たところ、「mkkeywordhash.c」と言うCソースで提供されています。こちらもその1の記事で「keywordhash.h」の生成ルールの中でコンパイルされて、即利用されていますね。
まあ、そんな感じで「tsrc」ディレクトリが作成されて、ソースがそろったらこのスクリプトを実行せよとのこと。そしたら、「sqlite3.c」を作成するよと言うことです・・。
つづく。
【参考】
・Lemon構文解析器生成プログラム
sqlite3.c: target_source $(TOP)/tool/mksqlite3c.tcl tclsh $(TOP)/tool/mksqlite3c.tcl echo '#ifndef USE_SYSTEM_SQLITE' >tclsqlite3.c cat sqlite3.c >>tclsqlite3.c echo '#endif /* USE_SYSTEM_SQLITE */' >>tclsqlite3.c cat $(TOP)/src/tclsqlite.c >>tclsqlite3.c |
まずは「./tool/mksqlite3c.tcl」を見て行きます。冒頭のコメントから・・・。
*
「target_source」の生成等、これまで実行されていた内容が書かれていますが、「parse.c」「parse.h」が「parse.y」からlemonと言う構文解析器生成プログラムで作成して「./tsrc」に追加されると書かれています。そんな箇所あったっけ?と思ったところ、その1の記事に該当の箇所がありました。
「keywordhash.h」は「mkkeywordhash」と言うコマンドで作成されるとのこと。「./tool」ディレクトリを見たところ、「mkkeywordhash.c」と言うCソースで提供されています。こちらもその1の記事で「keywordhash.h」の生成ルールの中でコンパイルされて、即利用されていますね。
まあ、そんな感じで「tsrc」ディレクトリが作成されて、ソースがそろったらこのスクリプトを実行せよとのこと。そしたら、「sqlite3.c」を作成するよと言うことです・・。
つづく。
【参考】
・Lemon構文解析器生成プログラム
amalgamationの様子をみる~その3 [SQLite]
「./tool/vdbe-compress.tcl」を見て行きます。冒頭にコメントが書かれているので、とりあえずそれを読んでみましょう・・。
ソースファイル「vdbe.c」をいじって「sqlite3VdbeExec()」実行時のスタックサイズを減らすとのこと。「vdbe.c」って、どっかから持ってきたソースなんでしょうかねぇ・・。
ところで、前回、このスクリプトが「target_source」を作成してるとか想像してましたが、「target_source」のルールの末尾に書かれている「touch target_source」が該当のファイルを作っているようですね。「touch」コマンドはファイルが無い場合に空のファイルを作成するそうです。タイムスタンプを変えるだけかと思ってました・・。
*
それはさておき、このスクリプトは特に実行しなくてもいいとのこと。実行してもしなくてもソースの動作結果は変わらない様です。単純にスタックを減らすためとのこと。組み込み向けですかね・・?
スタックの削減方法ですが、ローカル変数を個々の「opcode」の実装から抜き出して、一つの共用体(union)に詰め込んでいるとのこと。まあ、具体的には変更前と変更後のソースを見比べないと何ともわかんないですね。
ま、こういう処理もしていると言うことで、これについてはここまでにしておきます。
ソースファイル「vdbe.c」をいじって「sqlite3VdbeExec()」実行時のスタックサイズを減らすとのこと。「vdbe.c」って、どっかから持ってきたソースなんでしょうかねぇ・・。
ところで、前回、このスクリプトが「target_source」を作成してるとか想像してましたが、「target_source」のルールの末尾に書かれている「touch target_source」が該当のファイルを作っているようですね。「touch」コマンドはファイルが無い場合に空のファイルを作成するそうです。タイムスタンプを変えるだけかと思ってました・・。
*
それはさておき、このスクリプトは特に実行しなくてもいいとのこと。実行してもしなくてもソースの動作結果は変わらない様です。単純にスタックを減らすためとのこと。組み込み向けですかね・・?
スタックの削減方法ですが、ローカル変数を個々の「opcode」の実装から抜き出して、一つの共用体(union)に詰め込んでいるとのこと。まあ、具体的には変更前と変更後のソースを見比べないと何ともわかんないですね。
ま、こういう処理もしていると言うことで、これについてはここまでにしておきます。
amalgamationの様子をみる~その2 [SQLite]
次は、前々回の記事で出てきた、「main.mk」内の「target_src」のルールに戻ります。ルールを再度掲載すると、こんな感じ。
いきなり、「tsrc」と言うディレクトリを消して、再度作成しています。処理後には消さない様ですね・・。って、これはどこのディレクトリを起点に実行してるんでしたっけ??
「README」を読み返したところ、特に何も書いていない様で、「publish.sh」を見てみると、何となく任意のディレクトリで実行できそうな感じです。が、ソースのトップレベルのディレクトリが安全そうな気がしますね・・。まあ、今はどっちでもいいですか・・。
次に、対象のソースを全て、「tsrc」にコピーしていますね。その後、「SRC」内に含まれているソース以外のファイル「sqlite.h.in」「parse.y」を削除しています。
で、「./tool/vdbe-compress.tcl」に「tsrc/vdbe.c」を与えて実行しているようですね。後の行から、このスクリプトが「target_source」を作成しているのだろうと想像できます。
tclのソースの様ですが、分かりますかねぇ・・・。つづく。
target_source: $(SRC) $(TOP)/tool/vdbe-compress.tcl rm -rf tsrc mkdir tsrc cp -f $(SRC) tsrc rm tsrc/sqlite.h.in tsrc/parse.y tclsh $(TOP)/tool/vdbe-compress.tcl vdbe.new mv vdbe.new tsrc/vdbe.c touch target_source |
いきなり、「tsrc」と言うディレクトリを消して、再度作成しています。処理後には消さない様ですね・・。って、これはどこのディレクトリを起点に実行してるんでしたっけ??
「README」を読み返したところ、特に何も書いていない様で、「publish.sh」を見てみると、何となく任意のディレクトリで実行できそうな感じです。が、ソースのトップレベルのディレクトリが安全そうな気がしますね・・。まあ、今はどっちでもいいですか・・。
次に、対象のソースを全て、「tsrc」にコピーしていますね。その後、「SRC」内に含まれているソース以外のファイル「sqlite.h.in」「parse.y」を削除しています。
で、「./tool/vdbe-compress.tcl」に「tsrc/vdbe.c」を与えて実行しているようですね。後の行から、このスクリプトが「target_source」を作成しているのだろうと想像できます。
tclのソースの様ですが、分かりますかねぇ・・・。つづく。
amalgamationの様子をみる~その1 [SQLite]
前回の最後に上げた6つのソースの生成ルールは次の様に定義されています。
それぞれのソースの生成スクリプトはawkやtclで書かれている様ですね。スクリプトの中身をちらっと見てみたところ、たんに元ソースを加工するだけでなく、何らかのコードか定義を追加して行っているようです。この辺、なんでソースに含まれていないのかは分かりませんが、結合時に必要になったものを別途付けてる感じなんですかねぇ・・。
tclって、文法とかを知らないんですよねぇ・・。
最後の「keywordhash.h」は完全にプログラムで生成しているようです。なぜ、プログラムで生成する必要があるのかは、実際に出力を見ないと分かりそうにないですね。
これらのファイルについては、この辺にしておきます。
つづく。
opcodes.c: opcodes.h $(TOP)/mkopcodec.awk $(NAWK) -f $(TOP)/mkopcodec.awk opcodes.h >opcodes.c opcodes.h: parse.h $(TOP)/src/vdbe.c $(TOP)/mkopcodeh.awk cat parse.h $(TOP)/src/vdbe.c | \ $(NAWK) -f $(TOP)/mkopcodeh.awk >opcodes.h parse.h: parse.c parse.c: $(TOP)/src/parse.y lemon $(TOP)/addopcodes.awk cp $(TOP)/src/parse.y . rm -f parse.h ./lemon $(OPTS) parse.y mv parse.h parse.h.temp $(NAWK) -f $(TOP)/addopcodes.awk parse.h.temp >parse.h sqlite3.h: $(TOP)/src/sqlite.h.in $(TOP)/manifest.uuid $(TOP)/VERSION tclsh $(TOP)/tool/mksqlite3h.tcl $(TOP) >sqlite3.h keywordhash.h: $(TOP)/tool/mkkeywordhash.c $(BCC) -o mkkeywordhash $(OPTS) $(TOP)/tool/mkkeywordhash.c ./mkkeywordhash >keywordhash.h |
それぞれのソースの生成スクリプトはawkやtclで書かれている様ですね。スクリプトの中身をちらっと見てみたところ、たんに元ソースを加工するだけでなく、何らかのコードか定義を追加して行っているようです。この辺、なんでソースに含まれていないのかは分かりませんが、結合時に必要になったものを別途付けてる感じなんですかねぇ・・。
tclって、文法とかを知らないんですよねぇ・・。
最後の「keywordhash.h」は完全にプログラムで生成しているようです。なぜ、プログラムで生成する必要があるのかは、実際に出力を見ないと分かりそうにないですね。
これらのファイルについては、この辺にしておきます。
つづく。
the amalgamation generator script [SQLite]
Amalgamationってどうやってんの~? と、脱線気味に探していたところ、「the amalgamation generator script」と言うものが存在してそうな記述を見つけました。・・・それはどこにあるんかなぁ?
*
ズバリそのものが見つかりそうにないので、「README」に書かれていた「publish.sh」と言うのを見て行きます。すると「make sqlite3.c」と言う記述が!
ソースツリー内には「sqlite3.c」が無いため、それを作成する(Amalgamationする?)動作だと思われます。と言うことなので、「Makfile」を見て行こうと思いますが、これは、「publish.sh」の頭の方で「Makefile.linux-gcc」をコピーすることで作成している様なので、「Makefile.linux-gcc」を見て行きます。
「Makefile.linux-gcc」の中は定義っぽいのばかりで、最後に「main.mk」と言うのをインクルードしていますので、そっちを見ることに。「sqlite3.c」を作成する箇所は下記の様な記述になっていました。
「target_source」と「mksqlite3c.tcl」を参照してますね・・。
「target_source」の作成はこんな記述になってました。「mksqlite3c.tcl」は「./tool」配下にある様です。
こちらは「SRC」と「vdbe-compress.tcl」を参照しています。
「SRC」は「./src」「./ext」に含まれている全ソース(たぶん)と自動生成される(と言うかさせる)下記のファイルの全てを含む様です。
これらのルールもまた、この「main.mk」に書かれているようですね・・・。
長くなったので、つづく。
*
ズバリそのものが見つかりそうにないので、「README」に書かれていた「publish.sh」と言うのを見て行きます。すると「make sqlite3.c」と言う記述が!
ソースツリー内には「sqlite3.c」が無いため、それを作成する(Amalgamationする?)動作だと思われます。と言うことなので、「Makfile」を見て行こうと思いますが、これは、「publish.sh」の頭の方で「Makefile.linux-gcc」をコピーすることで作成している様なので、「Makefile.linux-gcc」を見て行きます。
「Makefile.linux-gcc」の中は定義っぽいのばかりで、最後に「main.mk」と言うのをインクルードしていますので、そっちを見ることに。「sqlite3.c」を作成する箇所は下記の様な記述になっていました。
sqlite3.c: target_source $(TOP)/tool/mksqlite3c.tcl tclsh $(TOP)/tool/mksqlite3c.tcl echo '#ifndef USE_SYSTEM_SQLITE' >tclsqlite3.c cat sqlite3.c >>tclsqlite3.c echo '#endif /* USE_SYSTEM_SQLITE */' >>tclsqlite3.c cat $(TOP)/src/tclsqlite.c >>tclsqlite3.c |
「target_source」と「mksqlite3c.tcl」を参照してますね・・。
「target_source」の作成はこんな記述になってました。「mksqlite3c.tcl」は「./tool」配下にある様です。
target_source: $(SRC) $(TOP)/tool/vdbe-compress.tcl rm -rf tsrc mkdir tsrc cp -f $(SRC) tsrc rm tsrc/sqlite.h.in tsrc/parse.y tclsh $(TOP)/tool/vdbe-compress.tcl |
こちらは「SRC」と「vdbe-compress.tcl」を参照しています。
「SRC」は「./src」「./ext」に含まれている全ソース(たぶん)と自動生成される(と言うかさせる)下記のファイルの全てを含む様です。
- keywordhash.h
- opcodes.c
- opcodes.h
- parse.c
- parse.h
- sqlite3.h
これらのルールもまた、この「main.mk」に書かれているようですね・・・。
長くなったので、つづく。
configureとか [SQLite]
先週の最後に落とした「sqlite-src-3071200.zip」の方を解凍してみたところ、ばらのソースが一式入っていました。入っていた「README」を読んだところ、「configure」して、「make」しろとのこと。こちらはこのドキュメントにビルド方法が書かれていますね・・。
*
「configure」スクリプトは、「autoconf 2.61」と「libtool」を使用するとのこと。「autoconf」はずっと以前にちらっと出てきましたね。その記事によると、configureを作るためにautoconfを使ってるとのことですが、今回は逆ですか・・。それはさておき、「configure」がうまく動かない時は「Makefile.linux-gcc」を使えとのこと。
「configure」とか「autotools」とかは以前調べた様な気がするんですが、頭に残って無い上に記事も見つかりませんね・・・。
ちなみに、Linux向けバイナリは makefile で作成されていて、configure は使って無いとか。詳しくは「publish.sh」スクリプトを見ろとか・・。それはそうと、Amalgamationの方法が見つかりませんね・・。非公開なんでしょうか・・。
どうしようかな・・。
*
「configure」スクリプトは、「autoconf 2.61」と「libtool」を使用するとのこと。「autoconf」はずっと以前にちらっと出てきましたね。その記事によると、configureを作るためにautoconfを使ってるとのことですが、今回は逆ですか・・。それはさておき、「configure」がうまく動かない時は「Makefile.linux-gcc」を使えとのこと。
「configure」とか「autotools」とかは以前調べた様な気がするんですが、頭に残って無い上に記事も見つかりませんね・・・。
ちなみに、Linux向けバイナリは makefile で作成されていて、configure は使って無いとか。詳しくは「publish.sh」スクリプトを見ろとか・・。それはそうと、Amalgamationの方法が見つかりませんね・・。非公開なんでしょうか・・。
どうしようかな・・。
SQLiteのアーカイブを開梱してみる [SQLite]
前回から、SQLiteを見て行くことにしましたが、ダウンロードサイトから「sqlite-amalgamation-3071100.zip」を落として解凍したところ・・・、ソースコードのみ。
configureファイルとか、makefileとかをどんな感じにしてるのか見たかったのに、無いの???と思ってよく見たところ、下にある「sqlite-autoconf-3071100.tar.gz」にソースとそのあたりのスクリプトファイルが含まれている様でした。後、Tcl(TEA)のための拡張も入ってるとか。
*
解凍したところ、ソースファイル以外にもたくさんファイルが入ってますね。まず、「README」を読んでみましょう。構成としては、「sqlite3.c」が本体のソースで、一ファイルになっている様です。インストール方法については「INSTALL」を読めとのことです。
ソースについては、扱いはその方が楽でしょうが、保守が大変そうですねぇ・・・。と思っていたところ、こちらのページに実際には96ファイルのCソースで構成されているとの記載がありました。何らかの方法で一つのファイル「sqlite3.c」にまとめている様です。その方法も興味ありますねぇ・・・。よく見たら、このファイルは4.5MBくらいのサイズがあります・・。このファイルはSQLiteのコア部分と、「FT3」「RTREE」と言う拡張を含んでいる様ですね。
で、そのAPIはヘッダファイル「sqlite3.h」に含まれているとのこと。でも、アーカイブに含まれているソース「sqlite3.c」にはそのヘッダファイルの中身も含まれているらしいです。「sqlite3.c」しか手に入らない状況で、「sqlite.h」も欲しいと言う場合には、「sqlite3.c」から該当部分をコピペして「sqlite3.h」を自前で作ることも可能だとか・・。ビルド時はこの「sqlite3.c」を使った方が速いだろうとのことです。
*
ソースツリーが欲しいなと思っていたところ、ダウンロードページの下の方に「Leagcy Source Code Distribution Formats」として、配布されていました。奨励はされていない様ですが・・。結合(amalgamation?)の仕方が知りたいんですが、ここにその情報は入ってますかねぇ・・・。
つづく。
configureファイルとか、makefileとかをどんな感じにしてるのか見たかったのに、無いの???と思ってよく見たところ、下にある「sqlite-autoconf-3071100.tar.gz」にソースとそのあたりのスクリプトファイルが含まれている様でした。後、Tcl(TEA)のための拡張も入ってるとか。
*
解凍したところ、ソースファイル以外にもたくさんファイルが入ってますね。まず、「README」を読んでみましょう。構成としては、「sqlite3.c」が本体のソースで、一ファイルになっている様です。インストール方法については「INSTALL」を読めとのことです。
ソースについては、扱いはその方が楽でしょうが、保守が大変そうですねぇ・・・。と思っていたところ、こちらのページに実際には96ファイルのCソースで構成されているとの記載がありました。何らかの方法で一つのファイル「sqlite3.c」にまとめている様です。その方法も興味ありますねぇ・・・。よく見たら、このファイルは4.5MBくらいのサイズがあります・・。このファイルはSQLiteのコア部分と、「FT3」「RTREE」と言う拡張を含んでいる様ですね。
で、そのAPIはヘッダファイル「sqlite3.h」に含まれているとのこと。でも、アーカイブに含まれているソース「sqlite3.c」にはそのヘッダファイルの中身も含まれているらしいです。「sqlite3.c」しか手に入らない状況で、「sqlite.h」も欲しいと言う場合には、「sqlite3.c」から該当部分をコピペして「sqlite3.h」を自前で作ることも可能だとか・・。ビルド時はこの「sqlite3.c」を使った方が速いだろうとのことです。
*
ソースツリーが欲しいなと思っていたところ、ダウンロードページの下の方に「Leagcy Source Code Distribution Formats」として、配布されていました。奨励はされていない様ですが・・。結合(amalgamation?)の仕方が知りたいんですが、ここにその情報は入ってますかねぇ・・・。
つづく。
SQLiteを見てみる [SQLite]
延々とiCalendarの仕様を見てきましたが、一応前回で一通りは見れたのかなと思ってます。まだ、見ようと思ってたところがあった様な気もしますが、まあ、必要になった時に見ることにしましょう。
で、なんでiCalendarの仕様を見てたかと言うと、何となくライブラリを作成してみたいなぁと思っていたのでした。が、仕様を見始めたのが、一年以上前。と言うことで、仕事ならいないことにされそうな速度ですね。
まあ、こんなペースなので、まあ完成なんて、夢物語みたいなものですが、そもそも汎用ライブラリ的なものを作ったことが無いため、お手本としてSQLiteがどんな感じでできているのかと言うのを見たいと思います。・・・・これも、一年以上かかったりするかもしれませんが。。 ま、おそらくSQLight関連のサイトはたくさんあると思うので、その辺も参考にしましょう。
とりあえず、公式サイトからダウンロードしときます。ドキュメントも充実している様ですね。
と言うことで、また延々と続けて行きます。(たぶん)
で、なんでiCalendarの仕様を見てたかと言うと、何となくライブラリを作成してみたいなぁと思っていたのでした。が、仕様を見始めたのが、一年以上前。と言うことで、仕事ならいないことにされそうな速度ですね。
まあ、こんなペースなので、まあ完成なんて、夢物語みたいなものですが、そもそも汎用ライブラリ的なものを作ったことが無いため、お手本としてSQLiteがどんな感じでできているのかと言うのを見たいと思います。・・・・これも、一年以上かかったりするかもしれませんが。。 ま、おそらくSQLight関連のサイトはたくさんあると思うので、その辺も参考にしましょう。
とりあえず、公式サイトからダウンロードしときます。ドキュメントも充実している様ですね。
と言うことで、また延々と続けて行きます。(たぶん)