13. ビルド関数とユーティリティ

13.1 ビルドイン .PHONY ターゲット

以下にビルドイン .PHONY ターゲットの完全なリストを示します。

  • .PHONY

    新しいphonyターゲットを宣言します。(8.10 .PHONY)

  • .DEFAULT

    デフォルトのビルドターゲットを宣言します。(8.7 .DEFAULT)

  • .SUBDIRS

    プロジェクトの一部としてディレクトリをインクルードします。(8.8 .SUBDIRS)

  • .SCANNER

    依存関係のスキャナを定義します。(8.6 .SCANNER ルール)

  • .INCLUDE

    ファイルをインクルードします。(8.9 .INCLUDE)

  • .ORDER

    ファイルの依存関係ルールの順番を定義します。(10.3.6 file-sort)

  • .BUILD_BEGIN

    ビルド開始時に実行されるコマンド

  • .BUILD_SUCCESS

    ビルドが成功したときに実行されるコマンド

  • .BUILD_FAILURE

    ビルドが失敗したときに実行されるコマンド

.BUILD ターゲットはビルドの開始と終了時に実行されるコマンドを指定するために用いられます。 .BUILD_BEGIN ターゲットはプロジェクトをビルドする前に実行されて、 .BUILD_FAILURE または .BUILD_SUCCESS はビルドが終了したときに実行されます。

例えば、以下のルールの集合はビルドの状況について、簡単なメッセージを表示します。

.BUILD_BEGIN:
    echo Build starting

.BUILD_SUCCESS:
    echo The build was successful

.BUILD_FAILURE:
    println($"The build failed: $(length $(find-build-targets Failed)) targets could not be built")

通常用いる別の使い方としては、ビルドが完了したときに通知するように定義するという方法があります。例えば、以下のルールでは(BUILD_SUMMARY変数を使うことで)ビルドの要約を新しいXターミナル上に表示します。

.BUILD_FAILURE:
    xterm -e vi $(BUILD_SUMMARY)

あなたがプロジェクトに直接これらのルールを追加したくない場合(もしあなたが他の場所で実行するなら、これはよいアイデアです)、あなたはこれらのルールを .omakerc に定義することができます(詳細は A.8 .omakerc を参照してください)。

find-build-targets 関数はさらに具体的なビルドの状況を取得したいときに有用です。 --output-* オプションを使って出力先を変更している場合、コマンドによって生成された出力はファイルにコピーされることに注意してください。ファイル名は Target オブジェクトの output-file フィールドによって指定されます。あなたはビルドの状況をカスタマイズしたいときに、この方法を試してみてください。

13.2 オプションとバージョン管理

13.2.1 OMakeFlags

OMakeFlags(options)
   options : String

OMakeFlags 関数はOMakefileの内部で omake のオプションを設定したいときに用いられます。オプションはコマンドライン上でのオプション指定と全く同じフォーマットで指定します。

例えば、以下のコードは VERBOSE 環境変数が定義されるまで、プログレスバーを表示し続けます。

if $(not $(defined-env VERBOSE))
    OMakeFlags(-S --progress)
    export

13.2.2 OMakeVersion

OMakeVersion(version1)
OMakeVersion(version1, version2)
   version1, version2 : String

OMakeVersion 関数はOMakefileのバージョンをチェックするときに用いられます。この関数は1つ、または2つの引数を取ります。

1つの引数をとる形では、omakeのバージョン番号が <version1> よりも低いときに例外を送出します。2つ引数をとる形では、omakeのバージョン番号は version1version2 の間になければなりません。

13.2.3 cmp-versions

$(cmp-versions version1, version2)
   version1, version2 : String

cmp-versions 関数は任意のバージョン文字列を比較することができます。2つのバージョン文字列が等しいときには、この関数は0を返します。一方で、最初の文字列が2番めよりも若いバージョンであるときには負の値を返し、そのいづれでもないときには正の値を返します。

13.2.4 DefineCommandVars

DefineCommandVars()

DefineCommandVars 関数はコマンドライン上から受け渡した変数を再定義します。変数定義はコマンドラインから name=value の形で受け渡されます。この関数は、これらの変数を最初の時点で定義するため、omakeが内部で使用します。

13.3 依存関係グラフの調査

13.3.1 dependencies, dependencies-all, dependencies-proper

$(dependencies targets) : File Array
$(dependencies-all targets) : File Array
$(dependencies-proper targets) : File Array
   targets : File Array
raises RuntimeException

dependencies 関数は与えられたターゲットの明示的な依存関係の集合を返します。この関数はルールの本体だけに使うことができます。さらに、 dependency 関数のすべての引数は、このルールの依存先でなければいけません。この制約は、関数が実行されたときにすべての依存関係が解析されていることを保証してくれます。

dependencies-all 関数は似ていますが、この関数は依存関係を再帰的に展開し、明示的な依存関係だけでなくターゲットの依存関係すべてを返してくれます。

dependencies-proper 関数は『末端』となる依存先を除く、すべての依存関係を再帰的に返します。『末端』のターゲットは依存先やビルドコマンドが存在しないターゲット、つまり、現在のプロジェクト上にあるソースファイルの集合を指しています。

