ご存知の通り make は Makefile というファイルにルールを記述していき、その内容に従って処理を実行していきます。
コマンド行は各行ごとにサブシェルか起動されて実行されます。 たとえ、cd コマンドでカレントディレクトリを変更したとしても、次のコマンド行にはそのカレントディレクトリを引き継ぐことができません。この問題に対処するには、&& 演算子でコマンドを繋いでひとつのコマンド行にまとめてやる必要があります。
makeは汎用的なツールであり、対象となるプログラミング言語を限定しない。もちろん、これはGNU Makeも同様だ。
make/makefileは,大きいプログラムのどの断片が再コンパイルされる必要があるかという事と,それらを再コンパイルする発行コマンドを自動的に決定するユーティリティ/設定ファイルです.
そこで、Makefileの勉強を兼ねて、これを自動化する設定を考えてみた。
C言語でちょっとしたサンプルを作りたいときに、たまにMakefileを書こうとすると大体忘れているので、ここにメモとして貼り付けておく。
まず,Makefileの基本構造を以下に示します. [作りたいもの] の後にコロン(:)を書き, その後に必要な[材料]を並べます. 次の行には,先頭にTABを入れた後, [作り方]を書きます.
.PHONYを使うと、同名のファイルが存在していても、大丈夫なよう。
詳細なmakeターゲットを追加するほど、それらの処理内容をテキスト形式で大量に記載しなければなりません。私たちのプロジェクトでは通常、このような文書をREADMEファイルに書いています。
ターゲットの中では$(変数名)の形式で変数を参照できます。
- $(shell)ではMakefile内でexportで設定した変数が渡らない。 - ` `はコマンドそのものがマクロとして代入され参照される度にそのコマンドが実行されてしまう。
そこで今回は、Makefileを使って日付を取得し、それを作成するファイルのファイル名に適用するTipsをまとめます。
Makefile でよく使う、特別な意味を持つ変数(自動変数)の備忘録です。
特別な意図がないときは := を使って単純展開変数にしておく のがよいでしょう。逆に再帰展開変数を使いたいのは、「Makefile のその行を読んでいるときにはまだ決まらない値を与えたいとき」です。
Makefileは各行を個別のシェルプロセスで動作させます。shellを-cつけて各行を実行してるのと同じなんだってさ。1プロセスでやりたいなら、&&とかで繋ぐことだね! 「$を2つ重ねるとシェルで定義されている変数(シェル変数もしくは環境変数)、1つだとmake変数」
変数定義の先頭にexportを付与することで、Makefile中の変数を環境変数としてサブプロセスに引き渡すことができる。
実行を表す@に-をつけることで無視できるようです!
このため1つの Makefile 内の1つのブロック内で Windows と Linux に両対応するための分岐を仕込みたくなります。これは次でできます。
Windowsのコマンドを使う場合は、cmd.exe /Cを接頭語のように付ける。
Windows 標準では当然 rm コマンドなどないので「RM = delとしておけばいいだろ」と思うのだが、それでは動かない。なぜならば! del コマンドはコマンドプロント(cmd.exe)の内部実装コマンドだからです。
Git for Windows のインストールパス (C:\Program Files\Git\bin) にある sh.exe が参照されます。 Git for Windows は MinGW / MSYS2 の *nix ライクな環境 (コマンド群・デバイス等) を提供しますが、 Make が cmd.exe または PowerShell から起動されているときは、 Make のシェルに sh が選ばれていてもコマンド群・デバイスにアクセスできず中途半端な状態となります。
前にも似たようなエントリで書いてるけど、Macを付け足しておかないと。
winget install GnuWin32.Make
手間を惜しまず、おとなしくMake for Windowsを入れましょう。
This article will go through the method to install and run Makefile on Windows.
WindowsからWSLのmakeを使うための方法と設定
In short, if you are invoking awk from the shell, use single $. In the Makefile, use $$ and awk will only see $.
@grep -w Reference myLatexFile.log || true cmd1 || cmd2 は,まず cmd1 を実行し,cmd1 が失敗コードを返したときに cmd2 を実行します.そして true は常に成功するコマンドです.これにより,文書中の相互参照が健全な状態になっているときでも make tgt が失敗しなくなりました.
command の実行でエラー(終了ステータスが 0 以外)が発生した場合、make はそれ以降の command を実行しないで終了します。 command の実行でエラーが発生しても処理を継続するには、command の前に - を付けます
@if not exist "$(@D)" (mkdir "$(@D)")
md /c "mkdir $@"