英語フランス語スペイン語

Ad


OnWorksファビコン

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

Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、または MAC OS オンライン エミュレーターを介して、OnWorks 無料ホスティング プロバイダーで makepp_functions を実行します。

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

プログラム:

NAME


makepp_functions -- makepp の関数

DESCRIPTION


A: 絶対ファイル名、
絶対ファイル名_nolink、
絶対パス、
追加プレフィックス、
接尾語を追加し、
そして、 B: ベースネーム、 C: コール、 D: 監督、
dir_noslash、 E: エラー、 F: ファイルサブスト、
フィルタ、
フィルターアウト、
フィルターアウト_ディレクトリ、
ファイルの検索、
find_first_upwards、
検索プログラム、
検索文字列、
find_upwards、
最初に利用可能、
最初の言葉、
それぞれ、 I: なら、
真であれば、
infer_linker、
infer_objects、
情報、 J: 参加、 M: 作る、
メイクマップ、
メイクパール、
地図、
"mktemp"、 N: ノットディル、 O: のみ_生成、
Only_nontargets、
Only_phony_targets、
のみ_古い、
のみ_ターゲット、
または、
元、 P: パットサブスト、
perl、
インチキ、
プリビルド、
印刷、 R: リアルパス、
相対ファイル名、
に関連して、 S: シェル、
ソート、
ストリップ、
サブサブ、
サフィックス、 T: 一時的、 W: 警告、
ワイルドカード、
ワード、
単語リスト、
言葉、 X: xargs

「$(name)」形式の任意の式。「name」は変数名ではありません。または
「$(name arg1 arg2 arg3)」は関数呼び出しとして解釈されます。 名前には文字が含まれる場合がありますが、
アンダースコアまたはハイフン。 混乱を避けるために、ハイフンまたはアンダースコアを使用できます
ハイフンは内部的にアンダースコアに変換されるため、同じ意味で使用できます。 そういったものを評価するのは
式は単に Perl サブルーチンを呼び出すだけです。 「name」の前に「&」がある場合、
makepp プロセス内のその名前の組み込みコマンドまたはスクリプトを実行し、標準のコマンドを返します。
出力。 これには、PerlIO 用に Perl を構築する必要があります。 名前が関数の名前ではない場合
これは呼び出しの呼び出しに変換されます。

変数と同様に、「$(name ...)」または「${name ...}」を選択できます。 あなたがしたい場合は
同じ括弧を埋め込みます。ペアにする必要があります。もう一方は重要ではありません: "$(name
...(){..." または "${name ...{}(...}"。(ただし、map と perl の場合は最初の閉じ括弧が終了します)
) XNUMX 倍にすることで、引数を複数行にまたがることができます。 改行は
その後、「define」を除いてスペースとして扱われます。 「$[name ...]」という構文もあります。
または $[[name ...]] は、ルールをグロッキングする前に、メイクファイルの読み取り中に評価されます。
およびその他の構成要素。

Makepp には便利な組み込み関数が多数あります。 ほぼすべてをサポートしています
GNU make のテキスト関数 (詳細については、GNU make のドキュメントを参照) とその一部
自分の。 Perl サブルーチンを定義して、好きなことを実行できます。 「サブ」ステートメントを参照してください。
詳細については、makepp の拡張に関するセクションを参照してください。

条件付きの 機能
& 条件1[,条件2[,条件3...]]
and 関数は、「ショートサーキット」AND 演算を提供します。 それぞれの引数は、
順番に展開していきます。 引数が空の文字列に展開されると、処理は停止し、
展開の結果は空の文字列です。 すべての引数が非
空の文字列の場合、展開の結果は最後の引数の展開になります。

if ひも、 文字列が空白でない場合の結果[, 文字列が空白の場合の結果]
真であれば ひも、 文字列が true の場合の結果[, 文字列が false の場合の結果]
「ifeq」などのステートメントの代替。 文字列が空白でない場合 (つまり、
条件が true の場合)、XNUMX 番目の引数(「then」句)が返されます(その後)
変数展開); 文字列が空白の場合、XNUMX 番目の引数 (「else」句) は次のようになります。
戻ってきた。

たとえば、

CFLAGS := $(if $(filter gcc egcc, $(CC)), -g -Wall, -g)

変数 CC が "gcc" または "egcc" の場合、および "-g" の場合、CFLAGS を "-g -Wall" として定義します。
さもないと。 (これは、デフォルトのビルド ルールが行うことです。)

「iftrue」は「if」と似ていますが、文字列 0 が空白として扱われる点が異なります。

or 条件1[,条件2[,条件3...]]
or 関数は、「ショートサーキット」OR 演算を提供します。 それぞれの引数を展開すると、
順番に。 引数が空ではない文字列に展開されると、処理は停止し、
展開の結果がその文字列になります。 すべての引数を展開した後、
それらが false (空) の場合、展開の結果は空の文字列になります。

File & ファイル名 機能
絶対ファイル名 ファイル
棄権 ファイル
相対ファイル名を絶対ファイル名に変換します。 . or ..。 例えば、
「$(absolute_filename xyz.c)」は「/usr/src/our_project/subdir/xyz.c」を返す場合があります。

絶対ファイル名_nolink ファイル
リアルパス ファイル
Absolute_filename と似ていますが、シンボリック リンクが確実に解決されます。

ベース名 ファイル名
ベース名は、(ディレクトリを含む) ファイル名全体から、 と の後のテキストを除いたものです。
最後の期間も含めて。 たとえば、「$(basename myfile/version-1.0-module.c)」は
「myfile/バージョン-1.0-モジュール」

DIR ファイル名
ファイル名リスト内の各ファイルのディレクトリ部分を末尾のディレクトリも含めて抽出します。
スラッシュ。 ファイル名にディレクトリがない場合は、「./」を返します。

dir_noslash ファイル名
末尾のスラッシュを返さないことを除いて、「$(dir )」と同じです。