この3つの関数では、現在のプロジェクトの一部でないファイルは無視されます。また、3つの関数はすべて『実際のファイル』に関連しているphonyやscannerターゲットも返します。

dependencies-proper 関数を使う一つの目的としては”clean”ターゲットを実装することが挙げられます。例えば、ビルドしたすべての明示的なファイルを削除する一つの方法としては、 dependencies-proper をルール部分に使うことです。しかしながら、このルールでは消去する前にプロジェクトをビルドすることが必要となってきます。

.PHONY: clean

APP = ...     # 対象となるアプリケーション名
clean: $(APP)
   rm -f $(dependencies-proper $(APP))

dependencies-proper 関数はまた、実際のファイルに加えてphonyやscannerターゲットも返してしまうことに注意してください。

(さらにより良く実装している)別のサンプルについては、 10.3.3 filter-exists, filter-targets, filter-proper-targetsfilter-proper-targets 関数を参照してください。

13.3.2 target

$(target targets) : Target Array
   targets : File Sequence
raises RuntimeException

target 関数はそれぞれのターゲットに関連しているTargetオブジェクトを返します。詳細な情報は Target オブジェクト( 12.1.11 Target )を参照してください。

13.3.3 find-build-targets

$(find-build-targets tag) : Target Array
   tag : Succeeded | Failed

find-build-targets はビルドの実行結果を返します。 tag では、どのターゲットを返すべきなのかについて指定します。結果は tag の場合によって異なります。

  • Succeeded

    ビルドが成功したターゲットのリスト

  • Failed

    ビルドできなかったターゲットのリスト

これらは主に .BUILD_SUCCESS.BUILD_FAILURE phonyターゲットと一緒に使われます。例えば、あなたのプロジェクトの OMakefile に以下を加えることで、(ビルドが失敗したときに)失敗したターゲットの数を表示します。

.BUILD_FAILURE:
    echo "Failed target count: $(length $(find-build-targets Failed))"

13.3.4 project-directories

$(project-directories) : Dir Array

project-directories 関数はプロジェクトの一部であると考えられる、すべてのディレクトリのリストを返します。

完全なディレクトリのリストを取得するためには、この関数をルールの本体で呼び出すべきです。

13.3.5 rule

rule 関数はビルドルールが定義されたときにいつでも呼び出されます。非常に特別なケースを除いて、あなたはこの関数を再定義すべきではありません。

rule(multiple, target, pattern, sources, options, body) : Rule
   multiple : String
   target   : Sequence
   pattern  : Sequence
   sources  : Sequence
   options  : Array
   body     : Body

rule 関数はルールが評価されたときに呼び出されます。

  • multiple

    ルールがダブルコロン :: を用いて定義されているかどうかを示しています。

  • target

    ターゲット名のシーケンスです。

  • pattern

    パターンのシーケンスです。このシーケンスは通常の2パートのルール定義のときには空となります。

  • sources

    依存関係のシーケンスです。

  • options

    オプションの配列です。各々のオプションは、オプション名と値が関連付けられている Map (辞書型の)オブジェクトとして表現されます。

  • body

    ルールの内容を表しています。

以下のルールを考えてみましょう。

target: pattern: sources :name1: option1 :name2: option2
   expr1
   expr2

上の式はまず以下の関数の呼び出しに置き換えられ、[]は配列を指定するために用いられ、さらに{}はMapオブジェクトに置き換わります。

rule(false, target, pattern, sources,
     { $|:name1:| = option1; $|:name2:| = option2 }
     [expr1; expr2])

13.3.6 build

build(targets : File Array) : bool

与えられたターゲットをビルドします。ビルドが成功した場合、この関数は真を返します。この関数は osh 上でのみ使うことができます。

13.4 OMakerootファイル

標準のOMakerootファイルでは、普通のプロジェクトをビルドするためのルール関数を定義しています。

13.4.1 変数

  • ROOT

    現在のプロジェクトのルートディレクトリ

  • CWD

    カレント作業ディレクトリ(このディレクトリは、プロジェクトにある各々のOMakefileの集合です)

  • EMPTY

    空文字列

  • STDROOT

    標準でインストールされているOMakerootのファイル名

  • ABORT_ON_COMMAND_ERROR

    trueに設定した場合、たとえコマンドの一つがビルドに失敗したとしても、ターゲットはそれを無視します。デフォルトの値はtrueで、通常はそのままにしておくべきです。

  • SCANNER_MODE

    この変数は以下の4つの値のうちの1つを選んで定義する必要があります(デフォルトは enabled です)。

    • enabled

      デフォルトの .SCANNER ルールを使うことを許可します。たとえルールが明示的に :scanner: 依存関係を指定していなくても、omakeは同じ名前のターゲットから .SCANNER を検索します。

    • disabled

      デフォルトの .SCANNER ルールを使いません。

    • warning

      デフォルトの .SCANNER ルールを使うことを許可しますが、そのうちの一つを使うことになったとき、omakeは常に警告を表示します。

    • error

      デフォルトの .SCANNER ルールを使うことを許可しません。もしルールが明示的に :scanner: 依存関係をしておらず、さらにデフォルトの .SCANNER を使うことになったとき、このルールのビルドは異常終了します。

