• オンラインツール
  • - 計算機
    • 文字数カウント
  • - ダウンロード
    • TikTok ダウンロード
    • Douyin ダウンロード
  • - Webツール
    • BASE64
    • Base64→画像
    • 画像→Base64
    • URLエンコード
    • JavaScript
    • タイムスタンプ
    • ユニコード変換
    • JSON整形
    • 拡張子変更
    • リスト作成
    • CSS最適化
  • - 暗号化ツール
    • MD5暗号化
    • ランダムジェネレーター
  • - 画像ツール
    • 画像圧縮
    • QRコードジェネレーター
    • QRコードリーダー
    • 壁紙プレビュー
  • - 情報シート
    • 血液型遺伝
    • 服のサイズ
  • [email protected]
DopuBox
  • English
  • Español
  • Français
  • 日本語
  • 한국어
  • 简体中文
  • 繁體中文
全部 ニュース Meta Code 文化・アート
Linuxでのmakeコマンドの使用について詳しく説明します
2022-02-23

コードが実行可能ファイルになり、コンパイル(compile)と呼ばれます。これを先にコンパイルするか、それを先にコンパイルするか(つまりコンパイルの手配)、構築(build)と呼ばれます。

一、Makeの概念

Makeという言葉は、英語で「作る」という意味です。Makeコマンドは直接この意味を使って、あるファイルを作ることです。たとえば、ファイルa.txtを作成するには、次のコマンドを実行します。

コードのコピー
$ make a.txt

しかし、もしあなたが本当にこのコマンドを入力したら、それは役に立たない。Makeコマンド自体がa.txtの作成方法を知らないため、他のコマンドを呼び出してこの目標を達成する方法を教えてくれる人が必要です。

例えば、ファイルa.txtは、b.txtおよびc.txtに依存し、後の2つのファイル接続(catコマンド)の生成物であると仮定する。では、makeは次のルールを知る必要があります。

コードのコピー
a.txt: b.txt c.txt

cat b.txt c.txt > a.txt

すなわち、make a.txtというコマンドの背後には、実際には2つのステップがあります。第1のステップは、b.txtとc.txtがすでに存在していることを確認し、第2のステップはcatコマンドを使用してこの2つのファイルをマージし、新しいファイルに出力します。

このようなルールは、Makefileというファイルに書かれており、Makeコマンドはこのファイルに依存して構築されます。Makefileファイルはmakefileと書くか、コマンドラインパラメータで他のファイル名として指定することもできます。
コードのコピー

$ make -f rules.txt

#または $ make --file=rules.txt

上のコードはmakeコマンドがrulesに従うことを指定します。txtファイルのルールを構築します。

二、Makefileファイルのフォーマット

2.1概要

Makefileファイルは一連のルール(rules)で構成されています。各ルールの形式は以下の通りです。

コードのコピー

上の最初の行のコロンの前の部分を「ターゲット」(target)と呼び、コロンの後ろの部分を「前置条件」(prerequisites)と呼ぶ。2行目はtabキーで始まり、「コマンド」(commands)に続く必要があります。

「目標」は必要で、省略できない。「前条件」と「コマンド」はオプションですが、少なくとも1つは存在する必要があります。

2.2目標(target)
1つのターゲット(target)はルールを構成します。ターゲットは通常、上記のa.txtなどのMakeコマンドが構築するオブジェクトを示すファイル名です。ターゲットは、1つのファイル名、または複数のファイル名でスペースで区切られます。

ファイル名に加えて、ターゲットはアクションの名前であってもよい。これを「擬似ターゲット」(phony target)と呼ぶ。

コードのコピー
clean:

rm *.o

上のコードのターゲットはcleanで、ファイル名ではなく、操作の名前であり、「擬似ターゲット」に属し、オブジェクトファイルを削除する役割を果たします。

コードのコピー
$ make clean

ただし、現在のディレクトリにcleanというファイルがある場合、このコマンドは実行されません。Makeはcleanファイルがすでに存在することを発見したので,再構築する必要はないと考え,指定したrmコマンドは実行しない.

このような状況を避けるためにcleanを「偽のターゲット」と明確に宣言することができ、書き方は以下の通りである。

コードのコピー
.PHONY: clean
clean:

rm *.o temp

cleanが「擬似ターゲット」であることを宣言すると、makeはcleanというファイルが存在するかどうかをチェックするのではなく、実行するたびに対応するコマンドを実行します。像PHONYのような内蔵ターゲット名はまだまだあるので、マニュアルを見ることができます。
Makeコマンドの実行時にターゲットが指定されていない場合、デフォルトではMakefileファイルの最初のターゲットが実行されます。

コードのコピー

$ make
2.3前置条件(prerequisites)

前の条件は、通常、ファイル名のセットで、スペースで区切られます。ターゲットが再構築されるかどうかの判断基準を指定します。ターゲットは、ターゲットのタイムスタンプよりも新しいlast-modificationタイムスタンプがある場合、または更新された場合に再構築する必要があります。