ファイルサブ パターン、 代替、 言葉
ファイル名に対してパターン置換を実行します。 これは、patsubst とは次の点で異なります。
ディレクトリの代替名が指定されている場合、正しく実行されます (次の場合に限ります)。
パーセント記号の前に置きます)。 例えば、

$(filesubst ./src/%.c, %.o, $(ワイルドカード src/*.c))

filesubst では動作しますが、patsubst では動作しません。

filter_out_dirs ファイル名
ディレクトリを参照しないすべてのファイル名を返します。

ファイルを見つける ファイル名、 path
指定されたパス内、または何も存在しない場合は環境変数 PATH 内でファイルを検索します。
指定された。 これは、バイナリやインクルード ファイルを見つけるのに役立ちます。 例えば、

TCL_INCLUDE := -I$(dir_noslash $(findfile tcl.h, \
/usr/local/stow/tcl-8.4.5-nothread/include \
/usr/include/tcl8.4 /usr/include/tcl \
/net/na1/tcl8.4a3/include /net/na1/tcl8.4a3/include))

これによりファイルが見つかります tcl.h 上記のディレクトリをすべて検索します。 絶対的な
ファイルへのパスが返されます。 次に、「$(dir_noslash )」がそのディレクトリを抽出します。
インクルードパスに入れられます。

プログラムを見つける
PATH で見つかるリスト内の最初のプログラムを返します。 これは便利です
使用できる同等のプログラムが複数あり、単にそれを実行したい場合
そのうちの XNUMX つを選択してください。 たとえば、以下はいくつかの一般的なデフォルトの定義です。
makepp が makefile に変数を指定しない場合に提供する変数:

CC = $(find_program gcc egcc pgcc c89 cc) # その他、マシンに応じて
F77 = $(find_program f77 g77 fort77)
CXX = $(find_program g++ c++ pg++ cxx CC aCC)

プログラムが見つからない場合、「$(find_program )」は文字列 not-found を返します。
見つからなかったものをログに記録します。 通常、これでは機能するメイクファイルは生成されませんが、
エラーメッセージが改善される傾向があります。 たとえば、次のようなことをすると
この:

%.o:%。c
$(CC) $(入力) -o $(出力)

makepp は上記のリストで C コンパイラを見つけることができない場合、見つからないものを置き換えます。
そうしないと、シェルがソース ファイルを実行しようとし、その結果エラーが発生します。
メッセージは本当に奇妙かもしれません。

find_upwards ファイル名
ディレクトリ ., .., .. 内で指定された名前のファイルを検索します。/ ..、../../.。など
ファイルが見つかるまで、ルート ディレクトリに到達するか、ディレクトリが見つかるまで
別のファイル システム上にあります。 (この最後の要件は、
オートマウンターまたはハングしたネットワーク ファイルシステム。) RootMakepp ファイル、それも
より高いところへの探索を妨げる障壁。

たとえば、多くのレベルのサブディレクトリを持つプロジェクトがある場合、次のようにすることができます。
この共通フラグメントをすべてのメイクファイルに含めます (たとえば、「include」を使用します)。
ステートメント):

TOP_LEVEL_INCLUDE_DIR := $(find_upwards が含まれる)
# を含むディレクトリを検索します。
# にはサブディレクトリが含まれます。

%.o:%。c
$(CC) $(CFLAGS) -I$(TOP_LEVEL_INCLUDE_DIR) -c $(入力) -o $(出力)

「find_upwards」が解決に役立つもう XNUMX つの問題は、トップレベルのディレクトリを見つけることです。
ビルドの。 多くの場合、次のように変数を定義すると便利です。

トップ := ../../.。

重要な情報が最上位ディレクトリにのみ存在する場合。 しかし
「..」の数はレベルごとに異なるため、これを維持するのは困難です
ディレクトリツリーの。 代わりに、「find_upwards」を使用して、次のファイルを見つけることができます。
最上位ディレクトリにのみ存在することが知られています。 たとえば、
ファイル「LICENSE」は最上位ディレクトリにのみ配置されます。 次に、次のようにすることができます。

TOP := $(dir_noslash $(find_upwards LICENSE))

「$(find_upwards LICENSE)」はライセンス ファイルのフル パスを返します。
「$(dir_noslash ...)」はファイル名を取り除き、ディレクトリのみを返します。

(「include」ステートメントはファイルを自動的に上方向に検索するため、
次のようなことをする必要はありません。

$(find_upwards top_level_rules.mk) を含める

代わりに、次のようにすることができます

top_level_rules.mk を含める

それも同様に機能します。)

ファイルが見つからない場合、「find_upwards」はエラー メッセージを表示してビルドを中止します。

複数のファイルを指定した場合、find_upwards は最初のファイルを検索し、その後、
XNUMX 番目など。 言い換えると、

$(find_upwards file1 file2)

に相当します

$(find_upwards ファイル 1) $(find_upwards ファイル 2)

いずれかのファイルを検索したい場合は、代わりに「find_first_upwards」を使用してください。

find_first_upwards file1 file2 ...
この関数は、「find_upwards」と同様に動作しますが、最初のファイルを返す点が異なります。
見つかったリスト内のファイル。 具体的には、現在のディレクトリをチェックします。
リスト内のいずれかのファイルを選択し、存在するか構築可能な最初のファイルを返します。
ファイルが存在しない場合、またはそのディレクトリにファイルを構築できない場合は、次のチェックが行われます。 ..をタップし、その後、
../ ..など、ルート ディレクトリまたはディレクトリに到達するまで、
別のファイル システム上にあります。

最初に利用可能 file1 file2 ...
リスト内の存在する、または構築可能な最初のファイルを返します。 これは次のような用途に役立ちます。
メイクファイルを複数の異なるマシンまたはネットワーク上で動作するように調整します。
重要なファイルは別の場所にある可能性があります。 たとえば、次の行があります
私のメイクファイルのXNUMXつ:

TCL_LIB = $(first_available \
/usr/local/stow/tcl-8.4.5-nothread/lib/libtcl8.4.so \
/usr/lib/libtcl8.4.so /usr/lib/libtcl.so \
/net/na1/tcl8.4a3/lib/libtcl8.4.a \
/net/na1/tcl8.4a3/lib/libtcl8.4.sl)

この行は、上記のすべての場所で Tcl ライブラリをチェックし、次の場所で停止します。
最初に見つかったもの。 リンク コマンドには $(TCL_LIB) が含まれるため、
適切な Tcl ライブラリ。

infer_linker file1 file2 ...
オブジェクト ファイルのリストが与えられ、まだ構築されていない場合は、まず構築します。 それから見つけてください
Fortran、C++、または C ソースに依存しているかどうかを判断し、対応するコードを返します。
コンパイラ (「ld」よりもリンク方法をよく知っています)。

infer_objects file1 file2 ···、 パターン
$(infer_objects object1.o object2.o, *.o)

ヘッダー ファイル名に関する標準規則を使用する場合、makepp では次のことが可能です。
どの ".o" または ".lo" ファイルをプログラムにリンクする必要があるかを推測します。 これを使って
さまざまなモジュールで使用されるモジュールを含むライブラリ ディレクトリからファイルを選択します。
プログラム。 ライブラリ「.a」ファイルを作成し、リンカにライブラリ「.a」ファイルを選択させる代わりに、
関連するモジュールを選択すると、makepp が関連するモジュールを選択します。 このままでは、
関連するモジュールがコンパイルされます。

オブジェクトの依存関係を推論するための Makepp のアルゴリズムは、次の規則に依存します。
ヘッダー ファイル「xyz.h」で定義されているすべてのクラスまたは関数の実装は次のとおりです。
「xyz.o」(または「xyz.lo」)というオブジェクト ファイルにコンパイルされます。 したがって、makepp のアルゴリズムは、
オブジェクトの依存関係の推論は、依存関係が必要であることがわかっている XNUMX つまたはいくつかのオブジェクトから始まります。
プログラムにリンクされています。 どのファイルが「#include」でインクルードされているかを調べます。
これらのソースを検索し、各インクルードに対応するオブジェクト ファイルを見つけようとします。
ファイル。

「$(infer_objects )」は、次のようにプログラムの依存関係リストに記載する必要があります。
この:

myprog: $(infer_objects main.o another_object.o, \
**/*.o /other/library/dirs/**/*.o)
$(CXX) $(入力) -o $(出力) $(LIBS)

「$(infer_objects)」関数は XNUMX つの引数を受け取ります (図に示すように、カンマで区切られています)。
XNUMX つ目は、必須であることがわかっている XNUMX つまたはいくつかのオブジェクト ファイルです (ワイルドカードは
ここでは許容されます)。 XNUMX 番目は、可能なオブジェクトのリストです (通常は、
ここではワイルドカードを使用します)、必要に応じてリンクできます。 ここからの戻り値は
function は、最初の引数にあるすべてのオブジェクトを最初に含むリストであり、
その後、XNUMX 番目の引数に含まれるすべての追加オブジェクト
最初の引数のオブジェクトに必要なもの。

たとえば、「main.o」が「my_class.h」を含む「main.cpp」から来ているとします。
「$(infer_objects)」は「my_class.o」という名前のファイルを検索します。 まさにそのようなものが XNUMX つある場合
ファイルが見つかると、リストに追加されます。 (オブジェクトファイル「my_class.o」がXNUMXつ見つかった場合)
異なるディレクトリでは、警告メッセージが出力されます。)「infer_objects」も
「my_class.cpp」を調べて、それに含まれる内容と追加のオブジェクト ファイルを確認します。
暗黙のうちに。

