これは実際にコマンドを実行して、ディレクトリをに変更します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
これは、ターゲット「all」に変更され、そこでsome_dir
実行されMakefile
ます。ベストプラクティスとして、直接$(MAKE)
呼び出すのではなく使用make
します。適切なmakeインスタンスを呼び出すようにします(たとえば、ビルド環境に特別なmakeバージョンを使用する場合)。また、実行時に少し異なる動作を提供します。などの特定のスイッチを使用する-t
。
レコードの場合、出力がない場合でも、makeは常に(明示的に抑制されない限り)実行するコマンドをエコーします。
make
、このようにディレクトリを変更したくありませんでした。多分あなたはあなたの解決策に別のアプローチを試すべきですか?