スタンドアロンインストール用の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インストール(異なるインストール済みアプリケーションおよびライブラリ)で使用できます)。

emuemu単に/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に関する情報を追加しました。

Source: https://habr.com/ru/post/J43180/


All Articles