metaconfig - クラウドでオンライン

これは、Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、または MAC OS オンライン エミュレーターなどの複数の無料オンライン ワークステーションの XNUMX つを使用して、OnWorks 無料ホスティング プロバイダーで実行できるコマンド メタコンフィグです。

プログラム:

NAME


metaconfig - 構成スクリプト ジェネレーター

SYNOPSIS


メタ構成 [-dhkmostvwGMV ] [ -L DIR ]

DESCRIPTION


メタ構成 Configure スクリプトを生成するプログラムです。 何かわからない場合は、
スクリプトの設定は、次のセクションに進んでください。 チュートリアル このマニュアルページのセクション。 あなたが望むなら
使用方法の完全な(正式な)説明 メタ構成 とその単位については、をご覧ください。
REFERENCE セクション。 以下は、知識のある人向けの簡単な紹介とリファレンスです。
ユーザー。

メタ構成 のセットから動作します ユニット これは、metaconfig が知っているすべてを定義します
携帯性。 各ユニットは自己完結型であり、どこにも登録する必要はありません
パブリック U ディレクトリまたはプライベート U ディレクトリのいずれかに含める場合を除きます。 もし
dist パッケージ (metaconfig は一部です) が LIB にインストールされ、次にパブリック U
ディレクトリは LIB/dist/mcon/U です。 このマシンでは、LIB ディレクトリは /usr/share/dist です。 あなたの
プライベート U ディレクトリがある場合は、パッケージの最上位ディレクトリにあります。
走る前に メタ構成 いくつかのことを行う必要があります。

· 次のコマンドを実行して、パッケージの最上位ディレクトリに .package ファイルを作成します。 パックイット.
このプログラムはあなたの荷物について尋ね、あなたが話した内容を記憶します。
すべての dist プログラムは賢明です。

· 用語集 (LIB/dist/mcon 内) を参照し、シェル スクリプトと C プログラムを作成します。
シンボルに関しては、metaconfig が定義方法を知っています。 言う必要はないよ
metaconfig がどのシンボルを使用したかを調べます。

· Makefile または依存するシェル スクリプトを作成するために必要な .SH スクリプトを生成します。
Configure で定義された値に基づいて。 というプログラムがあります メイクSH それはあなたを助けるでしょう
プレーンなスクリプトを script.SH テンプレートに変換します。 まだ編集が必要な場合があります
結果の .SH ファイルに対して実行され、変数構成部分を
スクリプトの先頭部分 (によって生成されるインライン コメントを参照) メイクSH .SH 内で
ファイル)。

· 最上位ディレクトリに、すべてのファイルをリストする MANIFEST.new ファイルを作成します。
あなたのパッケージ。 このファイルは非公開のままであり、最終的なファイルには含まれません。
分布。 (便宜上、MANIFEST ファイルは メタ構成 if
MANIFEST.new ファイルはまだありません。) ファイル名は各ファイルの最初のフィールドである必要があります。
ライン。 いくつかの空白の後に、ファイルを説明する短いコメントを追加できます。 のみ
ソースファイルがそこにリストされているはずです。 特別なファイル パッチレベル.h (これは
パッチ適用ツールによって処理および保守されます -- を参照してください。 パット(1)) は、
MANIFEST.new ファイルですが、一部のツールでは黙って無視される場合があります。 経験則として、
RCS によって管理されているファイルのみがそこにリストされる必要があります。 パッチレベル.h ファイルである
重要な例外が XNUMX つあります。

· オプションで、エクスポートされたバージョンとなる MANIFEST ファイルを作成することもできます。
MANIFEST.new の。 そのファイルはリリースの一部にする必要があります。つまり、両方のリリースにリストされる必要があります。
MANIFEST.new と MANIFEST 自体。 のXNUMXつ メタ構成 ユニットはこれについて知っています
ファイルを作成し、Configure にリリース チェックを強制的に実行させ、すべてのファイルが確実に保存されていることを確認します。
そこにリストされているのは配布物の一部です。 MANIFEST および MANIFEST.new ファイルは次のようになります。
リンクではなく、区別してください。

· 変更する .U ファイルをプライベート U ディレクトリにコピーします。 任意の .U ファイル
プライベート U ディレクトリにあるディレクトリは、パブリック U ディレクトリにあるディレクトリよりも優先して使用されます。
ディレクトリ。 たとえば、任意のユニットを強制的に含める XNUMX つの方法は、End.U をコピーすることです。
ファイルを .U ディレクトリに追加し、依存関係として必要なユニットの名前を追加します。
?MAKE: 行の終わり。 特定のユニットはこの方法でのみ強制できます。
Warn_*.U および Chk_*.U の形式のもの。 特定のデフォルトをカスタマイズすることもできます
Myinit.U をパッケージのプライベート U ディレクトリにコピーして変数を構成します。
そのユニット内の変数を設定します。

これで実行の準備が整いました メタ構成。 それは、 構成 ファイル、およびオプションで
config_h.SH ファイル (ソースで C シンボルが使用されている場合)。 生成されたファイルは、
必要に応じて、MANIFEST.new に自動的に追加されます。 忘れずにアップデートしてください
ただしMANIFESTファイル。

新しいユニットを作成するには、次の手順を実行します。

· 同様のユニットを新しい .U ファイルにコピーします。 選択する名前は、
ユニットによって生成される変数。ただし、これはユーザーにとって便宜的なものであり、機能を提供するものではありません。
要件。 ファイル名が途切れないように、12 文字以下にする必要があります。
実際には、RCS を使用したい人が使用できるように、おそらく 10 以下にする必要があります。
切り取らずに最後に .U,v を付けます。 Metaconfig は最初の文字の大文字と小文字を使用して、
変数が実際にこのユニットによって生成されるかどうかを判断するため、大文字にしないでください。
シェル変数を生成することになっている場合はユニット名。

· 新しい .U ファイルを必要に応じて編集します。 最初の ?MAKE: 行は、
依存関係; 最後のリストの前に、このユニットが定義するすべての変数をコロン付けします。
最後のコロンの後には、この単位が依存するすべての変数 (または他の単位) が入ります。
これらのリストが正確であることは非常に重要です。 依存関係がオプションであり、
デフォルト値を使用できる場合は、依存関係の前に「+」記号を付ける必要があります。 の
本当に必要でない限り、対応するユニットはシンボルを計算するためにロードされません。
別のユニットで。

· 可能な限り、上で定義されたシェル変数に基づいてユニットをパラメータ化します。
?INIT: 行。 これにより、変数定義が Init.U ユニットまで移動されます。
これらは、Init.U の後に含まれる Myinit.U の定義によってオーバーライドできます。

· 必要な C シンボルの定義を ?H: 行として追加します。 で始まる行
.U ファイル内の ?H:?%<: は、次の場合に限り、最終的な config.h ファイルに追加されます。
metaconfig は、このユニットが必要であると判断します。 %< はユニットの名前を表します。
以下に従った場合、これはたまたまファイル名でもあります (.U なし)。
大会。 変数のいずれかの場合に備えて、各 ?H: 行に必ずコメントを入れてください。
行の前半で置換を行うと、コメントを終了せずにコメントが開始されます。 任意のシェル
d_ で始まる変数はこれを行う可能性があるため、注意してください。 ?%<: を省略すると、
metaconfig は、定義が必要なシンボルを直感的に理解しようとします。
config.h に含めます。

· 用語集の定義を、シェル変数の場合は ?S: 行、C の場合は ?C: 行として追加します。
プリプロセッサ変数。 例については、現在の単位を参照してください。 非常に重要です
各エントリは左揃えのシンボル名で始まり、各エントリは ?C: で終わります。 または
?S:。 ライン。 C プリプロセッサのシンボル エントリを変換するアルゴリズム。
config.h のコメントへの用語集はこれに依存します。

・全ての注文を必ず確認してください。 ラインは正しいです。 正しい順序は次のとおりです。

?RCS: および ?X: 基本的には単なるコメントです
?MAKE: メタコンフィグの依存関係
?Y: ユニット配置指令
?S: 用語集のシェル定義
?C: 用語集 C の定義
?H: config.h の定義
?M: confmagic.h の定義
?W: 必要なシンボル
?V: 可視シンボル
?F:本機で作成したファイル
?T: 使用される一時シェルシンボル
?D: オプションの依存関係のデフォルト値
?O: 廃止されたユニットをマークするために使用されます。
?LINT: metalint ヒント
?INIT: シェルシンボルの初期化

以下に、行の順序と使用できるさまざまな形式を示す例を示します。

?RCS: $RCS-Id$
?RCS:著作権情報
?RCS: $RCS-Log$
?バツ:
?X: 不自然な例
?バツ:
?MAKE:d_one two: three +XNUMX Five
?MAKE: -pick add $@ %
?Y:デフォルト
?S:d_one:
?S: 最初のシェル シンボル。条件付きで ONE を定義します。
?S:。
?S:XNUMX:
?S: XNUMX 番目のシェル シンボル、TWO の値。
?S:。
?円錐:
?C: 最初の C 記号。
?C:。
?C:ツー:
?C: XNUMX 番目の C 記号。
?C:。
?H:#$d_one ONE /**/
?H:#define TWO "$two"
?H:#$d_one ONE_TWO "$two"
?H:。
?M:フリップ: HAS_FLIP
?M:#ifndef HAS_FLIP
?M:#define フリップ(x) フロップ(x)
?M:#endif
?M:。
?W:%<:one_two
?V:p_one p_two:p_three
?F:ファイル ./ftest !tmp
?T:tmp 変数
?D:two='undef'
?LINT: XNUMX つ変更
?INIT:two_init='2'
: ユニットを実装するシェルコードは次のとおりです
p_one='XNUMX'
p_two='XNUMX'
p_three=""

もう一度言っておきますが、上記の単位定義は のみを表示するもの
さまざまな可能性。 いずれにせよ、そのようなユニットはほとんど役に立ちません... さらに詳しく
高度な機能についてはここでは説明しません。 を参照してください。 REFERENCE 詳細についてはセクション
完全な情報。

· 必要に応じて、ユニットをパブリックまたはプライベート U ディレクトリに置きます。

・再放送 メタ構成.

· ユニットを次の宛先に送信してください ラム@acri.fr (Raphael Manfredi) マスターコピーに含めるために、
それが一般的な関心事だと思われる場合。

検索する新しいプログラムを追加するには:

· Loc.U を編集し、プログラムの名前を ?MAKE: 行 (
XNUMX つのコロン) と loclist または trylist (プログラムが
必須かどうか)。

· メタコンフィグを再実行します。

· 一般的な内容だと思われる場合は、マスター コピーに含めるためにあなたのユニットを私に送ってください。
関心。

.U ファイルを書き込む場合の注意事項:

* デフォルトで rm が対話型になるシステムがあるため、常に「rm -f」を使用してください。

* 「--」はすべてのシェルで機能するわけではないため、「set -- ...」は使用しないでください。 「set x ...;」を使用します。
シフト"。

* unset は完全に移植可能ではないため、「unset ENV」は使用しないでください。 代わりに「ENV=」と言ってください。

* Eunice システムのため、常に echo " " (スペースを含む) を使用してください。

※使用のみ test -r、-w、-f、または -d を使用します。これは、これらが唯一の移植可能なスイッチであるためです。 で
特に、「test -x」は避けてください。

* 誰もがそれを持っていることがわかるように、V7 に付属のプログラムのみを使用してください。

* すべての grep が結果を返すわけではないため、条件付きで grep を実行する場合は $contains を使用します。
妥当なステータス。 '>/dev/null を使用して、出力を /dev/null にリダイレクトしてください。
2>&1'。

* すべての sh が後者の構造を知っているわけではないため、「if [...]」ではなく「if test」を使用してください。

* シェルエスケープとデフォルトを実行できるように、入力に myread スクリプトを使用します。
評価。 一般的な形式は次のとおりです

