• 在线工具
  • - 计算器
    • 字符计数
  • - 下载
    • TikTok 下载
    • 抖音下载
  • - 网络工具
    • BASE64
    • Base64 转图片
    • 图片转 Base64
    • URL 编码
    • JavaScript
    • 时间戳
    • Unicode 转换器
    • JSON 格式化
    • 修改扩展名
    • 制作列表
    • CSS 优化器
  • - 加密工具
    • MD5 加密
    • 随机生成器
  • - 图像工具
    • 图像压缩
    • 二维码生成器
    • 二维码识别器
    • 壁纸预览
  • - 信息表
    • 血型遗传
    • 服装尺码
  • [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 下载 抖音下载 BASE64 Base64 转图片 图片转 Base64 URL 编码 JavaScript 时间戳 Unicode 转换器 JSON 格式化 修改扩展名 制作列表 CSS 优化器 MD5 加密 随机生成器 图像压缩 二维码生成器 二维码识别器 壁纸预览 血型遗传 服装尺码
  • 英国を代表する作曲家ブリテンが世界平和を願って作った『戦争レクイエム』【クラシック今日は何の日?】
    2024-05-29

    歯科医師の技術で愛好家も納得するサウナを細部まで再現するミニチュア作家
    2024-05-30

    MURAKAMI × Liquem 夢のコラボアクセが再登場☆|長山智美 デザイン狩人
    2024-05-30

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

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

    〈テロ事件と「美の復讐」〉15世紀末・イタリア「メディチ家兄弟暗殺計画」とルネサンスの画家たち
    2024-06-01

    <今週の本棚・次回の予定>6月8日の毎日新聞書評欄は『新装版 ペルーからきた私の娘』ほか
    2024-06-03

    道後温泉の記憶を継承するアート 大竹伸朗が“描き”重要文化財を守ったテント膜「熱景」の再生
    2024-06-03

    「CLAMP展」が国立新美術館で7月より開催。展示数は史上最多の約800点
    2024-06-04

    「TRIO パリ・東京・大阪 モダンアート・コレクション」(東京国立近代美術館)開幕レポート。トリオで再発見する3館のコレクション
    2024-06-05

    太宰府天満宮で「Fukuoka Art Book Fair」が開催へ
    2024-06-04

    「ゲバルト」展が東京日仏学院などで開催。反暴力的反応とその美的様式を探る
    2024-06-05

    PARCELで「Not Quite」開催。「~でなくもない」作家が集結
    2024-06-04

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

    ご当地体操「いちょう体操」に小学生の指導委員が誕生 「体がのびやかに動く」
    2024-06-06

    書評:「日本美術史」を書き換える100年単位の挑戦。『この国(近代日本)の芸術──〈日本美術史〉を脱帝国主義化する』
    2024-06-05

    安藤忠雄さん設計の美術館名称決まる…香川・直島に2025年オープン
    2024-06-05

    岡田将生の初ブランド「IN MY DEN」始動、第1弾グッズの受注販売がスタート
    2024-06-06

    そごう・西武が百貨店として初めてNFTマーケット開設、NFT作品約100点を発売
    2024-06-06

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

    ©  Dopu Box
    💛