32.7.2 makefile生成機能

<この項の構成>
(1) makefile生成機能の概要
(2) makefileの生成方法
(3) cbl2kmfコマンドに関する注意事項

(1) makefile生成機能の概要

makefile生成機能とは,COBOL2002で作成するプログラムやライブラリの作成方法や保守方法を,makeに通知するmakefileを生成する機能です。この機能は,cbl2kmfコマンドで使用します。生成したmakefileは,テキストエディタで変更できます。

(2) makefileの生成方法

(a) cbl2kmfコマンド
形式

cbl2kmf  〔-cls〕〔-f makefile名〕〔 マクロ名=値〕 …

機能
  • COBOL用のmakefileを生成します。
  • makefile生成前に,既存のmakefileの有無を調べます。
規則
-c
'creating makefile from …'のメッセージを表示しません。
-l
makefileをライブラリ用のmakefileにします。
-s
cbl2kmf起動前makefileのCOBOLマクロ情報およびCOBOLサフィックスのルールをmakefileが引き継ぎます。
-f makefile名
makefileのファイル名を指定します。省略した場合は,Makefileになります。
マクロ定義
cbl2kmfでは,次のマクロ定義を使用できます。また,mkmfコマンドで使用できるマクロ定義も使用できます。mkmfコマンドで使用できるマクロ定義の詳細は,システムのマニュアルを参照してください。
・CBLMAIN
  メインプログラムのソースファイル名を指定します(COBOL以外のプロ
  グラムがメインプログラムのときは指定しないでください)。
