Makefileの落とし穴に嵌った ${wildcard *.h}

IPLプログラムのファイル数が多くなってきたので、ブートセクタ部分とブートモニタ部分をサブディレクトリに分割し、Makefileもそれぞれのディレクトリで分割した。トップディレクトリのMakefileで一部でも修正があれば、そのプログラム(サブディレクトリ)だけ再構築するよう変更したのだが、単純な間違いに気付かず、何時間も時間を無駄にした。これからも同じ間違いをやりそうなので、覚え書きとして残す。

トップディレクトリのMakefile内で、ブートモニタのサブディレクトリ内(BOOTMON_DIR=./boot_monitorとして定義)のソースファイルの依存関係指定で、${BOOTMON_DIR}/bootmon: ${BOOTMON_DIR}/${wildcard *.h} (要点のみで省略)のような記述をしていた。
トップのディレクトリでmakeを実行したが、「boot_monitor/common.hをmakeするルールがみつかりません」というエラーが発生した。common.hはシステム全体の共通定義なので、トップディレクトリにしかない。もちろんブートモニターはそれに依存しているので、makeがそれをmakeしようとするのはいいのだが、common.hを修正してもいないのに、対象としようとするのは明らかにおかしい。何が悪いのかわからなかった。

結論から言うと、正しくは、${BOOTMON_DIR}/bootmon: ${wildcard ${BOOTMON_DIR}/*.h}
修正前の記述法だと、makeを実行しているのは、トップディレクトリで、${wildcard *.h}はカレントディレクトリの*.hのファイル(カレントディレクトリであるトップディレクトリに存在する.hのファイルは、common.hのみ)をMakefile内で文字列展開して、それにサブディレクトリ名${BOOTMON_DIR}を前にくっ付けて解釈していた。つまり、boot_monitor/common.hとしてファイル名を解釈し、それが存在しないからエラーとなっていたわけだ。

本当はワイルドカードなど使わず、cppの機能で依存関係を出力して、無駄のない設定をした方がいいのだろうが、そこまで手間をかける暇もないし、要求通り動いているので、とりあえず、このままとする。

カテゴリー: Linux, パソコン, 自作OS パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です