ケース「$grimble」
'') dflt=452;;
*) dflt="$グリムブル";;
ESAC
rp='グリムブルは何個ありますか?'
。 ./myread
グリンブル=「$ans」

* オプションのファイル パス名を要求する場合は、getfile スクリプトを使用します。
~名前の拡張と健全性チェック。 完全な説明については、Getfile.U ユニットを参照してください。

* を必ず入れてください

$startsh

によって起動またはソースされるすべての生成されたスクリプトの先頭に
構成.

* オブジェクト ファイルが次の文字で終わるという一般的な UNIX 主義を決して想定しないでください。 .o および
ライブラリ名が次で終わること .a。 使用 $_o および $_a 代わりに変数を使用します (「
Unix.U)。

* コンパイル、リンク、実行のテストを行う場合は、常に次のように記述します。

$cc $ccflags $ldflags try.c -o $libs を試してください

一部のシステムでは、コンパイルされる前にリンク フラグを指定する必要があるためです。
ターゲット (末尾のリンク ライブラリを除く)。

* '>&4' を使用して出力をリダイレクトし、ファイル記述子 #4 で重要なメッセージを発行します。
これらのメッセージのみが表示されます。 -s スイッチが与えられる 構成
コマンドライン(サイレントモード)。

* 機能が存在するかどうかを最も具体的な方法で常に判断しようとします。そうしないでください。
libc を grep できるときに「if bsd」と言います。 世の中にはハイブリッドシステムがたくさんありますが、
各機能は単独で立つか倒れる必要があります。

* 最も一般的な方法で機能が存在するかどうかを常に判断しようとします。
他のパッケージでもあなたのユニットを使用できます。

* 疑問がある場合は、デフォルトを設定して質問してください。 何も想定しないでください。

* ユーザーが間違っていると思う場合は、ユーザーが正しいかもしれないという事実を考慮してください。 のために
たとえば、使用するシステムとは別のシステムで Configure を実行している可能性があります。
最終製品が完成します。

Metaconfig はディレクトリ内に次の名前を予約します。そのような名前を使用すると、
破壊されたり、その他の予期せぬ影響が発生したりする可能性があります。

.MT/*
構成
欲しいです
廃止された
configure
config_h.SH
confmagic.h
う/*
マニフェスト.new

さらに、Configure が実行されているディレクトリ内のこれらの名前を上書きする可能性があります。

UU/*
config.sh
config.h

OPTIONS


次のオプションはによって認識されます メタ構成:

-d デバッグモードをオンにします。 デバッグしない限りあまり役に立ちません メタ構成
そのもの。

-h ヘルプメッセージを印刷して終了します。

-k 一時ディレクトリを保存しておくと、使用される作業ファイルを調べることができます。
メタ構成 あなたを構築する 構成 脚本。 デバッグする場合にのみ役立ちます。
単位

-m 大量のメモリとスワップ領域を想定します。 これにより、シンボルの検索が高速化されます。
ソース ファイルの読み込みにかなりの時間がかかり、メモリが消費されます
消費...

-o 廃止されたシンボルを新しいシンボルにマッピングします。 まだ残っている場合は、このスイッチを使用してください
ソースコード内に古いシンボルがあり、削除したくない(または削除できない)
今のところ彼ら。 それ以外の場合、廃止されたシンボルは無視されますが、
~から警告を発します メタ構成.

-s サイレントモードをオンにします。

-t シンボルが見つかったらトレースします。

-v 詳細モードをオンにします。

-w 求められているファイルは最新であると仮定します。 これにより時間と記憶がスキップされます
ソース コード スキャンの消費段階で、既知のシンボルを探します。 これを使って
ソースファイルが変更されていないことがわかっている場合にのみ、
のプール メタ構成 使用される記号。

-G GNUも提供します configure生成されたフロントエンドのようなもの 構成
スクリプトもディストリビューションに含まれる予定です。 これは単なるラッパーです
周りに 構成 スクリプトは自然ですが、これにより、人々は
新しいディストリビューションに直面したときに失われないようにするための GNU ツール。

-L DIR デフォルトのライブラリの場所を上書きします。 通常はメタコンフィグにのみ役立ちます
メンテナは、開発中のユニットをローカルで使用できます。
公的に入手可能なもの。 の DIR 指定されたものは単位を含むものです
U ディレクトリにあります。

-M の生産を許可する confmagic.h ファイルを使用して、いくつかのウェルを自動的に再マッピングします。
既知のシンボルを他の代替手段に置き換える bコピー() 再マッピング中
透過的に memcpy() 利用できないとき。 このオプションはオンになっています
自動的に confmagic.h ファイルは最上位ディレクトリに存在します。
このオプションを永久に無効にしたい場合は、そのファイルを削除してください。

-V バージョン番号を出力して終了します。

チュートリアル


この (長い) セクションは、 メタ構成、そこで私たちはすべてを学びます
基本。 すでに使い方を知っている場合 メタ構成、次へ安全にスキップできます
のセクションから無料でダウンロードできます。

概要
通常、特定のプラットフォームでコンパイルするソース パッケージを取得したい場合は、
メインの Makefile を編集するには (それがあると仮定して!)、C コンパイラを選択してください。
適切なライブラリを用意してから、 make 指示。 パッケージが合理的であれば
よく書かれているので、コンパイルできます (オプションの警告なしで :-)。 それ自体は最後に
現在利用可能なさまざまな UNIX プラットフォームを考慮すると、この文は本物のパフォーマンスです。
そしてフレーバーの多様性、それはパッケージの作者が深く追求したことを意味します
標準的な試行、推測、混乱を考慮すると、正しい選択を見つけるのに苦労する
システムのインクルードとタイプについて説明します。

しかし、これだけの才能にもかかわらず、著者は、あるシステムに
システムコールが壊れているか、システム構造の一部に標準フィールドが XNUMX つ欠けている、または
単に指定されたインクルード ファイルが存在するかどうかだけです。 そして私は暗黙のことを考慮していません
によって返される型などの仮定 malloc() 機能またはその存在
リネーム() いくつか例を挙げると、システムコールです。 しかし、その知識は本当のことを達成するために必要です
移植性。

今、自分自身を虐待しないようにしましょう。 その情報を使用するには、より高度なスキルが必要ですが、
システムに依存しない方法で記述されるため、より移植性の高いプログラムが可能になります。
ある仮定が特定のシステム上で真か偽であるという事実のみに依存します。
それぞれの仮定は互いに無関係です。 つまり、私たちは「私たちは~にいます」とは言いません。
BSD システム、または USG システムを使用しています。 とにかく今では曖昧すぎます。 いいえ、そうしたいです
ソース コードにこう言います: このシステムには リネーム() システムコールと malloc()
を返す (空所 *) の値です。

Metaconfig はまさにそれを可能にするツールですが、次のような利点もあります。
すべてがうまくいった場合は、Makefile を手動で編集する必要があります。 走ることで メタ構成を作成すると、
という名前のシェルスクリプト 構成。 Configure スクリプトには多大な労力が費やされました。
現時点で利用可能な既存のシェルの 99% で動作することを保証するための内部構造
書き込み。 Configure はターゲット システムを調査し、疑問がある場合は質問します。
すべての回答を XNUMX つのシェル ファイルに収集し、これを次の目的に使用できます。
設定された Makefile と C インクルード ファイルを自動的に生成します。

シェル スクリプトで使用できるシンボルのセットは限られています (ただし、かなり大きい)。
そしてCプログラム。 これらはすべて用語集ファイルに文書化されています。 必要なのは学ぶことだけです
それらについて説明し、移植性と構成の問題に対処するためにそれらを使用し始めてください。 それから、
実行することにより メタ構成を選択すると、パッケージに適した構成スクリプトが生成されます。

構成スクリプトは複数のユニット (300 以上) で構築されており、各ユニットは
少数のシェルおよび/または C シンボルの定義を担当します。 ユニットが組み立てられています
依存関係グラフを尊重して、最終段階で一緒に実行します (XNUMX つのユニットが結果を必要とする場合があります)
他のいくつかのユニットはスクリプトの前に配置されます)。

シンボル
シンボルはその中で最も重要なものです メタ構成 世界。 彼らは最も小さいです
認識されたエンティティ (通常は単語) であり、設定の最後に値を付与できます。
実行。 たとえば、C プリプロセッサ シンボル HAS_RENAME   メタ構成 それを象徴する
が定義されることが保証されるのは、 リネーム() システムコールが存在します。 同じく、
  $ranlib シェル変数は、
に電話する ランリブ ライブラリファイルを注文するにはプログラムが必要です。 これがどのように機能するかはそうではありません
現時点では重要ですが、重要なのは、これらのシンボルには次のような性質が与えられていることを理解することです。 生活
(つまり値) 構成 実行。

シンボルの使用は比較的簡単です。 C ソース ファイルでは、単に次のシンボルを使用します。
プリプロセッサ ディレクティブとしての値 (たとえば: #ifdef HAS_RENAME) または、記号の場合
value は文字列です。C でマクロを使用する場合と同様に、シェル ファイルまたは
Makefile では、シェル シンボルを直接参照できます。

実際のところ、私は嘘をついています。なぜなら、それは前の段落ほど完全に魔法ではないからです。
聞こえるかもしれない。 C ファイルには、Configure で生成された config.h ファイル、および
シェル スクリプトまたは Makefile を .SH ファイルでラップする必要があり、シェルを参照することもできます。
シンボルは、その .SH ファイルの変数置換部分にのみ含まれます。 これについては後で詳しく説明します。

ソース
シンボルは、限られたソース ファイルのセットにのみ表示される場合があります。 メタ構成 のみ
既知のシンボルを探すときにそれらをスキャンし、必要な単位を把握しようとします。
C ソース ファイル、つまり、 .c, .h, .y or .l 拡張、および
シェル シンボルは .SH ファイル内でのみ検索されます。

シンボルの値を取得するには、C ファイルに特別な config.h
ファイル、によって作成されます 構成 C シンボルが存在する場合。 そして、.SHファイルが実行されます
シェルを介して新しいファイルを作成します。 ただし、.SH ファイルの先頭セクションでは、
特別 config.sh ファイル (実行によっても生成されます) 構成) はソースであり、変数です
代替品が適用されます。 実は、 config.h を実行することによって生成されます メタ構成 - 生産された
config_h.SH ファイルを再度変数置換を使用して作成します。 それでは、それを見ていきます
ここが全体の中心なので、もう少し詳しく見てみましょう の監視 スキーム...

変数 置換
というシェル構造があります こちら ドキュメント コマンドが入力を取得できるようにします
スクリプト自体の中で指定されます。 その入力はシェルによって double-
ヒアドキュメントの形式に応じて引用符で囲まれた文字列または一重引用符で囲まれた文字列
仕様。

ヒアドキュメントを指定するには、「<<」トークンの後に単一の識別子を使用します。 から
その後、残りのスクリプト行がコマンドの入力を形成し、ここまで続きます。
ドキュメントが単独で行上に見つかります。 シェル置換(シェル変数を含む)
置換) は、識別子が一重引用符で囲まれていない限り実行されます。 例えば:

var='最初'
tar='秒'
echo "--> 最初のここのドキュメント:"
猫<
var='$var'
tar='$tar'
EOM
echo "--> ここの XNUMX 番目のドキュメント:"
猫 <<'EOM'
$varをエコーする
$tarをエコーする
EOM
エコー「-->終了」。

シェルを通して実行すると、次のものが生成されます。

--> 最初のドキュメントは次のとおりです。
var='最初'
tar='秒'
--> XNUMX 番目のドキュメント:
$varをエコーする
$tarをエコーする
--> 終了。

最初のヒアドキュメントの内容は解釈され、XNUMX 番目のドキュメントはそのまま出力されます。
これから説明するように、どちらも .SH スクリプトで役立ちます。

使い方 。NS スクリプト
.SH スクリプトは通常、次のコマンドを実行することによって生成されます。 MakeSH 既存のファイル以外のスクリプト、
変換 file ファイル.SH。 一つの例を挙げてみましょう。 ここに小さなスクリプトがあります
(それを呼びましょう インサイズ) 単一のメッセージを出力します。 int型 C のデータ型。
残念ながら、それには値が組み込まれているため、次のようになります。

#!/bin/sh
intsize='4'
echo "このマシンでは、int 型は $intsize バイトです"

走ろう メイクSH 「」と入力してその上でメイクSH インサイズ'。 シングルを手に入れます intsize.SH そのファイル
次のようになります。

$CONFIG の場合
'')
if テスト -f config.sh; 次に TOP=.;
elif テスト -f ../config.sh; 次に TOP=..;
elif テスト -f ../../config.sh; 次にTOP=../ ..;
elif テスト -f ../../../config.sh; 次にTOP=../../.。;
elif テスト -f ../../../../config.sh; 次にTOP=../../../.。;
ほかに
echo "config.sh が見つかりません。"; 出口1
fi
。 $TOP/config.sh
;;
ESAC
: これにより、SH ファイルは強制的に SH ファイルと同じディレクトリにターゲットを作成します。
: これは、make depend が常に SH 導関数がどこにあるかを知るためです。
ケース「$0」
*/*) cd `expr X$0 : 'X\(.*\)/'` ;;
ESAC
echo "intsize を抽出しています (変数置換あり)"
: ファイルのこのセクションでは変数置換が行われます。
: 設定サブスクライブが必要なものはすべて !NO!SUBS! から移動します。 !GROK!THIS! までのセクション。
: 解釈されたくないドル記号とバッククォートを保護します。
: 前にバックスラッシュを置きます。 これらのコメントは削除しても構いません。
$spitshell >intsize <
$startsh
!グロッ!これ!