コードのコピー
result.txt: source.txt

cp source.txt result.txt

上のコードではresultを構築します。txtの前置条件はsourceである.txt 。現在のディレクトリの場合、source.txtはすでに存在し、make result.txtは正常に動作し、そうでなければsourceを生成するためにもう一つのルールを書かなければならない。txt 。

コードのコピー
source.txt:

echo "this is the source" > source.txt

上のコードではsource.txtの後ろに前置条件がないということは、他のファイルとは無関係であることを意味し、このファイルがまだ存在しない限りmake sourceを呼び出すたびに.txtは、生成されます。
コードのコピー

$ make result.txt

$ make result.txt
上のコマンドは2回連続してmake resultを実行します。txt。最初の実行はまずsourceを新規作成します。txt、resultを新規作成します。txt。2回目の実行で、Makeはsourceを発見しました。txtは変動しない(タイムスタンプがresult.txtより遅い)、何も実行しない、result.txtも再生成されません。
複数のファイルを生成する必要がある場合は、次のような書き方をすることが多い。

コードのコピー

source: file1 file2 file3

上のコードでは、sourceは偽のターゲットであり、3つの前置ファイルしかなく、対応するコマンドはありません。
コードのコピー

$ make source

make sourceコマンドを実行すると、file 1,file 2,file 3の3つのファイルが一度に生成されます。これは次の書き方よりずっと便利です。

コードのコピー
$ make file1

$ make file2

$ make file3
2.4コマンド(commands)

コマンド(commands)は、ターゲットファイルを更新する方法を示し、1行または複数行のShellコマンドで構成されます。これは、通常、ターゲットファイルを生成する「ターゲット」を構築する具体的なコマンドです。

各行のコマンドの前にtabキーが必要です。他のキーを使用する場合は、内蔵変数を使用できます。RECIPEPREFIX宣言。
コードのコピー

.RECIPEPREFIX = >

all:
> echo Hello, world
上のコード用です。RECIPEPREFIXは、tabキーの代わりに番号(>)より大きいことを指定します。したがって、各行のコマンドの先頭はtabキーではなく番号より大きくなります。

各行のコマンドは、個別のshellで実行されることに注意してください。これらのシェルの間には継承関係はありません。

コードのコピー
var-lost:
export foo=bar

echo "foo=[$$foo]"

上のコードが実行されると(make var-lost)、fooの値が取れません。2行のコマンドは2つの異なるプロセスで実行されるためです。1つの解決策は、2行のコマンドを1行に書き、真ん中をセミコロンで区切ることです。
コードのコピー

var-kept:

export foo=bar; echo "foo=[$$foo]"
もう1つの解決策は、改行文字の前に反スラッシュ変換を加えることです。

コードのコピー

var-kept:
export foo=bar; \

echo "foo=[$$foo]"

最後の方法は加えることです。ONESHELL:コマンド。

コードのコピー
.ONESHELL:
var-kept:

export foo=bar;

echo "foo=[$$foo]"
三、Makefileファイルの文法
3.1コメント

