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