: 以下のドルとバッククォートでは、余分なバックスラッシュは必要ありません。
$spitshell >>intsize <<'!NO!SUBS!'
intsize='4'
echo "このマシンでは、int 型は $intsize バイトです"
!いいえ!サブス!
chmod 755 intsize
$eunicefix intsize

このスクリプトの最初の部分 ( 場合 ステートメント) を見つけようとしています config.sh
ファイルをソースするために。 の $CONFIG 変数はデフォルトでは false ですが、次の場合は true になります。
config.sh すでにソースされています (このファイルがから実行された場合に当てはまります)
以内 構成 それ自体ですが、ここで問題を混同しないようにしましょう)。

一度 config.sh ファイルはソースであり、によって定義されたすべてのシェル シンボルが含まれています。 構成  
セット。 XNUMX 番目の case ステートメントに到達したことがわかります。これは、現在のディレクトリを変更するために使用されます。
このプログラムに到達するためにパスを使用する必要があります (たとえば、「sh ../scripts/intsize.SH'、 私たちは
最初に実行するのは 'cd ../スクリプト続行する前に)。 これを理解できない場合は、しないでください
心配してください。

ここで興味深いことが起こります。 このスクリプトでは、 $スピットシェル 変数ですが、そうではありません
私たちが知っていることは...まだあります。 用語集ファイルを見ると、次のことがわかります。
これはによって知られる変数です メタ構成。 このファイルをディストリビューションの一部にすると、
(これを MANIFEST.new ファイルに含めることにより、後で説明します) を実行します。
メタ構成、 そうして 構成 スクリプトはこの変数に適切な値を決定します
そしてそれはに設定されます config.sh。 同じことが言えます $startsh そして神秘的な $eunicefix at
終わり。 合理的なシステムでは、 config.sh 次のようになります:

spitshell='猫'
startsh='#!/bin/sh'
ユニスフィックス=':'

ああ! そこに近づいています。 今では見慣れたものに見えます。 私たちはシングルに直面しています cat 誰のコマンド
入力は変数補間されたヒアドキュメントから取得され、その出力はにリダイレクトされます。
インサイズ。 値は次のようになります。 $startsh、つまり「#!」/bin/sh'。 ここまでは大丈夫です。

次に、スクリプトの残りを取得するために、XNUMX 番目のヒア ドキュメント展開に到達します。 これ
ヒアドキュメントのシンボルは一重引用符で囲まれているため、内容は次のようになります。
に逐語的に追加されました インサイズ ファイル。 したがって、「」を実行すると、sh intsize.SH' を取得します。
次の出力:

intsize の抽出 (変数置換あり)

生成された intsize ファイルを見ると、次のことがわかります。

#!/bin/sh
intsize='4'
echo "このマシンでは、int 型は $intsize バイトです"

それはまさに私たちが最初に持っていたものです。 ここまでは無操作手順です...
しかし、何と素晴らしいことでしょう。 それはたまたまです(まったくの偶然です、信じてください!)。 メタ構成 知っている
$intsize シェルのシンボル。 intsize の初期化を変数に移動することで、
.SH スクリプトの補間領域とそれを使用した初期化 構成- 計算された値、
によって追加された不要なコメントを削除します メイクSH、 我々が得る:

$CONFIG の場合
'')
if テスト -f config.sh; 次に TOP=.;
elif テスト -f ../config.sh; 次に TOP=..;
elif テスト -f ../../config.sh; 次にTOP=../ ..;
elif テスト -f ../../../config.sh; 次にTOP=../../.。;
elif テスト -f ../../../../config.sh; 次にTOP=../../../.。;
ほかに
echo "config.sh が見つかりません。"; 出口1
fi
。 $TOP/config.sh
;;
ESAC
ケース「$0」
*/*) cd `expr X$0 : 'X\(.*\)/'` ;;
ESAC
echo "intsize を抽出しています (変数置換あり)"
$spitshell >intsize <
$startsh
intsize='$intsize'
!グロッ!これ!

$spitshell >>intsize <<'!NO!SUBS!'
echo "このマシンでは、int 型は $intsize バイトです"
!いいえ!サブス!
chmod 755 intsize
$eunicefix intsize

もちろん、シェルを通じてこのスクリプトを実行すると、同じスクリプトが再度出力されます。 しかし、もし
私たちは走る 構成 マシン上で int型 64 ビット量として保存されます。 config.sh 意志
セッションに インサイズ 8と インサイズ スクリプトには正しい値が含まれ、次のように出力されます。

このマシンでは int 型は 8 バイトです

どちらが正しい。 おめでとう! シェルスクリプトを設定しました!!

プロデュース config.h
今、その道を見てみましょう config.h から生産されます config_h.SH。 私達はことを知っています
ランニング 構成 を生成します config.sh スクリプト (これがどのように正確に行われるかは厳密にはわかりません)
ここに関連しますが、興味がある方のために、これはここでの別のドキュメントの置換です。
構成 自体)。 の config_h.SH それ自体はによって構築されます メタ構成 同時に
構成 ただし、ソース内で少なくとも XNUMX つの C シンボルを使用する場合に限ります。

ランダムに見てみましょう config_h.SH 実際に何が起こるかを確認するには、次のファイルを使用します。

$CONFIG の場合
'')
if テスト -f config.sh; 次に TOP=.;
elif テスト -f ../config.sh; 次に TOP=..;
elif テスト -f ../../config.sh; 次にTOP=../ ..;
elif テスト -f ../../../config.sh; 次にTOP=../../.。;
elif テスト -f ../../../../config.sh; 次にTOP=../../../.。;
ほかに
echo "config.sh が見つかりません。"; 出口1
fi
。 $TOP/config.sh
;;
ESAC
ケース「$0」
*/*) cd `expr X$0 : 'X\(.*\)/'` ;;
ESAC
echo "config.h を抽出しています (変数置換あり)"
セド< config.h -e 's!^#undef!/define!' -e 's!^#un-def!#undef!'
/*
* このファイルは config_h.SH スクリプトを実行することによって生成されました。
* config.sh から値を取得します。config.sh は通常、次のように生成されます。
* 構成を実行中。
*
※必要に応じて自由に修正してください。 ただし、注意してください。
* config.h.SH を再度実行すると、行った変更はすべて消去されます。
* より永続的な変更を行うには、config.sh を編集し、config.h.SH を再実行します。
*/

/* 構成時間: $cf_time
* 構成者: $cf_by
* 対象システム: $myuname
*/

#ifndef _config_h_
#define _config_h_

/* bコピー:
* bcopy() ルーチンが存在しない場合、このシンボルは memcpy にマップされます。
* 文字列をコピーできます。
*/
/* HAS_BCOPY:
* このシンボルは、bcopy() ルーチンが利用可能な場合に定義されます。
* メモリのブロックをコピーします。 この記号は以下の環境では使用しないでください。
* 通常の状況では、代わりに bcopy() を直接使用します。
* bcopy が使用できない場合は、memcpy() にマップされます。
*/
#$d_bcopy HAS_BCOPY /**/
#ifndef HAS_BCOPY
#ifdef bcopy
#un-def bcopy
#endif
#define bcopy(s,d,l) memcpy((d),(s),(l)) /* memcpy にマップされる */
#endif

/* HAS_DUP2:
* このシンボルが定義されている場合、dup2 ルーチンが
* ファイル記述子の複製に使用できます。
*/
#$d_dup2 HAS_DUP2 /**/

/* I_STRING:
* このシンボルが定義されている場合、C プログラムに対して次のことを示します。
* 含む(USG システム) の代わりに(BSD システム)。
*/
#$i_string I_STRING /**/

#endif
!グロッ!これ!

ファイルの先頭で、すでに用意されている標準の .SH 構造を認識します。
詳しく勉強しました。 次に、ヒアドキュメントを介してファイル自体を抽出します。
変数の置換。 ただし、ここではプレーンは使用しません。 cat しかし、 sed 代わりに、
さらにその場で編集を行う必要があります。 理由は後ほどわかるので忘れましょう
今それについて。

ここで先頭のコメントに到達し、ファイルには設定時間のタグが付けられています。
ターゲット システムなど... (これらの変数はソースから取得されます) config.sh ファイルは
によって設定されました 構成)。 そのコメントヘッダーの後には、「#ifndef」保護が続きます。
このファイルの複数のインクルードに対して。 次に、ファイルの中心部分が来ます...

そのことを知るのに役立ちます $d_* および $i_* 変数は次のいずれかに設定されます。定義します'または'未定義' による
構成関数またはインクルード ファイルがシステム上に存在するかどうかに応じて、
ない。 それは次のことを意味します:

#$d_bcopy HAS_BCOPY /**/

行は次のいずれかに展開されます。

#define HAS_BCOPY /**/

$d_bcopy 変数が「define」に設定されている場合、または:

#undef HAS_BCOPY /**/

$d_bcopy が 'undef' に設定されている場合、その機能は存在しませんでした。 しかし、そうではありません
に何が書かれているか config.h ファイルのため sed すでに見たフィルター、
これにより、XNUMX 番目の形式が次のように変換されます。

/*#define HAS_BCOPY /**/

これは後で編集するのに便利なフォームです config.h を削除するだけでよいため、
上書きする場合は先頭に「/*」を付けます 構成さんの選択。 同様に、単一のを追加することもできます
特定のシンボルの定義を回避するには、「#define」行の先頭に「/*」を使用します。
このため、各シンボル定義は先頭のシンボルを閉じるために末尾の「/**/」で保護されています。
コメントは '/*' によって開かれます (コメントは C ではネストされません)。

'#undef' を '/*#define' に変換するのは良いことですが、実際に
「#undef」、私たちは行き詰まっています...「#un-def」と書いて許可しない限り、 sed それを「#undef」に修正してください
制作中 config.h、これがここで実際に行われていることです。

同じような推論が次の XNUMX 行にも当てはまります。

#$d_dup2 HAS_DUP2 /**/
#$i_string I_STRING /**/

