<<戻る

2004年9月3日

Makefileのサンプル

Makefileの学習するには、とりあえず書きましょう。シェルスクリプトのコマンドが書けるので自分でMakefileのみ作りながら、マクロなどの概要を学びます。後は、どんな小さなC言語プログラムでもMakefileを書きましょう。そのうち覚えます。ちなみにやり方でJavaのビルドツールのAntを覚えると、XMLの概要も分かります。

Makefile概要

# make
#変数=値
CC= gcc
CFLAGS= -g -Wall -O2 -std=c89 -pedantic
CPPFLAGS=
LIBS= -L.
INCLUDES= -I.

.c.o:
        $(CC) $(INCLUDES) $(CFLAGS) -c $<

myatoi :

clean:
        rm -f *.[o] myatoi

#
# ターゲット: 依存ファイル
#
aaa.o : hoge fuga
        @echo $@                # ターゲット名(aaa.o)
        @echo $*                # ターゲット名からサフィックスを除いたもの(aaa)
        @echo $?                # 依存ファイルのリスト(hoge fuga)

# $@,$* $?などをマクロと呼ぶ

#
# サフィックスルール
#
# サフィックスとは、.suffix1から.suffix2が作られる事を定義する
# .suffix1.suffix2
#
#最初に.SUFFIXESを定義しなければならない.
.SUFFIXES: .hoge .fuga

#これで、.hoge.fugaのサフィックスルールがつかえる。
.hoge.fuga :
        echo $<                         # $<はサフィックスルールでつかう
        @echo "hello" > $<;     # コマンドは;で終了させないと動作しない時有り
        @cat $<;                        # @は表示しない
#サフィックスルールでも$@,$*,$?をつかえる
        @echo $@
        @echo $*
        @echo $?
# 1.testmakeターゲットは、依存ファイルaaa.fugaをもつ。
# 2.aaa.fugaは、サフィックスの定義.hoge.fugaをよぶ。
testmake : aaa.fug

2_10 :
2_9 :
3_1 :
3_2 :

 

K&R本を勉強していたときのサンプル

CC=gcc
CPPFLAGS=
CFLAGS=-ggdb -O2 -std=c89 -pedantic -Wall
LIBS=
INCLUDES=

OBJS= bubble_sort.o insert_sort.o main.o select_sort.o utility.o shell_sort.o

all : argorithm

argorithm : $(OBJS)
    $(CC) $(LIBS) -o $@ $?
    rm -f $(OBJS)

$(OBJS) :

.c.o :
    $(CC) $(CPPFLAGS) $(CFLAGS) -c $<

clean :
    rm -f $(OBJS)
 

 

Pro*CでのMakefileさんぷる

PROGRAM=blob_sample

CC=gcc
PCC=proc
CFLAGS=-Wall -O2

PROCFLAGS = include=$(ORACLE_HOME)/precomp/public \
                include=. \
                include=/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include \
                mode=ansi \
                ireclen=256 \
                select_error=yes \
                sqlcheck=full \
                maxopencursors=32 \
                hold_cursor=no \
                release_cursor=yes \
                code=ANSI_C

INCLUDES=-I$(ORACLE_HOME)/precomp/public \
        -I/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include

DBLOGIN=okita2/okita2@oracledb

ORACLE_LIBS=-L$(ORACLE_HOME)/lib -lclntsh

OBJS=blob_sample.o

all: $(PROGRAM)

$(PROGRAM): blob_sample.o
        $(CC) -o $@ $(OBJS) $(ORACLE_LIBS)

clean:
        @rm -f $(OBJS) $(PROGRAM) *.[c]


.SUFFIXES: .pc .c .o

.pc.o:
        $(PCC) $(PROCFLAGS) iname=$< oname=$*.c  userid=$(DBLOGIN)
        $(CC) --save-temps $(CFLAGS) -c $*.c $(INCLUDES)
.pc.c:
        $(PCC) $(PROCFLAGS) iname=$< oname=$*.c userid=$(DBLOGIN)
.c.o:
        $(CC) $(CFLAGS) -c $< $(INCLUDES)

 

 

PthreadでのMakefileサンプル

 CC= gcc
CPPFLAGS=
CFLAGS= -ggdb -Wall -O2
INCLUDES=
LIBS= -lpthread

RM=/usr/local/bin/rm


PROGRAM = thread_sample
OBJS = quere.o control.o workcrew.o

all : $(PROGRAM)

$(PROGRAM) : $(OBJS)
    $(CC) -o $@ $? $(LIBS)

SUFFIEXES : .c .o

.c.o :
    $(CC) $(CFLAGS) -c $<

clean :
    $(RM) -f $(OBJS)
:q
bash-2.05$ cat Makefile
CC= gcc
CPPFLAGS=
CFLAGS= -ggdb -Wall -O2
INCLUDES=
LIBS= -lpthread

RM=/usr/local/bin/rm


PROGRAM = thread_sample
OBJS = quere.o control.o workcrew.o

all : $(PROGRAM)

$(PROGRAM) : $(OBJS)
        $(CC) -o $@ $? $(LIBS)

SUFFIEXES : .c .o

.c.o :
        $(CC) $(CFLAGS) -c $<

clean :
        $(RM) -f $(OBJS)