私と一緒にMakefileを書きます(14)


makeを使用して関数ライブラリファイルを更新します.----
関数ライブラリファイルは、Objectファイル(プログラムコンパイルの中間ファイル)のパッケージファイルです.Unixでは、一般的にコマンド「ar」によってパッケージ作業が完了します.
一、関数ライブラリファイルのメンバー
1つの関数ライブラリファイルは複数のファイルで構成されています.関数ライブラリファイルとその構成を次の形式で指定できます.
archive(member)
これはコマンドではなく、ターゲットと依存の定義です.一般的に、この使い方は基本的に「ar」コマンドのためにサービスされます.次のようになります.
foolib(hack.o) : hack.o ar cr foolib hack.o
複数のメンバーを指定する場合は、次のようにスペースで区切ります.
foolib(hack.o kludge.o)
これは次のようなものです.
foolib(hack.o) foolib(kludge.o)
Shellのファイルワイルドカードを使用して、次のように定義することもできます.
foolib(*.o)
二、関数ライブラリメンバーの暗黙規則
makeがターゲットの暗黙的なルールを検索すると、このターゲットが「a(m)」形式の場合、ターゲットが「(m)」になるという特殊な特性があります.そこで、メンバーが「%.o」のモード定義である場合、「make foo.a(bar.o)」という形式でMakefileを呼び出すと、bar.oが定義されていない場合、暗黙のルールは「bar.o」のルールを探しに行きます.oのルール、それでは内建の隠れたルールが発効して、makeはbarを探しに行きます.cファイルを生成するbar.o,見つかったらmakeが実行するコマンドは大体以下の通りである.
cc -c bar.c -o bar.o ar r foo.a bar.o rm -f bar.o
もう1つの変数は「$%」です.これは、専用関数ライブラリファイルの自動化変数です.詳細は、「自動化変数」セクションを参照してください.
三、関数ライブラリファイルの接尾辞規則
接尾辞ルールと暗黙ルールを使用して、次のような関数ライブラリパッケージファイルを生成できます.
.c.a: $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $*.o $(AR) r $@ $*.o $(RM) $*.o
これは次のようなものです.
(%.o) : %.c $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $*.o $(AR) r $@ $*.o $(RM) $*.o
四、注意事項
関数ライブラリパッケージファイルの生成を行う場合は、makeの並列メカニズム(-j)パラメータを使用することに注意してください.複数のarコマンドが同じ時間に同じ関数ライブラリパッケージファイルで実行されている場合、この関数ライブラリファイルを破損させる可能性があります.したがって、makeの将来のバージョンでは、関数パッケージファイルで並列操作が発生しないようにするメカニズムを提供する必要があります.
しかし、現在のところ、できるだけ「-j」パラメータを使用しないでください.
後の順序--
いよいよ終わりの言葉を書く時が来て、以上は基本的にGNU makeのMakefileのすべての細部です.他のメーカーのmakeは基本的にこのようなもので、どんなmakeでもファイルの依存性に基づいており、基本的には1つの基準に従っています.このドキュメントの技術的な詳細の80%はどのmakeにも適用されます.「関数」の章の内容は他のmakeがサポートしているものではないかもしれませんが、ルールを隠す面では、異なるmakeが異なる実装があると思います.GNUのmakeとVCのnmake、BCBのmake、あるいは他のUNIXのmakeにどのような違いがあるのかを見る精力がありません.1つは時間の精力が足りないことです.二つ目は、私は基本的にUnixでmakeを使用しています.以前はSCO UnixとIBMのAIXでしたが、今はLinux、Solaris、HP-UX、AIX、Alphaで使用しています.LinuxとSolarisの下でもっと多くのことをしています.しかし、Unixでのmakeは、どのプラットフォームでもRichard Stallmanが開発したmakeやcc/gccのコンパイラがほとんど使用されており、しかも、基本的にはGNUのmake(社内のすべてのUNIX機器にGNUが装着されているものなので、GNUを使用するプログラムも多くなっている)であることは間違いありません.GNUのものはやはりとても良くて、特に深く使った后に、ますますGNUのソフトウェアの强大さを感じて、同じくますますGNUのオペレーティングシステムの中で(主にUnixで、甚だしきに至ってはWindows)“杀伤力”を感じます.
上記のすべてのmakeの詳細については、makeというツールを使用してプログラムをコンパイルするだけでなく、makeを使用して他の作業を完了することもできます.ルールのコマンドはShellの下のコマンドであってもよいので、Unixではプログラム言語のコンパイラだけでなく、Makefileで他のコマンドを書くこともできます.例えば、tar、awk、mail、sed、cvs、compress、ls、rm、yacc、rpm、ftp......など、「プログラムパッケージ」、「プログラムバックアップ」、「プログラムインストールパッケージの作成」、「コードの提出」、「プログラムテンプレートの使用」、「ファイルのマージ」など、さまざまな機能、ファイル操作、ファイル管理、プログラミング開発設計、または他の奇想天外なものを完成させる.例えば、以前、銀行の取引プログラムを書いていたとき、銀行の取引プログラムが基本的に同じだったため、いくつかの取引を書いた汎用プログラムテンプレートが見られました.このテンプレートには、ネットワーク通信、データベース操作、業務操作の共通性のあるものを1つのファイルに書いて、これらのファイルには「@@N、##N」などの奇妙な文字列でいくつかの位置を表記していました.それから取引を書く時、1種の特定の規則に従って特定の処理を書くだけで、最後にmakeの時、awkとsedを使って、テンプレートの中の"@@N、##N"などの文字列を特定のプログラムに取って代わって、Cファイルを形成して、それからコンパイルします.この動作はデータベースの「拡張C」言語(すなわちC言語では「EXEC SQL」のようにSQL文を実行し、cc/gccでコンパイルする前に「拡張C」の翻訳プログラム、例えばcpreを使用して標準Cに翻訳する必要がある)に似ています.makeを使うときにもっと素晴らしい方法があれば、教えてください.
振り返ってみると、数年前にUnixの下で開発を始めたばかりの頃、Makefileを書くかどうかと聞かれたとき、目がまっすぐで、何を言っているのか全然分からなかった.最初はviの中でプログラムを書き終わった人を見て「!make」と入力したとき、viの機能だと思っていたが、後になってMakefileがおかしいことを知ったので、インターネットで調べてみると、その時は英語を見たくなくて、中国語のドキュメント紹介Makefileが全然なくて、他の人が書いたMakefileを見て、自分ででたらめを言ってやっと知識を蓄積した.しかし、多くの場所では完全にその理由が分からないことを知っています.その後UNIXの下で製品のソフトウェアの開発に従事し始めて、1つの400人の年、200万行近くのコードの大きい工事を見て、このような巨大なものをコンパイルすることを発見して、もしMakefileがなければ、それはどんなに恐ろしいことでしょう.そこで心を横にして、英語のドキュメントを必死に読んで、やっとそれをマスターしたと思った.しかし、現在のネット上でMakefileに紹介されている文章はそんなにかわいそうではないことに気づいたので、このような文章を書いて、みんなに共有して、皆さんに役に立つことを望んでいます.
今やっと書き終わりました.書類の作成時間を見て、この技術文書も2ヶ月以上書きました.発见して、自分は1つの事であることを知っていて、书いて、他の人と话すのはまた别の事で、その上、今ますます技术の细部を専门に研究する时间がなくて、だから书く时、いくつかの细部の问题を述べる时とても厳格で精练することが难しいことを発见して、その上先に何を言った后に何を言うのはよく分かりませんいくつかの技術書の言語スタイルが完成した.全体のドキュメントのアウトラインはGNUのMakefile技術マニュアルのアウトラインに基づいて書かれ、自分の仕事の経験と自分の学習過程を結合しています.こんなに長く、こんなに細いドキュメントを書いたことがないので、表現の問題、言語の曖昧さ、間違いがたくさんあるに違いありません.そのため、私は皆さんが私に証言と提案、そしていかなるフィードバックをくれるのを切に待たなければなりません.
最後に、やはりこの後序を利用して、自分を紹介します.私は現在すべてのUnixプラットフォームの下のソフトウェアの研究開発に従事して、主に分布式計算/グリッド計算の方面のシステム製品のソフトウェアをして、しかも私は次世代のコンピュータ革命--グリッド計算に対してとても興味を持って、分布式計算、P 2 P、Webサービス、J 2 EE技術の方向に対してもとても興味を持って、同時に、プロジェクトの実施、チーム管理、プロジェクトの管理も少し心得があって、同じく私と“技术と管理が同时に重いです”の阵线の上で戦う若い世代を望んで、私と多く交流することができます.私のMSNは[email protected](常用)、QQは:753640(常用しない).(注:MSNのメールボックスに送信しないでください.hotmailの迷惑メールでこのメールボックスのすべての手紙を拒否しました)
最後に、makeプログラムの設計開発者についても紹介したいと思います.
最初に突撃したのはRichard Stallmanです
オープンソースソフトウェアのリーダーと先駆者は、一日の給料をもらったことがなく、Windowsオペレーティングシステムを使用したことがありません.彼の事績と彼のソフトウェアと彼の思想について、私は多くのことを言う必要はありません.みんなはこの人に対して私よりよく知らないと信じています.これは彼のホームページです.http://www.stallman.org/.ここには彼の近影が1枚しか貼られていません.

コンピュータ、音楽、蝶は彼の大好きなものです.
2位は「Roland McGrath」
個人のホームページは:http://www.frob.com/~roland/で、次は彼のいくつかの事績です.
1)協力してGNU make を編纂し維持する
2)Thomas BushnellとともにGNU Hurdを記述した.
3)GNU C libraryを作成・維持している.
4)協力して一部のGNU Emacsを作成し維持している.
ここで、この2人のオープンソースプロジェクトの闘士に最も真摯な敬意を表します.
<- 前のページ
(著作権所有、転載時に作者と出典を明記してください)
(全文が終わった)私はいかなる形式の交流を歓迎して、技術を討論しても管理しても、あるいはその他の広い空のものを討論します.政治と娯楽のニュースを除いて私は関心がなくて、その他は積極的に向上するものはすべて歓迎します!