このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

make

DoxyfileとMakefileの連携

最初のうちは、Doxyfileの入力は FILE_PATTERNSにワイルドカードを書いていたが、だんだん苦しくなって、INPUTに列挙するようになった。INPUTへの列挙と、FILE_PATTERNSのパターンは併用できないようだ。INPUTを使うとなったら、すべて直書き。まー、しょう…

ルールの依存項目に注意

次のようなパターンルールを書いていた。 %.o : %.cpp %.h stdafx.h.gch @echo Making object file $(CXX) $(CXXFlags) -c $< これは、*.cppと*.hが揃ってないと発火しない。*.hがない*.cppだと、デフォルトルールが適用される。そうすると、コンパイラの名…

要確認

%.exe : %.cpp g++ -o $@ $< %.exe : %.c gcc -o $@ $

makeの論理

makeはしょうもない所があるソフトウェアだが、使わざるを得ない。makeのルール(のヘッダ行部分)をシーケントと解釈できそうな気はする。T1 ... Tm : P1 ... Pn が、P1 ... Pn ⇒ T1 ... Tm。命題変数=基本命題は、構文的には名前となる。その名前を論理式…

説明の方法

正月からせっかく調べた事なので本編に説明を書きたいが、どうすべきか? 従来の説明では本質が伝わらない気がする。 かといって、あまり新しい概念や用語を導入するのもどうか。 僕が個人的に非常に不満に思っている所も、実用上は問題ではないのかもしれな…

結局のところ

makeはリソースが生成されるかどうかに一切関与しない。それはレシピが勝手にやること。 なので当然に、makeはリソースが生成されたことをまったく確認なんてしない。関係ネー! ターゲットがリソースである必要はない。 とはいえ、ターゲットが実在リソース…

必要な言葉がないなら、誰も説明できない

makeに関してしみじみ感じたのは、やはり適切な概念と用語法が欠如していることだ。そのために、正確な事を誰も記述できない状況になっている。 makeが作る(であろう)グラフを依存関係グラフと呼んでいいかあやしい。むしろ実行計画グラフだろう。 ターゲ…

もし改善できるなら(架空)

現実的には何の望みもないが、思考実験として: 組み込みルールを廃止する。 モジュール/ライブラリ機能を入れる。 include のようにして、標準ルールは取り込める。 内部に持っているルールベースをダンプできるようにする。JSON型式とDOT型式。 リソース…

しょうもない実力者の正体:アルゴリズム

公式マニュアルを見てもどこを探してもmakeが使っているアルゴリズムの記述が見つからない。誰もマトモに解説しようとしない。実験と予測の結果をメモしておく。結局、実行すべきレシピ列(並列実行ならレシピツリー)を、与えられたゴールとルールセットと“…

レッドヘリングと混乱

うーん、混乱してきた。次の方法が.PHONYの代わりになる、という情報があり、信頼できそうなので信じていた。 do: FORCE echo Hello FORCE: 嘘だったらしい。doとFORCEを実在させればdoは動かない。FORCEなんて意味ねーじゃん。しかし、空レシピのセミコロン…

諸悪の根源は擬似ターゲット その3:名前空間の問題

擬似ターゲットの問題のさらにその奥には、名前空間と名前の取り扱いの問題がある。makeはリソース名空間とタスク名空間を区別できない。そこで: .PHONYはタスク名空間に名前を登録する。 タスク名は、それが存在すれば(.PHONY登録済みなら)リソース名よ…

makeはいつエラーするのか

実行時のエラーは実質的に1つしかない。 no rule ... :ゴールにマッチするルールがルールベースにない。 これが出るのは、 .PHONYでもなく、ターゲットでもない名前がゴール(現在注目しているターゲット)の前提に出現して、その名前に対応するリソースが…

諸悪の根源は擬似ターゲット その2

アルゴリズムの正確な記述が探してもないので実験による予測: ターゲットに結びついたレシピが当該ターゲット名リソースを生成するとは仮定しない。これを仮定すると技法的擬似ターゲット(みなしタスク)が使えない。 すべての名前が技法的擬似ターゲット…

諸悪の根源は擬似ターゲット その1

[追記]このエントリーに書いてあることは事実だが、「レッドヘリング」参照。[/追記]擬似ターゲットは運用手法/技法であってメカニズムではない。.PHONYがない時代から使われていて、その頃のMakefileとの互換性を考慮している、と思われる。その結果があの…

ルールの分類

