メイクとメイクファイル.何ですか.



Makefile
Makefileは、プログラムを構築するためのレシピを含むテキストファイル(宣言的な設定ファイル群)です.通常はソースと同じディレクトリにあり、通常Makefileと呼ばれます.これらのコマンドの各々は、makefileで別々の規則でなければなりません.
多くの人がこのファイルを人気のリポジトリで見ましたが、覚えていないでしょう.
Linux

makeコマンドを実行するとMakefileやMakefileというMakefileスクリプトがカレントディレクトリで実行されます.
  • 新しいディレクトリを作成する
  • mkdir newDirectory
    
  • 新しいディレクトリ内のMakefileを作成する
  • touch/ vi Makefile 
    
  • 我々のケースで何かをタイプしてください
  • target: dependencies
            commands
    
    例:
    say_something:
                echo "Software Portability and Optimization is cool"                                                          
    
    

    複雑な依存関係( Source )
    より複雑なビルドには多くのターゲットと依存関係が含まれます.Cプログラムは、例えば、オブジェクトファイル(. o拡張)と呼ばれる中間ファイルにコンパイルできます.
    このシナリオを表示します
    3つのオブジェクトファイルがあります.
    ダブル.C、番号.Hとソース.コンパイルするには二重です.o
    ハーフ.C、番号.Hとソース.コンパイルするにはh :半分です.o
    ソース.Cはソースを作ります.o
    2つのバイナリターゲットがあります.
    ダブル.とソース.にリンクすることができます
    ハーフ.とソース.oは生産にリンクできます:半分
    これらの関係のためのmakefileは次のように書かれます:
    CC=cc
    CFLAGS=-O3
    
    all:         half double
    
    half:        half.o sauce.o
                 ${CC} ${CFLAGS} -o half half.o sauce.o
    
    double:      double.o sauce.o
                 ${CC} ${CFLAGS} -o double double.o sauce.o
    
    half.o:      half.c number.h
                 ${CC} ${CFLAGS} -c half.c
    
    double.o:    double.c number.h
                 ${CC} ${CFLAGS} -c double.c
    
    sauce.o:     sauce.c
                 ${CC} ${CFLAGS} -c sauce.c
    
    このmakefileについて注意する価値があるいくつかのことがあります.

    Variables are used for the name of the compiler and the compiler flags. This makes it very easy to change these values -- to use the gcc compiler, for example, the CC variable could simply be changed to gcc. If variables were not used, you would have to change every line that invoked the compiler.
    all is a dummy target. Since it appears as the first target in the file, it is executed by default if no target is specified as an argument to the make command. It depends on the half and double files, which will be built in order to satisfy the dependency. However, the all target does not specify any commands, and the file all will never be built.


    makeを最初に実行すると、5つのコンパイルが行われます.
    $ make
    cc         -O3 -c half.c
    cc         -O3 -c sauce.c
    cc         -O3 -o half half.o sauce.o
    cc         -O3 -c double.c
    cc         -O3 -o double double.o sauce.
    
    コマンドがファイルに現れる順序で実行されていないことに注意してください--代わりに、それらは依存性に従って命じられます.
    2回目を実行するとコンパイルは行われません.
    $ make
    make: Nothing to be done for 'all'.
    
    ファイルが半分ならば.Cが編集されたか、最後に修正されたタイムスタンプ( mtime )が更新され、makeを実行すると2つのコンパイルが実行されます.
    $ touch half.c
    $ make
    cc         -O3 -c half.c
    cc         -O3 -o half half.o sauce.o
    
    これはmakeのパワーを明らかにします--指定されたターゲットを構築するために絶対最小値を行います.
    大きなプログラミングプロジェクトでは、バイナリは何百または何千ものソースファイルから成り、それらのファイルのすべてをコンパイルすることは時間がかかるかもしれません.ソフトウェア開発者がちょうど1つのファイルを編集するならば、それはすべてを再構築するために時間の浪費です.

    偽の目標
    Makefileでは“偽”ターゲットを含めるのは珍しいことではありません.例えば、“ALL”のターゲットは“ALL”という名前の実際のファイルを生成しません.典型的な偽のターゲットには以下があります.

    all: build all binaries
    docs: builts all documentation (e.g., generates PDFs, HTML, manpages, etc)
    install: install all files, building binaries, documentation, etc if required
    clean: erases all built intermediate and binary files
    dist-clean (or distclean): erases all files not included in the original distribution of the source
    check (or test): tests the software


    コマンドコマンドが失敗するとすぐにmakeコマンドが終了します.したがって、致命的に失敗する可能性がある偽のターゲットは通常成功コードを返すことを強制されます例えば、「きれいな」ターゲットの一部として存在するか、存在しないかもしれないファイルを削除するには、このようなコードを使用することができます.
    rm *.o || true
    

    結論
    ⚠️ コンピュータ建築ブログ

    リンク
    🖇 GitHubで私について来てください
    🖇 フォローミーオン
    私のソフトウェアの移植性と最適化のクラスのために作られました.