そして仮定すると config.sh 定義します:

d_dup2='定義'
i_string='undef'

私たちは生産されたものに入ります config.h:

#define HAS_DUP2 /**/
/*#I_STRING を定義 /**/

流水のように透明ですか? 良い!

これで、次のことが明らかになるはずです。 config.h すべての C ソース ファイルで、次のことを行うことができます。
何を知っている 構成 あなたのシステムを推測しました。 実際、これらの記号を使用すると、
設定された C コードを記述するため、 メタ構成 それらのシンボルが必要であることがわかり、
適切なものを生成する config_h.SH ファイルと必要なすべてのコード 構成 〜へ
(関連するシェル変数に値を割り当てることによって) それらの適切な値を計算します。

Running: メタ構成
に焦点を当てましょう メタ構成 しばらくプログラムを実行して、その単位がどのように使用されるかを理解します。
ソース コードを使用して、必要なすべての構成ファイルを生成します。 新しく書こうと思ったら
単位を取得するには、全体のスキームをよく理解する必要があります。

MANIFEST.newファイルがない場合は、 メタ構成 代わりに MANIFEST ファイルを使用しようとします。
便宜上。 MANIFEST.new について言及している箇所はどこでも、MANIFEST として理解できます。
パッケージのルートに MANIFEST.new ファイルが見つからない場合に限ります。

MANIFEST.new ファイルが適切に設定されており、必要なすべてのソース ファイルがリストされていると仮定します。
設定し、実行したことを確認します パケット ルートソースディレクトリに
。パッケージ ファイルを実行してください メタ構成 すると以下が得られます:

$メタコンフィグ
ユニットを検索中...
312 ユニットから依存関係リストを抽出しています...
MANIFEST.new からファイル名 (*.[chyl] および *.SH) を抽出しています...
手配中のファイルを構築しています...
.[chyl] ファイルのシンボルをスキャンしています...
.SH ファイルのシンボルをスキャンしています...
最適な依存関係グラフを計算しています...
プライベートメイクファイルを構築しています...
ロード可能なユニットを決定中...
メイクファイルを更新しています...
ユニットの正しい順序を決定しています...
構成を作成しています...
完了しました。

最初のフェーズでは、パブリック ディレクトリ内のすべてのユニット ファイル (.U で終わる) を検索します。
最初に、次にあなたのプライベートで。 プライベート U ディレクトリにパブリック ファイルをコピーする場合
(つまり、パッケージの最上位にある U という名前のディレクトリ)、パブリック ディレクトリをオーバーライドします。
バージョン。 利用可能なすべてのユニットのリストを取得すると、それらを解析してすべてのユニットを抽出します。
?MAKE: 行を参照すると、依存関係と既知のシェル シンボルについて知ることができます。 また
?H: 行に焦点を当てて、C シンボルとどのシェル シンボルが必要かを学習します。
その C シンボルの適切な値を取得するために計算されます (したがって、別のレベルの依存関係が存在します)
ここに)。

次に、適切なファイル名が MANIFEST.new ファイルから抽出され、 欲しいです ファイルは
build: このファイルには、そのパッケージに必要なすべての C シンボルとシェル シンボルがリストされています。 私たちは
まず C タイプ ファイルをスキャンして C シンボルを探し、次に依存関係をそれらのファイルに伝播します。
関連するシェル シンボル (?H: 行から収集)。 次に .SH ファイルがスキャンされ、最後に
すべてのシェル シンボルがわかっています。

一時的な Makefile が構築され、metaconfig が試行されます。 make 表示されるすべてのシェル シンボル
どのコマンド (XNUMX 番目の ?MAKE: 行にリストされている) が実行されるか、したがってどのユニットが実行されるか
本当に必要です。 他に必要のないオプションのユニットは削除され、XNUMX 番目の Makefile が作成されます。
生成された。 今回は、すべてのユニットとそのそれぞれの順序、オプションについて知っています。
ユニットは削除され、シェル シンボルのデフォルト値が計算されます。 の
構成 スクリプトを生成できます。 config_h.SH。 終わったね。

表記
プロセス全体を健全なものにするためには、適切な規則に従う必要があります。 場合があります
単位の規則と変数の命名規則。

特殊なユニットでない限り、すべてのユニットの最初の文字は小文字にする必要があります。 による
特別な、つまり、それらは実際には、
ユーザーは .SH ファイル内に記述されますが、むしろユニットがスクリプトやシェル変数を生成します。
によって内部的に使用される 構成 脚本。 典型的な例としては、 初期化U ファイルは
メイン変数の初期化、または Myread.U を生み出すのは 私の読み取り ほぼ使われているスクリプト
どこでも 構成 ユーザーに質問するとき。

特殊でないユニットは、変数を定義するユニットという XNUMX つの異なるグループに細分されます。
C シンボルと独自のシェル変数を定義するユニットに関連付けられています。 最初のグループ
インクルード ファイルに関連する変数にさらに分割されます (名前は i_)と
他の定義に関連する変数(で始まる名前) d_)。 XNUMX番目のグループは、
たとえば、名前自体がそれ自体を表す cc.U を定義します $cc 値が次のようなシェル変数
使用する C コンパイラ。

特殊ユニットは、事前に定義された変数を予約し、「結果」を返す場合があります。
他のよく知られた変数でも。 たとえば、 私の読み取り Myread.U が作成したスクリプト
のプロンプトが期待されます $rp、のデフォルトの答え $dflt ユーザーの回答を次の場所に置きます $ans.
これはこのマニュアル ページには記載されていません。ユニット自体を調べて確認する必要があります。
どの変数が使用されるか、単位がどのように使用されるかを理解します。

使い方   用語解説
用語集ファイルは、 メイクグロス スクリプト、
?S:、?C:、および ?MAKE: 行からの情報をアルファベット順に再フォーマットします。
分類された用語集。 自分のシンボルについて知るために用語集を読むことが重要です
使用が許可されています。 ただし、用語集ではその使用方法については説明されていません。 通常、それは
あなた次第。

いつか、あなたもおそらく独自の単元を作成し、次のことについて十分に知ることになるでしょう。 メタ構成
それを迅速かつ効率的に行うために。 ただし、作業内容を適切に文書化することを決して忘れないでください。
?S: 行と ?C: 行、または他の人がそれを再利用することはできません。 について覚えておいてください
用語集とこのマニュアル ページだけがあれば始められる時代でした。

まとめ
今あなたが知っている メタ構成 基本的には、読んでください。 DESCRIPTION セクション、その後
にスキップしてください REFERENCE セクションでは、許可されているものなど、すべての悲惨な詳細について学びます。
ユニット制御行 (「?」で始まる行) または個別の MAKE コマンドの構文
使用することが許可されています。

REFERENCE


このセクションでは、 メタ構成、基本的に単位構文、特殊な
知っておくべきユニットとヒントファイル。

ユニット 構文
メタ構成ユニットは XNUMX つの異なる部分に分割されます。 ヘッダー セクション (次の行から始まる)
'?' 付き) とシェル セクション ( 構成 脚本)。 それは
ユニット内のどこにでも「?X:」コメントを追加できますが、他の「?」コメントは追加できません。 行(また
呼ばれます コントロール ライン) には厳格な注文ポリシーがあります。

制御行が長すぎる場合は、最後の行をエスケープすることで継続を使用できます。
バックスラッシュを含む改行と次の行への継続 (その後、インデントする必要があります)
スペースまたはタブで区切ります)。

以下は、各制御線の正式な説明です。 明記されていない限り
それ以外の場合は、このプレゼンテーションの順序が単元内で使用される順序になります。

?RCS: 無料です。 클라우드 기반 AI/ML및 고성능 컴퓨팅을 통한 디지털 트윈의 기초 – Edward Hsu, Rescale CPO 많은 엔지니어링 중심 기업에게 클라우드는 R&D디지털 전환의 첫 단계일 뿐입니다. 클라우드 자원을 활용해 엔지니어링 팀의 제약을 해결하는 단계를 넘어, 시뮬레이션 운영을 통합하고 최적화하며, 궁극적으로는 모델 기반의 협업과 의사 결정을 지원하여 신제품을 결정할 때 데이터 기반 엔지니어링을 적용하고자 합니다. Rescale은 이러한 혁신을 돕기 위해 컴퓨팅 추천 엔진, 통합 데이터 패브릭, 메타데이터 관리 등을 개발하고 있습니다. 이번 자리를 빌려 비즈니스 경쟁력 제고를 위한 디지털 트윈 및 디지털 스레드 전략 개발 방법에 대한 인사이트를 나누고자 합니다.
ユニットの上部にある RCS コメントに使用されます。

?バツ: どれか 클라우드 기반 AI/ML및 고성능 컴퓨팅을 통한 디지털 트윈의 기초 – Edward Hsu, Rescale CPO 많은 엔지니어링 중심 기업에게 클라우드는 R&D디지털 전환의 첫 단계일 뿐입니다. 클라우드 자원을 활용해 엔지니어링 팀의 제약을 해결하는 단계를 넘어, 시뮬레이션 운영을 통합하고 최적화하며, 궁극적으로는 모델 기반의 협업과 의사 결정을 지원하여 신제품을 결정할 때 데이터 기반 엔지니어링을 적용하고자 합니다. Rescale은 이러한 혁신을 돕기 위해 컴퓨팅 추천 엔진, 통합 데이터 패브릭, 메타데이터 관리 등을 개발하고 있습니다. 이번 자리를 빌려 비즈니스 경쟁력 제고를 위한 디지털 트윈 및 디지털 스레드 전략 개발 방법에 대한 인사이트를 나누고자 합니다.
一般的な目的のコメント。 ユニット内のどこにでも出現できますが、両端揃えで配置する必要があります。
RCS コメントについては、?RCS: コメント フォームを使用してください。

?作る:シンボル リスト: 依存関係 リスト [+オプション]
これは最初の依存関係行です。 最初 シンボル リスト すべてのシンボルをリストする必要があります
このユニットによって構築されます (つまり、その値はユニットのシェル セクションによって計算されます)。
記号はスペースで区切る必要があります。 定義されたシンボルが内部使用のみを目的としており、
生成されたファイルには表示されないはずです config.sh ファイルの場合、その前に
'+' (今後定義されるオプションの依存関係と混同しないでください)。 二番目
リストの一部 (中央の「:」以降) は単位の依存関係です。 すべてリストされるはずです
必要な特殊単位と、シェルで使用されるすべてのシンボル
実装。 シンボルがネッディングされているが、その設定値が重要ではない場合、
の前に「+」を付けることができます。この場合、条件付き依存関係と呼ばれます。
対応するユニットは、そのシンボルが実際にそうでない場合にのみロードされます。
欲しかった; それ以外の場合は、デフォルト値が使用されます。

?作る:タブ command
最初の依存関係行の後に XNUMX つ以上のコマンド ラインが存在する場合があります。 それらの
コマンドは、ユニットがコマンドをロードしたいときに実行されます。 構成。 見る
詳細については、make コマンドに関する段落を参照してください。 先頭の タブ
の前に文字が必要です command.

?Y:レイアウト
このユニットのレイアウトディレクティブを宣言します。 そのディレクティブは文字列の XNUMX つである可能性があります
top, デフォルト or ボトム (大文字と小文字は関係ありません。推奨されるスタイルは、それらを詳しく説明することです
大文字)。 省略した場合は、 デフォルト 想定されます。

このディレクティブは、ユニットを強制的に上部または下部に配置する場合にのみ必要です。
生成されたの 構成 ユニットの依存関係により許可されるスクリプト。 重要
したがって、最初に質問が強制される可能性があります。 同じレイアウト クラス内のユニット
d_* および i_* 単位の XNUMX つの特殊なケースを使用してアルファベット順にソートされます。強制的に
それぞれクラスの最上位と最下位にあります (ただし、これらは
デフォルトのクラス)。

