Linuxコマンド - Make

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

Makeコマンドは、ソフトウェア開発やシステム管理において重要なツールである。
主な目的は、大規模なプログラムやプロジェクトのビルドプロセスを自動化して、効率化することである。

Makeの中核となるのは、Makefileと呼ばれる特殊なファイルである。
Makefileファイルには、プロジェクトのビルドに必要な一連の指示が記述されている。
例えば、ソースコードのコンパイル方法、リンク方法、実行ファイルの生成方法等が含まれている。

Makeの動作原理は、ファイル間の依存関係に基づいている。
Makefileには、ターゲットとその依存関係、そのターゲットを生成するためのコマンドが記述されている。
Makeは、これらの依存関係を解析して、必要に応じて更新されたファイルのみを再ビルドする。
これにより、不要な再コンパイルを避け、ビルド時間を大幅に短縮することができる。

Makeのメリットは、複雑なビルドプロセスを簡略化できることである。
大規模なプロジェクトでは、数百から数千のソースファイルが存在することがあるが、Makeを使用することによりこれらを効率的に管理できる。

また、Makefileを適切に設計することにより、クロスプラットフォームの開発、テスト、デプロイメント等も容易になる。

一方で、Makeの学習曲線はやや急である。
Makefileの構文や規則を理解して、効果的に使いこなすには時間と経験が必要である。
また、大規模で複雑なプロジェクトでは、Makefileの保守が難しくなる場合もある。

最近では、CMake、Gradle、Bazel等のより現代的なビルドツールも登場しているが、
Makeは依然として多くのプロジェクトで使用されており、特にUNIX系システムでは標準的なツールとして広く普及している。

Makeの基本的な使用方法は比較的単純であり、プロジェクトのルートディレクトリでmakeコマンドを実行するだけで、
Makefileに記述された一連のタスクが実行される。

また、make cleanコマンドのように特定のターゲットを指定して実行することもできる。


makeのインストール

多くのLinuxディストリビューションでは、標準でmakeがインストールされている。
もし、別途インストールする必要がある場合、ソースコードからmakeをインストールする。

GNUソフトウェアの公式Webサイトにアクセスして、makeのソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。

tar xf make-<バージョン>.tar.gz
cd make-<バージョン>


makeをビルドおよびインストールする。

mkdir build && cd build

../configure --prefix=<makeのインストールディレクトリ>
make -j $(nproc)
make install


~/.profileファイル等に、環境変数PATHを追記する。

vi ~/.profile


# ~/.profileファイル

export PATH="/<makeのインストールディレクトリ>/bin:$PATH"



Makeコマンドの基本

makeコマンドは、主にソースコードからプログラムをビルドする時に使用するツールである。
主に、ファイル間の依存関係を管理して、必要な部分のみを効率的に更新することにある。

makeコマンドの動作の中心となるのは、Makefileと呼ばれる設定ファイルである。
Makefileファイルには、ターゲット (生成したいファイルや実行したい操作)、依存関係、それらを生成するためのコマンドが記述されている。

基本的なMakefileファイルの構造を、以下に示す。

<ターゲット>: <依存ファイル>
   <コマンド>


以下の例では、簡単なC言語のプログラムをコンパイルするMakefileファイルである。

 program: main.o utils.o
    gcc -o program main.o utils.o
 
 main.o: main.c
    gcc -c main.c
 
 utils.o: utils.c
    gcc -c utils.c


makeコマンドを実行する時、Makefileファイルを読み取り、必要なファイルのみをコンパイルする。
例えば、main.cファイルのみを変更した場合は、makeコマンドはmain.oとprogramのみを再ビルドして、utils.oは再コンパイルしない。

また、makeコマンドには様々なオプションが存在する。

  • -f <ファイル名>
    特定のMakefileファイルを指定して実行する。
  • target
    特定のターゲットのみをビルドする。
  • -j <数値>
    <数値>個の並列ジョブを実行してビルドを高速化する。


makeコマンドのメリットは、大規模なプロジェクトでも効率的にビルドプロセスを管理できることである。
また、Makefileファイルを適切に設計することにより、クロスプラットフォーム開発、テスト、デプロイメント等も容易になる。

※注意
Makefileファイルのシンタックスは独特であり、特にタブとスペースの使い分けに注意が必要である。
また、複雑なプロジェクトではMakefileファイル自体が大きくなり、管理が難しくなることがある。


コンパイラの変更

コンパイラを指定する場合、一般的に使用されるオプションはCCGCCCXXCCX等があるが、
Makefileファイルを確認して、どの変数が使用されているか確認する必要がある。

Makefileファイルが定義に沿って記述されている場合、C言語コンパイラを指定する時はCC、C++コンパイラを指定する時はCXXを使用する。

make CC=<gccの実行ファイルのパス  例: $HOME/GCC/bin/gcc-13>
または
make CXX=<g++の実行ファイルのパス  例: $HOME/GCC/bin/g++-13>


また、configureコマンドを実行する時に指定することもできる。
configureコマンドは、生成されるMakefileファイルに対して、新しいCC値またはCXX値を自動的に組み込む。

./configure CC=<gccの実行ファイルのパス  例: $HOME/GCC/bin/gcc-13> --prefix=<インストールディレクトリ>
または
./configure CXX=<g++の実行ファイルのパス  例: $HOME/GCC/bin/g++-13> --prefix=<インストールディレクトリ>



インクルードディレクトリの変更

makeコマンドの実行時において、参照するライブラリとヘッダファイルを指定する場合、LDFLAGSオプションとCFLAGSオプションを付加する。

以下の例では、ホームディレクトリのlibディレクトリとincludeディレクトリを指定している。

make LDFLAGS="-L/home/<ユーザ名>/lib" CFLAGS="-I/home/<ユーザ名>/include"
または
make LDFLAGS="-L/home/<ユーザ名>/lib" CPPFLAGS="-I/home/<ユーザ名>/include"


インクルードディレクトリの設定を永続化する場合は、.profileファイルまたは.bashrcファイルに、以下の設定を追記する。

export C_INCLUDE_PATH=<C言語のインクルードディレクトリ>
export CPLUS_INCLUDE_PATH=<C++のインクルードディレクトリ>



インストールディレクトリの変更

make installコマンドの実行時において、パッケージ内部のディレクトリ構造を変更せずに別の場所にインストールする場合、DESTDIRオプションを付加する。
例えば、インストールしたパッケージをtarballにして、別のPCにコピーする場合等に使用する。

以下の例では、configureコマンドの実行時のプレフィックスとして/hogeディレクトリ、
make installコマンドでは、ホームディレクトリをインストール先のディレクトリとしてインストールしている。

これにより、インストールディレクトリは、/home/<ユーザ名>/hogeディレクトリなる。

./configure --prefix=/hoge
make -j $(nproc)
make DESTDIR=/home/<ユーザ名> install