Skip to content

Instantly share code, notes, and snippets.

@devlights
Last active February 11, 2025 06:20
Show Gist options
  • Save devlights/16a96258d3859b9d25876a536d07d4dd to your computer and use it in GitHub Desktop.
Save devlights/16a96258d3859b9d25876a536d07d4dd to your computer and use it in GitHub Desktop.
C言語でサンプル作る際のMakefile
TIMESTAMP := $(shell date "+%Y%m%d%H%M%S")
THIS_FILE := $(CURDIR)/$(firstword $(MAKEFILE_LIST))
SRCDIR := $(CURDIR)
DESTDIR := $(CURDIR)
PROGRAM := app
PROGRAM_PATH := $(DESTDIR)/$(PROGRAM)
EXT_SRCS :=
SRCS := $(shell find $(CURDIR) -name '*.c' -type f) $(EXT_SRCS)
EXT_INCDIRS :=
INCDIRS := $(shell find $(CURDIR) -type f -name '*.h' -exec dirname {} \; | sort | uniq) $(EXT_INCDIRS)
OBJS := $(SRCS:%.c=%.o)
DEPS := $(SRCS:%.c=%.d)
CC ?= clang
CMN_CFLAGS := -Wall -Wextra -Werror -std=c17
CFLAGS += -g3 -O0 $(CMN_CFLAGS) --coverage
RELEASE_FLAGS = -O2 -DNDEBUG $(CMN_CFLAGS)
EXT_LDFLAGS :=
LDFLAGS := $(shell find $(CURDIR) -type f -name '*.so' -exec dirname {} \; | sort | uniq) $(EXT_LDFLAGS)
EXT_LDLIBS :=
LDLIBS := $(patsubst lib%.so,%,$(notdir $(shell find $(CURDIR) -type f -name 'lib*.so'))) $(EXT_LDLIBS)
all: run ## デフォルトタスク (run)
debug:
@echo SRCS=$(SRCS)
@echo INCDIRS=$(INCDIRS)
clean: ## 成果物をクリアします
$(RM) $(OBJS) $(DEPS) $(PROGRAM_PATH) *.gcno *.gcda *.gcov
run: build ## 実行します
@$(PROGRAM_PATH)
pre-build:
build: pre-build $(PROGRAM) ## 成果物をビルドします (-g3 -O0)
pre-release:
release: CFLAGS = $(RELEASE_FLAGS)
release: pre-release $(PROGRAM) ## リリースビルドします (-O2 -DNDEBUG)
install: build ## インストールします(生成物を所定の場所に配置など)
help: ## ヘルプを表示します
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(THIS_FILE) | \
awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
# 依存関係ファイルを生成し読み込み
# (ヘッダファイルが変更された場合に、それに依存するファイルが再コンパイルされるようにするため)
# (1)
%.d: %.c
$(CC) $(CFLAGS) -MM -MF $@ $< $(addprefix -I,$(INCDIRS))
# clean or help ターゲットが指定されていない場合のみ依存関係ファイルを include
# (2)
ifeq ($(filter clean help,$(MAKECMDGOALS)),)
-include $(DEPS)
endif
# コンパイルステップ
# (1)
%.o: %.c %.d
$(CC) $(CFLAGS) -c $< -o $@ $(addprefix -I,$(INCDIRS))
# (2)
$(OBJS): $(SRCS)
# (3)
$(PROGRAM): $(OBJS)
$(CC) $(CFLAGS) $(addprefix -L,$(LDFLAGS)) -o $(PROGRAM_PATH) $(OBJS) $(addprefix -l,$(LDLIBS))
.PHONY: all pre-build build pre-release release clean run help debug install
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment