すべての必須パッケージが渡されたと仮定して、sudo apt-get install
My BuildRootはopenwrt
。
その後、私はフォルダの上のディレクトリの名前を変更し、次のopenwrt
ようにファイルを少し変更したときに見つけました。wifi.lua
作る(フォルダ内openwrt
)正常にコンパイルするのに21分かかります。
ただし、フォルダの上のディレクトリの名前を変更せずにopenwrt
同じファイルで同様のマイナーな変更を行うと、V=99にする正常にコンパイルするのに3分しかかかりません。
さて、上記のディレクトリの名前を変更し、上記と同じことをやり直すと作る正常にコンパイルするには21分かかります。そしてV=99にする、最上位ディレクトリの名前を変更しなかった場合よりも多くのコンパイル手順が実行されることがわかります。
トップレベルディレクトリの名前を変更しないと、Makefileがはるかに高速にコンパイルされることがわかります。
これにより関連する質問が生じます。 Linuxでディレクトリの名前を変更したり、ディレクトリを移動したりすると、サブディレクトリのファイル時間が変わりますか?
修正時間がすべての依存関係より新しい場合、Makefileはターゲットを再構築しないことを知っています。
私もGNU Makefileに関するいくつかの質問を読んだ。 http://www.conifersystems.com/whitepapers/gnu-make/
OpenWrt MakefileはもともとLinux Makefileよりもはるかに進化していると予想されます。これらの問題のいくつかまたはすべてを解決しますか?
(Makefileをより迅速にコンパイルするために、openwrt/dl
ホームディレクトリ内のフォルダへのシンボリックリンクも使用してユーザースペースtarballを再ダウンロードする必要はありませんでした。)
答え1
いいえ、含まれているファイルとディレクトリのタイムスタンプは変更されず、ディレクトリ自体のタイムスタンプのみが変更されます。ただし、Makefileに絶対パスを使用するターゲットまたは依存関係が含まれている場合、または$(src_dir)
それを再生成する場合は、別の/新しいターゲットになります。バラよりGNU make ドキュメント「標準」ターゲットと変数に関する規則と推奨事項。
ただし、Makefileはコンパイルされず、元のLinux Makefileは存在しません。 BuildRootなどの環境を作成/維持することは複雑であるため、メンテナンス者は効率的に構築する前にまず正しく構築することに集中できます。単純なパッチ(シンボリックリンクの追加など)がプロセスを高速化するのに役立つ場合は、改善提案として上流に送信する必要があります。
答え2
man makeのjobsオプションを使用してmakeを実行できます。
-j [jobs], --jobs[=jobs] は、
同時に実行されるジョブ (コマンド) の数を指定します。 -jオプションが複数ある場合、最後のオプションが適用されます。 -jオプションを引数なしで指定すると、makeは同時に実行できるジョブの数を制限しません。
答え3
以下を行います。 24個のスレッドを持つ非常に大きなマシンです。 128GB RAM。すべてを構築してください/dev/shm
。それを使うmake -j22
とやけどをするでしょう。デバイスの電源を切るとすべてが消えるので、設定を保存する必要があります。