他のすべてのユニットが依存関係にあるユニットを先頭に強制的に配置すると、
その前に、何も興味深いことは達成されません。 したがって、そのディレクティブは実際には
多くの機能に依存しない一部の対話型ユニットの優先順位を上げるために使用されます。
パス関連の質問など、ユーザーに表示されるその他のシンボル。

?S:シンボル名 [(廃止された シンボル リスト)]:
シェルシンボルを導入します。 この最初の行ではシンボルの名前を指定し、その後にオプションで
括弧で囲まれたリストと、廃止された同等のリストを示します。 時代遅れのもの
シンボルは新しいシンボルに再マップされます シンボル名 もし -o オプションが与えられます
メタ構成.

?S:どれか テキスト、 for 用語解説
基本的にシェル シンボルを説明するコメント。これは次のように抽出されます。 メイクグロス
用語集ファイルに追加します。

?S:。 シェルシンボルのコメントを閉じます。

?C:シンボル名 [~ alias] [(廃止された シンボル リスト)]:
新しい C 記号が導入されました。 の alias name は、C シンボルが付けられる名前です。
制御される場合、つまり、 alias シンボルが必要な場合、その C シンボルが書き込まれます
セクションに config_h.SH ファイル。 通常、エイリアスは単に「%<」(ユニット名を表します)です。
また、C シンボルを alias。 関連部分も
?H: 行のうち、「?%<」条件によって明示的に保護されています。 記号を参照してください
詳細については、別名段落を参照してください。 行の残りはオプションです
廃止された シンボル リスト、新しいものに相当する古いものをリストします。 シンボル名.

?C:どれか テキスト、 for 用語解説 および config_h.SH
基本的には C シンボルを説明するコメントで、次のように抽出されます。 メイクグロス
用語集ファイルに追加し、 メタ構成config_h.SH シンボルが次の場合はファイル
必要な場合 (または、シンボルのエイリアシングが使用されているときにそのエイリアスが必要な場合)。

?C:。 C シンボルのコメントを閉じます。

?ひ:?シンボル:config_h.SH スタッフ
これは一般的な組み込みリクエストです。 config_h.SH。 この行は次の場合にのみ書き込まれます。
警備 シンボル 本当に求められています。 この一般的な形式は、C シンボルの場合に必要です。
エイリアシングが使用されました。 それ以外の場合、他の「標準」形式のいずれかを使用する場合、
ガードは自動的に行われます メタ構成 そのもの。

?H:#$d_var VAR "$ var"
条件付きで定義します VAR C記号を入力 $ var が「」に設定されている場合定義します'。 を暗示します。
'?VAR:' ガード条件、および メタ構成 自動的にリンクします VAR 二つの殻に
変数の依存関係 (つまり両方 $d_var および $ var としてフラグが立てられます wanted if VAR is
C ソースで使用されます)。

?H:#定義 VAR [任意 클라우드 기반 AI/ML및 고성능 컴퓨팅을 통한 디지털 트윈의 기초 – Edward Hsu, Rescale CPO 많은 엔지니어링 중심 기업에게 클라우드는 R&D디지털 전환의 첫 단계일 뿐입니다. 클라우드 자원을 활용해 엔지니어링 팀의 제약을 해결하는 단계를 넘어, 시뮬레이션 운영을 통합하고 최적화하며, 궁극적으로는 모델 기반의 협업과 의사 결정을 지원하여 신제품을 결정할 때 데이터 기반 엔지니어링을 적용하고자 합니다. Rescale은 이러한 혁신을 돕기 위해 컴퓨팅 추천 엔진, 통합 데이터 패브릭, 메타데이터 관리 등을 개발하고 있습니다. 이번 자리를 빌려 비즈니스 경쟁력 제고를 위한 디지털 트윈 및 디지털 스레드 전략 개발 방법에 대한 인사이트를 나누고자 합니다. ]
常に定義します VAR C シンボルをある値に設定します。 「?」を意味します。VAR:' ガード条件。
ユニット自体に対して自動的なシェル依存関係が作成されます。

?H:#定義 VAR(x,y,z) $ var
常にマクロを定義します VAR の値になる $ var 変数。 それは、
確保する単位 $ var 合理的な価値観を保持しています。 C 間の自動依存関係
マクロ VAR シェル変数が確立され、行全体が
暗黙的に「?」VAR:'。

?H:#$d_var VAR
条件付きで定義します VAR if $d_var に設定されています '定義します'。 「?」を意味します。VAR:' ガード
状態。 自動的なシェル依存関係が生成されます。 $d_war.

?H:#定義 VAR "$ var"
構成された値を VAR Cのシンボル。 「?」を意味します。VAR:' グレーディング状態。
リンクするために自動シェル依存関係が生成されます。 VAR および $ var.

?H:。 を閉じます config_h.SH 含めるリクエスト。

?M:C シンボル: C 依存関係
C シンボルに関するマジック定義を導入します。 confmagic.hを定義し、
残りの ?M: 定義の保護記号。 この行は暗黙のうちに暗示しています
'?W:%<:C シンボル'、つまり、C 記号が表示されると、ユニットが Configure にロードされます。
C ソース内では、魔法が使用されているかどうかに関係なく。 C の依存関係がアクティブ化される
魔法が使用されるとき、その定義を強制するために config_h.SH。 しかし、
魔法は 使用されていますが、C 記号が必要な C なしでソースに表示されます。
依存関係がある場合、Wanted ファイルが構築されるたびに警告が表示されます。
移植性の問題 (また、ユニットが無条件にロードされるため)
他の ?C: 行に関係なく、C シンボルが使用されるたびに設定します。
単位)。

?M:cpp 定義
関連する場合に常に confmagic.h に導入されるマジック cpp マッピングを定義します。
という記号が使われています。 暗黙の「?」があります。sym「どこを守っているのか」 sym はシンボル名です
先頭の ?M: 行によって定義されます。

?M:。 を閉じます confmagic.h 含めるリクエスト。

?W:shell シンボル リスト:C シンボル リスト
シェル シンボルの運命を C シンボルの運命と結びつけます。
リストされているシンボルが必要である場合、すべてのシェル シンボルが必要としてマークされます。 役に立つ
何らかの C が存在する場合、ユニットを強制的に含めます (シェル シンボル リストが '%<' に設定されています)。
シンボルが検出されました。 シェル シンボル リストは、副次的な利点を得るために空のままにすることもできます。
組み込みプリプロセッサ内の C シンボルの位置の影響 (シンボルは 定義済みの
ソース内にある場合はそのプリプロセッサ用)。 スペースを含むパターンを検索するには
それらの中で、「struct」のように単純な引用符で囲んだ C シンボルを引用する必要があります。
タイムゾーン」。

?V:読み取り専用の を示すマークを追加しました:読み書き を示すマークを追加しました
これは メタリント ヒントであり、シェルをエクスポートする特別なユニットでのみ使用する必要があります。
変数。 中央の「:」より前の変数は読み取り専用でエクスポートされます(変数は変更されます)。
は警告を発します)、他のシンボルは自由に読み取ったり変更したりできます。

?F:ファイル 作成した
この行には XNUMX つの目的があります。 メタリント ヒント、およびプレースホルダーでもあります
未来 jmake 使用。 XNUMX 種類のファイルをリストする必要があります。XNUMX つは一時ファイルです。
テスト用に作成され、プライベート UU は後で使用するために UU ディレクトリに作成されます
閲覧可能なものと、パッケージのルート ディレクトリに残されている公開されたものです。 一時的
ファイルは先頭に「!」を付けてリストする必要があります。 文字 (「いいえ! 再利用されません」の意味)
後で!")、プライベート UU ファイルの前に「./」を付ける必要があります (意味: それらを使用するには、たとえば
。/ファイルだけではなく、 file)、パブリックなものはそのままの名前を付ける必要があります。

?T:shell 一時的な
別の メタリント ヒント。 この行には、一時変数として使用されるすべてのシェル変数がリストされます。
本機のシェル部内にあります。

?D:シンボル=''
条件付き依存関係として使用されるシンボルの初期化値。 ない場合、?D: 行は
見つかった場合は、代わりに null 値が使用されます。 の メタリント プログラムは、次の場合に警告します。
シンボルは条件付き依存関係として少なくとも XNUMX 回使用されており、適切な依存関係がありません。
?D: 初期化。 null の場合でもこれらの行を追加することをお勧めします。
初期化は、シンボルのオプションの性質を強調するためです。

?O:どれか メッセージ 貴社 欲しいです
このディレクティブは、このユニットが全体として廃止されたことを示します。 何かを使用するたびに、
そのシンボルが作成される (または依存関係を介して間接的に使用される) と、メッセージが出力されます。
画面 (標準エラー出力上)。 XNUMX つ以上の行を入れることができます。その場合、各行は次のようになります。
順番に印刷されます。

?糸くず:メタリント ヒント
ジョブの設定方法については、 メタリント マニュアルページには、使用できる個別のヒントの説明が記載されています。
中古。

?初期化:初期化 コード
この行で指定された初期化コードは、
構成 ユニットが必要な場合はスクリプトを実行します。

C シンボル エイリアシング
頼れないこともある メタ構成独自のデフォルト選択 config_h.SH
コメントと C シンボル定義。 そこでエイリアシングが登場します。 むしろそうなるので、
説明するのは難しいので、基礎となるメカニズムを理解するために例を検討します。

d_const.U ユニットは、C コンパイラがそのことを認識しているかどうかを判断しようとします。 定数
キーワード。 そうでない場合は、そのキーワードを NULL 文字列に再マッピングして、
プログラムのコンパイル。 さらに、次の場合にテストを自動的にトリガーしたいと考えています。 定数 単語
使用されている。

d_const.U ユニットの関連部分は次のとおりです。

?MAKE:d_const: cat cc ccflags Setvar
?MAKE: -pick add $@ %
?S:d_const:
?S: この変数は条件付きで HASCONST シンボルを定義します。
?S: この C コンパイラが
?S:定数型。
?S:。
?C:HASCONST ~ %<:
?C: このシンボルが定義されている場合、この C コンパイラーが次のことを認識していることを示します。
?C: const 型。 そのシンボルを実際にテストする必要はありません
?C: プログラム内。 「const」キーワードを使用するだけで、
?C: 必要なテストをトリガーします。
?C:。
?H:?%<:#$d_const HASCONST /**/
?H:?%<:#ifndef HASCONST
?H:?%<:#define const
?H:?%<:#endif
?H:。
?W:%<:const
?LINT: d_const を設定します
?LINT:既知の定数
: const キーワードをチェックします
エコー " "
echo 'C コンパイラが "const" について認識しているかどうかを確認しています...' >&4
/ bin / cat >const.c <<'EOCP'
メイン()
{
const char *foo;
}
EOCP
if $cc -c $ccflags const.c >/dev/null 2>&1 ; それから
val="$定義"
エコー「はい、そうです。」
ほかに
val="$undef"
エコー「いいえ、違います。」
fi
d_const を設定する
eval $setvar

まず、?W: 行が使用されていることに気付きます。これは基本的に次のように述べています。「このユニットは、
定数 キーワードは C ファイルで使用されています。」条件付きで再マップするには 定数 ヌルに
文字列を入力する config.h、条件付きで定義することにしました。 ハスコンスト$d_const.

ただし、これには問題が生じます。 ハスコンスト 記号は、
ソースのみ、 定数 トークンは。 そして、?H: 行定義 ハスコンスト 暗黙的に
「?HASCONST」によって保護されています。 したがって、明示的に「?%<」制約を追加して通知する必要があります。
メタ構成 それらの行を含める必要があること config_h.SH 「%<」記号がある場合は常に
指名手配されます (%< はユニットの名前を指します、ここでは d_const).