13.4.2 システム変数

  • INSTALL : プログラムをインストールするためのコマンド( UnixinstallWin32cp)
  • PATHSEP : 通常用いるパスのセパレータ( Unix:Win32;)
  • DIRSEP : 通常用いるディレクトリのセパレータ( Unix/Win32\)
  • EXT_OBJ : オブジェクトファイルの拡張子( Unix.oWin32.obj)
  • EXT_LIB : 静的ライブラリの拡張子( Unix.aWin32.lib)
  • EXT_DLL : 共有ライブラリの拡張子( Unix.soWin32.dll)
  • EXT_ASM : アセンブリファイルの拡張子( Unix.sWin32.asm)
  • EXE : 実行可能形式の拡張子( Unix は空文字列 、 Win32Cygwin.exe)

13.5 C/C++コードのビルド

OMakeではCやC++のプログラムのビルドを広範囲にわたってサポートする機能を提供しています。このセクションで列挙している関数を使うためには、まずあなたの OMakeroot ファイルに、以下の一行を追加してください。

open build/C

13.5.1 自動設定変数(Autoconfiguration variables)

これらの変数はまず最初にOMakeを実行した時点でautoconfスタイルの static. が実行されて、その結果を元に決定されます。あなたのプロジェクトを調和の取れた状態にするためには、これらの変数を使用してください。また、あなたはこれらの変数を再定義すべきではありません。

あなたは強制的にすべてのテストを実行させるために、 --configure コマンドラインオプション( A.3.9 -configure を参照)を使うことができます。

これらの自動設定変数の値はビルドする環境に依存します。これらの変数の一部は Win32 の環境下と、(Linux, OS X, Cygwinを含む)Unixライクな環境下では異なるふるまいをします。

13.5.1.1 Unixライクなシステム

  • GCC_FOUND : gcc バイナリを発見したかどうかを示す真偽値
  • GXX_FOUND : g++ バイナリを発見したかどうかを示す真偽値

13.5.1.2 Win32

  • CL_FOUND : cl バイナリを発見したかどうかを示す真偽値
  • LIB_FOUND : lib バイナリを発見したかどうかを示す真偽値

13.5.2 C/C++用の設定変数

以下の変数があなたのプロジェクト上で定義されています。

  • CC

    Cコンパイラの名前( Unix では gcc が発見されたときはデフォルトの値として gcc が使われます。そうでない場合は cc が使われます。 Win32 ではデフォルトの値は cl /nologo です。)

  • CXX

    C++コンパイラの名前( Unix では gcc が発見されたときはデフォルトの値として gcc が使われます。そうでない場合は c++ が使われます。 Win32 ではデフォルトの値は cl /nologo です。)

  • CPP

    Cプリプロセッサの名前( Unix ではデフォルトの値は cppWin32 の場合は cl /E )

  • CFLAGS

    Cコンパイラに渡すコンパイルフラグ( Unix ではデフォルトの値は空文字列、 Win32 の場合は /DWIN32 )

  • CXXFLAGS

    C++コンパイラに渡すコンパイルフラグ( Unix ではデフォルトの値は空文字列、 Win32 の場合は /DWIN32 )

  • INCLUDES

    C/C++コンパイラに渡す、追加する検索パスを指定しているディレクトリの値(デフォルトの値は . )。これらのディレクトリは -I オプションを追加してC/C++コンパイラに受け渡されます。また、 -I 接頭辞を追加したインクルードパスは PREFIXED_INCLUDES 変数で定義されます。

  • LIBS

    プログラムをビルドするときに必要となる追加ライブラリ(デフォルトの値は空文字列)

  • CCOUT

    C/C++コンパイラの出力ファイルの場所を指定するオプション( Unix ではデフォルトの値は -oWin32 の場合は /Fo )

  • AS

    アセンブラの名前( Unix ではデフォルトの値は asWin32 の場合は ml )

  • ASFLAGS

    アセンブラに渡すフラグ( Unix ではデフォルトの値は空文字列、 Win32 の場合は /c /coff )

  • ASOUT

    AS の出力ファイルの場所を指定するオプション文字列( Unix ではデフォルトの値は -oWin32 の場合は /Fo )

  • AR

    静的ライブラリを生成するためのプログラム名( Unix ではデフォルトの値は ar cqWin32 の場合は lib )

  • LD

    リンカの名前( Unix ではデフォルトの値は ldWin32 の場合は cl )

  • LDFLAGS

    リンカに渡すオプション(デフォルトの値は空文字列)

  • LDFLAGS_DLL

    共有ライブラリをコンパイルするときにリンカに受け渡すオプション( Unix ではデフォルトの値は -sharedWin32 の場合は /DLL )

  • LDOUT

    C/C++リンカが生成する出力ファイルの場所を指定するオプション( Unix ではデフォルトの値は -oWin32 の場合は /Fe )

  • YACC

    yacc パーサジェネレータの名前( Unix ではデフォルトの値は yaccWin32 の場合は空文字列)

  • LEX

    lex レキサジェネレータの名前( Unix ではデフォルトの値は lexWin32 の場合は空文字列)

13.5.3 Cファイルの生成

Cのスキャナは(生成されたヘッダファイルのような)生成されたソースファイルについては何も知りません。よって、これらのファイルはスキャナが実行される前に生成される必要があります。

