Tips記事
» 2001年11月07日 00時00分 UPDATE

ソースコンパイルでインストールしたプログラムを削除したい

[木田佳克,ITmedia]

 LinuxでRPMパッケージを利用している場合には,rpm -e [パッケージ名]と指定するだけで基本的に削除(アンインストール)することが可能だ。Windowsユーザーであれば,必要の無いソフトはアンインストールするという習慣があるだろう。

 しかし,Linux環境ではRPMではないソースコンパイルによってインストールしたツールを削除(アンインストール)するのは,難易度が高い作業だ。まず最初に,Makefileファイルの中身を理解する必要がある。

 ここでは比較的規模の小さなツールを例に挙げて,「make install」によって何が行われるのかまでを解説していく。前置きしておくが,むやみに共有ライブラリなどを削除してはならない。ほかのシステムやツールで使用されていると,システム障害になってしまうためだ。明らかに削除しても構わないと断言できるファイル以外には触れないようにしよう。自信がない人は,せいぜい実行バイナリだけを削除するといった程度に止めるのが無難である。

 以下のリストは,nmap 2.53の「Makefile」ファイルだ。Makefileは,通常次のようにtar.gzファイルを解凍し,最初に「./configure」を実行した時点でOS環境を調査して依存設定がMakefileに記録される。

$ tar zxfv nmap-2.53.tar.gz
$ cd nmap-2.53
$ ./configure

 ここ(./configure実行)で,前述したように次にリストを挙げるMakefileが自動生成される。

$ cat Makefile |more

# Generated automatically from Makefile.in by configure.
NMAP_VERSION = 2.53
NMAP_NAME= nmap
NMAP_URL= www.insecure.org/nmap/
prefix = /usr/local
exec_prefix = ${prefix}
bindir = ${exec_prefix}/bin
sbindir = ${exec_prefix}/sbin
mandir = ${prefix}/man

srcdir = .
nmapdatadir = ${prefix}/share/nmap
deskdir = $(prefix)/share/gnome/apps/Utilities

〜中略〜

install:
$(TARGET)
$(SHTOOL) mkdir -f -p -m 755 $(bindir) $(mandir)/man1 $(nmapdatadir) $(deskdir)
$(INSTALL) -c -m 755 nmap $(bindir)/nmap
@echo "If the next command fails -- you cannot use the X front end"
-test -f nmapfe/nmapfe && $(INSTALL) -c -m 755 nmapfe/nmapfe $(bindir)/nmapfe && $(SHTOOL) mkln -f -s $(bindir)/nmapfe $(bindir)/xnmap && $(INSTALL) -c-m 644 nmapfe.desktop $(deskdir)/nmapfe.desktop && $(INSTALL) -c -m 644 docs/nmapfe.1 $(mandir)/man1/nmapfe.1 && $(INSTALL) -c -m 644 docs/xnmap.1 $(mandir)/man1/xnmap.1
$(INSTALL) -c -m 644 docs/$(TARGET).1 $(mandir)/man1/$(TARGET).1
$(INSTALL) -c -m 644 nmap-os-fingerprints$(nmapdatadir)/nmap-os-fingerprints
$(INSTALL) -c -m 644 nmap-services$(nmapdatadir)/nmap-services
$(INSTALL) -c -m 644 nmap-rpc$(nmapdatadir)/nmap-rpc


uninstall:
rm -f $(bindir)/$(TARGET)

${srcdir}/configure: configure.in
cd ${srcdir} && autoconf


〜以下略〜

 上記リスト上で,ポイントとなる個所を順番に説明していこう。

 まずいちばん上に緑でマークした文字列「prefix = /usr/local」は,インストールを行うベースとなるディレクトリを設定している個所だ。「/usr/local/」が設定されていることが分かる。

 次に,注目すべきは「exec_prefix = ${prefix}」と,「bindir = ${exec_prefix}/bin」の2個所だ。ここでは,exec_prefix${prefix},つまり「/usr/local/」ディレクトリをそのまま流用し「/bin」を付加させていることが分かる。

 ここまでで「bindir」に代入している${exec_prefix}/binは,「/usr/local/bin/」ディレクトリという意味になる。nmap自体のバイナリはこのディレクトリにインストール(コピー)される。

 さらにバイナリがインストール(コピー)される先として,「sbindir = ${exec_prefix}/sbin」,つまり「/usr/local/sbin/」が定義されている。

 ほかには,「mandir = ${prefix}/man」(/usr/local/man/)にはドキュメントがインストールされることも分かる。

 そして,makeに付加させるパラメータ「install:」を見ると,具体的にどのファイルがmake installでコピーされるかが記述されている。

 ここではinstallパラメータにおけるすべての記述内容を解説しないが,「mkdir -f -p -m 755 $(bindir) $(mandir)/man1 $(nmapdatadir) $(deskdir)」でディレクトリ作成,「$(INSTALL) -c -m 755 nmap $(bindir)/nmap」ではnmapがコピーされる。「$(INSTALL)」が行頭に書かれている行が,コピーされるファイルすべての指定だ。このように事細かにファイルの動きを指定するのがMakefileファイルの役目である。

 以上の情報をすべて読み取らなければ,自ら完全なるアンインストール(削除)を行うことはできない。

 しかし,運良く? 「uninstall:」が定義されている行儀のよいツール(Makefile)であれば,「make uninstall」と指定するだけで削除することが可能だ。しかしここでのnmapの場合,実際に行われているのは「rm -f $(bindir)/$(TARGET)」,つまり「rm -f /usr/local/bin/nmap」を実行し,以下略で記述されている個所でコンパイル時に行った環境設定ファイルをクリアしているだけである。つまりドキュメントファイルなどは残されたままだ。

 このようにLinuxでのアンインストールがいかに面倒であるかが分かるだろう。付け足すならば,一見完璧そうなWindows環境であっても,実はDLLファイルなどが削除されないままで残っているケースが多い。アンインストール時に,ユーザーへ「削除してもよいですか?」などの問いが表示されるのを覚えている人は多いだろう。ここで削除をするとシステムが不安定になってしまうと思うのは自然である。むやみにクリーンな環境を追求し,システム障害になっては困るはずだ。削除(アンインストール)を行う場合には十分に注意してほしい。

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