スタンドアロンインストール用のInfernoアプリケーションの準備

そのため、 Limboで特定のアプリケーションを作成し、それを別のマシンにインストールするか、インターネット経由で配布したいとします。 ほとんどの場合、このアプリケーションがインストールされる場所にはOS Infernoがインストールされていません。 苦いですが、ありそうです。 :)何をする? OS Infernoをインストールして構成するようにアプリケーションのユーザーをトレーニングしますか? アプリケーションのアーカイブにInferno(最大250 MB)の完全インストールを含めますか? いいえ、すべてがはるかに簡単です!



アプリケーションを実行するために必要な最小限にInfernoを削減する方法を見てみましょう。 これを行うには、 emu



起動時に何が起こるか(OS Infernoがどのようにロードするか)を把握する必要があります。



OS Infernoをダウンロード



emu emu



は、OSカーネル、すべてのドライバー、およびDis仮想マシンが既に含まれています。 起動時に、-rパラメーターを使用してOS Infernoルートディレクトリを転送する必要があります( emu



自体はこのディレクトリ内にある必要はありません。したがって、1つのemu



を複数の異なるOS Infernoインストール(異なるインストール済みアプリケーションおよびライブラリ)で使用できます)。



emu



emu



単に/dis/emuinit.dis



実行し/dis/emuinit.dis



(すべてのパスはOS Infernoルートディレクトリに関連しています)。これにより、システムが初期化され、 emu



パラメーターで渡されたアプリケーションまたはシェルが実行されます。 (Linuxカーネルは同じことをします。起動すると、単に制御を/ sbin / initに転送します。) emuinitのソースを見ると、「システムの初期化」が非常に大きいことがわかります。 最も単純化されたLinux初期化



以上です。 :)したがって、アプリケーションでOS Infernoのスタンドアロンインストールを取得するには、次のファイルとディレクトリで十分です。

例:Hello World



依存関係のない単純なアプリケーションから始めましょう。 これは:

 implement HelloWorld; include "sys.m"; include "draw.m"; HelloWorld: module { init: fn(nil: ref Draw->Context, nil: list of string); }; init(nil: ref Draw->Context, nil: list of string) { sys := load Sys Sys->PATH; sys->print("Hello World!\n"); }
      
      







helloworld.b



に保存し、 limbo helloworld.b



を実行するとhelloworld.dis



が得られます。

 ; ls -l --rw-r--r-- U 0 powerman users 265 Oct 25 02:54 helloworld.b --rw-r--r-- U 0 powerman users 147 Oct 25 02:54 helloworld.dis
      
      





次に、依存関係を定義しましょう。

 ; disdep helloworld.dis ; disdep /dis/emuinit.dis /dis/lib/arg.dis /dis/sh.dis /dis/lib/bufio.dis /dis/lib/env.dis /dis/lib/readdir.dis /dis/lib/filepat.dis /dis/lib/string.dis
      
      





helloworld.dis



依存関係helloworld.dis



ませんが、Sysモジュールを使用します。 実際、Sysを含むいくつかのメインモジュールはCで記述され、emuに直接組み込まれています。 emuinit.dis



多くの依存関係がありますが、直接的なものはargとshの2つだけです。 残りはshに必要です。 sh自体は、 emu



パラメーターですぐに起動する必要があるアプリケーションを指定しなかった場合にのみ必要です。 したがって、1つのargライブラリに制限できます。 行こう:

 $ mkdir inferno-standalone $ mkdir inferno-standalone/dis $ mkdir inferno-standalone/dis/lib $ cd inferno-standalone/ $ SRC=/usr/local/inferno/ $ cp $SRC/Linux/386/bin/emu ./ $ cp $SRC/dis/emuinit.dis dis/ $ cp $SRC/dis/lib/arg.dis dis/lib/ $ cp $SRC/usr/powerman/helloworld.dis ./ $ ./emu -r. helloworld.dis Hello World! $
      
      





