これは、Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、または MAC OS オンライン エミュレーターなどの複数の無料オンライン ワークステーションの XNUMX つを使用して、OnWorks 無料ホスティング プロバイダーで実行できるコマンド makepp_incompatibilities です。
プログラム:
NAME
makepp_incompatibilities -- makepp と GNU make の間の非互換性
DESCRIPTION
Makepp は、GNU make に可能な限り近づけるように設計されました。
(<http://www.gnu.org/software/make/manual/make.html>)。 GNU オートツール
(<http://www.gnu.org/software/automake/manual/automake.html>)、CMake
(<http://www.cmake.org/>)、プリメイク(http://industriousone.com/premake> コメントを参照してください
以下)、または手作りのレガシー ビルド システムは、makepp でビルドできる必要があります。 これはとても〜です
プロジェクトを簡単に移行できます。 または、すべてを楽しみたくない場合は、
makepp の利点 (例: 他の人が引き続き GNU make を使用してプロジェクトをビルドできるため)
開発の信頼性の利点から利益を得ることができます。
ただし、哲学の違いにより、GNU 製または POSIX 製の一部の
(<http://pubs.opengroup.org/onlinepubs/009695399/utilities/make.html>) 機能はできません
サポートされました。 時間がなかったため、いくつかは実装されていません。 ほとんど
GNU make との違いは非常に技術的であり、問題が発生することはほとんどありません。 ああ、
従来の make の欠点の回避策はますます複雑になっており、
そしてマケップに苦労を与えています。
一言で言えば、すぐに構築できない場合は、次のことを試してください。
makepp --no-warn makepp_simple_concatenation=1 makepp_percent_subdirs=1 \
--build-check=target_newer --last-chance-rules --no-remake-makefiles
それが成功したら、それらの引数を XNUMX つずつ削除してみることができます。 しかし、それが失敗した場合、
追加してみてください:
--traditional-recursive-make
これも失敗する場合は、makepp と連携するためにビルド システムを調整する必要があります。 平
ここで説明されているオプションによって何かが構築可能になる場合でも、適応させることをお勧めします。
若干の違いがあるため、箱から出してすぐに両方のメーカーと互換性があります。
強制 他には? POSIX or GNU make 互換性
多くのレガシー ビルド システムを動作させるためのコマンド ラインの可能性をいくつか紹介します。
変更なしで。 これらにより、makepp は GNU make の動作を正確にエミュレートします。
互換性 、 オプション: 「--build-check=target_newer」
デフォルトでは、依存関係のいずれかに問題がある場合、makepp はすべてのターゲットを再構築しようとします。
最後のビルド以降に変更されたか、コマンドが変更されたかどうか (詳細については makepp_build_check を参照)
詳細)。 通常、これが必要なものです。 ただし、ターゲットを望まない場合もあります
makepp の制御とは別に変更された場合 (編集などにより) 再構築されます。
またはプログラムを手動で実行してファイルを作成します)。 makepp に強制的に使用させることができます。
従来の make アルゴリズムでは、ターゲットのいずれかが以前のバージョンよりも新しい場合にのみ再構築されます。
このオプションをコマンドラインに追加することで、依存関係を削除します。
互換性 、 オプション: 「--dont-build=config.status」
自分自身を自動構成しようとしたり、他のことをしようとしたりするパッケージがあります。
次のように、要求されない限り無視します。
config.status : 設定する
./config.status --再チェック
設定:configure.in aclocal.m4
自動設定
ほとんどの人は「autoconf」さえインストールしていないため、すべてを良心的に実行します。
makepp と同様に、ルールは失敗します。 このオプションは、何が原因かを理解している場合、それを防ぎます
建てないこと。
互換性 、 オプション: 「--ラストチャンス-ルール」
デフォルトのルール (パターン依存関係のないパターン ルール) は通常はサポートされません。
Makepp は既存のファイルに基づいてすべてのルールをインスタンス化するため、すべてのルールを認識します。
生成できたファイル。 残念ながら、この方法ではパターンをインスタンス化する方法がわかりません
パターン依存性のないルール。 :last_chance メカニズムはこれを部分的に解決します。
従来の Makefile にはこれで十分な場合、このオプションを使用するとグローバルに有効にすることができます。
互換性 、 オプション: 「――警告なし」
これでは結果は改善されません。 Makepp はさまざまなことについて警告メッセージを表示します
伝統的な Unix はこれをひるむことなく受け入れます。 あるからです。
makepp を使用してそれらを実行するより良い方法。 これらの警告が煩わしい場合は、警告をオフにすることができます
このオプションを使用します。
互換性 、 オプション: "--ハイブリッド-再帰-make"
make の再帰呼び出しは、多くの場合、危険な行為であると考えられています (「より良い方法」を参照)
詳細については、makepp の「階層ビルドのシステム」を参照してください)。ただし、これらは非常に一般的です。
既存のメイクファイル。 Makepp は下位互換性のために再帰的 make をサポートしています。 新しいための
makefile の場合は、「load_makefile」ステートメントを使用するか、makepp の暗黙的に使用する方がはるかに優れています。
メイクファイルのロードメカニズム。
バリアント ビルドにリポジトリを使用できるようにし、再帰的なビルドを支援するため
make securer の呼び出しでは、通常、makepp は実際にはそれ自体を再帰的に呼び出しません。
たとえそう言われても。 代わりに、サブプロセスは親プロセスと通信し、
実際のビルドは親プロセスによって行われます。
これはほとんどの場合に機能しますが、同じファイルから複数の Makefile を呼び出すことはできません。
たとえば、次のようなディレクトリは機能しません。
ターゲット: 依存関係
$(MAKE) -f other_makefile ターゲット
この場合、makepp は 2 番目の makefile をロードしていることに気づき、文句を言います。 このオプションを使用すると
代わりに、追加の Makefile からビルドする従来の方法に戻ります。
それぞれ別個の makepp プロセス。
注: いくつかの Makefile をロードすることは技術的には問題ありませんが、通常は
同じ偽のターゲット名。 それを切り離すことは、makepp を完全に再設計することを意味します
内部事情。 ただし、これは機能しますが、同等ではありません。
ターゲット: 依存関係
cd サブディレクトリ && $(MAKE) -f other_makefile ターゲット
互換性 、 オプション: "--traditional-recursive-make"
特に再帰呼び出しで使用する場合、前のオプションでは不十分な場合があります。
相反する選択肢。 Makepp は XNUMX セットのグローバル オプションのみを使用するため、submake は使用しません。
他のメイクファイルにも関係するため、それらを変更することは許可されています。
このオプションをコマンド ラインに追加すると、次のような望ましくない副作用が生じます。
· 再帰的 make は、親が実行する場合でも、内部的には並列実行されません。
gmake とは異なり、プロセス数の全体的な調整はありません。 この意志
この動作方法は makepp の設計目標ではないため、実装されません。
· 再帰的 make プロセスはリポジトリについて何も知りません。
· 各再帰的な make プロセスは、呼び出されたディレクトリに独自のログ ファイルを生成します。
ビルド全体に対して XNUMX つのログ ファイルを生成するのではなく、
· makepp は通常、従来の make が必要と判断した以上のものをビルドするため、また多くの場合、
ビルド システムはあらゆる方向に再帰呼び出しを行うため、無限の呼び出しが発生する可能性があります。
再帰。 マケップは50ラウンド後にブレーキを引いて、ラウンドを増やす方法を教えます
これは、実際に非常に深いネストがある場合に備えてです。
「--traditional-recursive-make」オプションを使用しても、環境変数
「MAKEOVERRIDES」と「MFLAGS」は設定されず、無視されるため、依存するメイクファイルは
それらは機能しません。
A プレメイク 生成された メークファイル これは、同じサブメイク呼び出しへの単なる面白いラッパーです
ディレクトリ。 プロジェクトの目標がある場合 XYZ のような行になります
@${MAKE} --no-print-directory -C 。 -f XYZ.make
この場合、「--traditional-recursive-make」オプションを直接呼び出すことで回避できます。
makepp に「-f」を付ける XYZ.make」 オプションを選択します。
互換性 無し オプション: "--ジョブ=n"
従来の Makefile では、次の順序に依存して、すべての依存関係がリストされないことがあります。
間に合うように実行します。 この状況では、makepp は前にルールを呼び出すことができるかもしれません。
その依存関係はすべて作成されています。 そうすれば、より少ない、あるいは何もしなくても結果が良くなる可能性があります。
並列実行。
互換性 、 変数: 「makepp_simple_concatenation=1」
Rc スタイルの置換は、makepp がテキストへの変数置換を実行するデフォルトの方法です
文字列を使用するのは、従来の Makefile が壊れることはほとんどなく、新しいメイクファイルで役立つことが多いためです。
メイクファイル。 ただし、代替として非互換性が発生する場合があります。
変数はスペースで囲まれていません。 例えば、
INCLUDE_PREFIX := -I/some/include/dir -I
INCLUDES := $(INCLUDE_PREFIX)/other/include/dir
rc- の場合、「INCLUDES」を「-I/some/include/dir/other/include/dir -I/other/include/dir」に設定します。
スタイル置換は有効ですが、GNU make では次のように設定されます。
「-I/some/include/dir -I/other/include/dir」。 たとえば、Redis 2.6.5 をコンパイルするときに、次のことを試みます。
「printfgcc」を実行します。 XNUMX つのコマンドのこのようなおかしな連結は、次のことを強く示しています。
この変数は、セマンティクスを作成するためにフォールバックするために必要です。
変数内の空白の処理にも非互換性があります。
null :=
T := -o $(null) # T には、-o の後にスペースが XNUMX つ続きます。
OUTFILE = $(T)outfile
rc スタイルの置換が有効な場合は、「OUTFILE」を「-ooutfile」に設定しますが、GNU make
「-o outfile」に設定します。
これらの非互換性は両方とも、「makepp_simple_concatenation」を設定することで解消されます。
変数。 ただし、「makepp_simple_concatenation」を使用しても、makepp は依然として
場合によっては、空白を非互換的に扱います。
T := -o # このコメントは削除しないでください。
GNU make は、「T」に「-o」とそれに続くスペースを含むように設定しますが、makepp は
とにかく末尾のスペース。 末尾のスペースが必要な場合は、次のように設定する必要があります
「makepp_simple_concatenation」とダミーを含む手法を使用して「T」も設定します
上に示すように、「null」などの変数。
回避方法 オプション "--no-remake-makefiles"
一般的なオープン ソースでは、メイクファイルを作成するために「configure」を呼び出す必要があります。 しかし、その後、これらは
makefile には、何らかのコマンドを呼び出して Makefile を再作成するためのルールを含めることができます。 マケップは
喜んで遵守し、ルールに従って更新してください。 しかし、これが有害な場合もあるので、
スキップしてください。
互換性 、 変数: 「makepp_percent_subdirs=1」
デフォルトでは、パターン ルールの「%」はディレクトリと一致しません。 これは、次のようなルールを意味します
この:
%.o: %.c
$(CC) $(CFLAGS) -c $(入力) -o $(出力)
「../shared/xyz.c」のようなファイルには適用されません。 ファイルと一致させたい場合は、
サブディレクトリも含めてから、コマンドラインで変数「makepp_percent_subdirs=1」を設定します。
またはメイクファイルの先頭付近。
互換性 、 環境 変数: $MAKEPP_IGNORE_OPTS
従来の再帰呼び出しでは、makepp が理解できないオプションが渡されることがあります。
このオプションが重要でないことを祈りますが、makepp の実行が妨げられます。 これとともに
環境変数を使用すると、makepp に特定のオプションを黙って無視するように依頼できます。 値
スペースで区切られたオプションのリストであり、次の 4 つのバリエーションがあります。
--長い=x
引数を必要とする長いオプション。 この事実は平等を通じて宣言されなければなりません
ただし、実際の使用は「--long=bla」または「--long=bla」のいずれかの空白で区切ることもできます。
「――ロングブラ」。
--長い
引数のない長いオプション。
-sx 引数を必要とする短いオプション。 この事実は次のように宣言する必要があります。
オプションの直後に何かを指定しますが、実際の使用は次のように区切ることもできます。
空白、「-sbla」または「-s bla」。
-s 引数のない短いオプション。
たとえば、引数なしで makepp の -R オプションを XNUMX つだけオーバーライドし、gmake のデバッグを受け入れます。
引数付きのオプション:
import MAKEPP_IGNORE_OPTS='-R --debug=x'
非互換性 それ 必要とする メークファイル 変更
· make を明示的に呼び出す Makefile は、makepp がすべてをそれ自体でビルドすることを防ぎます。
悲しいことに、Perl 独自の「ExtUtils::MakeMaker」は、次の XNUMX つの形式のうちの XNUMX 番目をコミットします。
バージョン 6.56 (Perl 5.12.1) までのこの間違いは次のとおりです。
サブディレクトリ:
cd サブディレクトリ; 作る
作る=作る
· 「VPATH」変数を何らかの値に設定すると、暗黙的に「vpath % value」が呼び出されます。 「vパス」
ステートメントはリポジトリ メカニズムでエミュレートされます。 したがって、gmake が代用される場所
vpath で見つかったファイルへのパス。makepp は代わりにそれをシンボリックにリンクします。
必要な場所に。 したがって、makepp は未変更の文字列を提供します。通常は、
問題ない。
vpath 内のターゲットはサポートされていません。 (Gmake は、それがより新しいかどうかを考慮します。
依存関係が存在しますが、そうでない場合は、ターゲットは現在のディレクトリに再作成されます。
-- むしろ矛盾しています。) vpath の設定解除はサポートされていません。
· メイクファイル内で後から存在するパターン ルールは、前に存在するパターン ルールをオーバーライドします。
これは GNU make とは逆です。
· 組み込みの暗黙的なルールのセットは、GNU make のルールとは多少異なります。
ただし、変数名にはほとんど互換性があります。 組み込みルールは、
C/C++/Fortran プログラムを正常にコンパイルでき、実際に、
場合によっては適切なライブラリも必要です。 Modula-2、RatFor、およびその他のまれなサポート
GNU で問題が発生し続けたため、言語は意図的に存在しません。
これらの言語の拡張機能を誤って再利用したときの make のルール。
· アクション接頭辞「+」は黙って無視されます。
· アーカイブ メンバーはサポートされておらず、関連付けられた自動変数もサポートされていません
$%、"$(%D)"、および "$(%F)"。
· SCCS サポートはありません。
· 変数割り当ての先頭と末尾の空白は無視されます (たとえ
空白の後にコメントが続きます)。 空白の処理の詳細については、
非互換性については、makepp_variables の「変数内の空白」を参照してください。
· Makepp は、次の場合を除き、「include」ステートメントに含まれるファイルを再構築しようとしません。
makefile には、include ステートメントが表示される前にそれらをビルドするためのルールが含まれています。
(ただし、メイクファイル自体を再構築しようとします。) これは通常、次の目的で使用されます。
インクルードファイルの依存関係を処理しますが、makepp ではあまり役に立ちません。
とにかくそうする必要があります。
· 現在、「SHELL」変数は部分的に無視されています。 マケップがいつも使っている /bin/sh
ない限り、 /usr/xpg4/bin/sh or /sbin/xpg4/sh が見つかるか、「SHELL」をエクスポートしない限り
メイクファイル内の変数。 ただし、これを実行すると、コマンド パーサーが完全に機能しなくなる可能性があります。
シェルコマンドが何をするのかを理解してください。 Windows Strawberry または ActiveState Perl の場合
代わりに SHELL 変数を設定する必要があります マケップに電話をかけます。
· Makefile 上の依存関係は引き続き機能しますが、通常は不要です。
これは通常、コンパイル オプションが変更されたときに再構築を強制するために使用されます。 マケップは知っています
メイクファイルに特別な変更を加えずにビルド コマンドが変更された場合。 それは保存します
これはファイルごとに行われます。 メイクファイルを変更すると、どのメイクファイルが変更されたのかが正確にわかります。
ファイルは再コンパイルが必要です。
・中間ファイルは削除されません。 (makepp はすべてのファイルを保持することを要求するため、
日付は最後のビルド時と同じである必要があります。中間ファイルはすべて
存在しない場合は再構築が発生します。) に与えられる特別なステータスはありません。
中間ファイル。
· サポートされている特別なターゲットは、「.PHONY」と部分的に「.SUFFIXES」のみです。 の
残りは単に無視されます。
具体的には、GNU make には次の特別なターゲットがあります。
。接尾辞
Makepp は、「.SUFFIXES」の特殊な場合を除き、「.SUFFIXES」を無視します。
依存関係は次のようになります。
.Suffixes:
これは、デフォルトのルールをロードしないように指示します。
.INTERMEDIATE、.SECONDARY、.PRECIOUS
中間ファイルには特別なステータスが与えられないため、これらのターゲットは
意味のある。
。無視
このターゲットは無視されます。 エラーを無視したい場合は、「ignore_error」という単語を入力します。
終了ステータスを無視するコマンドの前に (またはマイナス記号) を付けます。
。静けさ
このターゲットは無視されます。 コマンドをエコーしないようにするには、「noecho」という単語を入力します。
(または「@」文字) エコーされないコマンドの前に、
または、makepp に「--silent」オプションを使用します。
.DELETE_ON_ERROR
.EXPORT_ALL_VARIABLES
.NOEXPORT
.POSIX
。ディフォルト
これらのターゲットはサポートされていないため、単に無視されます。
· GNU make 関数「eval」、「flavor」、「value」は現在サポートされていません。 あなた
"$[...]" を使用すると、より単純な方法で eval と同じことを実現できます。
変数または関数の展開。
· 二重コロン規則は完全にはサポートされていません。 (これらはできません: makepp のパラダイムでは、
ターゲットを更新する方法は XNUMX つだけです。) 現在、連続するそれぞれの方法は
特定のターゲットの二重コロン ルールは、そのコマンド文字列と依存関係を単純に追加します。
list をコマンド文字列とこのターゲットの依存関係リストに追加します。 たとえば、次の場合
これを書く:
a::b
&cat b -oa
# メイクファイルの後半で:
交流
&cat c -o >>a
それは 正確に あなたが書いたかのように
: 紀元前
&cat b -oa
&cat c -o >>a
これは確かに二重コロン規則が意図したものではなく、常にそうであるとは限りません。
機能しますが、「クリーン」などのターゲットや、
ExtUtils::MakeMaker は、メイクファイルに次のことを行います。 それ以外のことを当てにしないでください
従来の Makefile よりも。
· 「$(wildcard )」関数は、存在するファイルだけでなく、存在するファイルにも一致します。
まだ存在していませんが、makepp がその時点で確認したルールがあります。
「$(wildcard )」関数が評価されます。
・define文はサポートされていますが、その前の@の扱いが行われています。
違う。 現在、makepp では、複数行がある変数の前に「@」が付いています。
この値は、最初の行のエコーのみを抑制します。 例えば、
エコーラインを定義する
&echo line1 -o $@
&echo line2 -o>>$@
エンデフ
x:
@$(エコーライン)
GNU make のように "&echo line2" の出力を抑制しません。 それはただ
「&echo line1」の出力を抑制します。
· Makepp は次の環境変数をサポートしていません (これらは設定されません。
そしてそれは単に無視されます):
メイクオーバーライド
MFフラッグス
非互換性 in 注文 of 表現 拡大
· makepp では、すべての依存関係が保証される前にルール アクションが展開されます。
構築されてきました。 この問題を回避するには、次のようなルールを変更します。
フー:バー
genfoo < $(貝殻猫バー)
:これに
フー:バー
genfoo < `猫バー`
またはこれにより、拡張中にファイルが作成されます。
フー:バー
genfoo < $(&cat $(make bar))
ファイルがリストされているため、ここではこれを推奨します。 バー もこれの依存関係です
ルールが追加され、makepp はリダイレクトを字句的に分析するときにそれをキャッチできるようになりました。
· これが使用されているのを見たことはありませんが、GNU make では次のことが可能です。
コロン = :
a$(コロン) b
エコー $^
Makepp が「$(コロン)」を展開するのが遅すぎて機能しません。 ただし、それが提供するのは、
代替の "$[colon]" 構文。GNU make よりもはるかに多くのことができます。
非常に早くから拡張されました。
「$(MAKE)」 かもしれません include スペース
アンインストールされた makepp の場合、またはプラットフォームが Perl スクリプトの開始をサポートしていないと思われる場合
マジックナンバーまたは「--traditional-recursive-make」を使用すると、この変数には少なくとも次のものが含まれます。
XNUMXつのスペース。 コマンドとして使用する場合には問題ありません。 しかし、それをとして渡すとき、
(Perl 5.14.0 ビルド システムのように) スクリプトに引用符で囲まれていないパラメータを指定すると、スクリプトが破棄されます。
別々のパラメータに分割すると、混乱が生じます。 したがって、パラメータとしては、次の方が安全です
「$(MAKE)」として引用します。 下位互換性を損なうことはありません。
ターゲット固有の 割り当て しない 伝わる
Makepp のターゲット固有の変数は、GNU make の変数とは少し異なります。
言及された XNUMX つのファイルのルールにのみ適用され、その以前のファイルには適用されません。 見る
ターゲット固有の割り当て。
括弧 or ブレース しない 巣
Makepp は、最初に一致する括弧または中括弧で式を終了します。 これの代わりに
$(somefunction ... ( ) ...) # GNU スタイルの作成
これらのいずれかを使用する必要があります
${somefunction ... ( ) ...} # GNU と互換性を持たせる
$((somefunction ... ( ) ...)) # Makepp 拡張機能
これはおそらくバージョン 2.1 で修正されるでしょう (おそらくオプション)。
マイナー ポイント
パターンの依存関係が偽のターゲットと一致しない
%.a: %.b; ...
$(偽xb): ; ... # xa をビルドする方法は提供されません
コメントには継続行がありません
# これは \
2 行コメントではありません
Command ライン 非互換性
Makepp は、make のより便利なコマンド ライン オプションをいくつかサポートしています。 ただし、以下の場合は、
サポートされていません:
-d または --debug
-f-
Makepp の内部 Makefile オブジェクトはファイル オブジェクトにリンクされているため、
stdin。
-i
-l または --load-average または --max-load
-m Makepp の "-m" オプションは署名方法の選択に関係しますが、GNU make
-m を無視します。
-p または --print-database
-q または --question
-R または --no-builtin-variables
Makepp の「-R」オプションは実際にはまったく異なることを行います。
-S --no-keep-going または --stop
「--stop」オプションは、すべてのルールを学習した後で makepp を停止 (スリープ状態) します。
編集を続けることができます。
-t または --touch
-w または --print-directory
これは自動的に行われます。
--warn-未定義変数
これらの中には、気にかけてくれる人がいれば簡単にサポートできるものもあります。
変数 非互換性
Makepp は $PATH 内で、「$(CC)」などの変数に返される一致するコマンドを探します。
「$(CXX)」。GNU make には静的なデフォルトがあります。 また、makepp は「gcc」を優先し、
"g++" ですが、驚くべきことに GNU make は前者の場合は "cc" を返しますが、後者の場合も同じです。
後者。 これらは、メイクファイル、コマンドライン、またはファイルをエクスポートすることでオーバーライドできます。
makepp を呼び出す前に、同じ名前の変数を追加します。
onworks.net サービスを使用してオンラインで makepp_incompatibility を使用する