カテゴリー
Linux

CentOS6の練習-#9(ビルド環境を整える)。

 明日は,旧7月1日らしい。朝夕はすっかり秋めいてきたが,昼は相変わらず暑い。それでも,盆休みが終わって,昨日1週間ぶりで道々の田んぼを見たら,稲穂が出そろっていた。今日はツクツクボウシの鳴くのも聞いた。そして今は,これから夕立が来るのか,PCに触っているのが気持ち悪いほど,雷鳴がしている。

 夕べはギータの劇的なサヨナラホームランで勝った。球宴後,さあダッシュと思ったら,がっくりくる試合が続いて落ち込んでいたのだが,8月に入ってから,まあまあだ。何とか,5割復帰したし。上も抜け出せないでいるから,ここが踏ん張りどころだよー。鷹のみなさま,頑張ってちょうだい。

 ところで本題の方だが,いつも,buildとmakeはどう違うんだろうと思っていた。今回ちょっと気を入れてあちこち読み漁ってみたら,用語の発生した時期が違うだけで意味はあまり違わないらしいネ。少し,違う意味で使っているページもあるようだが,作業的にはだいたい同じことをやっているようだ。

 CentOS6の練習-#6で書いたように,すべてパッケージで済ませるかどうか悩んでいるが,それにしてもこの際buildの勉強は身を入れてやっておくべきだろう。今まで,実践でビルドにかかわったことはあっても,何やっているかなんて,あまりまじめに考えたことがない。コンパイルはやってるんだろうとか思ってたけど,リンクなんかの作業も入るんだねー。知らなかった。

 まっ,ありがちな「Hello, World!」の表示プログラムのbuildでもやってみるかな。今回の参照ページは,仕事で使える魔法のLAMPだけ。

  1. まずは,GCC(GNU Compiler Collection)のインストール。こういうところはパッケージを利用する(爆)。
       $ sudo yum install gcc gcc-c++
  2.    $ vi hello.c
    で,/home/centosに,以下の内容で,hello.cを作成する。
         #include <stdio.h>
         main()
         {
          printf(“Hello, World!n”);
         }
  3.    $ gcc hello.c -o hello
    で,コンパイルしてみる。-oオプションで実行ファイル名をhelloに指定。一瞬で終わるよ。
  4.    $ ./hello
    と実行してみると,
         Hello, World!
    と,表示された。

 ふーん,シェアードライブラリ(=.so⇒シェアードオブジェクト)っていうのは,Winのダイナミックリンクライブラリ(.dll)と同じなんだ。以下のコマンドで,いつもお世話になっているbashがリンクしている.soを調べてみた。
   $ ldd /bin/bash
     linux-gate.so.1 => (0x003da000)
     libtinfo.so.5 => /lib/libtinfo.so.5 (0x00e49000)  <<—  helloと違う.so
     libdl.so.2 => /lib/libdl.so.2 (0x004dc000)  <<—  helloと違う.so
     libc.so.6 => /lib/libc.so.6 (0x00110000)
     /lib/ld-linux.so.2 (0x00b31000)

 ついでに, $ ldd hello をやって比べてみた。
     linux-gate.so.1 => (0x00d44000)
     libc.so.6 => /lib/libc.so.6 (0x00110000)
     /lib/ld-linux.so.2 (0x00634000)
となるので,この3つは簡単なプログラムでも,C言語で書かれたプログラムが動くためには,絶対にいるようだネ。

 次に,hello.cを2つの分けて,一つずつコンパイルした後,リンカを使って一つのファイルに仕上げる作業をやってみる。

  1. $ vi main.c  で,以下の内容のmain.cを作成する。
         main()
         {
          hello();
         }
  2. $ vi hello.c で,以下の内容のhello.cを作成する。この際,ひらがなの表示を試してみることにした。
         #include <stdio.h>
         hello()
         {
          printf(“こんにちは,みなさん!n”);
         }
  3. まず,main.cだけコンパイル。  $ gcc -c main.c
    lsで調べると分かるけど,この段階で  main.o  ができている。
  4. 次に,hello.cをコンパイル。  $ gcc -c hello.c
    これも調べると  hello.o  ができている。
    -cオプションのときは,「name」.c ⇒ 「name」.oというように.oのファイル名を決めるようだ。
  5. リンク作業。素のリンカldは使わずに,gccから呼び出す形で使う方が普通だそうだ。
       $ gcc main.o hello.o -o hello
    調べてみると,実行ファイルhelloができているので,
       $ ./hello
    と実行してみると,
         こんにちは,みなさん!
    と,表示された。ちゃんと,ひらがなも表示される。日本語フォントを特別に手動で入れる必要はないようだ。

 この時点で,/home/centosには
   hello hello.c hello.o main.c main.o
があるが,あとの都合上生成された hello,hello.o,main.o を削除する。
   $ rm hello main.o hello.o

 さて,makeをインストールしますか。
   $ sudo yum install make

 Makefile作成。  $ vi Makefile  で,内容は次の1行。
     hello: main.o hello.o
     ターゲット: 依存ファイル1 依存ファイル2 ……