井戸番号(#)はMakefileにコメントを表示します。

コードのコピー
コメントです

result.txt: source.txt

コメントです
cp source.txt result.txt#これもコメント
3.2エコー(echoing)

通常、makeは各コマンドを印刷して実行します。これをエコー(echoing)と言います。

コードのコピー
test:

これはテストです

上記のルールを実行すると、次の結果が得られます。

コードのコピー
$ make test

これはテストです

命令の前に@を付けると、エコーを閉じることができます。
コードのコピー

test:

@#これはテストです

今からmake testを実行しても、出力はありません。
構築中に現在実行されているコマンドを理解する必要があるため、通常はコメントと純粋に表示されるechoコマンドの前に@を付けるだけです。
コードのコピー

test:

@#これはテストです
@echo TODO
3.3ワイルドカード

ワイルドカードは、条件を満たすファイル名のセットを指定するために使用されます。MakefileのワイルドカードはBashと一致しており、主にアスタリスク(*)、疑問符(?)がある。と[...]。例えば、*.oは、すべての接尾辞がoというファイルを表す。

コードのコピー

clean:

rm -f *.o
3.4モードマッチング

Makeコマンドでは、ファイル名を正規演算のように一致させることができます。主に使用される一致子は%です。例えば、現在のディレクトリの下にf 1があるとする.cとf 2.c 2つのソースファイルは、対応するオブジェクトファイルにコンパイルする必要があります。

コードのコピー
%.o: %.c
次のような書き方になります。

コードのコピー

f1.o: f1.c
f2.o: f2.c
3.5変数と代入子

Makefileでは、変数を等号でカスタマイズできます。

コードのコピー

txt = Hello World

test:

@echo $(txt)

上記のコードでは、変数txtはHello Worldに等しい。呼び出す場合、変数は$()に配置する必要があります。

Shell変数を呼び出すには、Makeコマンドがドル記号をエスケープするため、ドル記号の前にドル記号を追加する必要があります。

コードのコピー

test: < 指代前置文件(src/%.txt), $@ 指代目标文件(dest/%.txt)。 @echo $$HOME

変数の値が別の変数を指す場合があります。

コードのコピー
v1 = $(v2)

上記のコードでは、変数v 1の値は別の変数v 2である。v 1の値が定義時に拡張(静的拡張)されるのか、実行時に拡張(動的拡張)されるのかという問題が発生します。v 2の値がダイナミックである場合、この2つの拡張方式の結果は大きく異なる可能性があります。

同様の問題を解決するために、Makefileには4つの付与演算子(=、:=、?=、+=)が用意されています。違いはStackOverflowを参照してください。
コードのコピー

VARIABLE = value

#実行時に拡張し、再帰的な拡張を許可します。
VARIABLE := value
#定義時に拡張します。

VARIABLE ?= value

#変数が空の場合にのみ値を設定します。
VARIABLE += value

#変数の末尾に値を追加します。

3.6組み込み変数(Implicit Variables)

Makeコマンドは、$(CC)が現在使用されているコンパイラを指し、$(MAKE)が現在使用されているMakeツールを指すなど、一連の組み込み変数を提供します。これは主にプラットフォーム間の互換性のためであり、詳細な組み込み変数リストはマニュアルを参照してください。

コードのコピー
output:
$(CC) -o output input.c

3.7自動変数(Automatic Variables)

Makeコマンドには、現在のルールに関連する自動変数も用意されています。主に以下のようなものがあります。
(1)$@
$@は現在のターゲットを指し、Makeコマンドが現在構築しているターゲットです。例えば、make fooの$@はfooを指す。

コードのコピー

a.txt b.txt:
touch $@
次のような書き方になります。 コードのコピー a.txt:
touch a.txt

b.txt:

touch b.txt コードのコピー
次のような書き方になります。

ソース元URL:https://dopubox.com/article/p/56439af22b3087cb

その他のツール
  • 文字数カウント TikTok ダウンロード Douyin ダウンロード BASE64 Base64→画像 画像→Base64 URLエンコード JavaScript タイムスタンプ ユニコード変換 JSON整形 拡張子変更 リスト作成 CSS最適化 MD5暗号化 ランダムジェネレーター 画像圧縮 QRコードジェネレーター QRコードリーダー 壁紙プレビュー 血液型遺伝 服のサイズ
  • ジョン・レノンのギター4億5千万円で落札
    2024-05-30

    「現実をみんなに伝えたい」能登高校書道部が新作の書道パフォーマンスを披露…部員それぞれが抱える大地震の被害
    2024-05-30

    『ボールアンドチェイン』南Q太著 評者:三木那由他【このマンガもすごい!】
    2024-05-30

    日テレ、意思疎通できず信頼喪失 「セクシー田中さん」の調査結果
    2024-05-31

    古本屋を巡り、顧みられなくなった作品、作家を生き返らせた九大大学院教授没後20年 教え子や研究仲間を支える「清新な光景」
    2024-05-30

    将棋叡王戦、藤井が勝ち最終局へ
    2024-05-30

    幸田文の名言「台所に立てば、…」【本と名言365】
    2024-05-30

    鎌倉幕府の地頭から海の武士団・松浦党に…古文書群「青方文書」からみる中世の漁業や製塩事情
    2024-06-01

    あらゆる知識に精通した「天才」が教えてくれた、頭を良くするための新書の読み方と「究極のインプット・アウトプット」の方法
    2024-06-02

    ポール・オースターの名言「けれどオニオンパイの味は…」【本と名言365】
    2024-06-02

    河合隼雄賞に八木詠美さん「休館日の彼女たち」、湯澤規子さん「焼き芋とドーナツ」
    2024-06-02

    現代美術作家の杉本博司がYouTubeチャンネル開設 素顔に迫る映像を公開
    2024-06-04

    アレクサンダー・カルダー個展「カルダー:そよぐ、感じる、日本」が開催
    2024-06-04

    第34回福岡アジア文化賞受賞者が決定。大賞は真鍋大度
    2024-06-04

    「犬派?猫派?」(山種美術館)開幕レポート。初公開から名作まで勢揃い
    2024-06-04

    クールべ《世界の起源》はなぜ攻撃されたのか? ポンピドゥー・センター・メッスで破壊・盗難事件
    2024-06-04

    口腔ケアで高齢者を守ろう 「おとなの歯磨き」訪問歯科医が出版
    2024-06-04

    藤井八冠、5連覇へ白星発進 将棋棋聖戦、山崎八段破る
    2024-06-06

    京都・祇園祭の「長刀鉾」稚児決まる 記者会見で「頑張ります」
    2024-06-06

    藤井、棋聖戦5連覇へ白星発進
    2024-06-06

    ©  Dopu Box
    💛