演習1: ソースコードの入手

  • 端末を起動しましょう。
  • エディタを準備しましょう。
  • ソースコードを入手しましょう。
  • ソースツリーを探索しましょう。

端末の起動

  1. 画面左下のメニューからApplicatoinsを選ぶ。
  2. メニューアイテムSystemからTerminal(konsole)を選ぶ。

エディタの準備

好みのエディタがあれば、ここでインストールして下さい。特に好みが無ければkwriteというKDEデスクトップに付属するエディタが利用できます。

システムの設定を変更するのに管理者権限でエディタを動かす必要があります。次のようにsuコマンドを使います。(suの後のハイフンを忘れないで下さい。)

$ su -
Password:
# kwrite

ツールのインストール

$ su
Password:
# yum -y install git rpm-build firefox gcc subversion \
         man-pages wget ctags autoconf make strace
...
Is this ok [y/N]: y
...
# exit

ソースコード配置用ディレクトリの作成

$ cd
$ mkdir upstream
$ mkdir released
$ mkdir fedora

アップストリームプロジェクトより入手(1)

helloの最新のコードを開発元リポジトリより入手します。

$ cd ~/upstream
$ git clone git://git.savannah.gnu.org/hello.git
$ cd hello
$ git submodule init
$ git submodule update

アップストリームプロジェクトより入手(2)

universal ctagsの最新のコードを開発元リポジトリより入手します。

$ cd ~/upstream
$ git clone https://github.com/universal-ctags/ctags

ctagsは古くから存在するソフトウェアですが、最近(2012,3年頃)から開発が停滞していました。筆者らは、フォークしたプロジェクト(universal ctags)にて開発を続けています。

アップストリームプロジェクトより入手(3)

coreutilsの最新のコードを開発元リポジトリより入手します。

$ rpm -qi coreutils

の出力を参照して、coreutilsの最新のソースコードを入手して~/upstream以下に配置して下さい。

アップストリームプロジェクトより入手(4)

sendmailの最新のリリース版をダウンロードして、展開の後 ~/releasedに配置して下さい。

$ wget ftp://ftp.sendmail.org/pub/sendmail/sendmail.8.14.6.tar.gz
$ tar zxvf sendmail.8.14.6.tar.gz
$ mv sendmail-8.14.6 ~/released

ソースパッケージより入手: ソースパッケージリポジトリの設定変更

glibcとcoreutilsのソースコードのソースパッケージ経由で入手しましょう。

/etc/yum.repos.d/fedora.repo及びfedora-updates.repoの[fedora-source]及び[updates-source]セクションにあるenableのフィールドを0から1に変更して保存します:

[fedora-source]
name=Fedora $releasever - Source
...
enabled=1
...

[updates-source]
name=Fedora $releasever - Updates Source
...
enabled=1
...

ソースパッケージより入手: ダウンロード

coreutilsとglibcのソースパッケージをダウンロードします。

$ cd /tmp
$ yumdownloader --source coreutils

ソースパッケージより入手: 依存パッケージのインストール

ソースコードツリーを合成するのに必要となるパッケージをインストールします。

$ su
Password:
# cd /tmp
# yum-builddep coreutils*.src.rpm
...
Is this ok [y/N]: y
...
# exit

ソースパッケージより入手: ソースパッケージのインストール

入手したsrc.rpmを展開します。

$ cd /tmp
$ rpm -ivh coreutils-*.src.rpm

~/rpmbuild以下に展開されます。

ソースパッケージより入手: 合成

specファイルを指定してソースコードツリーを合成します。

$ cd ~/rpmbuild
$ rpmbuild -bp SPECS/coreutils.spec

ソースコードツリーが~/rpmbuild/BUILD/coreutils-8.15に配置されます。(環境によってはバージョン番号部分は異なるかもしれません。)

ソースパッケージより入手: 配置

合成したソースコードツリーを~/fedoraへ移動させます。

$ mv ~/rpmbuild/BUILD/coreutils-8.15 ~/fedora

ソースパッケージより入手: 課題

glibcについてもソースパッケージを入手して、展開、合成、配置までのステップを実施して下さい。失敗した場合 rpmbuild コマンドのオプションに –nodeps を追加してみて下さい。

ソースコードツリーの観察

  • ソースコードツリーを探索してどのようなファイルがどのディレクトリに含まれているか調べて下さい。

    • ~/upstream/hello
    • ~/upstream/coreutils
    • ~/released/sendmail-8.14.6
    • ~/fedora/coreutils-*
    • ~/fedora/glibc-*
  • upstreamのcoreutilsとfedoraのcoreutilsの2つのソースコードツリーにどのような違いがあるか調べて下さい。

関数を読んでみる(1)

以下の関数の定義を行単位で説明して下さい。

  • fedora/glibc-2.15-a316c1f/string/strcmp.cに定義されたstrcmp関数
  • fedora/glibc-2.15-a316c1f/string/strcasecmp.cに定義されたstrcasecmp関数
  • fedora/glibc-2.15-a316c1f/string/strcat.cに定義されたstrcat関数
  • fedora/glibc-2.15-a316c1f/string/strdup.cに定義されたstrdup関数

関数を読んでみる(2)

~/released/sendmail-8.14.6/sendmail/convtime.cに2つの関数が定義されています。

  • convtime
  • pintvl

各関数の冒頭には関数の役割が記載されています。記載された通り実装されているか関数定義を読んで確認して下さい。

関数を読んでみる(3)

  1. C言語文字列の長さを返す関数strlenを独自に実装して下さい。
  2. ~/fedora/glibc-2.15-a316c1f/string/strlen.cに定義されたstrlen関数と比較してみて下さい。
  3. glibc中のstrlen関数の定義を説明して下さい(*)。