そのため、helloworldのスタンドアロンインストールがあり、Linuxを搭載した任意のシステムで動作する準備ができています(他のOSの場合、これらのOS用にコンパイルされたemuを取得するだけです)。 彼女の体重を見てみましょう。 (ところで、Linuxのemu



はデフォルトでは削除されないため、大幅に削減できます。)

 $ strip emu $ find -type f -printf "%8s %p\n" 1562504 ./emu 147 ./helloworld.dis 652 ./dis/lib/arg.dis 1518 ./dis/emuinit.dis
      
      





例:電卓



それでは、通常のアプリケーションを見てみましょう。 たとえば、標準のInfernoユーティリティに含まれている計算機。 ところで、彼は非常に洗練されています。

 ; disdep /dis/calc.dis /dis/lib/arg.dis /dis/lib/bufio.dis /dis/lib/daytime.dis /dis/lib/string.dis /dis/lib/rand.dis $ cp $SRC/dis/calc.dis ./ $ cp $SRC/dis/lib/{bufio,daytime,string,rand}.dis dis/lib/ $ find -type f -printf "%8s %p\n" 32567 ./calc.dis 1562504 ./emu 147 ./helloworld.dis 4630 ./dis/lib/bufio.dis 652 ./dis/lib/arg.dis 209 ./dis/lib/rand.dis 4051 ./dis/lib/string.dis 4701 ./dis/lib/daytime.dis 1518 ./dis/emuinit.dis $ ./emu -r. calc.dis 1+2 3 exit $ ./emu -r. calc.dis 1+2 3 $
      
      





待って、emu自体の依存関係はどうですか?



はい、そのような瞬間があります。 別のマシンでemuを実行するには、必要なすべてのemuライブラリがそこになければなりません。 幸いなことに、ライブラリは2つしかありません。 残念ながら、両方ともXに関連しています-これらはlibX11とlibXextです。



基本的に、これらのライブラリは、Xorgを完全にドラッグすることなく、優れた方法でインストールされます。 Gentoo Linuxを搭載したサーバーにインストールする必要があるものは次のとおりです。

 # emerge -pv x11-libs/libX11 x11-libs/libXext These are the packages that would be merged, in order: Calculating dependencies... done! [ebuild N ] x11-misc/util-macros-1.1.5 47 kB [ebuild N ] x11-proto/xproto-7.0.10 140 kB [ebuild N ] x11-proto/inputproto-1.4.2.1 47 kB [ebuild N ] x11-proto/kbproto-1.0.3 57 kB [ebuild N ] x11-proto/xf86bigfontproto-1.1.2 37 kB [ebuild N ] x11-libs/xtrans-1.0.3 USE="-debug" 101 kB [ebuild N ] x11-proto/bigreqsproto-1.0.2 36 kB [ebuild N ] x11-proto/xcmiscproto-1.1.2 36 kB [ebuild N ] x11-proto/xextproto-7.0.2 67 kB [ebuild N ] x11-libs/libXau-1.0.3 USE="-debug" 225 kB [ebuild N ] x11-libs/libXdmcp-1.0.2 USE="-debug" 216 kB [ebuild N ] x11-libs/libX11-1.1.4 USE="-debug -ipv6 -xcb" 1,540 kB [ebuild N ] x11-libs/libXext-1.0.3 USE="-debug" 256 kB Total: 13 packages (13 new), Size of downloads: 2,799 kB
      
      





しかし、ネットワークアプリケーションサーバー(GUIを持たない)で作業するには、これらのライブラリは絶対に不要です。 結局のところ、アプリケーションが実行されているサーバーから/prog/



ディレクトリをマウントするだけで、ワークステーションのグラフィカルデバッガーでこのアプリケーションをデバッグすることもできます。 この問題を解決するには、特別なバージョンのemu



- emu-g



を使用します。これはlibX11およびlibXextなしでビルドおよび動作します。



エミュー


emu-g



をビルドするには、実行する必要があります

 mk CONF=emu-g install
      
      





その後、 emu-g



代わりにemu-g



を実行できます(ちなみに、 emu-g



ストリップ後の重量はemu-g



)。

 $ emu-g ; pwd /usr/powerman ; wm/wm wm: cannot load $Draw: module not built-in ;
      
      







PS .tgzのディレクトリinferno-strandaloneには、 666 KBかかりました。 :-)



更新: emu-gに関する情報を追加しました。



All Articles