mktemp
mktemp 接頭辞
mktemp 接頭辞XXX
mktemp /
現在存在しない、予測できない一時ファイル名を返します。 ノーネーム
同じファイルを指すと、相対パスが異なっていても XNUMX 回返されます。
XNUMX 回の makepp 実行内 (おそらく従来の再帰的 make を除く、または Perl の場合は除く)
ルールアクション内で実行されるコードは「f_mktemp」を呼び出します)。 makepp の最後にすべてを実行します
この関数によって返されたファイルは、存在する場合は削除されます (ただし、これらのファイルは除きます)。
ルール内で実行される Perl コードのこの関数によって返されます)。

引数の末尾にある任意の数の大文字「X」は、その数に置き換えられます。
ランダムな文字と数字。 数が多ければ多いほど、衝突する可能性は低くなります
他のプロセスと同じなので、「」のようなプレフィックスを付けると、/tmp/abc."、十分にあるはずです
「X」。 X が複数ある場合、最初の文字はプロセス ID から取得されます。 もし
何もありません。あたかも 8.4 個あるかのようで、おそらくそれで十分です (17eXNUMX)
Windows では 3.7e15 の可能性があります)。 引数がない場合、プレフィックスはデフォルトで次のようになります。
"一時。" 現在のディレクトリにあります。

ルールのターゲットや依存関係などの名前を付けないことに注意してください。 の
結果は正しいはずですが、makepp を実行するたびに結果が再作成されます。

また、常に異なるため、ルール アクションでこれを使用するのは、次の場合にのみ使用する必要があります。
":build_check 無視_アクション":

TMPFILE ;= $(mktemp) # 1 回の呼び出し; 「=」は 3 つの呼び出し: 3 つのファイルを意味します
A-カウント B-カウント: :build_checkignore_action
プロデュース・アズ・アンド・B >$(TMPFILE)
&grep -c /A/ $(TMPFILE) -o A-count
&grep -c /B/ $(TMPFILE) -o B-count

または、それをエクスポートしてシェルに評価させる必要があります。

エクスポート TMPFILE ;= $(mktemp)
A カウント B カウント:
Produce-As-and-Bs >$$TMPFILE # makepp は var 値を認識しません
fgrep -c A $$TMPFILE >A-count
fgrep -c B $$TMPFILE >B-count

最後の形式は前の戻り値を繰り返すため、パターン ルールで使用できます。

