6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

C言語Advent Calendar 2018

Day 10

C言語でmakeのいろいろ

Last updated at Posted at 2018-12-09

概要

makeファイルについてのまとめ

makeとは

makeは主にCやC++などのコンパイル型言語で記述されたプログラムを用意にビルドするためのツール。
「$ gcc -Wall -I../common/ -I. -DUTIL -g」とか毎回記述するのが面倒なので一つのコマンドでビルドを実行します。
最近ネットで見たのですがGolangでも良く使われているようですね。

面白い記事を見たので紹介します。
Golang を使うなら Makefile を恐れるな

GNU Makeのサイト
https://www.gnu.org/software/make/

makeを使ってみる

今回使用しているバージョンは下記です。
macならデフォルトで入ってます。

$ make --version
GNU Make 3.81

基本情報

Makefileの基本形は下記の通り。
インデントは、スペースではなく、必ずタブにしてください

[変数名] = 値
[作りたいもの]: [材料]
(-----TAB-----) [作り方]

makeを試す

先ずは一つのファイルのコンパイルとバイナリ削除までを試します。
ソースは以下。

hello.c
#include <stdio.h>

int main(int argc, char **argv)
{
        fprintf(stdout, "Hello World!\n");
        return 0;
}

これをコンパイルしたりバイナリ削除したりするのはまだ容易です。
本領を発揮するのはまだですがそこまではとりあえず基本。

Makefile
CC = /usr/bin/gcc

hello:
        $(CC) -o hello hello.c -g

clean:
        rm -f hello

上記ファイルを元にmakeを実行してみます。
今回はターゲット名にhelloと記載したので「make hello」として実行します。

$ make hello
/usr/bin/gcc -o hello hello.c
$ ls
Makefile  hello  hello.c
$ make clean
rm -f hello
$ ls
Makefile  hello.c

次は複数ファイル同時にコンパイルとバイナリ削除の例です。
ターゲット名をallとしています。
またここでソースごとにオプションを書くのが面倒ってことでオプションをCFLAGSに代入してます。

CC = /usr/bin/gcc
CFLAGS = -O4 -Wall -I/usr/local/include

all:
        $(CC) $(CFLAGS) -o hello1 hello1.c -g
        $(CC) $(CFLAGS) -o hello2 hello2.c -g

clean:
        rm -f hello1 hello2

自動変数

Makefileには文字数を減らすための仕組み自動変数がある。

変数名 説明
"$@" ターゲットファイル名
"$%" ターゲットがアーカイブメンバだったときのターゲットメンバ名
"$<" 最初の依存するファイルの名前
"$?" ターゲットより新しいすべての依存するファイル名
"$^" すべての依存するファイルの名前
"$+" Makefileと同じ順番の依存するファイルの名前
"$*" サフィックスを除いたターゲットの名前
6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?