• home
  • about
  • 全ての投稿
  • ソフトウェア・ハードウェアの設定のまとめ
  • 分析関連のまとめ
  • ヘルスケア関連のまとめ
  • 生涯学習関連のまとめ

makefile

date: 2022-07-05 excerpt: makefileの書き方

tag: C++makefilemake


makefileの書き方

概要

  • gnu makeでコンパイルのルールを記すフォーマット
  • 特徴
    • Makefileというファイル名になる
    • インデントは必ずタブになる
      • スペースは使用できない
  • ユースケース
    • コンパイルとビルド
    • エントリーポイントのスクリプトとして使えるように用いる等
  • 感想
    • 体系的な資料が少ない(難しい)

書き方

  • 変数
    • ファイルの先頭で行う
  • 環境変数の参照
    • $${FOO}のように参照する
  • ファイルの内容を表示しない
    • @をつけてスクリプトを書く
    • @をつけないと実行しているスクリプトがstdoutに表示される

各項目

  • TARGRT
    • 出力バイナリ名
  • SRCS, SOURCES
    • cppファイル
  • INCLUDES
    • hppファイル
  • LIBS
    • so, aファイル

例; 一般的なスクリプトとしての使い方

  • karabinerのファイルのスタティックリンクを作成する
cdir = $(shell pwd)
karabiner_config = $${HOME}/.config/karabiner/karabiner.json
all:
        @echo "this is insall script '$ make' で実行できます"
        @ln -s ./karabiner.json $(karabiner_config)
test:
        @echo "これはテストです '$ make test' で実行できます"

実行例

$ make
this is insall script '$ make' で実行できます
$ make test
これはテストです '$ make test' で実行できます

具体例; C++のコンパイル

# コンパイラ
CC = g++

# コンパイルオプション
CFLAGS = -std=c++20

# 実行ファイル名
TARGET = Sample

# コンパイル対象のソースコードを追加
SRCDIR = ./src
SRCS = src/ENTRYPOINT.cpp

# 出力するオブジェクトファイル名
OBJDIR = ./obj
OBJECTS = $(addprefix $(OBJDIR)/, $(notdir $(SRCS:.cpp=.o)))

# インクルードファイルのあるディレクトリパス
INCLUDE = -I./include

# ライブラリファイルのあるディレクトリパス
LIBDIR =

# 追加するライブラリファイル
LIBS =

# ターゲットファイル生成
$(TARGET): $(OBJECTS)
    $(CC) -o $@ $^ $(LIBDIR) $(LIBS)

$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
    -mkdir -p $(OBJDIR)
    $(CC) $(CFLAGS) $(INCLUDE) -o $@ -c $<

# "make all"で make cleanとmakeを同時に実施。
all: clean $(OBJECTS) $(TARGET)

# .oファイル、実行ファイル、.dファイルを削除
clean:
    -rm -f $(OBJECTS) $(TARGET) *.d

bitbucketに作成したC++のサンプルプロジェクト

  • makefile-example

参考

  • シンプルで応用の効くmakefileとその解説
  • Makefileの書き方


C++makefilemake Share Tweet