素人がmakeファイルで、迷子になったので メモる。
コードは「ネットワークプログラミング入門」雪田修一著 p75
基本的なコードなので著作権はないと思われるのでそのまま掲載
#Fielname: Makefile
#http://omilab.naist.jp/~mukaigawa/misc/Makefile.html
#暗黙のルール
#先ほどの Makefileでは,main.cと sub.cから, それぞれ main.o と sub.oを作
#成する方法を書いていませんでした. 通常 *.cから *.oの作成手順は省略します
#. しかし,最適化オプション -Oや, インクルードファイルのありかを明示する
##-I オプションは *.cから *.oの作成時に指定すべきです. そのために使われるの
#が,CFLAGSです. *.cから *.oが自動的に作成される際に,CFLAGSがオプション
#として使われます.
#s: サーバーの実行ファイル名 c:クライアントの実行ファイル名
#$^ 内部マクロ 依存のファイルリスト
#gccは実行ファルを作成するのに 複数のファイルを記述する事がある
#server.oを作成するのに goban.hだけでいいのだろうか
#all: $(PROGRAM)
#作りたいもの(all)とその材料は示されてますが, 作り方が書いてありません
#allを作りたければ,まず$(PROGRAM)を作れという意味しかありません.
#これは,作りたいものを指定せずに makeコマンドを実行すると
#一番最初にある[作りたいもの]が作成される ことを利用して,
#とりあえず make と入力すれば実行バイナリが作成されるようにするための仕掛け
#です.
#このルールは,一番最初に書かないと意味がありません.
#http://nort-wmli.blogspot.com/2017/08/makefile.html
#【暗黙ルールの例】
#main.o が無いとき,同ディレクトリに,main.c があれば,cc で,main.cpp があ
#れば g++ でコンパイルする.
#ただし,変数 CC が指定されている場合,コンパイラには CC を用いる.
#したがって,下側の Makefile を以下のように書き換えると,上側の Makefile と
#全く同じことができるようになる.
#全ての暗黙ルールは Makefile が存在しない場所で,-pオプションをつけてmakeコ
#マンドを実行すると表示できる.
#よくCFLAGSや,LDFLAGS,LDLIBS等の変数が設定されたMakefileを見かけるのは上
#記のように暗黙ルールで使用されているからだ.これらの変数や暗黙ルールをうま
#く利用して Makefile を書くと,見やすく,かつミスの少ない Makefile を書くこ
#とができる
#暗黙のルールでこのMakefileは以下のコマンドとなる
#材料のオブジェクトファイルがないから、作ろうとする
#
#-c: オブジェクトファイルを作成
#server.cで使われるgoban.hはこのMakefileと同じフォルダにあるが
#mylib.hは別の場所にあるのでそれを -Iで教えているらしい
#
#オブジェクトファイルを作成するときは、定義されていない関数がある場合は
#extern宣言されたファイルがincludeされていれば、そのファイルだけで
#オブジェクトファイルができる
#別のフォルダにあれば-Iで指定してやる
#cc -I../mylib -c -o server.o server.c
#cc -I../mylib -c -o goban.o goban.c
#
#オブジェクトファイルをリンクさせて、実行ファイルを作成
#この場合、使われている関数を含んでいる全てのオブジェクトファイルが必要?
#この場合includeしているファイル(依存関係にある)をリンクさせる?
#エラーでる????????????
#goban_peer_turn' に対する定義されていない参照です
#cc -o s server.o goban.o ../mylib/mylib.a
MYLIBDIR = ../mylib
MYLIB = $(MYLIBDIR)/mylib.a
# -I: インクルード・ファイルの検索先に追加するディレクトリーを指定します。
#include aaa.hとするだけで aaa.c内に含まれる関数を利用できる
CFLAGS = -I$(MYLIBDIR)
all: s c
s: server.o goban.o
$(CC) -o $@ $^ $(MYLIB)
c: client.o goban.o
$(CC) -o $@ $^ $(MYLIB)
server.o client.o: goban.h
clean:
$(RM) s c *.o *~
#makeを実行するとこのファイルが実行される
#コンパイルはしていないようだ
#いや暗黙のルールでコンパイルいているようだ
#アーカイブファイルを作成しているようだ
#mylib.aといるライブラリを作成
#実際makeを実行すると
#ターミナルでコマンドがこのように表示される
#cc -c -o setup_client.o setup_client.c
#cc -c -o setup_server.o setup_server.c
#cc -c -o chop_newline.o chop_newline.c
#rm -f mylib.a
#ar -qc mylib.a setup_client.o setup_server.o chop_newline.o
#4つのオブジェクトファイルをOBJSという変数に代入
#下の行の最後の方の#は コメントアウト
#OBJS = setup_client.o setup_server.o chop_newline.o #setup_mserver.o
#ar アーカイブファイルを作成
#ARというマクロを作成?
#AR = ar -qc
#依存記述行
#目的物:(タブ)材料(依存するファイルリスト)
#コマンド行 依存記述行と区別するために先頭にタブをいれる
#(タブ) 材料から目的物を作り出すコマンド列
#$変数名 で変数名の中身が展開される
#デフォルト変数 予め変数がセットされている
#CC=cc RM=rm -f @目的物のmylib.h
#http://omilab.naist.jp/~mukaigawa/misc/Makefile.html
#その材料であるオブジェクトファイル(main.o と sub.o)が存在しないか, あ
#るいはさらにその材料のソースファイル(main.c と sub.c)よりも日付が古けれ
#ば 再帰的にオブジェクトファイルがコンパイルされます
#一旦アーカイブファイルを削除してから 又作成
#mylib.a: $(OBJS)
# $(RM) $@
# $(AR) $@ $(OBJS)
#http://www.not-enough.org/abe/manual/comm/make.html
#例えば、aaa.o がターゲットの場合は aaa.c をコンパイルするものとみなして、
#Makefile にルールを記述しなくても cc aaa.c を実行してくれる。
#下はmylib.hに変更があった場合自動的に再コンパイルする?
#$(OBJS): mylib.h
#make cleanと実行した時に何をするか記述
#clean:
# $(RM) *.o mylib.a
~
~
~
~
~
16,8-7 全て
0 件のコメント:
コメントを投稿