必要なすべてのパッケージがSudo apt-get install
を介してインストールされていると仮定すると、OpenWrtファームウェアイメージの最初のコンパイルに50分かかったことを記録しました。私のBuildRootルートディレクトリはopenwrt
です。
その後、openwrt
フォルダーの上のディレクトリの名前を変更し、ファイルに小さな変更を加えてwifi.lua
と言うと、次のmake(openwrt
フォルダー内)正常にコンパイルするには21分かかります。
ただし、openwrt
フォルダーの上のディレクトリの名前を変更せず、同じファイルに同様の小さな変更を加えた場合、次のmake V = 99正常にコンパイルするのに3分しかかかりません。
上記のディレクトリの名前を変更し、上記と同じことをもう一度行うと、makeが正常にコンパイルされるまで21分かかります。 make V = 99を使用すると、最上位ディレクトリの名前を変更しなかった場合と比較して、より多くのコンパイル手順が実行されたことがわかります。
トップディレクトリの名前を変更しないと、Makefileのコンパイルがはるかに高速になることがわかります。
これにより、関連する質問が発生します。Linuxでは、ディレクトリの名前を変更したり移動したりすると、サブディレクトリ内のファイルの時間が変更されますか?
ターゲットの変更時刻がすべての依存関係よりも新しい場合、Makefileがターゲットを再構築しないことを私は知っています。
GNU Makefile: http://www.conifersystems.com/whitepapers/gnu-make/ )に関するいくつかの問題についても読んでいました。
OpenWrt Makefileは、元のLinux Makefileよりもはるかに高度であると考えられており、これらの問題の一部またはすべてに対処していますか?
(Makefileをより高速にコンパイルするために、ホームディレクトリ内のフォルダへのシンボリックリンクとしてopenwrt/dl
も用意しているので、ユーザースペースパッケージのtarballを再度ダウンロードする必要はありません。)
いいえ、含まれているファイルとディレクトリのタイムスタンプは変更されず、ディレクトリ自体のみが変更されます。ただし、Makefileに絶対パスを使用するターゲットまたは依存関係が含まれている場合、あるいは$(src_dir)
だけでもそれらが再作成される場合、b/cは別の/新しいターゲットです。 「標準」のターゲットと変数に関する規則とアドバイスについては、 GNUドキュメントを作成 を参照してください。
ただし、Makefileはコンパイルされず、元のLinuxMakefileのようなものはありません。 BuildRootのような環境の作成/保守は非常に複雑であり、保守担当者はおそらく、効率的に構築する前に環境を正しく構築することに重点を置いています。シンボリックリンクの追加などの単純なパッチがプロセスの高速化に役立つ場合は、アップストリームの改善のための提案として送信する必要があります。
Man makeから、jobsオプションを使用してmakeを実行できます。
-j [jobs]、-jobs [= jobs]
同時に実行するジョブ(コマンド)の数を指定します。 -jオプションが複数ある場合は、最後のオプションが有効です。 -jオプションを引数なしで指定した場合、makeは同時に実行できるジョブの数を制限しません。
次の手順を実行します。24スレッドの非常に大きなマシン。 128GBのRAM。すべてを/dev/shm
でビルドします。 make -j22
を使用すると、炎上します。マシンの電源を切るとすべてが消えるので、必ず設定を保存してください。