13.5.3.1 CGeneratedFiles, LocalCGeneratedFiles

CGeneratedFiles(files)
LocalCGeneratedFiles(files)

CGeneratedFilesLocalCGeneratedFiles 関数は、Cファイルについての依存関係をスキャンする前に生成される必要があるファイルを指定します。例えば、 config.hinputs.h が両方とも生成されるファイルである場合、以下のように指定します。

CGeneratedFiles(config.h inputs.h)

CGeneratedFiles 関数は グローバル です。この関数で指定したファイルは、任意の場所にある任意のCファイルの依存関係をスキャンする前に生成されます。 LocalCGeneratedFiles 関数はOMakeの通常のスコープルールに従います。

13.5.4 Cプログラムとライブラリをビルド

13.5.4.1 StaticCLibrary, DynamicCLibrary

StaticCLibrary は静的ライブラリをビルドし、 DynamicCLibrary 関数は共有ライブラリ(DLL)をビルドします。

StaticCLibrary(<target>, <files>)
DynamicCLibrary(<target>, <files>)

<target> にライブラリの拡張子は 含めません 。また、同様にして <files> のリストにもオブジェクトの拡張子は含めません。これらの拡張子は EXT_LIB ( EXT_DLL )や EXT_OBJ 変数によって決定されます。

この関数はライブラリのファイル名を返します。

以下のコマンドは Unix 上のファイル a.o b.o c.o からライブラリ libfoo.a をビルドします。あるいは、 Win32 上のファイル a.obj b.obj c.obj からライブラリ libfoo.lib をビルドします。

StaticCLibrary(libfoo, a b c)
.DEFAULT: $(StaticCLibrary libbar, a b c d)

CDLL_IMPLIES_STATIC

もし CDLL_IMPLIES_STATIC 変数が真である( Win32 上でこれはデフォルトの値です)ならば、すべての DynamicC 関数は共有ライブラリを自動的に生成し、さらに静的ライブラリを生成することを保障してくれます。

13.5.4.2 StaticCLibraryCopy, DynamicCLibraryCopy

StaticCLibraryCopyDynamicCLibraryCopy 関数はインストール先にライブラリをコピーします。

StaticCLibraryCopy(<tag>, <dir>, <lib>)
DynamicCLibraryCopy(<tag>, <dir>, <lib>)

<tag> はターゲットの名前を指定します(大抵は .PHONY ターゲットです)。 <dir> はインストール先のディレクトリで、 <lib> はコピーするライブラリ(拡張子は除く)を指定します。

この関数はターゲットディレクトリ内でのライブラリのファイル名を返します。

例えば、以下のコードではライブラリ libfoo.a/usr/lib ディレクトリにコピーします。

.PHONY: install

StaticCLibraryCopy(install, /usr/lib, libfoo)

13.5.4.3 StaticCLibraryInstall, DynamicCLibraryInstall

StaticCLibraryInstallDynamicCLibraryInstall 関数はライブラリをビルドし、さらに出力先にインストール先を指定します。これらの関数はターゲットディレクトリ内でのライブラリのファイル名を返します。

StaticCLibraryInstall(<tag>, <dir>, <libname>, <files>)
DynamicCLibraryInstall(<tag>, <dir>, <libname>, <files>)
StaticCLibraryInstall(install, /usr/lib, libfoo, a b c)

13.5.4.4 StaticCObject, StaticCObjectCopy, StaticCObjectInstall

これらの関数は StaticCLibrary , StaticCLibraryCopy , StaticCLibraryInstall 関数と似ていますが、これらは オブジェクト ファイルをビルドします( Unix では .o ファイル、 Win32 では .obj ファイル)。

13.5.4.5 CProgram

CProgram 関数はオブジェクトファイルやライブラリの集合からCプログラムをビルドします。

CProgram(<name>, <files>)

<name> にはビルドするプログラムの名前を指定します。 <files> にはリンクするファイル名を指定します。この関数は実行可能なファイル名を返します。

オプションは以下の変数を受け渡すことで指定できます。

  • CFLAGS : リンクする際にCコンパイラに受け渡すフラグ
  • LDFLAGS : ローダー(loader)に受け渡すフラグ
  • LIBS : リンクするための追加ライブラリ

例えば、以下のコードはプログラム foo がファイル bar.obaz.o 、そしてライブラリ libfoo.a をリンクすることによって生成します。

section
   LIBS = libfoo
   LDFLAGS += -lbar
   CProgram(foo, bar baz)

13.5.4.6 CProgramCopy

CProgramCopy 関数はインストール先にファイルをコピーします。

CProgramCopy(<tag>, <dir>, <program>)

CProgramCopy(install, /usr/bin, foo)

13.5.4.7 CProgramInstall

CProgramInstall 関数は同様にプログラムをビルドし、さらに出力先にインストール先を指定します。

CProgramInstall(<tag>, <dir>, <name>, <files>)

section
   LIBS = libfoo
   LDFLAGS += -lbar
   CProgramInstall(install, /usr/bin, foo, bar baz)

13.5.4.8 CXXProgram, CXXProgramInstall

CXXProgramCXXProgramInstall 関数は $(CC)$(CFLAGS) の代わりに $(CXX)$(CXXFLAGS) を使う点を除いて、対応するCの関数と等価です。

