fml8 には、 インストールされている fml のバージョン依存性を解決するために、 本章で述べるブートストラップ過程があります。
fml (libexec/distribute) が boot していく様子 functions class ---------------------------------------- main::Bootstrap() libexec/loader | V main::Bootstrap2() FML::Process::Switch | V ProcessSwitch() FML::Process::Switch | | | switch to ($obj = FML::Process:Distribute) | V ProcessStart($obj,$args) FML::Process::Flow
たとえば配送処理の場合、 loader から次々とモジュールが呼ばれていく様子は次のようになります。
/usr/local/libexec/fml/distributre (の実体は /usr/local/libexec/fml/loader) は /usr/local/etc/fml/main.cf を読みこみ、 fml_version 変数から使うべきライブラリのバージョンを決めます。 たとえば fml_vesrion が 8.0.0 となっていれば、 /usr/local/lib/fml/8.0.0/ 以下にあるライブラリを使うといった具合です。
@INC を再設定した後、 loader は FML::Process::Switch をロードし、 $0 (プロセス名)を調べます。 プロセス名から自分の仕事は配送処理なので、 FML::Process::Distribute クラスをロードすればよいことを理解します。 このクラスをロードし、配送処理に移ります。 ここで、プロセス名とロードするべきクラスの対応関係は /usr/local/etc/fml/defaults/バージョン/modules (例 /usr/local/etc/fml/defaults/8.0.0/modules) に定義されています。
こういった処理は、 見かけ上 FML::Process::Flow::ProcessStart() という関数が制御しています。 ProcessStart() が引数として FML::Process::Distribute オブジェクトを渡され、 FML::Process::Distribute オブジェクトを実行していくという流れになります。
Copyright (C) 1993-2022 Ken'ichi Fukamachi mail:< fukachan at fml.org >