omakeメモ

OMakefileの中身考察

Singletonのサンプルで使ってるOMakefileについてテキトーなメモ書いとく。(あくまで主観で裏付けあまりしてませんので注意)
中身はこんな感じ。

CXX = g++

CFILES[] =
   main

MAIN = singleton_test

CXXProgram($(MAIN), $(CFILES))

.PHONY: build
build: $(MAIN)

.PHONY: test
test: $(MAIN)
	$(shell pwd)/$(MAIN)

.PHONY: all
all: build test

.PHONY: clean
clean:
	rm -rf $(filter-proper-targets $(ls R, .))

.DEFAULT: build

変数の宣言とアクセスはこんな感じ。

# 宣言
FILE = test.cpp
# アクセス
$(FILE)

リストになってるものは配列チックに宣言する。

# 宣言
FILES[] =
    test1.cpp
    test2.cpp
# アクセス
$(FILES)

実行ファイルのビルドルールは提供されてる関数で一発。(ファイルの順番とかは気にしなくていいのかな)
CXXProgramはC++用、CならCProgramだった気がする。

# コンパイラの指定
CXX = g++
# $(FILES)から$(MAIN)を作成するためのビルドルール作成
CXXProgram($(MAIN), $(CFILES))

Makefileちっくなビルドルールは先に".PHONY"でルール名を宣言してから書くみたい。

# omake buildで実行する
.PHONY: build
build: $(MAIN)

シェルコマンドの出力を取得したいときは"$(shell command)"を使う。(shell関数にcommandを引数で渡してるイメージ?)

# `pwd`の出力を利用してる
	$(shell pwd)/$(MAIN)

ビルドで生成されるファイルの一覧を取得するには"$(filter-proper-targets $(ls R, .))"を使う。
やっていることは、

  1. "$(ls R, .)"でカレントディレクトリ直下のファイルのリストを取得、要するに"ls(R, .)"の出力結果らしい。サブディレクト見ないなら"$(ls .)"でおk。
  2. filter-proper-targetsは引数のリストからビルドターゲットをフィルタリングする関数らしい。

cleanはとりあえず以下のように書いてみる。

.PHONY: clean
clean:
	rm -rf $(filter-proper-targets $(ls R, .))

引数なしでomake実行したときの動作は".DEFAULT"に指定。

# デフォルトのルールは"build"、つまり"omake build"
.DEFAULT: build

ちなみにファイルは頭から順番に読んでるのでビルドルールは使う箇所よりも前に書かないといけない? ".PHONY"だけ先に書けばおk? 要調査。