| パラダイム | マクロ、宣言型 |
|---|---|
| デザイン: | スチュアート・フェルドマン |
| 初登場 | 1976年4月 |
| 実装言語 | C |
| OS | Unix ライク、インフェルノ |
| ファイル形式 | メイクファイル |
| 主な実装 | |
| BSD、GNU、nmake | |
| 方言 | |
| BSD make、GNU make、Microsoft nmake | |
| 影響を受けた | |
| Ant、Rake、MSBuildなど | |
ソフトウェア開発において、Make は、makefileと呼ばれる構成ファイルで定義された、構成された依存関係によって順序付けられたアクションを実行するコマンドライン インターフェイス ソフトウェア ツールです。通常、Make は、ソース コードから実行可能コード(プログラムやライブラリなど)をビルドするためのビルド自動化に使用されます。ただし、ビルドに限定されず、Make はオペレーティング システム シェル経由で実行可能なあらゆる操作を実行できます。
Make は、依存関係に基づいてアクションを実行する同様のツール、一部のコンパイラ、統合開発環境を介して対話的に実行するなど、多くの競合するテクノロジやツールが利用可能であるにもかかわらず、特に Unix およびUnixライクなオペレーティング システムで広く使用されています。
Make は、オリジナルのUnixツールを指すだけでなく、ほぼ同じ機能 (類似した makefile構文とセマンティクスを含む) を備えた複数のツールが実装されているため、テクノロジーでもあります。
起源
スチュアート・フェルドマンはベル研究所在籍中にMakeを作成した。初期バージョンは1976年4月に完成した。 [1] [2] [3]フェルドマンはMakeの作者として2003年のACMソフトウェアシステム賞を受賞した。[4]
フェルドマン氏は、Make を書くきっかけは、当時利用可能なツールに対する同僚の不満から生まれたと述べている。
Make は、 Steve Johnson (yacc などの作者) が私のオフィスに押しかけてきて、正しいプログラム (バグは修正され、ファイルはコンパイルされていなかったため、影響を受けなかった
cc *.o) のデバッグに午前中を無駄にしてしまった運命を呪ったことから始まりました。その前の晩、私が取り組んでいたプロジェクトで同じ惨事に対処するのに時間を費やしていたので、それを解決するツールのアイデアが浮かびました。それは依存関係アナライザーという手の込んだアイデアから始まり、はるかに単純なものに煮詰められ、その週末に Make になりました。まだ未完成のツールを使うことは文化の一部でした。Makefile はテキスト ファイルであり、魔法のようにエンコードされたバイナリではありませんでした。なぜなら、それがUnix の精神、つまり印刷可能で、デバッグ可能で、理解可能なものだったからです。— スチュアート・フェルドマン『Unixプログラミングの芸術』エリック・S・レイモンド2003
Make が登場する前は、Unix でのビルドは主に各プログラムのコードベース用に書かれたシェル スクリプトで構成されていました。Make の依存関係の順序付けと期限切れのチェックにより、ビルド プロセスはより堅牢で効率的になりました。makefile により、ビルド ロジックの整理が改善され、ビルド ファイルの数が少なくなることもよくありました。
Makeが広く使用されているのは、さまざまなソフトウェア開発ツールを備えたPWB/UNIX 1.0から始まったUnixに早くから組み込まれていたためである。 [3]
バリエーション
Make はこれまで何度も実装されてきましたが、一般的には同じ makefile 形式を使用し、同じ機能を提供していますが、オリジナルからの拡張機能を提供しているものもあります。例:
- Sun DevPro Makeは1986年にSunOS-3.2で登場した。これはオプションのプログラムとして提供され、SunOS-4.0ではSunPro MakeがデフォルトのMakeプログラムとなった。[5] [より良いソースが必要] 2006年12月、 Solarisをオープンソース化する取り組みの一環として、Sun DevPro Makeはオープンソースになった。[6] [7]
- dmake または Distributed Make は、Sun Solaris Studio のデフォルトの Make として付属していますが、Solaris オペレーティング システム (SunOS) のデフォルトの Make ではありません。これはもともと OpenOffice をビルドするために必要でしたが、2009 年に[8]ビルド システムが書き直され、GNU Make を使用するようになりました。Apache OpenOfficeでは、依然として両方のビルド システムが混在していますが、[9]より積極的に開発されているLibreOffice では、現在は最新の "gbuild" のみを使用しています。[8]
- BSD Make(pmake、[10] bmake [11]またはfmake [12] )は、並列にターゲットを構築できるバージョンのMakeに関するAdam de Boorの研究から派生したもので、 FreeBSD [11] 、NetBSD [13]、OpenBSD [14]にさまざまな変更を加えて生き残っています。[15]特徴的なのは、構文解析段階で適用される条件文と反復ループがあり、条件付きでプログラム的にmakefileを構築するために使用できることです。[16]実行時にターゲットを生成することも含まれます。[要出典]
- GNU Make (略称gmake ) は、Linux および macOS 用の Make の標準実装です。[16] 条件文など、オリジナルの Make に対していくつかの拡張機能を提供します。また、makefile ルールでシェル スクリプトを必要とせずに済むようにしたり、makefile で設定および使用される変数を操作したりするために使用できる多くの組み込み関数も提供します。[17]たとえば、foreach関数を使用すると、特定のディレクトリ内のファイル名などの値のリストを反復処理できます。[18] GNU Make は、GNU Compiler Collection (GCC) (バージョン 3.4 [19]以降)、Linux カーネル、[20] [21] Apache OpenOffice、[9] LibreOffice、[8] Mozilla Firefoxなど、多くのソフトウェア システムをビルドするために必要です。[22]
- Rocky BernsteinのRemake [23]はGNU Makeのフォークであり、より優れた位置とエラー位置の報告、実行トレース、実行プロファイリングなどのGNU Makeに対するいくつかの拡張機能を提供し、デバッガも含まれています。
- Glenn Fowlerのnmake [24](同名のMicrosoftの亜種とは無関係)はUNIXの亜種とは互換性がありませんが、一部の人によるとmakefileのサイズを10分の1に削減する機能を提供します。
- Microsoft nmakeは通常Visual Studioと一緒にインストールされます。[25] includeや条件式などのプリプロセッサディレクティブをサポートしており、コマンドラインやmakefile内で設定された変数を使用します。[26] [27]推論規則はMakeとは異なり、たとえば検索パスを含めることができます。[28]
- Embarcadero makeには、「MAKEにMicrosoftのNMAKEを模倣させる」コマンドラインオプションがあります。[29]
- QtプロジェクトのJomツールはnmakeのクローンです。[30]
- Mkは、バージョン9以降のResearch UnixでMakeに取って代わりました。 [31]ベル研究所のプログラマーAndrew G. Humeによる元のツールの再設計であり、異なる構文が特徴です。Mkは、ベル研究所が意図したUnixの後継であるPlan 9の標準ビルドツールになりました。 [32]
- Katiは、2020年現在Android OSビルドで使用されているGNU MakeのGoogleによる代替品です。Katiは、makefileをninjaに変換して、増分ビルドを高速化します(cmakeメタツールに似ています)。[33]
- Snakemakeは、バイオインフォマティクスワークフローをコンパイルおよび実行するためのPythonベースの実装です。[34]
POSIX にはMake ユーティリティの基本機能と操作の標準化が含まれており、Unix ベースの Make のバージョンとの互換性がさまざまなレベルで実装されています。一般的に、シンプルな makefile はさまざまなバージョンの Make 間で使用しても、十分な成功を収めることができます。GNU Make、Makepp、および一部のバージョンの BSD Make では、デフォルトで最初にそれぞれ「GNUmakefile」、「Makeppfile」[ 35 ] 、「BSDmakefile」[36]という名前のファイルを検索します。これにより、実装定義の動作を使用する makefile を別の場所に置くことができます。
使用
一般的に、Makefile に基づいて、ソース ファイルのタイムスタンプがターゲット ファイルよりも新しい場合、またはターゲット ファイルが存在しない場合は、Make はソース ファイルからターゲット ファイルを更新します。たとえば、Cファイル ( ) をオブジェクト ファイル*.cにコンパイルし、オブジェクト ファイルを実行可能プログラムにリンクすることが含まれます。または、TypeScriptファイル ( ) をブラウザーで使用するためにJavaScriptにコンパイルすることが含まれる場合があります。その他の例としては、ソース イメージ ファイルを別の形式に変換する、ファイルをコンテンツ管理システムにコピーする、ビルド ステータスに関する電子メールを送信するなどがあります。
*.ts
makefile はターゲットを定義します。各ターゲットは、生成するファイルか、偽のターゲットと呼ばれるユーザー定義の概念のいずれかです。
引数として渡されたターゲットを更新します。
make [ -f makefile ] [オプション] [ターゲット]
ターゲットが指定されていない場合、Make は、最も一般的に使用されるアクションを実行するために、多くの場合偽のターゲットである makefile 内の最初のターゲットを更新します。
Makeは、ターゲットファイルのタイムスタンプがソースファイルのタイムスタンプより後の場合、ビルドアクションをスキップします。[38]これにより、ターゲットファイルが最新の場合にアクションをスキップすることでビルドプロセスが最適化されますが、ソースファイルの古いバージョンを復元するなどのファイルタイムスタンプの問題や、ネットワークファイルシステムがファイルのソースであり、そのクロックまたはタイムゾーンがMakeを実行しているマシンと同期していない場合など、更新が誤ってスキップされることがあります。また、ソースファイルのタイムスタンプが将来の場合、makeは不要なアクションを繰り返しトリガーし、ビルド時間が長くなります。
Make が起動すると、コマンドラインで指定された makefile が使用されます。指定されていない場合は、特定の検索ルールによって見つかった makefile が使用されます。通常、Make はデフォルトで作業ディレクトリ内のMakefileという名前のファイルを使用します。GNU Make は、 GNUmakefile、makefile、またはMakefileに一致する最初のファイルを検索します。
Make は、ロードされた makefile に基づいてコマンドラインのオプションを処理します。
メイクファイル
| 統一型識別子 (UTI) | パブリック.make-source [39] |
|---|
makefile言語は部分的に宣言型プログラミングであり、終了条件は記述されるが、アクションを実行する順序は記述されない。[40] [41] [42] [43]このタイプのプログラミングは、命令型プログラミングに慣れているプログラマーを混乱させる可能性がある。
Makefileには以下の構成要素を含めることができる: [44]
- 明示的なルール: ターゲットを更新するタイミングと方法を定義します。前提条件(依存ターゲット)と更新アクションを定義するコマンドをリストします。レシピと呼ばれます。
- 暗黙のルール: ターゲットがターゲットに似た名前のファイルにどのように依存しているかや更新レシピなど、ファイル名に基づいてファイルのクラスをいつどのように再作成するかを定義します。
- 変数定義: テキスト値を、後のテキストに代入できる名前に関連付けます。
- ディレクティブ: 別のmakefileをインクルードするなど、特別なことを行うための指示
- コメント: で始まる行
#
ルール
各ルールは依存関係行で始まり、ルールのターゲット名とそれに続くコロン(:)で構成され、オプションでルールのターゲットが依存するターゲットのリスト、つまり前提条件が続きます。[45]
ターゲット [ターゲット...]: [コンポーネント...] Tab ↹[コマンド1] 。 。 。 Tab ↹[コマンドn]
通常、ルールには複数のターゲットではなく、単一のターゲットがあります。
依存関係行の後にレシピが続く場合があります。レシピとは、コンポーネント (つまりソース ファイル) からターゲットを生成する方法を定義する、 TABでインデントされた一連のコマンド ラインです。前提条件のタイムスタンプがターゲット ファイルよりも新しい場合、またはターゲットがファイルとして存在しない場合は、レシピが実行されます。
最初のコマンドは、前提条件の後にセミコロンで区切って同じ行に記述することができます。
ターゲット:前提条件 ;コマンド
例えば、
こんにちは: ; @ echo "こんにちは"
各コマンド ラインはタブ文字で始まる必要があります。スペースも空白ですが、Make ではタブが必要です。これは混乱や間違いにつながることが多いため、makefile 構文のこの側面は批判の対象になっています。Eric S. Raymondはこれを「Unix 史上最悪の設計ミスの 1 つ」と評し[46]、The Unix-Haters Handbookでは「構文の一部としてタブを使用することは、グリーン ベレーのパンジー スティック トラップの 1 つに似ている」と述べています。Feldman は、この選択は初期の実装の難しさを回避するためであり、初期のユーザーとの下位互換性を保つためであると説明しています。
なぜ列 1 にタブがあるのでしょうか? Yaccは新しく、Lex もまったく新しいものでした。どちらも試したことがなかったので、これは学習するいい口実になると思いました。Lex を初めて試して混乱した後、パターン newline-tab で簡単な操作をしました。うまくいきました。そして数週間後、ユーザー数が 12 人ほどになり、そのほとんどは友人だったので、組み込みベースを台無しにしたくありませんでした。悲しいことに、残りは歴史です。
— スチュアート・フェルドマン[46]
GNU Make バージョン 3.82 以降では、.RECIPEPREFIX 特殊変数を使用して、レシピのプレフィックスとして任意のシンボル (1 文字) を選択できます。次に例を示します。
.RECIPEPREFIX := :
all : :@echo "レシピのプレフィックス シンボルは '$(.RECIPEPREFIX)' に設定されています"
各コマンドは、別々のシェルで実行されます。オペレーティング システムによって異なるシェルが使用されるため、makefile が移植不可能になる可能性があります。たとえば、GNU Make (すべての POSIX Make) は、デフォルトで/bin/shを使用してコマンドを実行します。この場合、cp などのUnixコマンドが通常使用されます。これとは対照的に、Microsoft のnmake は、cmd.exe を使用してコマンドを実行します。この場合、 copyなどのバッチコマンドは使用できますが、cp は必ずしも使用できません 。
レシピはオプションなので、依存関係の行は他のターゲットを参照するコンポーネントのみで構成できます。次に例を示します。
realclean :クリーンなdistclean
次のサンプル ルールは、Make がターゲットの file.txt を更新するときに評価されます。つまり、経由しますmake file.txt。file.html が file.txt より新しいか、file.txt が存在しない場合は、コマンドが実行され、file.html から file.txt が生成されます。
file.txt :ファイル. html lynx -dump file.html > file.txt
コマンドには、次のプレフィックス (タブの後) を 1 つ以上付けることができます。
- マイナス(-)はコマンドからのエラーを無視することを指定します
- at (@)は、コマンドが実行される前に出力しないことを指定します。
- プラス(+)は、Makeが「実行しない」モードで呼び出された場合でもコマンドを実行することを指定します。
.IGNOREエラーを無視し、エコーを消音することは、特別なターゲットとを介して代わりに達成することができる.SILENT。[47]
Microsoft の NMAKE には、これらの makefile から省略できる定義済みのルールがあります。
例:c.obj $(CC)$(CFLAGS)
マクロ
makefile ではマクロを定義して使用できます。マクロは、 のような単純な文字列定義を保持する場合は通常、変数と呼ばれます。makefile 内のマクロは、Make ユーティリティに渡されるコマンドライン引数で上書きできます。環境変数もマクロとして使用できます。
CC=clang
たとえば、マクロはCCCコンパイラの場所を参照するために makefile で頻繁に使用されます。makefile 全体で一貫して使用する場合、コンパイラを呼び出す各ルール コマンドを変更するのではなく、マクロの値を変更することによって、使用するコンパイラを変更できます。
マクロの名前は通常、すべて大文字で付けられます。
マクロ=定義
マクロ値は他のマクロ値で構成できます。マクロの値は、使用ごとに (遅延して) 展開されます。
マクロは、 $ NAMEまたは $( NAME ) のいずれかを介して展開して使用されます。括弧を省略すると Make が の後の文字を$変数名全体と解釈するため、後者の方が安全です。同等の形式では、括弧ではなく中括弧を使用します。つまり、 です。これはBSD${}で使用されるスタイルです。
NEW_MACRO = $( MACRO ) - $( MACRO2 )
マクロは、バックティック( )で表されるコマンド置換演算子を使用してシェル コマンドから構成できます。
`
YYYYMMDD = `日付`
マクロをオーバーライドするためのコマンドライン構文は次のとおりです。
MACRO = "値" [ MACRO = "値" ... ] TARGET [ TARGET ... ]を作成します。
Makefile は定義済みの内部マクロにアクセスできます。 と?は@共通です。
ターゲット:コンポーネント1コンポーネント2
# echo コンポーネントは TARGET より若いecho $? # echo ターゲット名echo $@
BSDとGNU Makeで動作するマクロを定義する際の一般的な構文は、等号(= )の代わりに+=、?=、!=を使用することです。[48]
接尾辞のルール
サフィックスルールには、形式の名前を持つ「ターゲット」があり.FROM.TO、ファイル拡張子に基づいてアクションを起動するために使用されます。サフィックスルールのコマンドラインでは、POSIXは[49]内部マクロが$<最初の前提条件を参照し、$@ターゲットを参照することを規定しています。任意のHTMLファイルをテキストに変換するこの例では、シェルリダイレクトトークンは>コマンドラインの一部ですが、$<はHTMLファイルを参照するマクロです。
.サフィックス: . txt . html
# .html から .txt へ
.html.txt :
lynx -dump $< > $@
コマンドラインから呼び出されると、上記の例が展開されます。
$ make -n file.txt
lynx -dump file.html > file.txt
パターンルール
サフィックスルールは独自の前提条件を持つことはできません。[50]前提条件がある場合は、サフィックスルールとしてではなく、通常とは異なる名前のファイルとして扱われます。GNU Makeは古いmakefileとの互換性のためにサフィックスルールをサポートしていますが、それ以外ではパターンルールの使用を推奨しています。[51]
パターンルールは、そのターゲットが %文字列内に正確に1文字を含むことを除いて、通常のルールのように見えます。ターゲットはファイル名を一致させるためのパターンと見なされます。 は%0文字以上の任意の部分文字列に一致しますが、[52]他の文字はそれ自身にのみ一致します。前提条件も同様に、%その名前がターゲット名とどのように関連しているかを示すために使用します。
上記の接尾辞ルールの例は、次のパターン ルールのようになります。
# %.html から %.txt へ
%.txt : % .html
lynx -dump $< > $@
コメント
指令
ディレクティブは、別の makefile をインクルードするなどの特別な動作を指定します。
行の継続
行の継続は\、行末の
バックスラッシュ文字で示されます。
ターゲット: コンポーネント \
成分
Tab ↹コマンド ; \
コマンド | \
パイプコマンド
Tab ↹Tab ↹
例
次のコマンドは、後続の makefile のコンテキスト内にあります。
make # 最初のターゲット 'all' を更新
make help # ターゲット 'help' を更新してターゲットをリストします
make dist # 配布用にビルドするためにターゲット 'dist' を更新します
PACKAGE =パッケージ
VERSION = `日付"+%Y.%m%d%" ` RELEASE_DIR = ..
RELEASE_FILE = $( PACKAGE ) - $( VERSION )
# デフォルトのターゲット
# 注意: 変数 LOGNAME は環境から取得されます
all :
echo "Hello $( LOGNAME ) 、デフォルトでは何もしません" echo "'make help' を試してください"
# このファイルを検索してターゲットを表示する
help :
egrep "^# target:" [ Mm ] akefile
# リリース
distを作成します:
tar -cf $( RELEASE_DIR ) / $( RELEASE_FILE ) && \ gzip -9 $( RELEASE_DIR ) / $( RELEASE_FILE ) .tar
以下は、デフォルトで(「all」ルールが最初にリストされている)システムの C コンパイラを使用して「helloworld.c」というソース ファイルをコンパイルし、ユーザーが最初からやり直したい場合に生成されたファイルを削除する「clean」ターゲットも提供する単純な makefile です。 と は、$@いわゆる$<内部マクロ(自動変数とも呼ばれる)の 2 つで、それぞれターゲット名と「暗黙の」ソースを表します。以下の例では、 は、$^前提条件のスペースで区切られたリストに展開されます。他にも多数の内部マクロがあります。[49] [53]
CFLAGS ?= -g
すべて: helloworld
helloworld : helloworld.o $ ( CC ) $( LDFLAGS ) -o $ @ $^
helloworld.o : helloworld .c $( CC ) $ ( CFLAGS ) -c -o $@ $<
クリーン:
$( RM ) helloworld helloworld.o
多くのシステムには、ファイル サフィックスに基づいてコンパイルなどの一般的なタスクを指定するための定義済みの Make ルールとマクロが付属しています。これにより、ユーザーは、ソースからターゲットを生成する方法に関する実際の (多くの場合は移植性のない) 指示を省略できます。このようなシステムでは、上記の makefile は次のように変更できます。
すべて: helloworld
helloworld : helloworld.o $ ( CC ) $( CFLAGS ) $( LDFLAGS ) -o $@ $ ^
クリーン:
$( RM ) helloworld helloworld.o
# サフィックスルール
.co :
$( CC ) $( CFLAGS ) -c $<
.接尾辞: . c
「helloworld.o」が「helloworld.c」に依存していることは、Make によって自動的に処理されるようになりました。ここで示したような単純な例では、これはほとんど問題になりませんが、ソフトウェア プロジェクトのソース ファイルの数が増え始めると、サフィックス ルールの真の威力が明らかになります。リンク ステップのルールを記述し、オブジェクト ファイルを前提条件として宣言するだけで済みます。その後、Make はすべてのオブジェクト ファイルの作成方法を暗黙的に決定し、すべてのソース ファイルの変更を探します。
ソース ファイルが相互に依存しておらず、ヘッダー ファイルなどの他のファイルにも依存していない限り、単純なサフィックス ルールは有効です。ビルド プロセスを簡素化するもう 1 つの方法は、コンパイラ支援の依存関係生成と組み合わせることができる、いわゆるパターン マッチング ルールを使用することです。gcc コンパイラと GNU Make を必要とする最後の例として、フォルダー内のすべての C ファイルを対応するオブジェクト ファイルにコンパイルし、それらを最終的な実行ファイルにリンクする汎用の makefile を示します。コンパイルが行われる前に、依存関係は makefile 対応の形式で隠しファイル ".depend" に集められ、その後 makefile に含められます。ポータブル プログラムでは、以下で使用される構造を避ける必要があります。
# 汎用 GNUMakefile
# GNU ifneq (,)
でない場合失敗するスニペットこのmakefile にはGNU Make が必要です。endif
PROGRAM = foo
C_FILES := $(ワイルドカード*.c ) OBJS := $( patsubst %.c, %.o, $( C_FILES )) CC = cc
CFLAGS = -Wall -pedantic
LDFLAGS = LDLIBS = -lm
すべて: $(プログラム)
$(PROGRAM) : .依存 $( OBJS )
$( CC ) $( CFLAGS ) $( OBJS ) $( LDFLAGS ) -o $( PROGRAM ) $( LDLIBS )
依存: 依存する
.depend : cmd = gcc - MM - MFdepend $( var ) ; catdepend >>. depend ; .depend
: @echo "依存関係を生成しています..." @ $ ( foreach var , $( C_FILES ) , $( cmd )) @rm -fdepend
-include .depend
# これらはパターンマッチングのルールです。ここで使用される自動
変数に加えて、% が表すものに一致する変数 $* が
特別な場合に便利です。
%.o : %. c
$( CC ) $( CFLAGS ) -c $< -o $@
% : %.o $
( CC ) $( CFLAGS ) -o $@ $<
クリーン:
rm -f .depend $( OBJS )
.PHONY :クリーンな依存関係
依存関係の追跡
Makefile は依存関係で構成されており、依存関係を忘れたり余分に追加したりすると、ユーザーにはすぐにはわからないため、生成されたソフトウェアに見つけにくい微妙なバグが発生する可能性があります。この問題を回避し、ソースと Makefile の依存関係を同期させるには、さまざまな方法があります。1 つの方法は、コンパイラを使用して依存関係の変更を追跡することです。-MMたとえば、GCC はソース コードを静的に分析し、スイッチを使用して指定されたファイルのルールを自動的に生成できます。もう 1 つの方法は、依存関係を含む Makefile を生成する Makefile またはサードパーティ ツールです (たとえば、 GNU プロジェクトのAutomakeツールチェーンはこれを自動的に実行できます)。
別のアプローチとしては、 CMake、Mesonなど のメタビルド ツールを使用することです。
参照
- 依存関係グラフ – 依存関係を表す有向グラフ
- ビルド自動化ソフトウェアのリスト
参考文献
- ^ “V7/usr/src/cmd/make/ident.c”. tuhs.org . 2013年9月1日. 2013年9月1日時点のオリジナルよりアーカイブ。2018年3月18日閲覧。
- ^ Feldman, SI (1979 年 4 月). 「Make --- コンピュータ プログラムを保守するためのプログラム」.ソフトウェア: 実践と経験. 9 (4): 255–265. CiteSeerX 10.1.1.39.7058 . doi :10.1002/spe.4380090402. S2CID 33059412.
- ^ ab Thompson, TJ (1980 年 11 月)。「Designer's Workbench: 実稼働環境の提供」。Bell System Technical Journal。59 ( 9): 1811–1825。doi : 10.1002 /j.1538-7305.1980.tb03063.x。S2CID 27213583。DWB
の一般的なメンテナンスでは、PWB/UNIX* 対話型オペレーティング システムが提供するソース コード コントロール システムと make ユーティリティを使用しています。
- ^ マシュー・ドア (2005).実践的開発環境.オライリーメディア. p. 94. ISBN 978-0-596-00796-6。
- ^ 「Google グループ」。arquivo.pt。2011年1月22日時点のオリジナルよりアーカイブ。 2018年3月18日閲覧。
{{cite web}}: CS1 maint: bot: 元の URL ステータス不明 (リンク) - ^ “OpenSolaris at Two (Jim Grisanzio)”. 2013年12月12日. 2013年12月12日時点のオリジナルよりアーカイブ。 2018年3月18日閲覧。
- ^ Grisanzio, Jim. OpenSolaris のストーリー。
- ^ abc 「Development/Gbuild - The Document Foundation Wiki」。wiki.documentfoundation.org 。 2018年3月18日閲覧。
- ^ ab 「Apache OpenOffice 構築ガイド - Apache OpenOffice Wiki」。wiki.openoffice.org。2018年3 月 18 日閲覧。
- ^ FreeBSD 2.0.5 Make ソースコード、1993
- ^ ab "Bmake(1)"。
- ^ 「fmake(1) 一般コマンドマニュアル」。
- ^ "make". NetBSD マニュアルページ. 2020 年7 月 9 日閲覧。
- ^ "make(1) - OpenBSDマニュアルページ". man.openbsd.org . 2018年3月18日閲覧。
- ^ "make". FreeBSD . 2020 年7 月 9 日閲覧。C
プログラミング言語を彷彿とさせる Makefile のインクルード、条件構造、および for ループが make で提供されています。
- ^ アーノルド・ロビンズ (2005)、Unix in a Nutshell、第 4 版、O'Reilly
- ^ 「8. テキスト変換関数」、GNU make、フリーソフトウェア財団、2013
- ^ 「8.5 foreach 関数」、GNU make、フリーソフトウェア財団、2013
- ^ 「GCC 3.4 リリース シリーズの変更点、新機能、および修正点」。フリー ソフトウェア財団。2006 年。
- ^ Javier Martinez Canillas (2012 年 12 月 26 日)。「Kbuild: Linux カーネル ビルド システム」。Linux Journal。
- ^ Greg Kroah-Hartman (2006)、Linuxカーネルの概要、O'Reilly
- ^ 「ビルド手順」。
- ^ Rocky Bernstein. 「Remake – わかりやすいトレース機能とデバッガーを備えた GNU Make」
- ^ Glenn Fowler (2012 年 1 月 4 日)。「nmake の概要」。情報およびソフトウェア システム リサーチ、AT&T ラボ リサーチ。2015 年 9 月 2 日時点のオリジナルよりアーカイブ。2014年5 月 26 日閲覧。
- ^ 「NMAKE リファレンス Visual Studio 2015」。Microsoft。2015 年。
- ^ 「Makefile プリプロセッサ ディレクティブ」 2014 年。
- ^ 「Makefile プリプロセス演算子」。Microsoft。2014 年。
- ^ 「ルール内の検索パス」。Microsoft。2014 年。
- ^ 「MAKE」。CodeGear(TM)。2008年。
- ^ “Jom - Qt Wiki”. Qtプロジェクト。 2021年。
- ^ McIlroy, MD (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (技術レポート). Bell Labs. CSTR 139.
- ^ Hume, Andrew G.; Flandrena, Bob (2002). 「Mk を使用した Plan 9 上のファイルの保守」. Plan 9 プログラマーズ マニュアル. AT&T Bell Laboratories. 2015 年 7 月 11 日時点のオリジナルよりアーカイブ。
- ^ 「google/kati: 実験的なGNU makeクローン」。GitHub。2020年11月30日。
- ^ Mölder, Felix; Jablonski, Kim Philipp; Letcher, Brice; Hall, Michael B.; Tomkins-Tinch, Christopher H.; Sochat, Vanessa; Forster, Jan; Lee, Soohyun; Twardziok, Sven O.; Kanitz, Alexander; Wilm, Andreas (2021-04-19). 「Snakemake による持続可能なデータ分析」. F1000Research . 10:33 . doi : 10.12688/f1000research.29032.2 . ISSN 2046-1402. PMC 8114187 . PMID 34035898.
- ^ 「GNU 'make'」。フリーソフトウェア財団。
- ^ 「メイクップ」.
- ^ 「フリーBSD make」。
- ^ Linux ls コマンドのファイル出力をソートする方法 2016 年 9 月 13 日にWayback Machineにアーカイブされました
- ^ "makefile". Apple 開発者向けドキュメント: Uniform Type Identifiers . Apple Inc.
- ^ Adams, P. および Solomon, M.、1993、「CAPITL ソフトウェア開発環境の概要」。International Workshop on Software Configuration Management (pp. 1-34)。ベルリン、ハイデルベルク: Springer Berlin Heidelberg。
- ^ DSLS の概要 アーカイブ済み 2007 年 10 月 23 日、Wayback Machine、2007/02/27、フェニックス ウィキ
- ^ Re: 振り付けと REST 2016 年 9 月 12 日に Wayback Machineにアーカイブ、Christopher B Ferris による 2002 年 8 月 9 日
- ^ Target Junior Makefiles アーカイブ済み 2010年1月7日、Wayback Machine、Andrew W. Fitzgibbon および William A. Hoffman
- ^ 3.1 Makefile の内容、GNU make、フリーソフトウェア財団
- ^ 「前提条件タイプ (GNU make)」。GNU.org。GNUプロジェクト。2020年12 月 15 日閲覧。
- ^ ab 「第 15 章 ツール: make: レシピの自動化」、The Art of Unix Programming、Eric S. Raymond 2003
- ^ – シェルおよびユーティリティ リファレンス、The Single UNIX 仕様、バージョン 4、The Open Group
- ^ – FreeBSD一般コマンドマニュアル
- ^ ab "make". www.opengroup.org . 2018年3月18日閲覧。
- ^ 「GNU make マニュアル: サフィックスルール」。フリーソフトウェア財団。
- ^ 「GNU make マニュアル: パターンルール」。フリーソフトウェア財団。
- ^ SunPro マニュアルページの「パターンマッチングルール」セクションを参照してください。2014 年 5 月 29 日にWayback Machineにアーカイブされました。
- ^ 自動変数 Archived April 25, 2016, at the Wayback Machine GNU `make'
外部リンク
- GNU Make ホームページ