%.x: %.y
&grep foo $(input) -o $(mktemp)
&sed bar $(mktemp /) -o $(output) # &grep の出力を操作します

ノットディル ファイル名
ファイル名のディレクトリ以外の部分、つまり最後のファイル名の後のすべてを返します。
ファイル名がある場合はスラッシュ、そうでない場合はファイル名全体。

生成のみ ファイル名
リスト内の makepp によって生成され、それ以降に生成されたファイル名のみを返します。
ビルド情報ファイルに従って変更されました。

この関数は、クリーン ターゲット ルールで役立ちます (もちろん、「makeppclean」は
推奨されるバリアント):

$(偽のクリーン):
&rm -f $(only_generated **/*)

Only_nontargets ファイル名
リスト内のどのルールのターゲットでもないファイル名のみを返します(
明示的なルールまたはパターン ルール)。 ワイルドカードを指定できます (「$(wildcard )」を参照)
makepp のワイルドカードの詳細については、関数を参照してください)。 これは、
配布ターゲット、例:

.PHONY: 配布

分布:
&mkdir our_product-$(VERSION)
&cp $(filter-out %~, $(only_nontargets *)) our_product-$(VERSION)
tar cf - our_product-$(VERSION) | gzip -9c > our_product-$(VERSION).tar.gz

この場合、「$(only_nontargets *)」は現在のディレクトリ内のすべてのファイルを返します。
それは何らかのルールの対象ではありません。 「$(filter_out %~, ...)」はエディタを削除します
バックアップ。

「only_targets」(上記を参照) と同様に、「only_nontargets」は、次のターゲットについてのみ認識します。
すでに定義されています。 これは変数の定義に使用する場合にのみ問題になります。
「:=」割り当てを使用します。 依存関係リストまたは本体で使用する場合
ルール以外のルールはすべてすでに表示されています。

のみ_古い ファイル名
リスト内の makepp によって生成され、それ以降に生成されたファイル名のみを返します。
ビルド情報ファイルに従って変更されましたが、どのルールのターゲットでもなくなりました。

この関数は、そのようなファイルに依存関係がないことを確認するのに役立ちます。
すべてのターゲットのクリーン ビルドを強制する必要はありません。

$(偽のフラッシュ):
&rm -f $(only_stale **/*)

実際には、makepp を呼び出して生成するスクリプトを作成する方がよいでしょう。
古いファイルのリストを取得し、そのスクリプトでリストされたすべてのファイルを削除します。
現在はソース管理下にありません。生成されたファイルがソースになる場合に備えて
ファイル。 Makepp にはそのような関数が組み込まれていません。
ソース管理については不可知性を維持すべきです。

のみ_ターゲット ファイル名
リスト内の実際に何らかのルールのターゲットであるファイル名のみを返します。
(明示的なルールまたはパターンルール)。 ワイルドカード (makepp の文字列を含む) を指定できます。
ファイル名に特別なワイルドカード (「**」) が含まれています。 (詳細については、「$(wildcard )」関数を参照してください。
詳細。 これは、次のようなクリーンなターゲットに使用できます。

.PHONY: クリーン

クリーン:
&rm -f $(only_targets *)

ここで「makepp clean」と入力すると、構築方法を知っているすべてが削除されます。 しかし
クリーンなターゲットを作成せず、代わりに「makeppclean」を使用してください。

もう XNUMX つの便利な場所は、古いものを含めないようにすることです。 .o あなたの中のファイル
建てる。 たとえば、次のようなライブラリを構築するとします。

mylib.a: *.o
&rm -f $(出力)
$(AR) cr $(出力) $(入力)

その後、いくつかのソース ファイルを削除しましたが、対応するソース ファイルを削除するのを忘れました。 .o ファイル、
  .o ファイルはまだ存在します。 これは、それらが引き続き組み込まれることを意味します
もう役に立たないにもかかわらず、ライブラリを保存します。 を変更する場合は、
このようなルール:

mylib.a: $(only_targets *.o)
&rm -f $(出力)
$(AR) cr $(出力) $(入力)

そうすればこの問題は発生しません。

これは、ターゲットであることがわかっているファイルのみを指すことに注意してください。 at   時間 貴社
呼び出します 「ターゲットのみ」。 「only_targets」が依存関係またはアクションに表示される場合、
ルールを適用すると、依存関係とアクションが認識されないため、考えられるすべてのターゲットが判明します。
ルールが実行されるまで評価されます。 ただし、評価する場合は評価してみてください
Makefile の前半で、次のように「:=」変数を使用します。

ALL_TARGETS := $(only_targets *)

ターゲット1: 依存関係1
行動

ターゲット2: 依存関係2
行動

その場合、「only_targets」は後続のルールを認識しません。

同様に、「only_targets」は、メイクファイルで生成されたターゲットについては認識しません。
再帰的な make がロードされます。 (ただし、とにかく再帰的な make を使用すべきではありません。
代わりに「load_makefile」ステートメントを使用するか、暗黙的に makefile をロードしてください)。

相対ファイル名 file1 file2 ファイル3[、 スラッシュ]
現在のディレクトリ (ディレクトリ) からの相対的なファイルの名前を返します。
メイクファイルが入っています)。 これは、不要な「./」やその他のジャンクをクリーンアップするためにも使用できます。
パス:

ディレクトリ:= 。
サブディレクトリ := ..
FNAME := $(DIR)/../otherdir/$(SUBDIR)/files
X := $(相対ファイル名 $(FNAME))

If スラッシュ true (通常は 1) 返されるファイル名にはスラッシュが含まれることが保証されます。
必要に応じて「./」を先頭に追加すると、それを実行可能ファイル名として使用できます。
コマンド検索パスがディレクトリの場所を上書きすることを心配しています。

パスがルート ディレクトリを経由する場合、ホーム ディレクトリまたは
ビルド システムの「$(ROOT)」、または Windows ではドライブのルート (
環境でもこれは起こります /cygdrive/c or /c)、絶対パスは次のようになります。
代わりに戻ってきました。

