• Online Tools
  • - Calculators
    • Character Count
  • - Download
    • TikTok Download
    • DouYin Download
  • - Web Tools
    • BASE64
    • Base64 to Image
    • Image to Base64
    • URL Encoding
    • JavaScript
    • Timestamp
    • Unicode Converter
    • JSON Format
    • Modify Extension
    • Make List
    • CSS Optimizer
  • - Encryption Tools
    • MD5 Encryption
    • Random Generator
  • - Image Tools
    • Image Compression
    • QR Code Generator
    • QR Code Reader
    • Wallpaper Preview
  • - Info Sheets
    • Blood Type Heredity
    • Clothing Sizes
  • [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

Other Tools
  • Character Count TikTok Download DouYin Download BASE64 Base64 to Image Image to Base64 URL Encoding JavaScript Timestamp Unicode Converter JSON Format Modify Extension Make List CSS Optimizer MD5 Encryption Random Generator Image Compression QR Code Generator QR Code Reader Wallpaper Preview Blood Type Heredity Clothing Sizes
  • 藤井聡太八冠、瀬戸際の戦い 将棋叡王戦、31日に第4局
    2024-05-29

    囲碁、一力遼本因坊が初防衛 余正麒破り三冠堅持
    2024-05-30

    ブームなぜ起きた? 東京国立近代美術館で「ハニワと土偶の近代」展
    2024-05-30

    ドローンサッカーで世界2位 大阪・星翔高校チーム 「世界でも通用することがわかった」
    2024-05-30

    制作期間「足りていなかった可能性」
    2024-05-31

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

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

    「警察密着24時」担当者ら懲戒 テレビ東京、石川社長は3割返上
    2024-06-03

    万博無料招待、大阪の学校7割が希望 「不参加」の選択肢ない調査手法に批判も
    2024-06-03

    香川県・直島に開館する新たな美術館の正式名称が「直島新美術館」に決定
    2024-06-03

    ジャスパー・モリソンの名言「…が「普通」のものより役にたつことはない。」【本と名言365】
    2024-06-03

    フジコ・ヘミングさん偲ぶ魂のピアノ旋律
    2024-06-03

    「ロバート」秋山さんが鳥取PR イリュージョニストに扮し
    2024-06-04

    石川九楊の個展「石川九楊大全」が上野の森美術館で2ヶ月連続開催へ
    2024-06-05

    多摩美術大学がAIやサーキュラーなど5つの最先端のテーマを研究するプラットフォームをスタート
    2024-06-04

    今週末に見たい展覧会ベスト13。「令和6年 新指定国宝・重要文化財」展から国立西洋美術館の現代美術展、KYOTOGRAPHIEまで
    2024-06-04

    スマイル社が性犯罪被害者支援の法人設立
    2024-06-04

    週末見たい展覧会5選。今週はTRIO展、吉田克朗展、建築の構造デザインに焦点を当てた展覧会など。【2024年6月第2週】
    2024-06-05

    写真家の吉田ルイ子さん死去
    2024-06-06

    書評:「普通にラッセンが好き」と言えない現代美術界へ。原田裕規『評伝クリスチャン・ラッセン 日本に愛された画家』
    2024-06-06

    ©  Dopu Box
    💛