となるらしいが,今回は,main.o と hello.o から hello を作るだけなので,この1行でO.K.
 makeを走らせてみる。
   $ make
   cc -c -o hello.o hello.c
   cc -c -o main.o main.c
   cc hello.o main.o -o hello
とメッセージが出て,終了すると,/home/centosに hello,hello.o,main.o ができている。

   $ touch hello.c
をやったのち,makeをやると,
   cc -c -o hello.o hello.c
   cc hello.o main.o -o hello
さっきよりメッセージが1行少ない。touchでタイムスタンプの変わったhello.cだけがコンパイルし直されて,新しいhelloが作られることが分かる。

 本日の最後の練習は,GNU Helloを使った実行ファイルの作成。

  1. まず,ダウンロードのために wget をインストール。もっとも,自鯖の場合,この間のClamAVがらみでwgetは導入済み(汗)。
       $ sudo yum install wget
  2. 最新のGNU Helloをゲット。
       $ wget http://ftp.gnu.org/gnu/hello/hello-2.8.tar.gz
  3. 同じバージョンのシグネチャファイルもダウンロード。
       $ wget http://ftp.gnu.org/gnu/hello/hello-2.8.tar.gz.sig
  4. GnuPG(調べてみたら,gnupg2-2.0.14-4.el6.i686が,すでにインストール済みだった。)を使って,ファイルの正当性を確認する。
       $ gpg –list-keys    <<—  初回起動で,/home/centos/.gnupg が作成される。
       $ vi ~/.gnupg/gpg.conf
    で,中ごろにある keyserver-options auto-key-retrieve 行をアンコメントする。
  5. 以下のコマンドで,シグネチャの確認。
       $ gpg –verify hello-2.8.tar.gz.sig
     これ,何もしないでやったら日本語のメッセージが戻ってきたが,変な日本語。もちっとどうにかならんの。
         ————————————————————————————————————————
         gpg: 2012年04月21日 02時55分39秒 JSTにDSA鍵ID 80EE4A00で施された署名
         gpg: 鍵80EE4A00をhkpからサーバーkeys.gnupg.netに要求
         gpg: 鍵80EE4A00: 公開鍵“Reuben Thomas <rrt@sc3d.org>”を読み込みました
         gpg: 絶対的に信用する鍵が見つかりません
         gpg: 処理数の合計: 1
         gpg: 読込み: 1
         gpg: “Reuben Thomas <rrt@sc3d.org>”からの正しい署名  <<— こういう行があれば,O.K.というか,うーむ。
         gpg: 警告: この鍵は信用できる署名で証明されていません!
         gpg: この署名が所有者のものかどうかの検証手段がありません。
         主鍵の指紋: 9297 8852 A62F A5E2 85B2 A174 6808 9F73 80EE 4A00
         ————————————————————————————————————————
  6. パッケージを展開し,展開されてできたディレクトリに移動する。その後,ls -pで直下のファイルとディレクトリを確認する。
       $ tar zxvf hello-2.8.tar.gz
       $ cd hello-2.8
       $ ls -p
         ————————————————————————————————————————
         ABOUT-NLS GNUmakefile README build-aux/ doc/ po/
         AUTHORS INSTALL README-release config.in lib/ src/
         COPYING Makefile.am THANKS configure m4/ tests/
         ChangeLog Makefile.in TODO configure.ac maint.mk
         ChangeLog.O NEWS aclocal.m4 contrib/ man/
         ————————————————————————————————————————
    /の付いてるやつはディレクトリね。READMEとかTODOとかINSTALLあたりは読むけど,あとはドキュメント関係でもあんまり読んだことがない(汗)。あっ,たまにChangeLogも読む。
  7.    $ less INSTALL
     「Briefly, the shell commands `./configure; make; make install’ should configure, build, and install this package.」ということなので,素直に,
       $ ./configure –prefix=/opt/hello-2.8    <<—  インストール先を/opt/hello-2.8にしてやってみた。
     無事通ったので,もう1回, $ ls -p をやってみると,いろいろ変化があるが,大きなところで Makefile ができたのが分かる。とすると,ちゃんとmakeできるはずなので,
       $ make

       $ ./configure | grep ‘checking’ | wc -l
    で何をチェックしているのか項目数を調べてみた。参照ページでは,202と書いてあるが,うちのでは250あった。どんどん増えていくんだろうなあ。

     makeが終わったので,インストールしてみた。
       $ sudo make install

       $ ls -p /opt/hello-2.8  で確認してみると,確かに bin/ share/ ができている。
       $ ls -p /opt/hello-2.8/bin で見ると,中に実行ファイル hello があった。
       $ /opt/hello-2.8/bin/hello  と実行してみた。
         世界よ、こんにちは!
    と表示された。完了!!!

 本日は,ここまで。

コメントを残す

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