に関連して file1 file2 ファイル3[、 ディレクトリ]
指定されたディレクトリからの相対的なファイルの名前を返します。 これは
通常、何らかの理由でコマンドを実行する必要がある場合に便利です。
別のディレクトリ (デフォルトの現在のディレクトリ):

ソース_バックアップ.tar:
cd .. && tar cf $(relative_to $(output), ..) $(relative_to ., ..)

サフィックス 名前...
名前内の各ファイル名の接尾辞を抽出します。 ファイル名にピリオドが含まれている場合、
接尾辞は最後のピリオドで始まるすべてです。 それ以外の場合、サフィックスは
空の文字列。 これは、名前が空でない場合に結果が空になることを意味します。
また、名前に複数のファイル名が含まれている場合は、結果に含まれるファイル名が少なくなる可能性があります。

たとえば、

$(サフィックス src/foo.c src-1.0/bar.c ハック)

結果「.c .c」が生成されます。

一時的 言葉
指定されたターゲットが、生成するルールによって削除される可能性があることを makepp に知らせます。
彼ら。 「phony」と似ていますが、makepp がその名前の実際のファイルを期待している点が異なります。
意志はルールの影響を受ける可能性があります。 一時的なルールのみの場合、ルールは実行されません。
ターゲットが古くなっています。

ワイルドカード パターン
指定されたパターンに一致する存在するすべてのファイルのソートされた名前、または存在するファイルの名前を返します。
まだ存在していないが、makepp が知っているルールに基づいて構築できるファイル
式を評価する時点でのことです。 この最後の点では異なります
ルール入力ワイルドカードから。これは、後で見つかったルールによって作成されたファイルにも適用されます。

Makepp は、通常のシェル ワイルドカード (「*」、「?」、および「[]」) をすべてサポートします。 また、
ワイルドカード「**」は、間にある任意の数のディレクトリに一致します。 (このアイデアは
zsh から盗まれたものです。) たとえば、「**/*.c」はすべての .c ソース全体のファイル
木。 「objects/**/*.o」はすべての .o のどこかに含まれるファイル
サブディレクトリ オブジェクト またはそのサブディレクトリのいずれか、またはそのサブディレクトリのいずれか。 の
「**」ワイルドカードは、どのレベルでもディレクトリへのソフト リンクをたどることはありません。
存在するが読み取れないディレクトリに入ろうとします。 ファイルや
存在するが読み取ることができないディレクトリは、「$(wildcard )」によって返されません。

文字列 機能
プレフィックスを追加 プレフィックス、 言葉
各単語の先頭にプレフィックス文字列を付加します。 これは主に GNU make 用です
互換性。 rc スタイルの展開を使用すると、より読みやすい方法でこれを行うことができます
このような:

モジュール := abcd
X_OLD_STYLE := $(addprefix $(OBJDIR)/, $(addsuffix .o, $(MODULES)))
X_NEW_STYLE := $(OBJDIR)/$(MODULES).o # 読みやすくなりませんか?

adduffix サフィックス、 言葉
各単語に接尾辞文字列を追加します。 これは主に GNU make 用です
互換性。 rc スタイルの展開を使用すると、より読みやすい方法でこれを行うことができます
このような:

X_OLD_STYLE := $(サフィックス .o を追加, $(MODULES))
X_NEW_STYLE := $(MODULES).o

コール 変数[、 言葉]...
関数「call」は、次のことを考慮して使用できるという点でユニークです。 変数 として
パラメータ化された関数。 複雑な式を割り当てることができます 変数 使用する
「call」を使用して、その内容をパラメータ化されたさまざまな値に展開します。 言葉 後で。 で
他の make システム、主に経由で拡張する目的で使用される変数
「コール」は、と呼ばれます マクロ.

マクロの展開中に、一時変数 $1, $2, 「……」 を参照してください
呼び出し中に「call」に指定される引数。 変数 $0 に拡張されます
マクロの名前 (つまり、 変数)その「呼びかけ」が現在拡大中です。

マクロを「呼び出す」ことができる引数の数、またはその数に制限はありません。
マクロが予期するパラメータ。 マクロとして「call」にさらに引数を渡す場合
必要に応じて、超過した引数はすべて破棄されます。 渡す引数の数が少ない場合は、
マクロでは、超過したパラメータはすべて空の文字列に折りたたまれます。

まず簡単な例を示します。

残り = $(単語リスト 2, $(単語 $(1)),$(1))
リスト = ABCDE
butfirst := $(rest を呼び出す,$(list))

ここで、変数「$(butfirst)」にはリスト「BCDE」が含まれます。

次に、何が可能かを示す、より複雑な例を示します。

残り = $(単語リスト 2,$(単語 $(1)),${1})
mymap = $(if $2,$(call $1,$(firstword $2)) $(call $0,$1,$(callrest,$2)))
ダウンケース = ${makeperl lc("$1")}

UCWORDS = これらの単語はすべて大文字です
DCWORDS := $(mymap を呼び出す,downcase,$(UCWORDS))

現在、「$(DCWORDS)」には「これらの単語はすべて大文字」が含まれています。 ちなみに、それはありません
違いは、引数にアクセスするかどうかです。 $1, 「${1}」 or 「$(1)」 マクロ内で。

変数がない場合は、関数であるかのように変数を直接使用できます。
その名前の機能。 これは内部で「call」に変換されるため、次のようになります。
同等:

議論 = $0 が $1 $2 になりました。
direct = $(議論と引数)
呼び出された = $(ディスカッションの呼び出し,an,argument)

「$[call]」がマクロの「$[]」も展開すべきかどうかについては議論の余地があるかもしれません。
式、または関数がどのような方法であっても常に同じことを実行する必要があるかどうか
と呼ばれます。 通常の make 構文では次のようになるため、後者が選択されました。
"$[1]、$[2]..." を変数に取得することは不可能です (これらは何も置き換えられません。
割り当てが行われる前です。) したがって、
ルールでは、ルールが解析されるときに「$(output)」のような式が表示されるようにする必要があるため、
「呼び出し」からそれらを保護する必要があります。