13.5.4.9 StaticCXXLibrary, StaticCXXLibraryCopy, StaticCXXLibraryInstall, DynamicCXXLibrary, DynamicCXXLibraryCopy, DynamicCXXLibararyInstall

同様にして、6つの CXXLibrary 関数は関連する CLibrary 関数と等価です。

13.6 OCamlコードのビルド

OMakeではOCamlコードをビルドするための、広範的なサポートを提供しています。このサポートには ocamlfindocamlyaccmenhir のようなツールへのサポートも含まれています。このセクションで列挙している関数を使うためには、まずあなたの OMakeroot ファイルに、以下の一行を追加してください。

open build/OCaml

13.6.1 OCamlコンパイルに用いる自動設定用の変数

これらの変数はまず最初にOMakeを実行した時点で『自動設定スタイル(autoconf-style)』が実行されて、その結果を元に決定されます。あなたのプロジェクトを調和の取れた状態にするためには、これらの変数を使用してください。また、あなたはこれらの変数を再定義すべきではありません。

あなたは強制的にすべてのテストを実行させるために、 --configure コマンドラインオプション( A.3.9 -configure を参照)を使うことができます。

  • OCAMLOPT_EXISTS

    あなたのマシン上で ocamlopt (あるいは ocamlopt.opt )が利用可能である場合は真となります。

  • OCAMLFIND_EXISTS

    あなたのマシン上で ocamlfind が利用可能である場合は真となります。

  • OCAMLDEP_MODULES_AVAILABLE

    あなたのマシン上で -modules オプションが理解できるバージョンの ocamldep が利用可能である場合は真となります。

  • MENHIR_AVAILABLE

    あなたのマシン上でMenhirパーサジェネレータが利用可能である場合は真となります。

13.6.2 OCamlコンパイルに用いる設定用の変数

以下の変数はあなたのプロジェクト上で再定義可能な変数です。

  • USE_OCAMLFIND

    ocamlfind ユーティリティを利用するかどうか(デフォルトは false )

  • OCAMLC

    OCamlバイトコードコンパイラ( ocamlc.opt が存在していてかつ USE_OCAMLFIND が設定されていない場合は ocamlc.opt 。そうでない場合は ocamlc )

  • OCAMLOPT

    OCamlネイティブコードコンパイラ( ocamlc.opt が存在していてかつ USE_OCAMLFIND が設定されていない場合は ocamlc.opt 。そうでない場合は ocamlopt )

  • CAMLP4

    camlp4 プリプロセッサ(デフォルトは camlp4 )

  • OCAMLLEX

    OCamlレキサジェネレータ(デフォルトは ocamllex )

  • OCAMLLEXFLAGS

    ocamllex に渡すフラグ(デフォルトは -q )

  • OCAMLYACC

    OCamlパーサジェネレータ(デフォルトは ocamlyacc )

  • OCAMLYACCFLAGS

    $(OCAMLYACC) に渡す追加オプション

  • OCAMLDEP

    OCaml依存関係解析器(dependency analyzer)(デフォルトは ocamldep )

  • OCAMLDEP_MODULES

    -module オプションが理解できるOCaml依存解析器(デフォルトの値は ocamldep 、ただし ocamldep-modules で動いた場合のみ。 ocamlrun ocamldep-omake -module が動く場合は ocamlrun ocamldep-omake が使われる。どちらでもない場合は空となる)

  • OCAMLDEP_MODULES_ENABLED

    従来の伝統的な make -style の形で OCAMLDEP を使う代わりに $(OCAMLDEP_MODULES) -modules を実行させて、 関連しているすべての .ml.mli ファイルを探しだし、その出力を内部で後処理します。OMakeと、 OCAMLDEP や生成されたファイルの相互間の動作に関して、より詳しく知りたい方は “13.6.5 OCamlファイルを生成” を参照してください。

  • OCAMLMKTOP

    OCamlトップループコンパイラ(デフォルトは ocamlmktop )

  • OCAMLLINK

    OCamlバイトコードリンカ(デフォルトは $(OCAMLC) )

  • OCAMLOPTLINK

    OCamlネイティブコードリンカ(デフォルトは $(OCAMLOPT) )

  • OCAMLINCLUDES

    OCamlコンパイラに受け渡す検索パス(デフォルトは . )。 -I 接頭辞を加えた検索パスについては、 PREFIXED_OCAMLINCLUDES 変数で定義されています。

  • OCAMLFIND

    ocamlfind ユーティリティ( USE_OCAMLFIND が設定されている場合は ocamlfind 。そうでない場合は空文字)

  • OCAMLFINDFLAGS

    ocamlfind に渡すフラグ(デフォルトは空文字で、 USE_OCAMLFIND が設定されていなければならない)

  • OCAMLPACKS

    ocamlfind に渡すパッケージ名( USE_OCAMLFIND が設定されていなければならない)

  • BYTE_ENABLED

    バイトコードコンパイラを使用するかどうかを示すフラグ( ocamlopt が見つからない場合は true 。そうでない場合は false )

  • NATIVE_ENABLED

    ネイティブコードコンパイラを使用するかどうかを示すフラグ( ocamlopt が見つかる場合は true 。そうでない場合は false )。 BYTE_ENABLEDNATIVE_ENABLED の両方はどちらとも真にすることができます。また、最低でも一つの変数は真であるべきです。

  • MENHIR_ENABLED

    ocamlyacc の代わりに menhir を使いたい場合は true に設定してください(デフォルトは false )。

