1. ホーム
  2. メイクファイル

[解決済み】Makefileの現在の相対ディレクトリを取得する方法は?

2022-04-03 04:11:41

質問

このようなアプリ固有のディレクトリにいくつかのMakefileがあります。

/project1/apps/app_typeA/Makefile
/project1/apps/app_typeB/Makefile
/project1/apps/app_typeC/Makefile

各Makefileは、このパスの1つ上の階層にある.incファイルを含んでいます。

/project1/apps/app_rules.inc

app_rules.incの中で、ビルド時にバイナリを配置する場所を設定しています。すべてのバイナリをそれぞれの app_type のパスが必要です。

/project1/bin/app_typeA/

を使ってみました。 $(CURDIR) を、このように。

OUTPUT_PATH = /project1/bin/$(CURDIR)

が、代わりにこんな感じでパス名全体にバイナリが埋もれてしまいました。 (冗長であることに注意してください)

/project1/bin/projects/users/bob/project1/apps/app_typeA

実行中のカレントディレクトリを取得するにはどうすればよいですか? app_typeX バイナリをそれぞれのタイプフォルダに入れるために?

解決方法を教えてください。

シェル機能

を使用することができます。 shell 関数を使用します。 current_dir = $(shell pwd) . または shell と組み合わせて notdir 絶対パスが必要でない場合は current_dir = $(notdir $(shell pwd)) .

更新しました。

を実行しているときのみ機能します。 make を、Makefile のカレントディレクトリから実行します。

Flimm さんのご指摘の通りです。

これは、Makefile の親ディレクトリではなく、現在の作業ディレクトリを返すことに注意してください。

例えば cd /; make -f /home/username/project/Makefile は、その current_dir 変数が / ではなく /home/username/project/ .

以下のコードは、どのディレクトリから起動された Makefile でも動作します。

mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST)))
current_dir := $(notdir $(patsubst %/,%,$(dir $(mkfile_path))))