?W: 行が必要とするため、これはほぼ完璧です。 d_const たびに 定数 が使用されている場合、
?H: 行は config_h.SH ファイル。 ただし、先頭のコメント (?C:
行) に接続されています ハスコンスト それ自体も経由で保護されています ハスコンスト、つまり、暗黙的な
「?HASCONST」制約。 したがって、次の必要性があります。 エイリアシング   ハスコンスト 記号を「%<」にします。

ユニットの残りの部分(シェル部分)は非常に簡単です。 それは単純に
を使用してサンプル C プログラムをコンパイルしようとします。 定数 キーワード。 それができるなら、そうなります
定義します $d_const ビア $setvar 関数 (によって定義される) Setvar.U ユニット)。 この段落を参照してください
詳細については、特殊ユニットについてを参照してください。

アカウントを作成し コマンド
?MAKE: コマンド ラインでは、そのまま実行されるシェル コマンドを記述することも、
特別 -選ぶ によってトラップされるコマンド メタ構成 そして解析して、あるべきものを確認します
終わり。 先頭の「-」は、それを防ぐためにのみ存在します。 make コマンドが返されたときに失敗しないようにする
ゼロ以外のステータス -- ' を使用するため、実際には必要ありません。make -n'を解決するには
依存関係がありますが、将来のバージョンで必須になる場合に備えて保持しておくことをお勧めします。
の構文は、 選ぶ コマンドは:

-選ぶ CMD $@ ターゲットファイル

コラボレー $@ 現在のターゲット (名前) を表す Makefile 内の標準マクロです。
構築中のユニットの最後の .U 拡張子が取り除かれています)。 の CMD 部分は
実際の メタ構成 実行するコマンドと、 ターゲットファイル はさらに別のパラメータです。
解釈はによって異なります CMD 自体。 また、最後の .U 拡張子も削除されており、
通常はユニット ファイルを指しますが、「./」で始まる場合はユニット ファイルを参照します。
メタ構成 ' 内の制御ファイル.MT ディレクトリにあります。

使用可能なコマンドは次のとおりです。

add を追加します ターゲットファイル 〜へ 構成.

add.Config_sh
その部分を埋めます 構成 の生産 config.sh ファイル。 使用のみ
変数が追加され、条件付き変数 (条件付き依存関係から) が追加されます。
スキップしました。

add.Null 使用するすべてのシェル変数を空文字列に初期化するセクションを追加します。

c_h_weed が生成するのは、 config_h.SH ファイル。 必要な行だけを印刷します。

cm_h_weed は、 confmagic.h ファイル。 必要な行だけを印刷します。 これ
コマンドは、次の場合にのみ有効になります。 -M スイッチが与えられたとき、または confmagic.h file
もう存在している。

close.Config_sh
最後の「EOT」記号を単独で行に追加して、ヒアドキュメントを終了します。
を生成する構築物 config.sh ファイルにソフトウェアを指定する必要があります。

prepend ターゲットのコンテンツを先頭に追加します。 ターゲットファイル そのファイルが空でない場合。

雑草 ユニットを追加します 構成 のような 加えます コマンドを使用しますが、追加のテストをいくつか行います
「?」を削除するにはシンボル' そして '%シンボル' の行 ターゲットファイル シンボルの場合
求められていない、または条件付きで求められている。 「%」形式は内部的にのみ使用されます。
メタ構成 ' 内に独自の .U ファイルを生成しながら、.MT' ディレクトリ。

ワイプと同じ 加えます 実際はそうなりますが、追加のマクロ置換が実行されます。 の
利用可能なマクロについては、 ハードワイヤー マクロ 段落。

補足として、 メタ構成 生成する -cond 条件を処理するための内部コマンド
依存関係。 自分で使用するべきではありませんが、ファイルをスキャンすると表示されます。
生成された メークファイル セクションに .MT ディレクトリにあります。

ハードワイヤー マクロ
次のマクロが認識されます。 ワイプ コマンドに含める前に置換されます。
構成:

パッケージの基本リビジョン番号。次から導出されます。 。パッケージ.

現在の日付。


このパッケージの管理者の電子メール アドレス。
。パッケージ.


パッケージの名前。 。パッケージ ファイルにソフトウェアを指定する必要があります。


パッチレベルは、 メタ構成 プログラム (非推奨になりました) )。


の SVN リビジョン レベル メタ構成 プログラム。

のバージョン番号 メタ構成 プログラム。

これらのマクロは主に、 メタ構成 を生成したバージョン
特定の 構成 スクリプトとそれが実行されたパッケージ。 の電子メールアドレス
メンテナは主要な命令に組み込まれています。 構成 起動時に印刷されます。

最近の メタ構成 バージョンは、次の形式のより一般的な構文を理解します。

<$変数>

これは、構成生成時に次の値に置き換えられます。 変数 あなたから取られた
。パッケージ ファイル。 最終的には、古い固定マクロ形式は消滅し、<$baserev>
交換します付属のすべてのユニットで。

スペシャル Units
次の特別な単位は、コードを因数分解し、より高いレベルを提供するために使用されます。
機能性。 これらは、ソース可能なシェル スクリプトを生成するか、シェルを生成します。
できる変数 評価する編集しました。 パラメータの受け渡しは、よく知られた変数を介して行われます。
$1、$2 などの名前付きまたは匿名 (シェル経由で簡単に設定できます) セッションに
オペレーター)。 いつ 構成 実行すると、 UU ディレクトリなので、すべての
生成されたスクリプトはそこにあり、パッケージのファイルに干渉しません。

ここでは、知っておくべき特殊な単位とその使用方法を紹介します。

Cppsym.U
このユニットは、というシェル スクリプトを生成します。 コプシムを決定するために使用できます。
リスト内のシンボルが C プリプロセッサまたは C コンパイラによって定義されているかどうか
指定された。 任意のシンボルのステータスを決定できますが、
(属性リスト) をより簡単に決定できます。

Csym.U
これにより、内部で使用される $csym シェル変数が設定されます。 構成 かどうかを確認する
指定された C シンボルが定義されているかどうか。 一般的な使用例は次のとおりです。

シンボルの結果を設定 [-fva] [前へ]
評価$csym

それは設定します 結果 関数 [-f]、変数 [-v]、または
配列 [-a] が定義されている場合は 'false' が定義されています。 以前の値が与えられ、 -r
スイッチが提供されました 構成 (参照 構成 オプション 段落)、それから、
値は問題なく再利用されます。

この計算が行われる方法は、質問に対するユーザーの答えによって異なります。
構成 を実行する必要があるかどうかを尋ねます。 nm 抽出か否か。 もし
抽出が実行された場合、ユニットは単にシンボルリストを調べます。それ以外の場合は、
そうでない限り、コンパイルリンクテストを実行します。 -r 以前に計算された値を再利用するために与えられました
当然のことですが...

End.U
このユニットをプライベートにコピーすることで、 U ディレクトリと依存関係の追加
?MAKE: 行で、指定されたユニットを強制的にロードできます。 構成 たとえそうでなくても
それ以外の場合は希望されます。 一部のユニットは強制的にのみ可能です 構成 そうですね。

Fileexp.U
このユニットはシェルスクリプトを生成します ファイル拡張子 これにより、次で始まるファイル名が展開されます。
チルダ。 一般的な使用例は次のとおりです。

exp_name=`./fileexp $name`

展開されたファイル名を割り当てるには exp_name.

Findhdr.U
このユニットは、 hdrを見つける ヘッダー ファイルを見つけるために使用されるスクリプト
$usrinc または cpp 機能を使用する他の見知らぬ場所。 スクリプトには
「stdio.h」や「sys/file.h」などのファイルベース名を含めると、そのフルパスが返されます。
インクルード ファイルと、見つかった場合はゼロのステータス、または空の文字列とゼロ以外のステータス
ファイルが見つからなかった場合。

Getfile.U
このユニットは、ファイルを取得するためにソースする必要があるシェル コードを生成します。
名前を付けて健全性チェックを行います。 オプションで、~name 展開が実行されます。

本機を使用するには、 $rp および $dflt 質問とデフォルトの回答を保持する必要があります。
にそのまま渡されます 私の読み取り スクリプト (今後の予定を参照) Myread.U)。 ザ $fn
変数が操作を制御し、結果が返されます。 $ans.

ファイルまたはディレクトリを見つけるには、「f」または「d」を入力します。 ふ〜/。 「~」が表示される場合は、~name
置換は許可されています。 「/」が表示される場合は、絶対パス名のみが受け入れられます。
~name 置換は、返される前に常に展開されます。 「+」を指定すると、
存在チェックはスキップされます。 中に「n」が入っている場合 $fn、その後、ユーザーは次のことが許可されます
「なし」と答えてください。

通常、移植性を要求しない限り、要求されたときに ~name 置換が行われます。
ただし、移植性をバイパスして強制的に実行したい場合もあります。
置換。 これを行うには、「e」文字 (展開) を使用できます。

特殊な「l」(位置特定)タイプが使用されている場合、 $fn 変数は「:」で終わる必要があります。
その後にファイルのベース名が続きます。 答えがディレクトリの場合、ファイルのベース名は次のようになります。
ファイルの存在をテストする前に追加されます。 これは、検索形式の質問に役立ちます
このような:

dflt='~ニュース/lib'
: 'l' を使用する場合は 'd' または 'f' を指定する必要はありません
fn='l~:アクティブ'
rp='アクティブなファイルはどこですか?'
。 ./getfile
アクティブ = "$ans"

さらに、「p」(パス)文字を「l」と組み合わせて使用​​して、
ファイルの取得 '/' が含まれていない回答は受け入れられると仮定して、
この値が必要になる時点で、全員の PATH に存在する必要があります。

受け入れられるべき回答のリストを指定できることも便利です
逐語的に、すべてのチェックをバイパスします。 このリストは括弧と項目で囲む必要があります
スペースを挟まずにカンマで区切る必要があります。 引用することを忘れないでください
かっこはシェルにとって意味があるため、結果の文字列になります。 例えば:

dflt='/bin/install'
fn='/fe~(インストール,./インストール)'
rp='どのインストール プログラムを使用しますか?'
。 ./getfile
インストール = "$ans"

ユーザーは既存のファイルを参照する完全修飾パスのみを指定できます。
ただし、特殊な "install" および "./install" の応答はそのまま許可されます (
もちろん、彼らはそうするので、チェーンの後半で特別に何かがそれらに対処します。
一般的に予想されるフレームとは一致しません)。

質問に対する答えが「なし」の場合、存在チェックはスキップされ、
空の文字列が返されます。 以降に注意してください ファイルの取得 呼び出し 私の読み取り 内部的には、すべて
で利用できる機能 私の読み取り ここに申請してください。

完全に展開された値が必要な場合 (たとえば Makefile 内)、次を使用できます。
  $ansexp によって常に適切に設定される変数 ファイルの取得 拡張されたものとして
のバージョン $ans。 もちろん、~name が許可されていない場合は展開されません。
のXNUMX位 $fn 変数に保存します.

Inhdr.U
このユニットが生み出すのは、 $inhdr シェル変数。内部で使用されます。 構成 チェックする
ヘッダーのセットが存在するかどうか。 一般的な使用例は次のとおりです。

ヘッダーを設定 i_header [ header2 i_header2 ... ]
評価 $inhdr

これにより、ヘッダーが見つかったかどうかを示すメッセージが出力され、
i_header それに応じて変化します。 複数のヘッダーが指定され、最初のヘッダーが指定された場合、
ヘッダーが見つからない場合は、リストが空になるか、ヘッダーが見つかるまで、次のヘッダーが試行されます。

Inlibc.U
このユニットが生み出すのは、 $inlibc シェル変数。内部で使用されます。 構成 チェックする
特定の C 関数が定義されているかどうか。 一般的な使用例は次のとおりです。

関数 d_func を設定します
評価$inlibc