13.6.3 OCamlコマンドフラグ

以下の変数はOCamlのツールに渡す 追加 オプションを示しています。

  • OCAMLDEPFLAGS

    OCAMLDEPOCAMLDEP_MODULES に渡すフラグ

  • OCAMLPPFLAGS

    CAMLP4 に渡すフラグ

  • OCAMLCFLAGS

    バイトコードコンパイラに渡すフラグ(デフォルトは -g )

  • OCAMLOPTFLAGS

    ネイティブコードコンパイラに渡すフラグ(デフォルトは空)

  • OCAMLFLAGS

    両方のコンパイラに渡すフラグ(デフォルトは -warn-error A )

  • OCAML_BYTE_LINK_FLAGS

    バイトコードリンカに渡すフラグ(デフォルトは空)

  • OCAML_NATIVE_LINK_FLAGS

    ネイティブコードリンカに渡すフラグ(デフォルトは空)

  • OCAML_LINK_FLAGS

    両方のリンカに渡すフラグ

  • MENHIR_FLAGS

    menhir に渡す追加フラグ

13.6.4 ライブラリ変数

以下の変数がリンクの際に用いられます。

  • OCAML_LIBS

    リンカに渡すライブラリ。これらのライブラリはリンク作業時に依存先となります。

  • OCAML_OTHER_LIBS

    リンカに渡す追加ライブラリ。これらのライブラリはリンク作業時に依存先には 含まれません 。一般的な使用方法としては、OCamlの unixstr のような標準ライブラリに用いられます。

  • OCAML_CLIBS

    リンカに渡すCライブラリ

  • OCAML_LIB_FLAGS

    ライブラリリンカに渡すその他のフラグ

  • ABORT_ON_DEPENDENCY_ERRORS

    OCamlのリンカは依存する順番でリストされたOCamlのファイルを必要としています。通常、このセクションにあるすべての関数は <files> 引数として渡したOCamlのモジュールリストを自動的にソートします。しかし、この変数が true に設定してある場合、これらの関数に受け渡されたファイルの順番はそのままになります。また、OMakeはこの順番が正しくなかったとしても、生じたエラーメッセージを無視します。

13.6.5 OCamlファイルを生成

OCaml バージョン 3.09.2に関しては、標準の ocamldep スキャナは『壊れています』。これに関しての主な問題は、既に存在している依存関係しか検索しないという点です。例えば、 foo.mlBar に依存しているものとしましょう。

foo.ml:
   open Bar

この場合、ファイル bar.ml あるいはインクルードパス上の bar.ml が存在しているときには、デフォルトの ocamldep はそのファイルの依存関係しか調べません。つまり、もし ocamldep を実行した時点では bar.mly しか存在しなかったとしたら、たとえ bar.mlbar.mlibar.mly から生成されたとしても、これらの依存関係は調べない(あるいは出力しない)のです。

現状のOMakeでは、この問題を解決するための2つの方法を提供しています。一つは生成されるファイルを手動で指定してあげることです。二つめは実験的な方法ですが、自動的に『隠れた』依存関係を調査することです。 OCAMLDEP_MODULES_ENABLED 変数はどちらの方法を使うのか、制御する変数です。この変数が偽であるときには、手動で指定するという方法が期待されます。また、真であるときには、自動的な調査を試みます。

13.6.5.1 OCamlGeneratedFiles, LocalOCamlGeneratedFiles

OCamlGeneratedFiles(files)
LocalOCamlGeneratedFiles(files)

OCAMLDEP_MODULES_ENABLED 変数が false に設定してある場合、 OCamlGeneratedFilesLocalOCamlGeneratedFiles 関数は任意のOCamlファイルが依存関係をスキャンする前に、生成される必要のあるファイルを指定します。例えば、 parser.mllexer.ml の両方が生成されるファイルであった場合、以下のように指定します。

OCamlGeneratedFiles(parser.ml lexer.ml)

OCamlGeneratedFiles 関数は グローバル です。この関数の引数は、プロジェクト上の任意の場所にある任意のOCamlファイルの依存関係をスキャンする前に生成されます。 LocalOCamlGeneratedFiles 関数はOMakeの通常のスコープルールに従います。

これらの関数は OCAMLDEP_MODULES_ENABLED 変数が真であるときにはなんの影響も与えません。

13.6.5.2 依存関係の解析中に生成されるファイルを自動的に調査

OMakeが自動的に調査してくれるときに、いちいち手動で生成されるファイルを指定してあげるのは明らかに最適とは言えません。まずこれについて話すために、ファイルの自由なモジュール名 のみ を探しだす ocamldep について話し、その後内部でその結果を後処理することを伝えました。

この自動的な機構は OCAMLDEP_MODULES_ENABLED 変数が true に設定されているときに許可されます。通常、 OCAMLDEP_MODULES_ENABLED 変数は $(OCAMLDEP_MODULES_AVAILABLE) に設定されています。