ターゲットの数 前提の数 説明 0 0 エラーとはならず無視される 0 n ≧ 1 エラーとはならず無視される 1 0 前提のないターゲット 1 n ≧ 1 標準的なルール m ≧ 2 n ≧ 1 レシピも含めてコピーして分割される マルチターゲットのルールの分割のとき、レシピはコ…

ロクでもないハマリどころ

複数のルールからのレシピが競合すると負けたレシピは消滅する。警告はある。 暗黙の組み込みルールが予期せぬ所で使われる。極めて発見しにくい。-r で対処。[追記].outは組み込みの暗黙ルールにある。ハマった。[/追記] 組み込みルールの利用/非利用を細…

さらにロクでもない仕様が判明

DontCareフラグとしての空レシピは擬似ターゲット(ほんとのPHONYターゲット)では別な挙動を示す。 リソースターゲット(PHONYではないターゲット)では、空レシピはDontCareフラグとして働く。 擬似ターゲット(ほんとのPHONYターゲット)では、空レシピは…

ロクでもない仕様とロクでもないメッセージ:レシピがないとき

[追記]記述が混乱しているから取り消ししておく。[/追記]Makeにとってゴールと認識できない項目(ノード)が初期ゴールまたは前提項目(導出されたゴール)として出現すると: make: *** No rule to make target `XXXXX'. Stop. となる。これはいい。ゴール…

ロクでもない用語法

あまりの酷さに、ほんとにムカムカしてきた。 公式マニュアルでは、ゴールとターゲットが区別されているが、通常は区別されない。ターゲットは構文上の概念。ゴールは実行時の動的概念。違う!! ルール内での役割としてのターゲット(左辺)と、依存関係グ…

ロクでもない変数と代入

単純変数と再帰変数(事実上は関数、あるいはon-demand遅延評価変数)の区別を設けたのはいいが、 X ?= $(warning X defined)foo Y ?= $(warning Y defined)$(X) Z := $(warning Z defined)$(Y) 「?=」は再帰変数になる。「?=」が欲しいのはむしろ単純変数だ…

ほんとにロクでもない

構文に一貫性がない。ツギハギ。 視認しにくいタブを最も重要な記号に使っている。 特別扱いや例外事項が多い。 要するに、短い説明ができなくて、記憶する事が多くなり、勘違いを誘発しやすい。逆は当然に、 一貫性があり統合された単一構文 読み書きが容易…

makeのデバッグテクニック

info, warning関数の利用 -n, -p, --debugオプション 表示が多すぎるときは -r, -Rオプション @をマクロ定義にしてコマンドラインから有効無効を切り替える。 変数をorigin関数で調べる。 'SHELL=/bin/sh -x' を起動時に付ける。

よく使う組み込み変数/関数

カレントディレクトリの参照 $(CURDIR) ワイルドカードの展開 $(wildcard ワイルドカード) 文字列置換 $(subst 置換前,置換後,対象テキスト) パターン置換 $(patsubst パターン,置換後,対象キスト) ワードリストの採取フィルタリング $(filter パターン(複…

makeに関連する本編記事

bashの間接参照変数 - 檜山正幸のキマイラ飼育記 gulp問題ひきずり:ウォッチがまたおバカ過ぎる - 檜山正幸のキマイラ飼育記 最近のビルドツールって何なの? - 檜山正幸のキマイラ飼育記 GNU Makeと空白を含むファイル名 - 檜山正幸のキマイラ飼育記 Makef…

Makeの自動変数

微妙に違う (make) - 檜山正幸のキマイラ飼育記 メモ編 にもメモがあるが、ダラー+1文字の組み込み変数が自動変数だが、ほんとに覚えられない! https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html よく使うのは、 $@ ターゲ…

微妙に違う (make)

GNU Make自動変数: $* : 一致する暗黙のルールの語幹(どんな型が一致するかの項を参照)。 $@ : ターゲットのファイル名。 $^ 、$+ : 全依存関係の名前を空白で挟んで並べたもの。アーカイブメンバである依存関係についてはメンバー名だけが利用されます(ア…

Makefileで使うかどうか?

mkdir -p は便利、という意見と、使うな、という意見がある。 -p, --parents 引き数に指定した各々の directory で、存在しない親ディレクトリも含めて作成する。作成された親ディレクトリのアクセス権は、 umask の値に `u+wx' としたものが設定される。す…

Makeターゲット

標準的なのは、次くらいで十分だろう。 all -- 必要なもの一式を全部作る。デフォルトターゲット。 clean -- ほぼallの反対。生成に時間がかかるファイルや、ほとんど変更しないファイルは消さなくてもよい。 distclean -- 配布に含まれていなかった全てのフ…