マイルールを定義する
2ドル: 1ドル
mycommand $$(入力) -o $$(出力)
エンデフ
$[myrule myinput,myoutput]

filter パターン、 言葉
パターンに一致するリスト内のすべての単語を返します。 パターンは単に他のものである可能性があります
単語、またはファイル名のワイルドカード (つまり、「*」、「?」、および「[az]」が認識されます)、あるいはそれらは
これは、その時点で任意の文字列と一致することを意味します (「*」と同じ)。

フィルターアウト パターン、 言葉
パターンに一致しないリスト内のすべての単語を返します。 パターンは単純に次のとおりです。
言い換えると、ファイル名のワイルドカード (つまり、「*」、「?」、および「[az]」が認識されます)、または
「%」文字が含まれる場合があります。これは、その時点で任意の文字列と一致することを意味します (
「*」)。

例:

libproduction.a: $(filter_out test_*, $(wildcard *.o))

すべてを置きます .o で始まるファイルを除く、存在するかビルドできるファイル test_,
libproduction.a.

検索文字列 探す、 in
返品 findの部分文字列の場合 in.

最初の言葉 言葉
最初の単語を返します。

地図 言葉、 パーコード
メイクマップ 言葉、 パーコード
Perl のマップと同様に適用されます パーコード 各単語を順番に返します。
結果。 最初のバリアントはプレーンな Perl コードですが、XNUMX 番目のバリアントは最初にパスします。
Make スタイルの変数展開による perlcode。 単語は両方で展開されます
ケース。

単語は $_ にあり、$_ の定義を解除しない限り返されます。 これは以下を対象としています
「patsubst」では簡単に扱えない修正。 最初のカンマのみが区切り文字になります。
他のものはその一部とみなされます パーコード.

# 言葉を切り替えます。 Perl コードで括弧を許可するには、二重括弧を使用するか、${} を使用します。
X = $((マップ $(VALUES), s/(.+)-(.+)/$2-$1/))
# make 式を使用できますが、Perl には $$ を使用する必要があります $:
Y = $(makemap $(VALUES)、tr/$(OLDCHARS)/$(NEWCHARS)/ または $$_ = '失敗')
# 候補を除外できます。
Y = $(map $(VALUES), undef $_ if /no_good/)

join 言葉1、 言葉2
最初の単語と XNUMX 番目の単語をペアごとに結合します。

パットサブスト パターン、 代替、 言葉
単語リスト内の各単語に対して置換を実行します。 「%」文字は任意の文字に一致します
弦。 これを最もよく説明する例は次のとおりです。

OBJS = $(patsubst %.c, object_dir/%.o, $(C_SOURCES))

C_SOURCES 内のすべてのファイルを取得し、object_dir 内のオブジェクト ファイルの名前を返します。
場合によっては、置換参照を使用する方がより簡潔になる場合があります。たとえば、上記のようになります。
のように書かれています

OBJS = $(C_SOURCES:%.c=object_dir/%.o)

sort word1 word2 word3 ...
単語を語彙順に並べ替え、重複を削除します。

ストリップ 文字列
文字列から先頭と末尾の空白を削除し、内部の各空白を置き換えます。
XNUMX つのスペースを含む XNUMX つ以上の空白文字のシーケンス。 したがって、「$(strip ab
c)" は "abc" になります。

SUBST から、まで、テキスト
テキスト text に対してテキスト置換を実行します。from が出現するたびに置換されます。
までに。 結果は関数呼び出しに置き換えられます。 例えば、

$(subst ee、EE、路上でフィート)

文字列「fEEt on the strEEt」を置き換えます。

単語 n、テキスト
を返します nの XNUMX 番目の単語 클라우드 기반 AI/ML및 고성능 컴퓨팅을 통한 디지털 트윈의 기초 – Edward Hsu, Rescale CPO 많은 엔지니어링 중심 기업에게 클라우드는 R&D디지털 전환의 첫 단계일 뿐입니다. 클라우드 자원을 활용해 엔지니어링 팀의 제약을 해결하는 단계를 넘어, 시뮬레이션 운영을 통합하고 최적화하며, 궁극적으로는 모델 기반의 협업과 의사 결정을 지원하여 신제품을 결정할 때 데이터 기반 엔지니어링을 적용하고자 합니다. Rescale은 이러한 혁신을 돕기 위해 컴퓨팅 추천 엔진, 통합 데이터 패브릭, 메타데이터 관리 등을 개발하고 있습니다. 이번 자리를 빌려 비즈니스 경쟁력 제고를 위한 디지털 트윈 및 디지털 스레드 전략 개발 방법에 대한 인사이트를 나누고자 합니다. 。 の正当な値は、 n 最初は1から始める
または最後に -1 から逆方向に進みます。 もし n の単語数よりも大きいです 클라우드 기반 AI/ML및 고성능 컴퓨팅을 통한 디지털 트윈의 기초 – Edward Hsu, Rescale CPO 많은 엔지니어링 중심 기업에게 클라우드는 R&D디지털 전환의 첫 단계일 뿐입니다. 클라우드 자원을 활용해 엔지니어링 팀의 제약을 해결하는 단계를 넘어, 시뮬레이션 운영을 통합하고 최적화하며, 궁극적으로는 모델 기반의 협업과 의사 결정을 지원하여 신제품을 결정할 때 데이터 기반 엔지니어링을 적용하고자 합니다. Rescale은 이러한 혁신을 돕기 위해 컴퓨팅 추천 엔진, 통합 데이터 패브릭, 메타데이터 관리 등을 개발하고 있습니다. 이번 자리를 빌려 비즈니스 경쟁력 제고를 위한 디지털 트윈 및 디지털 스레드 전략 개발 방법에 대한 인사이트를 나누고자 합니다.
値が空です。

