Makefileにinstallの記述を行う

前回の投稿で作成したhelloという実行ファイルをパスの通ったディレクトリに自動的に置いてあげるルールを作成してみます。
これこそが世間一般で言うインストールというものです。

まず最初に、私たちが毎日のように用いているLinuxコマンドの一つ「ls」の実行ファイルのパスを調べます。

$ which ls
/bin/ls

#/bin/には、grepやkillなどの馴染み深いコマンドの実行ファイル(コマンド本体)がいっぱい置いてあります。
$ ls /bin
bash date gzip mt readlink uname
bunzip2 dbus-cleanup-sockets hostname mt-gnu rm uncompress
busybox dbus-daemon ip mv rmdir unicode_start
bzcat dbus-uuidgen kbd_mode nano rnano vdir
bzcmp dd kill nc run-parts vmmouse_detect
bzdiff df less nc.openbsd sed which
bzegrep dir lessecho netcat setfont ypdomainname
bzexe dmesg lessfile netstat setupcon zcat
bzfgrep dnsdomainname lesskey nisdomainname sh zcmp
bzgrep domainname lesspipe ntfs-3g sh.distrib zdiff
bzip2 dumpkeys ln ntfs-3g.probe sleep zegrep
bzip2recover echo loadkeys ntfs-3g.secaudit static-sh zfgrep
bzless ed login ntfs-3g.usermap stty zforce
bzmore egrep lowntfs-3g open su zgrep
cat false ls openvt sync zless
chgrp fgconsole lsmod pidof tailf zmore
chmod fgrep mkdir ping tar znew
chown fuser mknod ping6 tempfile
chvt fusermount mktemp plymouth touch
cp grep more ps true
cpio gunzip mount pwd ulockmgr_server
dash gzexe mountpoint rbash umount

#/bin/に自分が作る新しい実行ファイルを追加するためには、/binの属性を調べる必要があります
$ ls -l / | grep "bin"
drwxr-xr-x 2 root root 4096 2012-03-01 08:07 bin
drwxr-xr-x 2 root root 4096 2012-03-16 00:21 sbin

#/binディレクトリは、rootユーザーの所有であり、それ以外のユーザーは閲覧したり、実行したりすることは出きるが、上書きすることができないということがわかる。故に、Makefileのルールに従い、実行ファイルまでは作成できるものの、「インストール」をしようとして、/bin/に実行ファイルを置こうものなら、ルート権限が要求されることが理解できる。

それでは実際にMakefileにInstallのルールを追記してみる。


$ cat Makefile
#Makefile

#マクロを定義します
TARGET = hello
OBJECT = hello.o
SRC = hello.c
CC = gcc
CFLAGS = -g -Wall

#コマンド行
#以下の二行の繰り返し
#1.ターゲット: 依存するファイルの形式で記述する
#2.(Tabの後) コマンド
$(TARGET) : $(OBJECT)
@echo "*** Making $(TARGET) ****" #make実行中にコメントを表示
$(CC) -o $(TARGET) $(OBJECT)
$(OBJECT) : $(SRC)
@echo "*** Making $(OBJECT) ****" #make実行中にコメントを表示
$(CC) -c $(SRC)
clean:
@echo "*** Deleting $(OBJECT) ***"
rm -f $(OBJECT)
clobber: clean
@echo "*** Clobbering all produced files : $(OBJECT),$(TARGET)"
rm -f $(TARGET)
#もしも万が一、同名の実行ファイルがすでに/binに存在する場合は、警告を出すように-iオプションをつける。
install:
cp -ip $(TARGET) /bin

$ make
*** Making hello.o ****
gcc -c hello.c
*** Making hello ****
gcc -o hello hello.o


$ make install
cp -ip hello /bin
cp: 通常のファイル `/bin/hello' を作成できません: 許可がありません
make: *** [install] エラー 1

$ sudo make install

$ sudo make install
[sudo] password for user:
cp -ip hello /bin

#パスをつけずに実行ファイルを実行してみる。
#パスが通って入れば、実行されるはず。。。。
$ hello
Hello, world!!

#ばっちりですね!!!
#念のためhelloへのパスを調べてみると
$ which hello
/bin/hello

#しっかり目的の場所に実行ファイルが置かれていることがわかります。


/binにおいておけば、自分以外のユーザーもアクセスできるため、プログラムを共有して使うことができるのですね。
いかにもUNIXらしいシステムです。

今日はちょっと感動しました。