関数が見つかったかどうかを示すメッセージが表示され、設定されます。
$d_func それに応じて。 内部的には、 $csym ルーチン。

Loc.U
この重要なユニットはシェル スクリプトを生成します LOC 場所を見つけるために使用できます
ディレクトリのリストに指定されたファイルが存在します。 最初の引数でファイルを指定します。
XNUMX 番目の引数は検索が失敗した場合に返されるもので、
残りの引数は、ファイルが検索されるディレクトリのリストです。 のために
インスタンス:

dflt=`./loc sendmail.cf X / usr / lib /var/lib/sendmail / lib`

設定します $dflt 〜へ X いいえの場合 sendmail.cf リストされたディレクトリの下にファイルが見つかりました。
または何かのような /usr/lib/sendmail.cf 一部のシステムでは。 こちらも参照 Getfile.U.

MailAuthor.U
作成するには、このユニットを独自のプライベート End.U の ?MAKE: 行に含める必要があります。
それに 構成。 ユーザーはオプションで著者に自分自身を登録することができます。
新しいパッチが到着すると通知されるか、発行時に自動的に受信されます。
あなたはインストールする必要があります メールエージェント これを行うには (少なくともバージョン 3.0)。

メールリスト.U
作成するには、このユニットを独自のプライベート End.U の ?MAKE: 行に含める必要があります。
それに 構成。 ユーザーにメーリングリストの購読または購読解除を提案します。
パッケージに関する議論が行われている場所。 走らなければなりません パックイット
メーリング リストに関連する質問に答えて、適切な変数を設定します。
。パッケージ このユニットが動作する前に。

Myinit.U
このユニットをプライベートにコピーします U ディレクトリに独自のデフォルト値を追加する
内部変数。 このユニットはにロードされています 構成 結局デフォルト
初期化が行われています。

Myread.U
このユニットが生み出すのは、 私の読み取り 実行するためにソースする必要があるシェル スクリプト
読む。 シェルエスケープ、デフォルトの割り当て、およびパラメータの評価が可能です。
Instruct.U ユニットに文書化されています。 また、 -d オプション、
これは残りのスクリプト実行に使用されます。

本機を使用するには、 $rp 質問を保留しなければなりません、そして $dflt デフォルトを含める必要があります
答え。 質問はスクリプト自体によって出力され、結果が返されます。
セクションに $ans 変数に保存します.

一般的な使用例は次のとおりです。

dflt='y'
rp='質問?'
。 ./myread
値 = "$ans"

詳細については、ユニット自体を参照してください。

Oldconfig.U
一部のユニットが試行するとき、このユニットは依存関係の ?MAKE: 行の一部である必要があります。
古いシンボル値を再利用します。 このユニットは古い答えを取得する責任があります
から config.sh または、特定のプラットフォームで実行するときに役立つヒントを提供します。
初めて。 を参照してください。 構成 ヒント ヒントの詳細については、この段落を参照してください。

Prefixit.U
このユニットの目的は、インストール プレフィックス ディレクトリの変更を検出することです。
以前の回答から適切なデフォルトを自動的に再計算します。 それは、
の値 $oldprefix 前のプレフィックス ディレクトリを保持する変数
変更されており、それ以外の場合は空です。 たとえば、プレフィックスが次から変更された場合、 / opt 〜へ
/ usr / localの場合、以前のバイナリのインストール ディレクトリは から変更されます。
/ opt / bin 〜へ / usr / local / bin、または、たとえば、次の場合は変更されません。 / binに.

電話する必要があります セッションに 発行する前に 評価する on $prefixit、のような:

dflt var [ディレクトリ]を設定します
eval $prefixit

どちらが設定しますか $dflt 〜へ $ var or $プレフィックス/ディレクトリ プレフィックスが残っているかどうかに応じて
同じかどうか。 もし DIR 文字列です なし、単一のスペース値 $dflt として保存されます-
つまり、プレフィックスが変わった場合でも同様です。 もし DIR 省略された場合 $dflt 空に設定されています
プレフィックスが変更された場合は文字列に $ var さもないと。

Prefixup.U
このユニットの目的は Prefixit.U の目的と似ています。つまり、
プレフィックスの変更に対応するデフォルトの文字列。 ただし、シェル変数 $prefixup,
評価されると、~name の展開のみが復元されます。プレフィックスにはそのようなエスケープを使用する必要があります
機構。 次のように使用します。

dfltを設定する
eval $prefixup

プロンプトを表示する前に ファイルの取得 例えば。 プレフィックスが ~name を使用しない場合
展開した場合、上記は何も行われません。 y 当然、変化します。

Typedef.U
このユニットが生み出すのは、 $typedef シェル変数。内部で使用されます。 構成 チェックする
typedef が存在するかどうか。 一般的な使用例は次のとおりです。

typedef val_t のデフォルトを設定 [インクルード]
評価$typedef

これにより、変数が設定されます val_t の値に デフォルト typedef が見つからなかった場合
リストされたインクルード ファイルの中から、または typedef 見つかったら。 インクルード ファイルがない場合は、
指定すると、ユニットは以下を調べます のみ。 いくつかのインクルードを指定した場合のみ、
それらは見られています。

Unix.U
この単元の目的は、変数を介して最も一般的な UNIX 主義のいくつかを定義することです。
これはコマンドラインから、または適切なヒントファイルを介して変更できます。 特に、
$_exe, $_o および $_a 設定されています。 すべてのユニットが参照する必要があります $_o そしてしない .o 直接。
「。」 はこれらの変数の一部です。

Setvar.U
このユニットは、内部で使用される変数を生成します。 構成 設定する
定義します/undef 値を指定されたシンボルに設定し、値が突然変化したときに警告を発します。
以前の値から。 例えば:

val="$定義"
d_変数を設定します
eval $setvar

以前の場合 $d_変数 値が null ではなく、 $val 違うよ、「おっ」
警告が発せられます。

おっと、U
このユニットが生み出すのは、 ウア スクリプトは、次の場合に警告を発します。 変数内
誰の名前は $ var に保持されている古い以前の値と同じではありません $ was。 に
戻り、 $td および $tu 適切な値を保持してください 定義します or 未定義 変数。 見る
の例 Inlibc.U.

ビルトイン プリプロセッサ
収録される各ユニット 構成 組み込みのプリプロセッサを通じて実行されます。 プレ
プロセッサー・ステートメントは「@」文字によって導入されます (「#」はシェルのコメントです)
キャラクター)。 C プリプロセッサと同じように機能しますが、シェルや Perl も使用できます。
逃げる。 利用可能な機能は次のとおりです。

@もしも 表現
If 表現 が true の場合、@end、@elsif、または @else までコードの読み込みを続けます。

@エルシフ 表現
別の選択肢。 もし 表現 true の場合、@end までコードの読み込みを続けます。
別の @elsif または @else。

@else @if の場合にロードされるデフォルトのコード 表現 は虚偽であり、どれも
オプションの @elsif が一致しました。 @endまでロードします。

@end @if で開いた条件付き読み込みステートメントを閉じます。

@定義する シンボル
プリプロセッサに次のことを伝えます シンボル これから定義されます。

