たとえば、私の makefile には次のようなものがあります:
all:
cd some_directory
しかし、入力するとmake
、コマンドのように「cd some_directory」だけが表示されましたecho
。
ベストアンサー1
実際にはコマンドが実行され、ディレクトリが に変更されますsome_directory
が、これはサブプロセス シェルで実行されるため、make にも作業中のシェルにも影響しません。
内でさらに多くのタスクを実行する場合はsome_directory
、セミコロンを追加し、他のコマンドも追加する必要があります。新しい行は make によってルールの終わりとして解釈されるため使用できないことに注意してください。したがって、明確にするために使用する新しい行は、バックスラッシュでエスケープする必要があります。
例えば:
all:
cd some_dir; echo "I'm in some_dir"; \
gcc -Wall -o myTest myTest.c
また、バックスラッシュと改行を追加しても、各コマンドの間にはセミコロンが必要であることにも注意してください。これは、シェルによって文字列全体が 1 行として解析されるためです。コメントに記載されているように、コマンドを結合するには '&&' を使用する必要があります。これは、前のコマンドが成功した場合にのみ実行されることを意味します。
all:
cd some_dir && echo "I'm in some_dir" && \
gcc -Wall -o myTest myTest.c
これは、クリーンアップなどの破壊的な作業を行うときに特に重要です。そうしないと、cd
何らかの理由で失敗した場合に間違ったものを破壊してしまうことになります。
しかし、一般的な使用法はサブディレクトリでmakeを呼び出すことです。これについては調べてみるといいでしょう。これにはコマンドラインオプションがあるので、自分で呼び出す必要はありません。cd
ルールは次のようになります。
all:
$(MAKE) -C some_dir all
は に変更されsome_dir
、Makefile
そのディレクトリで をターゲット「all」で実行します。ベストプラクティスとしては、を直接$(MAKE)
呼び出すのではなく を使用してくださいmake
。これにより、適切な make インスタンスが呼び出されるようになります (たとえば、ビルド環境に特別な make バージョンを使用する場合)。また、 などの特定のスイッチを使用して実行する場合、若干異なる動作が提供されます-t
。
ちなみに、make は、出力がない場合でも、実行したコマンドを常にエコーします (明示的に抑制されない限り)。これが表示されている内容です。