・CBLFLAGS
  COBOL2002のコンパイラオプションを指定します。
  複数のフラグを指定するときは,引用符(")で囲んでください。
環境変数
cbl2kmfに指定できる環境変数を次に示します。
環境変数意味デフォルト値
LDmakefileのマクロ定義と置換"ccbl2002"
CBLMAINメインプログラムのソースファイル名を指定""
CBLFLAGSCOBOL2002のコンパイラオプションを指定""
  • CBLMAINとCBLFLAGSは,マクロ定義,環境変数,-sオプションの順に優先します。
  • 登録集原文を検索するディレクトリを設定する環境変数CBLLIBなど,ccbl2002コマンドでコンパイルするときに必要な環境変数は,cbl2kmfコマンド起動時も必要となります。環境変数の詳細については,「32.6.2 コンパイラ環境変数の一覧」を参照してください。
  • cbl2kmfコマンドは,次の終了コードを返します。
    終了コード意味
    0cbl2kmfは,正常に終了した。
    1cbl2kmfで,エラーが発生した。
    2cbl2kmfで,回復不能エラーが発生した。
注意事項
  • cbl2kmfで作成されたmakefileは,make時にmkmfが受け付ける要求の中で次の要求は受け付けません。
    ・index:標準出力への関数インデクスのプリント
    ・tags :exエディタ用のタグファイルの作成
    mkmfが受け付ける要求については,システムのマニュアルを参照してください。
  • プログラム名とライブラリの名称のデフォルトは,それぞれa.outとlib.aです。変更するときは,マクロ名PROGRAMおよびLIBRARYの値設定式を指定してください。
  • 生成された依存関係の情報は,####で始まるmakefileの行の後に現れます。これらの行を変更してはなりません。
  • cbl2kmfに不正なオプションを指定すると,mkmfのエラーメッセージが出力される場合があります。
  • ソースファイル中にクラス定義,インタフェース定義,関数定義があった場合でも,次のディレクトリに対する環境変数は生成されません。
    ・リポジトリファイルの検索対象ディレクトリ
    ・リポジトリファイルの出力先のディレクトリ
  • ソースファイル中にクラス定義,インタフェース定義,関数定義があった場合でも,リポジトリファイルに対するCOBOL原始プログラムや登録集原文との依存関係を示す情報は生成されません。
  • cbl2kmfコマンドで生成されたmakefileを使用すると,ソースファイル名のアルファベット順にソースファイルがコンパイルされます。参照関係を持つクラス定義,インタフェース定義,関数定義がある場合は,参照先のソースファイルを先にコンパイルするために,参照先のソースファイル名は参照元のソースファイル名よりアルファベット順が先になるようにする必要があります。参照元および参照先のソースファイル(翻訳単位)の関係については,「33.1 リポジトリファイルを使用するCOBOLプログラム開発の概要」を参照してください。
    参照元および参照先のソースファイルと,生成されたmakefileでのコンパイル順序の例を次に示します。

    [図データ]

    makefileの生成

cbl2kmf CBLMAIN=PROGRAM1.cbl

生成されたmakefileでのコンパイル順序

ccbl2002 -Compile,NoLink CLASS01.cbl
ccbl2002 -Compile,NoLink CLASS02.cbl
ccbl2002 -Compile,NoLink -Main,System PROGRAM1.cbl

  • 生成したmakefileでコンパイルを実行するときに指定しなければならないコンパイラオプションがある場合は,cbl2kmfコマンドを実行するときに必要なすべてのコンパイラオプションを次のどれかに指定してください。
    ・マクロ定義CBLFLAGS
    ・環境変数CBLFLAGS
    ・コンパイラ環境変数CBLCOPT2002
    また,必要なコンパイラオプションをコンパイラ環境変数CBLCOPT2002に指定してmakefileを生成した場合は,makeを実行するときにも同じコンパイラオプションを指定する必要があります。
(b) 使用例

makefile生成機能の使用例を示します。

前提条件
作成する実行可能ファイル名称example1
原始プログラム名称main.cbl
(主プログラム,原始プログラムに登録集cpy1.cbl,cpy2.cblを複写)
sub1.CBL
(副プログラム,原始プログラムに登録集cpy1.cblを複写)
sub2.cob
(副プログラム,原始プログラムに登録集cpy2.cblを複写)
登録集原文名cpy1.cbl
(原始プログラムとは別ディレクトリ)
cpy2.cbl
(原始プログラムとは別ディレクトリ)
コンパイラオプション-TDInf
(テストデバッグ機能が使用できる実行可能ファイルを作成)
-DoubleQuote
(原文中に引用符を使用)
ファイル構成と操作概要
[図データ]
makefileの内容

CFLAGS        =
DEST          = .
EXTHDRS       = ../copylib/cpy1.cbl ¥
               ../copylib/cpy2.cbl
HDRS          =
INSTALL       = /etc/install
LD            = ccbl2002
LDFLAGS       = -TDInf
LIBS          =
MAKEFILE      = Makefile
OBJS          = main.o ¥
               sub1.o ¥
               sub2.o
PRINT         = pr
PROGRAM       = example1
SHELL         = /bin/sh
SRCS          = main.cbl ¥
               sub1.CBL ¥
               sub2.cob
SYSHDRS       =
all:            $(PROGRAM)
$(PROGRAM):     $(OBJS) $(LIBS)
               @echo "Linking $(PROGRAM)..."
               @$(LD) $(LDFLAGS) $(OBJS) $(LIBS) -o $(PROGRAM)
               @echo "done"
clean:;         @rm -f $(OBJS) core
clobber:;       @rm -f $(OBJS) $(PROGRAM) core tags
depend:;        @mkmf -f $(MAKEFILE) ROOT=$(ROOT)
echo:;          @echo $(HDRS) $(SRCS)
index:;         @ctags -wx $(HDRS) $(SRCS)
install:        $(PROGRAM)
               @echo Installing $(PROGRAM) in $(DEST)
               @-strip $(PROGRAM)
               @if [ $(DEST) != . ]; then ¥
            (rm -f $(DEST)/$(PROGRAM); $(INSTALL) -f $(DEST) $(PROGRAM); fi
print:;         @$(PRINT) $(HDRS) $(SRCS)
tags:           $(HDRS) $(SRCS); @ctags $(HDRS) $(SRCS)
update:         $(DEST)/$(PROGRAM)
$(DEST)/$(PROGRAM): $(SRCS) $(LIBS) $(HDRS) $(EXTHDRS)
               @$(MAKE) -f $(MAKEFILE) ROOT=$(ROOT) DEST=$(DEST) install
###

上記のmakefileの内容の詳細は,システムのマニュアルを参照してください。
環境変数指定またはマクロ定義によるマクロ

CBL          = ccbl2002
CBLFLAGS     = -TDInf -DoubleQuote
CBLMAINOPT   = -Main,System
CBLCMPLOPT   = -Compile,NoLink

COBOL言語用サフィックス
.cbl:
$(CBL) $(CBLFLAGS) $(CBLMAINOPT) $< $(LDFLAGS) -O $<
.cbl.o:
$(CBL) $(CBLFLAGS) $(CBLCMPLOPT) $<
.CBL:
$(CBL) $(CBLFLAGS) $(CBLMAINOPT) $< $(LDFLAGS) -O $<
.CBL.o:
$(CBL) $(CBLFLAGS) $(CBLCMPLOPT) $<
.cob:
$(CBL) $(CBLFLAGS) $(CBLMAINOPT) $< $(LDFLAGS) -O $<
.cob.o:
$(CBL) $(CBLFLAGS) $(CBLCMPLOPT) $<
.ocb:
$(CBL) $(CBLFLAGS) $(CBLMAINOPT) $< $(LDFLAGS) -O $<
.ocb.o:
$(CBL) $(CBLFLAGS) $(CBLCMPLOPT) $<
.cbf:
$(CBL) $(CBLFLAGS) $(CBLMAINOPT) $< $(LDFLAGS) -O $<
.cbf.o:
$(CBL) $(CBLFLAGS) $(CBLCMPLOPT) $<
.ocf:
$(CBL) $(CBLFLAGS) $(CBLMAINOPT) $< $(LDFLAGS) -O $<
.ocf.o:
$(CBL) $(CBLFLAGS) $(CBLCMPLOPT) $<
.SUFFIXES : .cbl .CBL .cob .ocb .cbf .ocf
COBOL原始プログラムとCOBOL登録集原文の依存関係を示すターゲット行とシェル行

####
main.o: ../copylib/cpy1.cbl ../copylib/cpy2.cbl
       $(CBL) $(CBLFLAGS) $(CBLCMPLOPT) $(CBLMAINOPT) $<
sub1.o: ../copylib/cpy1.cbl
sub2.o: ../copylib/cpy2.cbl

具体的な操作
コマンド

cd     /home/src      *>1.
CBLLIB=/home/copylib  *>2.
export CBLLIB         *>3.
cbl2kmf  PROGRAM=example1 CBLMAIN=main.cbl
        CBLFLAGS="-TDInf -DoubleQuote"
        LDFLAGS=-TDInf  *>4.
make                     *>5.

説明
  1. 原始プログラムが,存在するディレクトリを変更します。
  2. 登録集原文は,別ディレクトリであるため,cbl2kmfが検索できるように環境変数CBLLIBを設定します。
  3. 環境変数CBLLIBを有効にします。
  4. makefileを生成します。
  5. 実行可能ファイルexample1を生成します。

(3) cbl2kmfコマンドに関する注意事項

cbl2kmfコマンドは,COBOLソースファイルだけを対象としてmakefileを生成します。Cプログラムに対しては,makefileが生成されないので注意してください。

Cプログラムに対するmakefileを生成するmkmfコマンドがある場合は,次の環境変数を指定することによって,Cプログラムを含めたmakefileを生成できます。

環境変数の指定例(コマンド名:mkmf)
sh(Bシェル)の場合

$CBLMKMF=/home/tools/bin/mkmf
$export CBLMKMF