条件付き 表現 シンボル名を含めることができます (シンボルが必要な場合、値は true です。
経由で定義 @定義する またはシェル/Perl エスケープ。 これらの原子は、
従来のブール演算子「!」 否定の場合は「&&」、論理積の場合は「||」 論理的な
または。

単一のブラケットで囲まれたテキストはシェル テストであり、二重ブラケット間のテキストはシェル テストです。
パールのテスト。 つまり、次の式です。

{ shell 클라우드 기반 AI/ML및 고성능 컴퓨팅을 통한 디지털 트윈의 기초 – Edward Hsu, Rescale CPO 많은 엔지니어링 중심 기업에게 클라우드는 R&D디지털 전환의 첫 단계일 뿐입니다. 클라우드 자원을 활용해 엔지니어링 팀의 제약을 해결하는 단계를 넘어, 시뮬레이션 운영을 통합하고 최적화하며, 궁극적으로는 모델 기반의 협업과 의사 결정을 지원하여 신제품을 결정할 때 데이터 기반 엔지니어링을 적용하고자 합니다. Rescale은 이러한 혁신을 돕기 위해 컴퓨팅 추천 엔진, 통합 데이터 패브릭, 메타데이터 관리 등을 개발하고 있습니다. 이번 자리를 빌려 비즈니스 경쟁력 제고를 위한 디지털 트윈 및 디지털 스레드 전략 개발 방법에 대한 인사이트를 나누고자 합니다. }
{{ パール 클라우드 기반 AI/ML및 고성능 컴퓨팅을 통한 디지털 트윈의 기초 – Edward Hsu, Rescale CPO 많은 엔지니어링 중심 기업에게 클라우드는 R&D디지털 전환의 첫 단계일 뿐입니다. 클라우드 자원을 활용해 엔지니어링 팀의 제약을 해결하는 단계를 넘어, 시뮬레이션 운영을 통합하고 최적화하며, 궁극적으로는 모델 기반의 협업과 의사 결정을 지원하여 신제품을 결정할 때 데이터 기반 엔지니어링을 적용하고자 합니다. Rescale은 이러한 혁신을 돕기 위해 컴퓨팅 추천 엔진, 통합 데이터 패브릭, 메타데이터 관리 등을 개발하고 있습니다. 이번 자리를 빌려 비즈니스 경쟁력 제고를 위한 디지털 트윈 및 디지털 스레드 전략 개발 방법에 대한 인사이트를 나누고자 합니다. }}

は次のように翻訳されます。

if shell 클라우드 기반 AI/ML및 고성능 컴퓨팅을 통한 디지털 트윈의 기초 – Edward Hsu, Rescale CPO 많은 엔지니어링 중심 기업에게 클라우드는 R&D디지털 전환의 첫 단계일 뿐입니다. 클라우드 자원을 활용해 엔지니어링 팀의 제약을 해결하는 단계를 넘어, 시뮬레이션 운영을 통합하고 최적화하며, 궁극적으로는 모델 기반의 협업과 의사 결정을 지원하여 신제품을 결정할 때 데이터 기반 엔지니어링을 적용하고자 합니다. Rescale은 이러한 혁신을 돕기 위해 컴퓨팅 추천 엔진, 통합 데이터 패브릭, 메타데이터 관리 등을 개발하고 있습니다. 이번 자리를 빌려 비즈니스 경쟁력 제고를 위한 디지털 트윈 및 디지털 스레드 전략 개발 방법에 대한 인사이트를 나누고자 합니다. >/dev/null 2>&1; 次に 0 を終了します。 それ以外の場合は 1 を終了します。 フィ
(もしパール 클라우드 기반 AI/ML및 고성능 컴퓨팅을 통한 디지털 트윈의 기초 – Edward Hsu, Rescale CPO 많은 엔지니어링 중심 기업에게 클라우드는 R&D디지털 전환의 첫 단계일 뿐입니다. 클라우드 자원을 활용해 엔지니어링 팀의 제약을 해결하는 단계를 넘어, 시뮬레이션 운영을 통합하고 최적화하며, 궁극적으로는 모델 기반의 협업과 의사 결정을 지원하여 신제품을 결정할 때 데이터 기반 엔지니어링을 적용하고자 합니다. Rescale은 이러한 혁신을 돕기 위해 컴퓨팅 추천 엔진, 통합 데이터 패브릭, 메타데이터 관리 등을 개발하고 있습니다. 이번 자리를 빌려 비즈니스 경쟁력 제고를 위한 디지털 트윈 및 디지털 스레드 전략 개발 방법에 대한 인사이트를 나누고자 합니다. ) {出口 0;} else {出口 1;}

終了ステータスはブール値を取得する標準的な方法で使用されます。つまり、0 は true、
それ以外はすべて偽です。 Perl で表現できるのは単純な条件だけであることに注意してください。
いくつかの複雑なコードを内部にロードできます メタ構成 そして実行されました。

内蔵プリプロセッサを使用して一部のユニットを微調整できます(「 d_gethname.U のために
複雑な例) プログラムまたはファイルで実際に使用されるシンボルに応じて
ディストリビューションに存在します。 たとえば、 Oldconfig.U 次のようなテストを使用します。

@if {テスト -d ../ヒント}

および 構成 がある場合にのみ、ヒント依存のコードが含まれます。 ヒント のディレクトリ
パッケージの最上位ディレクトリ。 テストは ' 内から実行されることに注意してください。.MT' ディレクトリ、
したがって、テストには「../」が必要です。

プリプロセッサは、シンボルが正しくない場合に無駄なコードの挿入を避けるためにも使用できます。
定義されています。 複数のシンボルを定義しているユニットは、その方法で保護できます (ユニットは
@if/@end ペア内のシンボル依存コードを収集することで、全体としてロードされます。 のために
インスタンス:

@if I_TIME || || I_SYS_TIME || I_SYS_TIME_KERNEL
need_time_h='true'
@それ以外
need_time_h='false'
@終わり

ソース コードが制御する XNUMX つのシンボルのいずれかを使用しているかどうかをテストします。
  時間.h or sys/time.h インクルードを追加し、それに応じてシェル シンボルを定義します。 それは与える
構成 ソースが必要とするものについてのフィードバックと、修正による欠点の回避
凍結されたユニット。

「?W:」行を使用すると、興味深い組み合わせを取得できます。 たとえば、 i_time.U 単位
C ソースが 構造 タイムゾーン タイプ。 したがって、
この線:

?W::タイムゾーン

シンボルを定義するという副作用のために使用されます。 タイムゾーン プリプロセッサ用。 の
ユニットコードは次のように言えます:

@ifタイムゾーン
'-DS_TIMEZONE' の s_timezone の場合 ''; する
@それ以外
s_timezone=''
@終わり

... s_timezone を使用したコード ...

@ifタイムゾーン
行われ
@終わり

の XNUMX つの連続する値を試す追加のループがあります。 s_timezone 変数ですが、
必要に応じて。

廃止された シンボル
古いシンボルへの移行を容易にするために、廃止されたシンボルが保存されます。 メタ構成 単位。 ない限り
  -o スイッチが渡される メタ構成 それらは無視されます。 ただし、 廃止された ファイルは
どのファイルがそれらの廃止されたシンボルを使用しているのか、そして何を使用しているのかを通知する情報が生成されます。
は、使用される新しいシンボルです。

廃止されたシンボルの有効期間は XNUMX 回の完全なリビジョンです。つまり、シンボルは次の時点で削除されます。
次の基本リビジョンが発行されます (もちろん、パッチのアップグレードはカウントされません)。 したがって、それは
できるだけ早くソースを翻訳し、新しいシンボルの使用を開始することが賢明です。

構成 ヒント
内部構成ロ​​ジックが間違った選択をする場合があります。 のために
たとえば、あるプラットフォームでは、 vfork() システムコールは存在しますが壊れているため、
使用しないでください。 その知識を単元自体に組み込むことはできません。
それは一時的な問題であり、ベンダーが最終的に修正するか、または
新しい OS のアップグレードによって導入されました。

とにかく、システム固有すぎるこれらの小さな小さな問題すべてについては、 メタ構成
ヒント ファイルのサポートを提供します。 これを使用するには、 ヒント のディレクトリ
パッケージの最上位ディレクトリ。実行時にそれが保存されます。 メタ構成。 それはロードします
のヒント関連部分 Oldconfig.U.

それ以降、いくつかのシェル変数を事前に設定できます。 構成 OS 固有の用途
.sh ファイル。 コードが入っています Oldconfig.U どのヒント ファイルが必要かを推測しようとします
システムの OS 名、カーネル名、リリースに基づいて標準名を計算します。
番号など...この情報は急速に変更される可能性があるため、文書化していません。
ここ。 コードをリバースエンジニアリングする必要があります Oldconfig.U.

パッケージを初めてリリースするときは、ヒント ファイル ディレクトリは空である必要があります。 もし
あなたのパッケージのユーザーは、次の問題があると不満を抱いています。 構成 デフォルトでは
特定のシステムの場合、これがプラットフォーム固有の問題なのか、それとも問題なのかを確認する必要があります。
一般的なもの。 前者の場合、新しいヒント ファイルを導入します。
後者については、対応する単位を改訂する必要があります。

たとえば、SGI システムには壊れた機能があることが知られています。 vfork() システムコール、現時点では
書き込み。 対応するヒント ファイル名は次のとおりです。 sgi.sh。 だからあなたがしなければならないのは作成することだけです
a ヒント/sgi.sh 以下を記述するファイル:

d_vfork="$define"

常に再マップされます vフォーク on フォーク (参照してください d_vfork.U)。 SGI システム上で実行している場合、
初めて、 構成 があることを検出します ヒント/sgi.sh ファイル、そして私たちが進んでいること
IRIX マシン (カーネル名は /irix であることが多い) であるため、 sgi として
考えられるヒント。 ユーザーがそれを受け入れた場合、 $d_vfork 値は、
$setvar 電話、 うわあ! 値を上書きしようとしていることを警告するために発行されます
によって計算される 構成.

提供する必要はないことに注意してください によって知られているヒント Oldconfig.U。 ヒントファイルがある場合、
欠落している場合、可能な選択肢として提案されません。 計算するためにヒューリスティックテストが実行されました
考えられるヒントの候補は不安定です。 新しい値や異なるテストがある場合は、
それらを私に送ってください...

オーバーライド 選択肢
作成する場合 config.over 最上位ディレクトリにあるファイル、 構成 どうか尋ねます
これをロードしてデフォルト値をオーバーライドしたいと考えています。 これは、
config.sh ファイルに保存されている値にパッチを適用する機会が得られます。

これは、ユーザーがローカル ファイルであるという点で、ヒントのアプローチとは異なります。
自分の使用のために自由に作成できます。 このようなファイルを自分で提供するべきではありません。
ユーザーはこの可能性について知っています。

構成 オプション
  構成 スクリプトは、コマンドラインでいくつかのオプションを指定して呼び出すことができます。
動作を少し変更します。 許可されるオプションは次のとおりです。

-d すべての回答にデフォルトを使用します。

-e 過去の制作に疑問を持たずに進んでください。 config.sh.

-f file 指定されたファイルをデフォルト構成として使用します。 このスイッチを使用しない場合、
構成はから取得されます config.sh、存在する場合。

-h ヘルプメッセージを印刷して終了します。

-r 可能であれば、C シンボルの値を再利用します。 これにより、コストのかかる作業が省略されます nm シンボル
抽出。 初めて使用する場合 (以前の構成ファイルがない場合)、
構成 について知るために、小さなプログラムをコンパイルしてリンクしようとします。
シンボルの有無。

-s サイレントモード。 ファイル記述子 #4 に出力された文字列のみが、
画面に表示されます (これは重要なメッセージです)。 完全にオフにすることはできません
任意の出力ですが、「」を使用することもできます構成 -ders > / dev / null 2>&1' いっぱいになる
バッチは出力なしで実行され、ユーザーの操作は必要ありません。

-D 記号=値
事前定義 シンボル 指定されたものを負担する 。 'を使用することも可能です-D
シンボル' これはデフォルト値の 'define' を使用します。

-E 構成に関する質問を作成したら、最後で停止します。
config.sh。 これでは何も実行されません。make 決まる' または .SH ファイルの抽出。

-K 知識豊富なユーザー。 このオプションを使用すると、自分が何をしているのかがわかり、
したがって、 config.sh ファイルは常に、意図されたものであるかのように処理されます。
たとえそれがエイリアンのシステムで生成されたものであっても、再利用されます。 また
次の場合に中止を防止します 構成 使用できない C コンパイラまたは間違ったセットを検出します
C フラグの。 このオプションによってさらにショートカットが有効になる場合もあります。
未来。 このオプションについては、次のドキュメントに記載されています。 構成 使用状況メッセージ、思い出させるため
その存在については不明ですが、与えられた説明は十分に不可解であることが望まれます。
:-)

-O 経由で指定された値を許可します -D or -U ロードされた設定を上書きするには
設定ファイル。 これはデフォルトの動作ではありません。
現在変更している変数から派生した変数には伝播されません。
当然、なしで -O、設定は設定ファイルがない場合にのみ行われます。
ロードされていますが、導関数変数はまだ計算されていないため安全です...

-S すべての .SH ファイルに対して変数置換を実行します。 と組み合わせることができます。
-f スイッチを使用して、任意の設定を反映させます。

-U 記号=
プリセット シンボル 空の値を保持します。 'を使用することも可能です-U シンボル'
どれが設定しますか シンボル 「undef」にします。

-V のバージョン番号を出力します。 メタ構成 これを生成したのは 構成 スクリプト
終了します。

Running: 環境
開始すると、 構成 ローカルを作成します UU ディレクトリにあり、そこから実行されます。 ディレクトリ
構成が終了すると削除されますが、これは、次の場所からスクリプトを実行する必要があることを意味します。
つまり、読み取り専用ファイル システムからは書き込みできません。

あなたは走れる 構成 ただし、リモートでは次のようになります。

../パッケージ/構成

ローカルに存在しないソースを構成するには。 生成されたすべてのファイルが配置されます
スクリプトを実行しているディレクトリ。 この魔法は src.U のおかげで実行されます。
を設定しているユニット $ src および $rsrc パッケージソースを指す変数。 それ
パスが完全パスか相対パスかに応じて、 構成 フルまたは
相対パス。

内から UU サブディレクトリを使用できます $rsrc ソースファイルにアクセスするため(単位
ソース ファイルのリンク ヒントを参照する場合は、常にこのメカニズムを使用し、
ファイルは親ディレクトリに存在します)。 すべての Makefile は $src 変数を使用する必要があります
ビルド ディレクトリの先頭からのソースへのポインタとして (ここで、 構成 が実行されます)、
直接または VPATH 設定経由で。

実行時 構成 リモートでは、.SH ファイルはビルド ディレクトリではなく、ビルド ディレクトリに抽出されます。
ソースツリー内。 ただし、それにはある種の make コンパイルできるようにサポートします
ソースは別の場所にありますが、ビルドディレクトリにあるもの。

使い方 再定義
を活用することで、 -M スイッチを切り替えると、魔法の再マッピングが内部で行われる場合があります。 confmagic.h
ファイル。 そのファイルは後に含める必要があります config.hもちろんですが、結局のところ、
その他の必要なインクルード ファイル。 つまり:

#include "config.h"
...
... 他の インクルージョン ...
...
#include "confmagic.h"

一般的に、 confmagic.h 再マップを試みます bcopy() on memcpy() いいえの場合 bcopy() is
ローカルで利用可能、または変換 vフォークフォーク 必要に応じて、
のことを気にする HAS_VFORK シンボル。

この構成マジックは用語集ファイルに文書化されています。

ユニット テンプレート
ユニットテンプレートのセットがあります。 メタ構成 ソースディレクトリは、次のことを目的としています。
さまざまな種類の新しい単位を迅速に生成するために (まだ作成されていない) プログラムで使用されます。
状況。 この未完成のプロジェクトに関するドキュメントはありませんが、言及しておこうと思いました
自分で作成して貢献したい場合は、マニュアルページを参照してください...

作者


ラリー・ウォールlwall@netlabs.com> バージョン 2.0 の場合。
ハーラン・ステンharlan@mumps.pfcs.com> 重要な単位の拡張用。
ラファエル・マンフレディram@hptnos02.grenoble.hp.com>.
他にも多くの貢献者が メタ構成 単位。 リストについては、クレジット ファイルを参照してください。

onworks.net サービスを使用してオンラインでメタコンフィグを使用する



最新のLinuxおよびWindowsオンラインプログラム