1. ホーム
  2. makefile

[解決済み] Makefile からプログラムが存在するかどうかをチェックする

2022-07-12 04:49:38

質問

あるプログラムが Makefile から呼び出せるかどうかを調べるにはどうしたらよいでしょうか。

(つまり、プログラムがパスに存在するか、さもなければ呼び出し可能であるべきです)。

例えば、どのコンパイラがインストールされているかをチェックするために使用することができます。

例えば、次のようなものです。 この質問 のようなものですが、基礎となるシェルがPOSIX互換であることを仮定していません。

どのように解決するのですか?

時には、Makefile を異なるターゲット OS 上で実行できるようにする必要があり、 必要な実行形式が PATH にない場合、失敗する前に長い時間実行するのではなく、早期に失敗するようにしたい場合があります。

が提供する優れた解決策は エンジニアチュアン を作る必要があります。 ターゲット . しかし、テストする実行ファイルがたくさんあり、Makefile に多くの独立したターゲットがあり、それぞれがテストを必要とする場合、それぞれのターゲットは依存関係としてテストターゲットを必要とします。そのため、一度に複数のターゲットを作成すると、処理時間だけでなく、余分な入力が多くなります。

が提供する解決策は 0xf はターゲットを作ることなく実行可能かどうかをテストすることができます。これは、別々にまたは一緒に構築できる複数のターゲットがある場合、多くの入力と実行時間を節約します。

後者の解決策に対する私の改良点は which 実行ファイル ( where が存在することに依存するのではなく、Windowsでは --version オプションに依存するのではなく、直接 GNU Make の ifeq ディレクティブで新しい変数を定義するのではなく、 GNU Make の error 関数を使用して、必要な実行形式が ${PATH} . 例えば、テストするために lzop を実行します。

 ifeq (, $(shell which lzop))
 $(error "No lzop in $(PATH), consider doing apt-get install lzop")
 endif

チェックする実行ファイルが複数ある場合、実行ファイルごとに foreach 関数と which を実行します。

EXECUTABLES = ls dd dudu lxop
K := $(foreach exec,$(EXECUTABLES),\
        $(if $(shell which $(exec)),some string,$(error "No $(exec) in PATH")))

を使うことに注意してください。 := という代入演算子が使われていることに注意してください。これは、RHS 式の即時評価を強制するために必要なものです。もしあなたのMakefileが PATH を変更した場合、上記の最後の行の代わりに、次の行が必要になります。

        $(if $(shell PATH=$(PATH) which $(exec)),some string,$(error "No $(exec) in PATH")))

このように出力されるはずです。

ads$ make
Makefile:5: *** "No dudu in PATH.  Stop.