単語リスト インデックスリスト、 言葉
単語リスト 最初のインデックス、 最後のインデックス、 言葉
最初のフォームでは、インデックスのリスト (最初は 1 から数えるか、
最後に -1 から逆方向) を選択して、必要な単語を選択します。 XNUMX 番目の形式では、
返したい単語の範囲を指定します。

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

その他 機能
foreachの 変数、リスト、テキスト
最初の XNUMX つの引数は、 VAR & リスト、他の処理が行われる前に展開されます。 注記
最後の引数である text は同時に展開されないこと。 次に、それぞれの単語に対して、
list の展開された値、var の展開された値によって名前が付けられた変数は、次のように設定されます。
その単語を入力すると、テキストが展開されます。 おそらくテキストにはその変数への参照が含まれています。
したがって、その展開は毎回異なります。

この簡単な例では、変数を設定します ファイル 内のすべてのファイルのリストに
リスト内のディレクトリ Dirs:

ディレクトリ := abcd
ファイル := $(foreach dir,$(dirs),$(ワイルドカード $(dir)/*))

ここでのテキストは「$(wildcard $(dir)/*)」です。 最初の繰り返しでは、dir の値「a」が見つかります。
したがって、「$(wildcard a/*)」と同じ結果が生成されます。 XNUMX 回目の繰り返しで生成されるのは
"$(ワイルドカード b/*)" の結果; XNUMX つ目は、「$(wildcard c/*)」です。

この例は、次の例と同じ結果になります (「dirs」の設定を除く)。

ファイル := $(ワイルドカード a/* b/* c/* d/*)

テキストが複雑な場合は、テキストに名前を付けると読みやすくなります。
追加の変数:

find_files = $(ワイルドカード $(dir)/*)
ディレクトリ := abcd
ファイル := $(foreach dir,$(dirs),$(find_files))

ここでは変数 find_files をこのように使用します。 単純な「=」を使用して定義します。
再帰的に展開される変数。その値には実際の関数呼び出しが含まれます。
foreach の制御下で再展開されます。 単純に展開された変数では機能しません。
ワイルドカードは find_files の定義時に XNUMX 回だけ呼び出されるからです。

注: これを「$(foreach)」特殊変数と混同しないでください。

info 클라우드 기반 AI/ML및 고성능 컴퓨팅을 통한 디지털 트윈의 기초 – Edward Hsu, Rescale CPO 많은 엔지니어링 중심 기업에게 클라우드는 R&D디지털 전환의 첫 단계일 뿐입니다. 클라우드 자원을 활용해 엔지니어링 팀의 제약을 해결하는 단계를 넘어, 시뮬레이션 운영을 통합하고 최적화하며, 궁극적으로는 모델 기반의 협업과 의사 결정을 지원하여 신제품을 결정할 때 데이터 기반 엔지니어링을 적용하고자 합니다. Rescale은 이러한 혁신을 돕기 위해 컴퓨팅 추천 엔진, 통합 데이터 패브릭, 메타데이터 관리 등을 개발하고 있습니다. 이번 자리를 빌려 비즈니스 경쟁력 제고를 위한 디지털 트윈 및 디지털 스레드 전략 개발 방법에 대한 인사이트를 나누고자 합니다.
警告 클라우드 기반 AI/ML및 고성능 컴퓨팅을 통한 디지털 트윈의 기초 – Edward Hsu, Rescale CPO 많은 엔지니어링 중심 기업에게 클라우드는 R&D디지털 전환의 첫 단계일 뿐입니다. 클라우드 자원을 활용해 엔지니어링 팀의 제약을 해결하는 단계를 넘어, 시뮬레이션 운영을 통합하고 최적화하며, 궁극적으로는 모델 기반의 협업과 의사 결정을 지원하여 신제품을 결정할 때 데이터 기반 엔지니어링을 적용하고자 합니다. Rescale은 이러한 혁신을 돕기 위해 컴퓨팅 추천 엔진, 통합 데이터 패브릭, 메타데이터 관리 등을 개발하고 있습니다. 이번 자리를 빌려 비즈니스 경쟁력 제고를 위한 디지털 트윈 및 디지털 스레드 전략 개발 방법에 대한 인사이트를 나누고자 합니다.
エラー 클라우드 기반 AI/ML및 고성능 컴퓨팅을 통한 디지털 트윈의 기초 – Edward Hsu, Rescale CPO 많은 엔지니어링 중심 기업에게 클라우드는 R&D디지털 전환의 첫 단계일 뿐입니다. 클라우드 자원을 활용해 엔지니어링 팀의 제약을 해결하는 단계를 넘어, 시뮬레이션 운영을 통합하고 최적화하며, 궁극적으로는 모델 기반의 협업과 의사 결정을 지원하여 신제품을 결정할 때 데이터 기반 엔지니어링을 적용하고자 합니다. Rescale은 이러한 혁신을 돕기 위해 컴퓨팅 추천 엔진, 통합 데이터 패브릭, 메타데이터 관리 등을 개발하고 있습니다. 이번 자리를 빌려 비즈니스 경쟁력 제고를 위한 디지털 트윈 및 디지털 스레드 전략 개발 방법에 대한 인사이트를 나누고자 합니다.
何も返さない出力テキスト。 XNUMX つ目は STDOUT に送られ、XNUMX つ目は STDERR に送られます。
XNUMX 番目はさらに処理を中止します。

事前構築 ターゲット
make ターゲット
引数をそのまま返しますが、最初にリストされているすべてのファイルをビルドします。 これは便利です
make 式を評価するときに特定のファイルが必要な場合。 これは通常起こります
関連するファイルのセットが何らかのシェルによって計算されるビルドがある場合
コマンド。 例えば、

ファイルリスト:
# プログラムに入れるファイルのリストを計算するシェルコマンド

my_program : $(&cat $(prebuild file_list))

複数のルールでリストが必要な場合は、
変数を最大 XNUMX 回展開します。

file_list ;= $(&cat $(prebuild file_list))

my_program1 : ao $(file_list)

my_program2 : bo $(file_list)

代わりに「$(&cat file_list)」だけを指定した場合、makepp は強制しません。
file_list は、シェル コマンドを実行する前に最新の状態にする必要があります。 「$(prebuild )」を使用する
この問題を解決する最良の方法です。 他のことも試してみたくなるかもしれません。
この:

my_program : file_list $(&cat file_list)

しかし、これは機能しません。なぜなら、makepp が試行する前に「$(&cat file_list)」が評価されるからです。
「file_list」をビルドします。

Only_phony_targets
リスト内の、何らかのルールの偽のターゲットである名前のみを返します (
明示的なルールまたはパターン ルール)。 ワイルドカード (makepp の特殊なカードを含む) を指定できます。
ファイル名にはワイルドカード「**」) が含まれます。 (詳細については、「$(wildcard )」関数を参照してください。
これは、ターゲットをグループ化するために使用できます。例:

$(偽のテスト): $(only_phony_targets */**/tests)

起源 変数
変数の名前を指定すると、その値がどこから来たのかがわかります。

パール パーコード
メイクパール パーコード
ブロック内の perlcode を評価し、結果を返します。 最初のバリアントはプレーンな Perl です
コードを使用しますが、XNUMX 番目のバリアントは最初に Make スタイル変数を介して Perl コードを渡します。
拡張。

すべての関数と同様に、使用される関数区切り文字が関数内に表示されない場合があることに注意してください。
一重引用符または二重引用符で囲まれた文字列の外側の perlcode。 しかし、次のようにそれをXNUMX倍にすることができます
最後の例:

VAR = 1
VAR1 = ${perl ($VAR + 1) * 3}
VAR2 = $(perl do { $VAR *= 3; return $VAR + 1 } if $VAR)
VAR3 = $(makeperl $(VAR1) * 3 + $$VAR) # XNUMX つの Make var と XNUMX つの Perl var
VAR = $((perl if( ... ) { ... }))

偽物 言葉
単語のリストが実際には偽のターゲットであることを示し、単語のリストを返します。
ターゲット。 これは次のように使用することを目的としています。

$(偽のすべて): my_program

$(偽のクリーン):
&rm -f *.o my_program

また、次のような行を次の行で XNUMX つ以上のターゲットを偽として宣言することもできます。
あなたのメイクファイル:

.PHONY: すべてクリーン

印刷 클라우드 기반 AI/ML및 고성능 컴퓨팅을 통한 디지털 트윈의 기초 – Edward Hsu, Rescale CPO 많은 엔지니어링 중심 기업에게 클라우드는 R&D디지털 전환의 첫 단계일 뿐입니다. 클라우드 자원을 활용해 엔지니어링 팀의 제약을 해결하는 단계를 넘어, 시뮬레이션 운영을 통합하고 최적화하며, 궁극적으로는 모델 기반의 협업과 의사 결정을 지원하여 신제품을 결정할 때 데이터 기반 엔지니어링을 적용하고자 합니다. Rescale은 이러한 혁신을 돕기 위해 컴퓨팅 추천 엔진, 통합 데이터 패브릭, 메타데이터 관리 등을 개발하고 있습니다. 이번 자리를 빌려 비즈니스 경쟁력 제고를 위한 디지털 트윈 및 디지털 스레드 전략 개발 방법에 대한 인사이트를 나누고자 합니다.
テキストを出力して返します。 これは主にデバッグに役立ちますが、そうでない場合に便利です。
変数置換がなぜそのような結果をもたらすのかを理解してください。 例えば、

XYZ := $(print $(patsubst %.c, %o, $(SOURCE_FILES)))

「patsubst」呼び出しの結果を出力します。

XYZ := $(patsubst %.c, %o, $(print $(SOURCE_FILES)))

「patsubst」呼び出しの最後の引数を出力します。

shell シェルコマンド
指定されたシェル コマンドからの出力を、改行をスペースに置き換えて返します。

すべての関数と同様に、使用される関数区切り文字が関数内に表示されない場合があることに注意してください。
一重引用符または二重引用符で囲まれた文字列の外側にあるシェルコマンド。 でもXNUMX倍にすることはできる
XNUMX 番目の例のように:

date = $(シェル日付) # より良い: $(perl スカラー localtime)
VAR = ${{shell f() { echo hello; }; f}}

xargs コマンド,引数[,サフィックス[,長さ]]
指定されたコマンドで始まるコマンドの改行で区切られたリストを返します。
コマンドを実行し、範囲を超えずにできるだけ多くのリストの要素で終了します。
長さ (デフォルトは 1000) 文字。

この目的は、システム上のコマンド長制限を超えないようにすることです。
たとえば、生成されたファイルが多数ある場合は、おそらく
clean ターゲット (「makeppclean」の方が効率的であるため、これは使用しないでください)
次のようになります:

$(偽のクリーン):
$(xargs $(RM), $(only_targets **/*))

これには、リストが次の場合にはコマンドがまったく生成されないという副作用もあります。
たまたま空いている。 ただし、この場合は組み込みの &rm を使用する方が良いでしょう。
組み込みコマンドの引数は Perl のメモリによってのみ制限されるためです。

$(偽のクリーン):
&rm -f $(only_targets **/*)

XNUMX 番目の引数が指定されている場合、それは各コマンドの接尾辞として使用されます。 これは
リダイレクタを指定するのに役立ちます。たとえば (ただし、ここでも &echo が役に立ちます):

マニフェスト:
&rm -f $@
$@ にタッチ(&T)
$(xargs echo, $(only_nontargets **/*), >> $@)

このドキュメントの一部は、GNU make ドキュメントに基づいています。

メイクファイルの初期化中に関数が呼び出される場合には注意してください。
エクスポート変数を展開すると、エラーまたは警告メッセージが行番号 0 を報告します。

onworks.net サービスを使用してオンラインで makepp_functions を使用する


無料のサーバーとワークステーション

Windows と Linux のアプリをダウンロード

Linuxコマンド

Ad