• 온라인 도구
  • - 계산기
    • 문자 수
  • - 다운로드
    • TikTok 다운로드
    • DouYin 다운로드
  • - 웹 도구
    • 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 코드 리더 배경 화면 미리보기 혈액형 유전 의류 사이즈
  • テレビ東京、不適切表現で謝罪 「激録・警察密着24時!!」
    2024-05-29

    美術館の裏側を伝える展覧会「鎌倉別館40周年記念 てあて・まもり・のこす 神奈川県立近代美術館の保存修復」レポート
    2024-05-29

    被害者「問題解決には程遠い」 旧ジャニーズ被害者らが会見
    2024-05-29

    「ねこクラゲ」被告、脱税認める 原稿優先で申告せず、福岡地裁
    2024-05-31

    ビルケンシュトック、創業から250年の歴史を振り返る2冊を出版
    2024-06-01

    日本の「木」の文化を家具を通して世界へ【ミラノデザインウィーク】
    2024-06-01

    大阪はアートとデザインの街となるか? Osaka Art & Design 2024の見どころをレポート
    2024-06-03

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

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

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

    「国芳の団扇絵 猫と歌舞伎とチャキチャキ娘」(太田記念美術館)開幕レポート。世界初の展覧会
    2024-06-04

    社会的関与の芸術。清水穣評 城戸保「駐車空間、文字景、光画」展/野村浩「Painter」展
    2024-06-04

    アートフェア東京、次回は2025年3月に開催決定
    2024-06-04

    東京都写真美術館で「今森光彦 にっぽんの里山」が開催へ
    2024-06-04

    「KOGEI Art Fair Kanazawa 2024」開催決定
    2024-06-04

    「安全だと誰も言わない万博」爆発事故で教職員組合 大阪府に子供無料招待中止申し入れ
    2024-06-04

    古今東西 かしゆか商店【つづら】
    2024-06-05

    フィギュアスケートにもぴったり! ハチャトゥリアン作曲の『仮面舞踏会』【クラシック今日は何の日?】
    2024-06-06

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

    美しくて“かわいい”結びの技  1400年の歴史を誇る「水引」の可能性を探って
    2024-06-06

    ©  Dopu Box
    💛