#author("2025-01-12T22:59:27+00:00","default:hotate","hotate") #author("2025-01-12T22:59:47+00:00","default:hotate","hotate") #contents &tag(コマンド,シェル); * 情報 [#s1ec0643] ** 概要 [#u36ddbd4] - [[いまさら人に聞けないmake入門 - UUUMエンジニアブログ>https://system.blog.uuum.jp/entry/make]] ご存知の通り make は Makefile というファイルにルールを記述していき、その内容に従って処理を実行していきます。 - [[make を使いこなすためのメモ | まくまくいろいろノート>https://maku77.github.io/memo/tool/make.html]] コマンド行は各行ごとにサブシェルか起動されて実行されます。 たとえ、cd コマンドでカレントディレクトリを変更したとしても、次のコマンド行にはそのカレントディレクトリを引き継ぐことができません。この問題に対処するには、&& 演算子でコマンドを繋いでひとつのコマンド行にまとめてやる必要があります。 - [[にわか管理者のためのLinux運用入門(319) GNU Makeでいく | TECH+>https://news.mynavi.jp/techplus/article/linux-319/]] (2022/02/15) makeは汎用的なツールであり、対象となるプログラミング言語を限定しない。もちろん、これはGNU Makeも同様だ。 - [[トリビアなmakefile入門>http://www.jsk.t.u-tokyo.ac.jp/~k-okada/makefile/]] make/makefileは,大きいプログラムのどの断片が再コンパイルされる必要があるかという事と,それらを再コンパイルする発行コマンドを自動的に決定するユーティリティ/設定ファイルです. - [[Makefileでワイルドカードを使う方法 - nao-bambooの日記>https://nao-bamboo.hatenablog.com/entry/2015/09/11/175832]] そこで、Makefileの勉強を兼ねて、これを自動化する設定を考えてみた。 - [[C言語でちょっとしたサンプルつくるときのMakefile - いろいろ備忘録日記>https://devlights.hatenablog.com/entry/2024/04/10/073000]] C言語でちょっとしたサンプルを作りたいときに、たまにMakefileを書こうとすると大体忘れているので、ここにメモとして貼り付けておく。 ** 記法 [#nf25f8a3] - [[Makefileの解説>http://omilab.naist.jp/~mukaigawa/misc/Makefile.html]] まず,Makefileの基本構造を以下に示します. [作りたいもの] の後にコロン(:)を書き, その後に必要な[材料]を並べます. 次の行には,先頭にTABを入れた後, [作り方]を書きます. - [[Makefileのお勉強メモですよ。「.PHONY」「環境変数」「C99の規格を強制する方法」>https://qiita.com/yukikimoto/items/1dd4abc306073aa9db0a]] .PHONYを使うと、同名のファイルが存在していても、大丈夫なよう。 - [[Makefileを自己文書化する | POSTD>https://postd.cc/auto-documented-makefile/]] 詳細なmakeターゲットを追加するほど、それらの処理内容をテキスト形式で大量に記載しなければなりません。私たちのプロジェクトでは通常、このような文書をREADMEファイルに書いています。 ** 外部コマンド [#p08160aa] - [[[Makefile] コマンドの実行結果を変数に格納する | akamist blog>https://akamist.com/blog/archives/4710]] ターゲットの中では$(変数名)の形式で変数を参照できます。 - [[Makefileで外部プログラムの実行結果を変数に取り込む - Qiita>https://qiita.com/vega77/items/5206c397258b5b372fc4]] - $(shell)ではMakefile内でexportで設定した変数が渡らない。 - ` `はコマンドそのものがマクロとして代入され参照される度にそのコマンドが実行されてしまう。 - [[Makefileで日付を取得して、日付付きファイルの作成を自動化する|かえるのほんだな>https://yukituna.com/2821/]] そこで今回は、Makefileを使って日付を取得し、それを作成するファイルのファイル名に適用するTipsをまとめます。 ** 変数 [#a5fa11c3] - [[Makefile の特殊変数・自動変数の一覧 | 晴耕雨読>https://tex2e.github.io/blog/makefile/automatic-variables]] Makefile でよく使う、特別な意味を持つ変数(自動変数)の備忘録です。 - [[GNU Make のふたつの変数の使い分け - Qiita>https://qiita.com/kojiohta/items/54b1a9f7d482c35dc4fa]] 特別な意図がないときは := を使って単純展開変数にしておく のがよいでしょう。逆に再帰展開変数を使いたいのは、「Makefile のその行を読んでいるときにはまだ決まらない値を与えたいとき」です。 ** [[環境変数]] [#b11986de] - [[ちょっとMakefileくん! .envに書いた環境変数読んで!!!!!なんで読んでくれないの!?>https://zenn.dev/canalun/articles/7d31ba0fb12be2]] Makefileは各行を個別のシェルプロセスで動作させます。shellを-cつけて各行を実行してるのと同じなんだってさ。1プロセスでやりたいなら、&&とかで繋ぐことだね! 「$を2つ重ねるとシェルで定義されている変数(シェル変数もしくは環境変数)、1つだとmake変数」 - [[Makefileで、実行するコマンドに環境変数を渡す方法 - Jaybanuan's Blog>https://redj.hatenablog.com/entry/2021/08/09/230719]] 変数定義の先頭にexportを付与することで、Makefile中の変数を環境変数としてサブプロセスに引き渡すことができる。 ** エラー [#h613bf0f] - [[【make】Errorが出ても無視する`-@`のメモ - tweeeetyのぶろぐ的めも>https://www.tweeeety.blog/entry/2019/05/05/003804]] 実行を表す@に-をつけることで無視できるようです! ** 動作環境 [#j317610b] - [[【make】Makefile内の記述をWindowsとLinux両対応にする – 株式会社シーポイントラボ | 浜松のシステム・RTK-GNSS開発>https://cpoint-lab.co.jp/article/202209/23343/]] このため1つの Makefile 内の1つのブロック内で Windows と Linux に両対応するための分岐を仕込みたくなります。これは次でできます。 - [[WindowsでもLinuxでも動くMakefileを書く>https://shidetake.com/make_win/]] Windowsのコマンドを使う場合は、cmd.exe /Cを接頭語のように付ける。 - [[WindowsでもUNIXでも動くMakefileのポイント - Qiita>https://qiita.com/bottomzlife/items/bf36b4d057bd22e54a46]] Windows 標準では当然 rm コマンドなどないので「RM = delとしておけばいいだろ」と思うのだが、それでは動かない。なぜならば! del コマンドはコマンドプロント(cmd.exe)の内部実装コマンドだからです。 - [[マルチプラットフォーム向けのMakefileは闇>https://zenn.dev/shellyln/articles/eeee477eb74bdae8bc2f]] Git for Windows のインストールパス (C:\Program Files\Git\bin) にある sh.exe が参照されます。 Git for Windows は MinGW / MSYS2 の *nix ライクな環境 (コマンド群・デバイス等) を提供しますが、 Make が cmd.exe または PowerShell から起動されているときは、 Make のシェルに sh が選ばれていてもコマンド群・デバイスにアクセスできず中途半端な状態となります。 - [[うしろむきでんぐりがえし: Makefile内で Windows と Mac と Linux 環境で分岐する>http://weblog.nekonya.com/2010/11/makefile-windows-mac-linux.html]] 前にも似たようなエントリで書いてるけど、Macを付け足しておかないと。 ** [[シェルスクリプト]] [#de1d2366] - [[シェルスクリプトとMakefileの使い分け - 2012-10-24 - ククログ>https://www.clear-code.com/blog/2012/10/24/which-is-better-to-use-shell-script-or-makefile.html]] シェルスクリプトはシェルで実行するコマンドを列挙したものです。対するMakefileは、ターゲットごとにビルド手順のコマンドを列挙したものです。シェルのコマンドを列挙するものであるという点で両者はよく似ていますが、いくつか違うところもあります。 * インストール [#i3343ebc] ** [[Windows]] [#v1378e42] - [[Windows 10で始めるC言語開発(12) Windows 10でC言語開発をしよう! makeを使う | TECH+(テックプラス)>https://news.mynavi.jp/techplus/article/c-for-windows-12/]] winget install GnuWin32.Make - [[Windows10環境でmakeコマンドを使用する方法【ハマリ回避】 - Qiita>https://qiita.com/BARANCE_TW/items/c7ffdb311df84d47bddd]] 手間を惜しまず、おとなしくMake for Windowsを入れましょう。 - [[How to Run a Makefile in Windows>https://linuxhint.com/run-makefile-windows/]] This article will go through the method to install and run Makefile on Windows. ** [[WSL]] [#s0c485df] - [[にわか管理者のためのLinux運用入門(348) GNU Makeでいく - ビジネスフローをMakefileにまとめる+WSL | TECH+(テックプラス)>https://news.mynavi.jp/techplus/article/linux-348/]] ([[2022]]/09/06) WindowsからWSLのmakeを使うための方法と設定 * [[トラブル]] [#vefb4573] ** [[awk]] [#d9025b18] - [[bash - Why does AWK not work correctly in a makefile? - Stack Overflow>https://stackoverflow.com/questions/30445218/why-does-awk-not-work-correctly-in-a-makefile]] In short, if you are invoking awk from the shell, use single $. In the Makefile, use $$ and awk will only see $. -- コメント:上記の方法でうまく動作した。(2022/08/27) ** [[textlint]] [#rcc88df8] - [[Makefileのコマンドが失敗しても無視したい | 萌えとかプログラミングとか>https://differentialengine.wordpress.com/2020/09/10/makefile%E3%81%AE%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%8C%E5%A4%B1%E6%95%97%E3%81%97%E3%81%A6%E3%82%82%E7%84%A1%E8%A6%96%E3%81%97%E3%81%9F%E3%81%84/]] @grep -w Reference myLatexFile.log || true cmd1 || cmd2 は,まず cmd1 を実行し,cmd1 が失敗コードを返したときに cmd2 を実行します.そして true は常に成功するコマンドです.これにより,文書中の相互参照が健全な状態になっているときでも make tgt が失敗しなくなりました. -- コメント:[[textlint]]にて問題が見つかっても処理自体は成功と見なして動作した。([[2024]]/01/07) - [[make を使いこなすためのメモ - まくまくいろいろノート>https://maku77.github.io/memo/tool/make.html]] command の実行でエラー(終了ステータスが 0 以外)が発生した場合、make はそれ以降の command を実行しないで終了します。 command の実行でエラーが発生しても処理を継続するには、command の前に - を付けます -- コメント:上記と同じケースでも処理に成功し、結果として"make: [lint] Error 1 (ignored)"が表示された。(2024/01/07) ** [[Windows]] [#od37896f] - mkdirコマンドに失敗する。 ++ [[Windows実行用Makefileの記述方法について>https://teratail.com/questions/329092]] @if not exist "$(@D)" (mkdir "$(@D)") --- コメント:パス名を""で囲むと成功した。(2024/01/10) ++ [[Windows Makefile c mkdir -p $@ - Stack Overflow>https://stackoverflow.com/questions/36401973/windows-makefile-c-mkdir-p]] md /c "mkdir $@" --- コメント:"cmd /c"経由でも成功した。(2024/01/10) ** [[シェルスクリプト]] [#de1d2366] - [[シェルスクリプトとMakefileの使い分け - 2012-10-24 - ククログ>https://www.clear-code.com/blog/2012/10/24/which-is-better-to-use-shell-script-or-makefile.html]] シェルスクリプトはシェルで実行するコマンドを列挙したものです。対するMakefileは、ターゲットごとにビルド手順のコマンドを列挙したものです。シェルのコマンドを列挙するものであるという点で両者はよく似ていますが、いくつか違うところもあります。 * 関連 [#i4bf5848] #related