makeを使いこなすMakefile最近社内でビルドの手順がちょいちょいMakefileで書かれているため、意外と知らなそうなmake及びMakefileの基本的な使い方をまとめてみました。https://www.oreilly.co.jp/books/4873112699/。makeの本来の用途は、ソースコードのビルド手順を自動化することで、Makefileはその手順を記載したファイルになります。C言語をターゲットにしています。基本的な内容はターゲットと依存、そしてビルド手順の3つを記載したルールで構成されています。hellomakeコマンドに引数としてターゲット名を指定することで、Makefile内のそのターゲットの手順を実行します。ソースコードビルドなどの場合は、ターゲットは生成物の名前になると自然ですね。targetが更新されていない場合はその手順をスキップしてくれます。Targets本来の使い方はビルドツールなのですが、最近はタスクランナーとしての使われ方が多いかもしれません。先程、ターゲットが生成物になるのが自然と言いましたが、ターゲットに生成物を伴わない書き方もできます。Targetsと言います。lexer.cここでの注意点としては、"ファイルが存在してしまったら、差分なしと解釈されて実行されない”ということ。.PHONYというターゲットを使います。cleanあえて.PHONYを使わないちょっとしたテクニックもあります。実行コマンドであえてファイルを作成しておくことで、ファイルが更新されてない時は再度実行されないようにできます。次の例はファイルが更新されてない時はサイズを測りなおさない例になります。size変数Makefile中に変数も記載できます。以下2通りの書き方どちらも有効です。$(variable-name)${variable-name}変数への代入は少し気をつける必要があります。後ろのスペースは除去されません。コメントつけるときとかやりがちなエラーです。'$(LIBRARY)'変数への代入方法はいくつかあります。比較的よく使うのは+=。これは変数に追記する記法になります。ちなみにプログラムではよくありがちな次の記法は間違いです。再起的に展開しようとするので、ループになってしまいます。そのため追記は+=を使わないと実現できません。Stop.変数の定義箇所も複数あり、それを適切に使い分けると様々な環境の違いに適応できるように書けます。ファイル内で定義すでに出てるやつなので省略。コマンドラインコマンドラインからも変数を上書きできます。個人ごとの開発環境の違いなどはこれで対応するのがよいです。値も全てmakeで使えます。定義してある環境変数を見て環境をチェックして条件分岐をするというのがよくある流れです。makeの定義変数makeに定義ずみの変数もあります。変数で定義されてます。この辺を使いこなせるとちょっとカッコいい。マクロ・コマンドマクロも使うことができます。関数ではなくマクロです。多用するとスパゲッティーコード化するので、なるべく最小範囲で使うことを推奨します。前に出てきた環境変数をチェックして環境ごとに切り替える使い方でよく使います。:=endif関数も使えます。個人的にはあまり関数は使わず、シェルスクリプトに記載した方が良いと思う。$(TMP_JAR_DIR)endefシェルコマンドを使うときに、その挙動を調整することもできます。makeコマンドではコマンド実行前にコマンドを表示しますが、コマンドの前に@をつけるとコマンド実行を表示しなくなります。echoと合わせてよく用います。コマンドでエラーが発生しても無視する。実行が成功しても失敗しても事後クリーンナップが必要な時などに、失敗処理で終了しないようにするためなどに使います。プロジェクトでのMakefile管理ソースコードが大きくなってきた場合、Makefileをディレクトリごとに適切に切り分けて管理すると見通しやすくなります。その際に最適なmake実行を各ディレクトリに移動しながら再起的に実行していくことになります。その際はmakeは--directory=でディレクトリを指定して実行すると使いやすいです。cdして実行するコマンドを書くより、こっちを使った方がキレイにかけるかと。hellohelloまとめざっくりMakefileの使い方を見てみました。targetを使ったタスクランナーとしてのMakefileの使い方を見てきました。Makefileだと言語や環境への依存が少なく動かせるため、マイクロサービスなどで複数の言語を使ったシステムを連携させて開発するときとかに便利ですね。upLoginユーザーは見つかりませんでした。