この処理に依存している ocamldep の機構はバージョン3.10のOCamlかそれ以降のみに含まれています。一時的に、私たちは ocamldep を似せて修正したバイトコードバージョンの ocamldep-omake を用意しました。この似せて作った ocamldep は自動的に依存関係を調査してくれます。詳細は OCAMLDEP_MODULES_AVAILABLEOCAMLDEP_MODULES 変数の項を参照し、さらにこれらの変数を正しく設定し、利用してください。

13.6.6 Menhirパーサジェネレータを使用

Menhirは ocamlyacc とほとんど互換性がとれており、かつ様々な改良がなされているパーサジェネレータです。機能の一部を以下にリストします(さらに知りたい方はMenhirのホームページ http://cristal.inria.fr/~fpottier/menhir/ を参照してください)。

  • Menhirの解釈(explanations)は、多くの人間が分かりやすくなるように改良されています。
  • Menhirは複数のファイルにわたって文法を記述できます。これはまた、トークンの集合を複数のgrammerが共有できることを意味しています。
  • MenhirはObjective Camlモジュールによって記述されたパーサを提供することができます。
  • jyhによって -infer オプションが追加されました。これによって、Menhirは生成時にあなたの文法における意味動作(semantic actions)をチェック(typecheck)することができます。

ノート

訳注: 見ての通り、訳が安定していません。すいませんがあまり信用しないでください

どのようにして ocamlyacc の代わりにMenhirを使用できるのでしょうか?

  1. あなたのプロジェクトの適切な位置(Menhirをどこでも使いたいのならプロジェクトトップの OMakefile )に、以下の定義を追加してください。

    MENHIR_ENABLED = true
    
  1. 必要ならば、Menhirに追加させたいオプションを MENHIR_FLAGS に追加してください。

    MENHIR_FLAGS += --infer
    

このセットアップによって、任意の .mly 拡張子のファイルはMenhirでコンパイルされます。

もしあなたの文法(grammar)がいくつかのファイルにわたって分割されているのなら、あなたは MenhirMulti 関数を用いて、そのことを明示的に指定してあげる必要があります。

MenhirMulti(target, sources)
    target : 拡張子を除いたファイル名
    sources : 拡張子を除いた、文法を定義しているファイル群

例えば、文法を指定しているファイル a.mlyb.mly からパーサファイル parse.mlparse.mli を生成したい場合は、以下のように記述します。

MenhirMulti(parse, a b)

13.6.6.1 OCamlLibrary

OCamlLibrary 関数はOCamlライブラリをビルドします。

OCamlLibrary(<libname>, <files>)

<libname><files> は拡張子を 付けないで 指定してください。

この関数はルールを定義しているすべてのターゲットのリスト( NATIVE_ENABLED が設定されているときは $(name)$(EXT_LIB) を含む)を返します。

以下のコードは( NATIVE_ENABLED が設定されている場合は) foo.cmxbar.cmx から libfoo.cmxa ライブラリをビルドし、( BYTE_ENABLED が設定されている場合は) foo.cmobar.cmo から libfoo.cma をビルドします。

OCamlLibrary(libfoo, foo bar)

13.6.6.2 OCamlPackage

OCamlPackage 関数はOCamlパッケージをビルドします。

OCamlPackage(<name>, <files>)

<name><files> は拡張子を 付けないで 指定してください。 <files> はOCamlコンパイラに -for-pack <ident> フラグを加えた状態でコンパイルされます。

この関数はルールを定義しているすべてのターゲットのリスト( NATIVE_ENABLED が設定されているときは $(name)$(EXT_LIB) を含む)を返します。

以下のコードは( NATIVE_ENABLED が設定されている場合は) foo.cmxbar.cmx から package.cmx パッケージをビルドし、( BYTE_ENABLED が設定されている場合は) foo.cmobar.cmo から package.cmo をビルドします。

OCamlPackage(package, foo bar)

13.6.6.3 OCamlLibraryCopy

OCamlLibraryCopy 関数はライブラリをインストール先にコピーします。

OCamlLibraryCopy(<tag>, <libdir>, <libname>, <interface-files>)

<interface-files> では INSTALL_INTERFACES 変数が真である場合にコピーする、追加のインターフェイスファイルを指定します。

13.6.6.4 OCamlLibraryInstall

OCamlLibraryInstall 関数はライブラリをビルドし、加えてインストール先にコピーします。

OCamlLibraryInstall(<tag>, <libdir>, <libname>, <files>)

13.6.6.5 OCamlProgram

OCamlProgram 関数はOCamlプログラムをビルドします。この関数はルールを定義している、すべてのターゲットの配列を返します( $(name)$(EXE) , $(name).run $(name).optNATIVE_ENABLEDBYTE_ENABLED 変数の値に依存しています)。

OCamlProgram(<name>, <files>)

以下の変数が利用されます。

  • OCAML_LIBS

    リンカに渡す追加ライブラリ(拡張子を除く)。これらのファイルは対象のプログラムの依存先となります。

  • OCAML_OTHER_LIBS

    リンカに渡す追加ライブラリ(拡張子を除く)。これらのファイルは対象のプログラムの依存先に なりません

  • OCAML_CLIBS

    リンカに渡すCライブラリ

  • OCAML_BYTE_LINK_FLAGS

    バイトコードリンカに渡すフラグ

  • OCAML_NATIVE_LINK_FLAGS

    ネイティブコードリンカに渡すフラグ

  • OCAML_LINK_FLAGS

    両方のリンカに渡すフラグ

13.6.6.6 OCamlProgramCopy

OCamlProgramInstall 関数はOCamlプログラムをインストール先にコピーします。

OCamlProgramCopy(<tag>, <bindir>, <name>)

以下の変数が利用されます。

  • NATIVE_ENABLED

    NATIVE_ENABLED 変数が設定されている場合、ネイティブコードの実行形式がコピーされます。そうでない場合はバイトコードの実行形式がコピーされます。

13.6.6.7 OCamlProgramInstall

OCamlProgramInstall 関数はプログラムをビルドし、加えてインストール先にコピーします。

OCamlProgramInstall(<tag>, <bindir>, <name>, <files>)

13.7 LaTeXファイルのビルド

OMakeではLaTeXドキュメントのビルドをサポートします。このサポートには自動的にBiBTexを実行させ、PostScriptやPDFファイルを生成するためのサポートも含まれます。このセクションで列挙している関数を使うためには、まずあなたの OMakeroot ファイルに、以下の一行を追加してください。

open build/LaTeX

13.7.1 設定用の変数

以下の変数があなたのプロジェクト上で編集できます。

  • LATEX

    LaTeXコマンド(デフォルトは latex )

  • TETEX2_ENABLED

    TeTeX v.2にある、発展的なLaTeXオプションを利用するかどうかを示すフラグです(デフォルトの値は最初にomakeが LaTeX.src を読み込むことで決定されて、さらにインストールしてあるLaTeXのバージョンに依存します)。

  • LATEXFLAGS

    LaTexのフラグ(デフォルトの値は TETEX2_ENABLED 変数に依存する)

  • BIBTEX

    BibTeXコマンド(デフォルトは bibtex )

  • MAKEINDEX

    索引をビルドするコマンド(デフォルトは makeindex )

  • DVIPS

    .dvi からPostScriptに変換するコンバータ(デフォルトは dvips )

  • DVIPSFLAGS

    dvips に渡すフラグ(デフォルトは -t letter )

  • DVIPDFM

    .dvi から .pdf に変換するコンバータ(デフォルトは dvipdfm )

  • DVIPDFMFLAGS

    dvipdfm に渡すフラグ(デフォルトは -p letter )

  • PDFLATEX

    .latex から .pdf に変換するコンバータ(デフォルトは pdflatex )

  • PDFLATEXFLAGS

    pdflatex に渡すフラグ(デフォルトは $`(LATEXFLAGS) )

  • USEPDFLATEX

    .pdf ドキュメントを生成するのにdvipdfmではなくpdflatexを使うかどうかを示すフラグ(デフォルトは false )

13.7.2 LaTeXドキュメントのビルド

13.7.2.1 LaTeXDocument

LaTeXDocument 関数はLaTeXドキュメントを生成します。

LaTeXDocument(<name>, <texfiles>)

<name><texfiles> には拡張子を 付けないで 指定してください。この関数は生成された .ps.pdf ファイルのファイル名を返します。

以下の変数が利用されます。

  • TEXINPUTS

    LaTeXの検索パス(ディレクトリの配列で、デフォルトは TEXINPUTS 環境変数から取得される)

  • TEXDEPS

    このドキュメントに依存している追加ファイル

  • TEXVARS

    OMakeの TEXINPUTS 変数の値に基づいてアップデートすることになっている、環境変数の名前の配列。デフォルトは TEXINPUTS BIBINPUTS BSTINPUTS

13.7.2.2 TeXGeneratedFiles, LocalTeXGeneratedFiles

TeXGeneratedFiles(files)
LocalTeXGeneratedFiles(files)

TeXGeneratedFilesLocalTeXGeneratedFiles 関数は任意のLaTeXファイルの依存関係をスキャンする前に生成される必要のあるファイルを指定します。例えば、 config.texinputs.tex が両方とも生成されるファイルであった場合、以下のように指定します。

TeXGeneratedFiles(config.tex inputs.tex)

TeXGeneratedFiles 関数は グローバル です。この関数で指定したファイルは、任意の場所にある任意のTeXファイルの依存関係をスキャンする前に生成されます。 LocalTeXGeneratedFiles 関数はOMakeの通常のスコープルールに従います。

13.7.2.3 LaTeXDocumentCopy

LaTeXDocumentCopy 関数はインストール先にドキュメントをコピーします。

LaTeXDocumentCopy(<tag>, <libdir>, <installname>, <docname>)

この関数は .pdf.ps ファイルだけコピーします。

13.7.2.4 LaTeXDocumentInstall

LaTeXDocumentInstall 関数はドキュメントをビルドし、加えてインストール先にドキュメントをコピーします。

LaTeXDocumentInstall(<tag>, <libdir>, <installname>, <docname>, <files>)

目次

前のトピックへ

12. 標準的なオブジェクト群

次のトピックへ

14. 自動設定用の変数と関数

このページ

SourceForge.JP

SourceForge.JP

このドキュメントはsourceforge.jpのサーバを利用して提供しています。