diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d855a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = test +TARGET = $(NAME).a +SUBDIR = + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d855a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = test +TARGET = $(NAME).a +SUBDIR = + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/README.md diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d855a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = test +TARGET = $(NAME).a +SUBDIR = + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/README.md diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..29eee10 --- /dev/null +++ b/config.mk @@ -0,0 +1,71 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + + + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + + + +# +# アーキテクチャ指定 +# +ARCH ?= x86_64 +# ARCH ?= aarch64 + + + +# +# クロスコンパイラ指定 +# +ifeq ($(strip $(ARCH)),aarch64) +CROSS_COMPILE = +else +CROSS_COMPILE = +endif + + + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (X==03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++14 + + + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + + + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + + + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += -lpthread -lrt + + + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d855a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = test +TARGET = $(NAME).a +SUBDIR = + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/README.md diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..29eee10 --- /dev/null +++ b/config.mk @@ -0,0 +1,71 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + + + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + + + +# +# アーキテクチャ指定 +# +ARCH ?= x86_64 +# ARCH ?= aarch64 + + + +# +# クロスコンパイラ指定 +# +ifeq ($(strip $(ARCH)),aarch64) +CROSS_COMPILE = +else +CROSS_COMPILE = +endif + + + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (X==03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++14 + + + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + + + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + + + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += -lpthread -lrt + + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..3cf2923 --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d855a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = test +TARGET = $(NAME).a +SUBDIR = + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/README.md diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..29eee10 --- /dev/null +++ b/config.mk @@ -0,0 +1,71 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + + + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + + + +# +# アーキテクチャ指定 +# +ARCH ?= x86_64 +# ARCH ?= aarch64 + + + +# +# クロスコンパイラ指定 +# +ifeq ($(strip $(ARCH)),aarch64) +CROSS_COMPILE = +else +CROSS_COMPILE = +endif + + + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (X==03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++14 + + + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + + + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + + + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += -lpthread -lrt + + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..3cf2923 --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif + diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..b35372c --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,78 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += ../include +DEFINE += -DUNITTEST +endif + + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + + +# ------------------------------------------------------------------------------ +# CFLAGS, CXXFLAGS, LDFLAGS 設定 +# ------------------------------------------------------------------------------ +CFLAGS += $(INCLUDES) +CFLAGS += $(C_VERSION) +CFLAGS += $(C_WARNING_OPTIONS) +CFLAGS += $(DEFINE) +CFLAGS += $(DEPENDS_OPTIONS) + +CXXFLAGS += $(INCLUDES) +CXXFLAGS += $(CXX_VERSION) +CXXFLAGS += $(CXX_WARNING_OPTIONS) +CXXFLAGS += $(DEFINE) +CXXFLAGS += $(DEPENDS_OPTIONS) + + + +ifeq ($(strip $(DEBUG)),) +# For Release +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# For Debug +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +endif + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d855a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = test +TARGET = $(NAME).a +SUBDIR = + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/README.md diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..29eee10 --- /dev/null +++ b/config.mk @@ -0,0 +1,71 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + + + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + + + +# +# アーキテクチャ指定 +# +ARCH ?= x86_64 +# ARCH ?= aarch64 + + + +# +# クロスコンパイラ指定 +# +ifeq ($(strip $(ARCH)),aarch64) +CROSS_COMPILE = +else +CROSS_COMPILE = +endif + + + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (X==03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++14 + + + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + + + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + + + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += -lpthread -lrt + + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..3cf2923 --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif + diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..b35372c --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,78 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += ../include +DEFINE += -DUNITTEST +endif + + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + + +# ------------------------------------------------------------------------------ +# CFLAGS, CXXFLAGS, LDFLAGS 設定 +# ------------------------------------------------------------------------------ +CFLAGS += $(INCLUDES) +CFLAGS += $(C_VERSION) +CFLAGS += $(C_WARNING_OPTIONS) +CFLAGS += $(DEFINE) +CFLAGS += $(DEPENDS_OPTIONS) + +CXXFLAGS += $(INCLUDES) +CXXFLAGS += $(CXX_VERSION) +CXXFLAGS += $(CXX_WARNING_OPTIONS) +CXXFLAGS += $(DEFINE) +CXXFLAGS += $(DEPENDS_OPTIONS) + + + +ifeq ($(strip $(DEBUG)),) +# For Release +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# For Debug +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +endif + diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..b0c78de --- /dev/null +++ b/mk/base-cmd.mk @@ -0,0 +1,49 @@ +# ============================================================================== +# コマンド設定 +# ============================================================================== +AWK = awk +CAT = cat +CHMOD = chmod +CHOWN = chown +CP = cp +CPPCHECK = cppcheck +DATE = date +DOXYGEN = doxygen +ECHO = echo +GIT = git +GREP = grep +HEAD = head +INSTALL = install +KILL = kill +LS = ls +LN = ln +MAKE = make +MKDIR = mkdir +MKNOD = mknod +MV = mv +RM = rm +RMDIR = rmdir +PS = ps +PWD = pwd +SED = sed +SORT = sort +TAIL = tail +TAR = tar +TOUCH = touch + +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +RANLIB = $(CROSS_COMPILE)ranlib +ADDR2LINE = $(CROSS_COMPILE)addr2line +AR = $(CROSS_COMPILE)ar +AS = $(CROSS_COMPILE)as +CPP = $(CROSS_COMPILE)cpp +GCOV = $(CROSS_COMPILE)gcov +GDB = $(CROSS_COMPILE)gdb +LD = $(CROSS_COMPILE)ld +NM = $(CROSS_COMPILE)nm +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump +READELF = $(CROSS_COMPILE)readelf +STRIP = $(CROSS_COMPILE)strip + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d855a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = test +TARGET = $(NAME).a +SUBDIR = + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/README.md diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..29eee10 --- /dev/null +++ b/config.mk @@ -0,0 +1,71 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + + + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + + + +# +# アーキテクチャ指定 +# +ARCH ?= x86_64 +# ARCH ?= aarch64 + + + +# +# クロスコンパイラ指定 +# +ifeq ($(strip $(ARCH)),aarch64) +CROSS_COMPILE = +else +CROSS_COMPILE = +endif + + + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (X==03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++14 + + + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + + + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + + + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += -lpthread -lrt + + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..3cf2923 --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif + diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..b35372c --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,78 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += ../include +DEFINE += -DUNITTEST +endif + + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + + +# ------------------------------------------------------------------------------ +# CFLAGS, CXXFLAGS, LDFLAGS 設定 +# ------------------------------------------------------------------------------ +CFLAGS += $(INCLUDES) +CFLAGS += $(C_VERSION) +CFLAGS += $(C_WARNING_OPTIONS) +CFLAGS += $(DEFINE) +CFLAGS += $(DEPENDS_OPTIONS) + +CXXFLAGS += $(INCLUDES) +CXXFLAGS += $(CXX_VERSION) +CXXFLAGS += $(CXX_WARNING_OPTIONS) +CXXFLAGS += $(DEFINE) +CXXFLAGS += $(DEPENDS_OPTIONS) + + + +ifeq ($(strip $(DEBUG)),) +# For Release +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# For Debug +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +endif + diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..b0c78de --- /dev/null +++ b/mk/base-cmd.mk @@ -0,0 +1,49 @@ +# ============================================================================== +# コマンド設定 +# ============================================================================== +AWK = awk +CAT = cat +CHMOD = chmod +CHOWN = chown +CP = cp +CPPCHECK = cppcheck +DATE = date +DOXYGEN = doxygen +ECHO = echo +GIT = git +GREP = grep +HEAD = head +INSTALL = install +KILL = kill +LS = ls +LN = ln +MAKE = make +MKDIR = mkdir +MKNOD = mknod +MV = mv +RM = rm +RMDIR = rmdir +PS = ps +PWD = pwd +SED = sed +SORT = sort +TAIL = tail +TAR = tar +TOUCH = touch + +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +RANLIB = $(CROSS_COMPILE)ranlib +ADDR2LINE = $(CROSS_COMPILE)addr2line +AR = $(CROSS_COMPILE)ar +AS = $(CROSS_COMPILE)as +CPP = $(CROSS_COMPILE)cpp +GCOV = $(CROSS_COMPILE)gcov +GDB = $(CROSS_COMPILE)gdb +LD = $(CROSS_COMPILE)ld +NM = $(CROSS_COMPILE)nm +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump +READELF = $(CROSS_COMPILE)readelf +STRIP = $(CROSS_COMPILE)strip + diff --git a/mk/base-conf.mk b/mk/base-conf.mk new file mode 100644 index 0000000..64f0e24 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,89 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= + + + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -O0 最適化無効。 +# -O1 速度最適化(低)。 +# -O2 速度最適化(中)[推奨]。 +# -O3 速度最適化(高)。 +# -Os サイズ最適化。 +# その他のフラグについては、gcc のヘルプを参照ください。 +# ------------------------------------------------------------------------------ +OPTIMIZATION = -O2 + + + +# ------------------------------------------------------------------------------ +# ヘッダー依存関係出力 +# 基本的に変更しないでください。 +# +# -MMD +# コンパイル時に依存関係を .d ファイルに出力する。 +# -MP +# .d ファイルにヘッダファイル用のターゲットも出力する。 +# ------------------------------------------------------------------------------ +DEPENDS_OPTIONS = -MMD -MP + + + +# ------------------------------------------------------------------------------ +# 警告オプション +# -pedantic +# ANSI C/ISO C++ により要求される警告をすべて出力する。 +# gcc の HELP にも記載されている通り、基本的に使べきではありません。 +# -pedantic-errors +# 警告ではなくエラーが出力される点を除けば -pedantic と同様です。 +# -w +# すべての警告メッセージの出力を禁止します。 +# -Wall +# 基本的な警告オプションを有効にします。 +# -Wextra +# 追加の警告オプションを有効にします。 +# -Weffc++ +# Effective C++ による方針に沿わない記述に警告を出します。 +# ------------------------------------------------------------------------------ +C_WARNING_OPTIONS += -Wall -Wextra -Werror +CXX_WARNING_OPTIONS += -Wall -Wextra -Werror -Weffc++ + + + +# ------------------------------------------------------------------------------ +# デバッグ用オプション +# デバッグ、単体テストの際のオプションを指定します。 +# +# -fstack-protector スタック・オーバーフロー・セキュリティチェックを有効にします。 +# --coverage カバレッジ計測します。(-fprofile-arcs -ftest-coverage オプションと同じ) +# -g0 デバッグオプション無効。 +# -g1 最小限のデバッグ情報を生成します。 +# -g2 (-g) デバッグ情報を生成します。 +# -g3 マクロ定義を含んだデバッグ情報を生成します。 +# -ggdb gdb で使うためのデバッグ情報を生成します。 +# -D_FACTORY_SOURCE=[値] +# 文字列やメモリ操作を行う glibc の関数を使用する際に、バッファオーバーフローを検出します。 +# ※すべてのパターンではなく、よくある例についてのみ検出可能。 +# 値が1の場合、規格に準拠するプログラムの振る舞いを変化させないようなチェックが実行される。 +# 値が2の場合、さらなるチェックを追加するが、規格準拠のプログラムが失敗する可能性がある。 +# いくつかのチェックは、コンパイル時に実行され、コンパイラの警告として表示される。 +# ------------------------------------------------------------------------------ +DEBUG_OPTIONS += -fstack-protector +DEBUG_OPTIONS += --coverage +DEBUG_OPTIONS += -g3 -ggdb +DEBUG_OPTIONS += -O0 +DEBUG_OPTIONS += -D_FACTORY_SOURCE=2 +DEBUG_OPTIONS += -D_DEBUG + +DEBUG_LDFLAGS += --coverage +DEBUG_LDFLAGS += -g3 -ggdb + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d855a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = test +TARGET = $(NAME).a +SUBDIR = + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/README.md diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..29eee10 --- /dev/null +++ b/config.mk @@ -0,0 +1,71 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + + + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + + + +# +# アーキテクチャ指定 +# +ARCH ?= x86_64 +# ARCH ?= aarch64 + + + +# +# クロスコンパイラ指定 +# +ifeq ($(strip $(ARCH)),aarch64) +CROSS_COMPILE = +else +CROSS_COMPILE = +endif + + + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (X==03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++14 + + + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + + + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + + + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += -lpthread -lrt + + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..3cf2923 --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif + diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..b35372c --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,78 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += ../include +DEFINE += -DUNITTEST +endif + + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + + +# ------------------------------------------------------------------------------ +# CFLAGS, CXXFLAGS, LDFLAGS 設定 +# ------------------------------------------------------------------------------ +CFLAGS += $(INCLUDES) +CFLAGS += $(C_VERSION) +CFLAGS += $(C_WARNING_OPTIONS) +CFLAGS += $(DEFINE) +CFLAGS += $(DEPENDS_OPTIONS) + +CXXFLAGS += $(INCLUDES) +CXXFLAGS += $(CXX_VERSION) +CXXFLAGS += $(CXX_WARNING_OPTIONS) +CXXFLAGS += $(DEFINE) +CXXFLAGS += $(DEPENDS_OPTIONS) + + + +ifeq ($(strip $(DEBUG)),) +# For Release +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# For Debug +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +endif + diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..b0c78de --- /dev/null +++ b/mk/base-cmd.mk @@ -0,0 +1,49 @@ +# ============================================================================== +# コマンド設定 +# ============================================================================== +AWK = awk +CAT = cat +CHMOD = chmod +CHOWN = chown +CP = cp +CPPCHECK = cppcheck +DATE = date +DOXYGEN = doxygen +ECHO = echo +GIT = git +GREP = grep +HEAD = head +INSTALL = install +KILL = kill +LS = ls +LN = ln +MAKE = make +MKDIR = mkdir +MKNOD = mknod +MV = mv +RM = rm +RMDIR = rmdir +PS = ps +PWD = pwd +SED = sed +SORT = sort +TAIL = tail +TAR = tar +TOUCH = touch + +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +RANLIB = $(CROSS_COMPILE)ranlib +ADDR2LINE = $(CROSS_COMPILE)addr2line +AR = $(CROSS_COMPILE)ar +AS = $(CROSS_COMPILE)as +CPP = $(CROSS_COMPILE)cpp +GCOV = $(CROSS_COMPILE)gcov +GDB = $(CROSS_COMPILE)gdb +LD = $(CROSS_COMPILE)ld +NM = $(CROSS_COMPILE)nm +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump +READELF = $(CROSS_COMPILE)readelf +STRIP = $(CROSS_COMPILE)strip + diff --git a/mk/base-conf.mk b/mk/base-conf.mk new file mode 100644 index 0000000..64f0e24 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,89 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= + + + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -O0 最適化無効。 +# -O1 速度最適化(低)。 +# -O2 速度最適化(中)[推奨]。 +# -O3 速度最適化(高)。 +# -Os サイズ最適化。 +# その他のフラグについては、gcc のヘルプを参照ください。 +# ------------------------------------------------------------------------------ +OPTIMIZATION = -O2 + + + +# ------------------------------------------------------------------------------ +# ヘッダー依存関係出力 +# 基本的に変更しないでください。 +# +# -MMD +# コンパイル時に依存関係を .d ファイルに出力する。 +# -MP +# .d ファイルにヘッダファイル用のターゲットも出力する。 +# ------------------------------------------------------------------------------ +DEPENDS_OPTIONS = -MMD -MP + + + +# ------------------------------------------------------------------------------ +# 警告オプション +# -pedantic +# ANSI C/ISO C++ により要求される警告をすべて出力する。 +# gcc の HELP にも記載されている通り、基本的に使べきではありません。 +# -pedantic-errors +# 警告ではなくエラーが出力される点を除けば -pedantic と同様です。 +# -w +# すべての警告メッセージの出力を禁止します。 +# -Wall +# 基本的な警告オプションを有効にします。 +# -Wextra +# 追加の警告オプションを有効にします。 +# -Weffc++ +# Effective C++ による方針に沿わない記述に警告を出します。 +# ------------------------------------------------------------------------------ +C_WARNING_OPTIONS += -Wall -Wextra -Werror +CXX_WARNING_OPTIONS += -Wall -Wextra -Werror -Weffc++ + + + +# ------------------------------------------------------------------------------ +# デバッグ用オプション +# デバッグ、単体テストの際のオプションを指定します。 +# +# -fstack-protector スタック・オーバーフロー・セキュリティチェックを有効にします。 +# --coverage カバレッジ計測します。(-fprofile-arcs -ftest-coverage オプションと同じ) +# -g0 デバッグオプション無効。 +# -g1 最小限のデバッグ情報を生成します。 +# -g2 (-g) デバッグ情報を生成します。 +# -g3 マクロ定義を含んだデバッグ情報を生成します。 +# -ggdb gdb で使うためのデバッグ情報を生成します。 +# -D_FACTORY_SOURCE=[値] +# 文字列やメモリ操作を行う glibc の関数を使用する際に、バッファオーバーフローを検出します。 +# ※すべてのパターンではなく、よくある例についてのみ検出可能。 +# 値が1の場合、規格に準拠するプログラムの振る舞いを変化させないようなチェックが実行される。 +# 値が2の場合、さらなるチェックを追加するが、規格準拠のプログラムが失敗する可能性がある。 +# いくつかのチェックは、コンパイル時に実行され、コンパイラの警告として表示される。 +# ------------------------------------------------------------------------------ +DEBUG_OPTIONS += -fstack-protector +DEBUG_OPTIONS += --coverage +DEBUG_OPTIONS += -g3 -ggdb +DEBUG_OPTIONS += -O0 +DEBUG_OPTIONS += -D_FACTORY_SOURCE=2 +DEBUG_OPTIONS += -D_DEBUG + +DEBUG_LDFLAGS += --coverage +DEBUG_LDFLAGS += -g3 -ggdb + diff --git a/mk/check-cppcheck-conf.mk b/mk/check-cppcheck-conf.mk new file mode 100644 index 0000000..ca3db60 --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,36 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPHECK_REPORT_DIR = report/cppcheck +CPPCHECK_LOG = $(CPPCHECK_REPORT_DIR)/cppcheck.xml + + + +# ------------------------------------------------------------------------------ +# 警告抑止 +# ------------------------------------------------------------------------------ +# 次の警告を抑止します。 +# - システムヘッダー読み込み失敗 (読み込むと非常に時間がかかります。) +# - 未使用関数 (チェック単位が異なり、public な関数が呼び出されないと誤検知する) +CPPCHECK_SUPPRESS = --suppress=missingIncludeSystem +CPPCHECK_SUPPRESS += --suppress=unusedFunction + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(CPPCHECK_REPORT_DIR) +endif +endif + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d855a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = test +TARGET = $(NAME).a +SUBDIR = + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/README.md diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..29eee10 --- /dev/null +++ b/config.mk @@ -0,0 +1,71 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + + + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + + + +# +# アーキテクチャ指定 +# +ARCH ?= x86_64 +# ARCH ?= aarch64 + + + +# +# クロスコンパイラ指定 +# +ifeq ($(strip $(ARCH)),aarch64) +CROSS_COMPILE = +else +CROSS_COMPILE = +endif + + + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (X==03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++14 + + + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + + + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + + + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += -lpthread -lrt + + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..3cf2923 --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif + diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..b35372c --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,78 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += ../include +DEFINE += -DUNITTEST +endif + + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + + +# ------------------------------------------------------------------------------ +# CFLAGS, CXXFLAGS, LDFLAGS 設定 +# ------------------------------------------------------------------------------ +CFLAGS += $(INCLUDES) +CFLAGS += $(C_VERSION) +CFLAGS += $(C_WARNING_OPTIONS) +CFLAGS += $(DEFINE) +CFLAGS += $(DEPENDS_OPTIONS) + +CXXFLAGS += $(INCLUDES) +CXXFLAGS += $(CXX_VERSION) +CXXFLAGS += $(CXX_WARNING_OPTIONS) +CXXFLAGS += $(DEFINE) +CXXFLAGS += $(DEPENDS_OPTIONS) + + + +ifeq ($(strip $(DEBUG)),) +# For Release +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# For Debug +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +endif + diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..b0c78de --- /dev/null +++ b/mk/base-cmd.mk @@ -0,0 +1,49 @@ +# ============================================================================== +# コマンド設定 +# ============================================================================== +AWK = awk +CAT = cat +CHMOD = chmod +CHOWN = chown +CP = cp +CPPCHECK = cppcheck +DATE = date +DOXYGEN = doxygen +ECHO = echo +GIT = git +GREP = grep +HEAD = head +INSTALL = install +KILL = kill +LS = ls +LN = ln +MAKE = make +MKDIR = mkdir +MKNOD = mknod +MV = mv +RM = rm +RMDIR = rmdir +PS = ps +PWD = pwd +SED = sed +SORT = sort +TAIL = tail +TAR = tar +TOUCH = touch + +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +RANLIB = $(CROSS_COMPILE)ranlib +ADDR2LINE = $(CROSS_COMPILE)addr2line +AR = $(CROSS_COMPILE)ar +AS = $(CROSS_COMPILE)as +CPP = $(CROSS_COMPILE)cpp +GCOV = $(CROSS_COMPILE)gcov +GDB = $(CROSS_COMPILE)gdb +LD = $(CROSS_COMPILE)ld +NM = $(CROSS_COMPILE)nm +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump +READELF = $(CROSS_COMPILE)readelf +STRIP = $(CROSS_COMPILE)strip + diff --git a/mk/base-conf.mk b/mk/base-conf.mk new file mode 100644 index 0000000..64f0e24 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,89 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= + + + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -O0 最適化無効。 +# -O1 速度最適化(低)。 +# -O2 速度最適化(中)[推奨]。 +# -O3 速度最適化(高)。 +# -Os サイズ最適化。 +# その他のフラグについては、gcc のヘルプを参照ください。 +# ------------------------------------------------------------------------------ +OPTIMIZATION = -O2 + + + +# ------------------------------------------------------------------------------ +# ヘッダー依存関係出力 +# 基本的に変更しないでください。 +# +# -MMD +# コンパイル時に依存関係を .d ファイルに出力する。 +# -MP +# .d ファイルにヘッダファイル用のターゲットも出力する。 +# ------------------------------------------------------------------------------ +DEPENDS_OPTIONS = -MMD -MP + + + +# ------------------------------------------------------------------------------ +# 警告オプション +# -pedantic +# ANSI C/ISO C++ により要求される警告をすべて出力する。 +# gcc の HELP にも記載されている通り、基本的に使べきではありません。 +# -pedantic-errors +# 警告ではなくエラーが出力される点を除けば -pedantic と同様です。 +# -w +# すべての警告メッセージの出力を禁止します。 +# -Wall +# 基本的な警告オプションを有効にします。 +# -Wextra +# 追加の警告オプションを有効にします。 +# -Weffc++ +# Effective C++ による方針に沿わない記述に警告を出します。 +# ------------------------------------------------------------------------------ +C_WARNING_OPTIONS += -Wall -Wextra -Werror +CXX_WARNING_OPTIONS += -Wall -Wextra -Werror -Weffc++ + + + +# ------------------------------------------------------------------------------ +# デバッグ用オプション +# デバッグ、単体テストの際のオプションを指定します。 +# +# -fstack-protector スタック・オーバーフロー・セキュリティチェックを有効にします。 +# --coverage カバレッジ計測します。(-fprofile-arcs -ftest-coverage オプションと同じ) +# -g0 デバッグオプション無効。 +# -g1 最小限のデバッグ情報を生成します。 +# -g2 (-g) デバッグ情報を生成します。 +# -g3 マクロ定義を含んだデバッグ情報を生成します。 +# -ggdb gdb で使うためのデバッグ情報を生成します。 +# -D_FACTORY_SOURCE=[値] +# 文字列やメモリ操作を行う glibc の関数を使用する際に、バッファオーバーフローを検出します。 +# ※すべてのパターンではなく、よくある例についてのみ検出可能。 +# 値が1の場合、規格に準拠するプログラムの振る舞いを変化させないようなチェックが実行される。 +# 値が2の場合、さらなるチェックを追加するが、規格準拠のプログラムが失敗する可能性がある。 +# いくつかのチェックは、コンパイル時に実行され、コンパイラの警告として表示される。 +# ------------------------------------------------------------------------------ +DEBUG_OPTIONS += -fstack-protector +DEBUG_OPTIONS += --coverage +DEBUG_OPTIONS += -g3 -ggdb +DEBUG_OPTIONS += -O0 +DEBUG_OPTIONS += -D_FACTORY_SOURCE=2 +DEBUG_OPTIONS += -D_DEBUG + +DEBUG_LDFLAGS += --coverage +DEBUG_LDFLAGS += -g3 -ggdb + diff --git a/mk/check-cppcheck-conf.mk b/mk/check-cppcheck-conf.mk new file mode 100644 index 0000000..ca3db60 --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,36 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPHECK_REPORT_DIR = report/cppcheck +CPPCHECK_LOG = $(CPPCHECK_REPORT_DIR)/cppcheck.xml + + + +# ------------------------------------------------------------------------------ +# 警告抑止 +# ------------------------------------------------------------------------------ +# 次の警告を抑止します。 +# - システムヘッダー読み込み失敗 (読み込むと非常に時間がかかります。) +# - 未使用関数 (チェック単位が異なり、public な関数が呼び出されないと誤検知する) +CPPCHECK_SUPPRESS = --suppress=missingIncludeSystem +CPPCHECK_SUPPRESS += --suppress=unusedFunction + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(CPPCHECK_REPORT_DIR) +endif +endif + diff --git a/mk/check-cppcheck-rule.mk b/mk/check-cppcheck-rule.mk new file mode 100644 index 0000000..a8420d3 --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) $(CPPCHECK_REPORT_DIR) + $(CPPCHECK) $(CPPCHECK_FLAGS) $(CPPCHECK_SUPPRESS) $(INCLUDES) $(SRCDIR) 2> $(CPPCHECK_LOG) +endif +endif + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d855a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = test +TARGET = $(NAME).a +SUBDIR = + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/README.md diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..29eee10 --- /dev/null +++ b/config.mk @@ -0,0 +1,71 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + + + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + + + +# +# アーキテクチャ指定 +# +ARCH ?= x86_64 +# ARCH ?= aarch64 + + + +# +# クロスコンパイラ指定 +# +ifeq ($(strip $(ARCH)),aarch64) +CROSS_COMPILE = +else +CROSS_COMPILE = +endif + + + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (X==03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++14 + + + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + + + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + + + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += -lpthread -lrt + + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..3cf2923 --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif + diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..b35372c --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,78 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += ../include +DEFINE += -DUNITTEST +endif + + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + + +# ------------------------------------------------------------------------------ +# CFLAGS, CXXFLAGS, LDFLAGS 設定 +# ------------------------------------------------------------------------------ +CFLAGS += $(INCLUDES) +CFLAGS += $(C_VERSION) +CFLAGS += $(C_WARNING_OPTIONS) +CFLAGS += $(DEFINE) +CFLAGS += $(DEPENDS_OPTIONS) + +CXXFLAGS += $(INCLUDES) +CXXFLAGS += $(CXX_VERSION) +CXXFLAGS += $(CXX_WARNING_OPTIONS) +CXXFLAGS += $(DEFINE) +CXXFLAGS += $(DEPENDS_OPTIONS) + + + +ifeq ($(strip $(DEBUG)),) +# For Release +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# For Debug +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +endif + diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..b0c78de --- /dev/null +++ b/mk/base-cmd.mk @@ -0,0 +1,49 @@ +# ============================================================================== +# コマンド設定 +# ============================================================================== +AWK = awk +CAT = cat +CHMOD = chmod +CHOWN = chown +CP = cp +CPPCHECK = cppcheck +DATE = date +DOXYGEN = doxygen +ECHO = echo +GIT = git +GREP = grep +HEAD = head +INSTALL = install +KILL = kill +LS = ls +LN = ln +MAKE = make +MKDIR = mkdir +MKNOD = mknod +MV = mv +RM = rm +RMDIR = rmdir +PS = ps +PWD = pwd +SED = sed +SORT = sort +TAIL = tail +TAR = tar +TOUCH = touch + +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +RANLIB = $(CROSS_COMPILE)ranlib +ADDR2LINE = $(CROSS_COMPILE)addr2line +AR = $(CROSS_COMPILE)ar +AS = $(CROSS_COMPILE)as +CPP = $(CROSS_COMPILE)cpp +GCOV = $(CROSS_COMPILE)gcov +GDB = $(CROSS_COMPILE)gdb +LD = $(CROSS_COMPILE)ld +NM = $(CROSS_COMPILE)nm +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump +READELF = $(CROSS_COMPILE)readelf +STRIP = $(CROSS_COMPILE)strip + diff --git a/mk/base-conf.mk b/mk/base-conf.mk new file mode 100644 index 0000000..64f0e24 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,89 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= + + + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -O0 最適化無効。 +# -O1 速度最適化(低)。 +# -O2 速度最適化(中)[推奨]。 +# -O3 速度最適化(高)。 +# -Os サイズ最適化。 +# その他のフラグについては、gcc のヘルプを参照ください。 +# ------------------------------------------------------------------------------ +OPTIMIZATION = -O2 + + + +# ------------------------------------------------------------------------------ +# ヘッダー依存関係出力 +# 基本的に変更しないでください。 +# +# -MMD +# コンパイル時に依存関係を .d ファイルに出力する。 +# -MP +# .d ファイルにヘッダファイル用のターゲットも出力する。 +# ------------------------------------------------------------------------------ +DEPENDS_OPTIONS = -MMD -MP + + + +# ------------------------------------------------------------------------------ +# 警告オプション +# -pedantic +# ANSI C/ISO C++ により要求される警告をすべて出力する。 +# gcc の HELP にも記載されている通り、基本的に使べきではありません。 +# -pedantic-errors +# 警告ではなくエラーが出力される点を除けば -pedantic と同様です。 +# -w +# すべての警告メッセージの出力を禁止します。 +# -Wall +# 基本的な警告オプションを有効にします。 +# -Wextra +# 追加の警告オプションを有効にします。 +# -Weffc++ +# Effective C++ による方針に沿わない記述に警告を出します。 +# ------------------------------------------------------------------------------ +C_WARNING_OPTIONS += -Wall -Wextra -Werror +CXX_WARNING_OPTIONS += -Wall -Wextra -Werror -Weffc++ + + + +# ------------------------------------------------------------------------------ +# デバッグ用オプション +# デバッグ、単体テストの際のオプションを指定します。 +# +# -fstack-protector スタック・オーバーフロー・セキュリティチェックを有効にします。 +# --coverage カバレッジ計測します。(-fprofile-arcs -ftest-coverage オプションと同じ) +# -g0 デバッグオプション無効。 +# -g1 最小限のデバッグ情報を生成します。 +# -g2 (-g) デバッグ情報を生成します。 +# -g3 マクロ定義を含んだデバッグ情報を生成します。 +# -ggdb gdb で使うためのデバッグ情報を生成します。 +# -D_FACTORY_SOURCE=[値] +# 文字列やメモリ操作を行う glibc の関数を使用する際に、バッファオーバーフローを検出します。 +# ※すべてのパターンではなく、よくある例についてのみ検出可能。 +# 値が1の場合、規格に準拠するプログラムの振る舞いを変化させないようなチェックが実行される。 +# 値が2の場合、さらなるチェックを追加するが、規格準拠のプログラムが失敗する可能性がある。 +# いくつかのチェックは、コンパイル時に実行され、コンパイラの警告として表示される。 +# ------------------------------------------------------------------------------ +DEBUG_OPTIONS += -fstack-protector +DEBUG_OPTIONS += --coverage +DEBUG_OPTIONS += -g3 -ggdb +DEBUG_OPTIONS += -O0 +DEBUG_OPTIONS += -D_FACTORY_SOURCE=2 +DEBUG_OPTIONS += -D_DEBUG + +DEBUG_LDFLAGS += --coverage +DEBUG_LDFLAGS += -g3 -ggdb + diff --git a/mk/check-cppcheck-conf.mk b/mk/check-cppcheck-conf.mk new file mode 100644 index 0000000..ca3db60 --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,36 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPHECK_REPORT_DIR = report/cppcheck +CPPCHECK_LOG = $(CPPCHECK_REPORT_DIR)/cppcheck.xml + + + +# ------------------------------------------------------------------------------ +# 警告抑止 +# ------------------------------------------------------------------------------ +# 次の警告を抑止します。 +# - システムヘッダー読み込み失敗 (読み込むと非常に時間がかかります。) +# - 未使用関数 (チェック単位が異なり、public な関数が呼び出されないと誤検知する) +CPPCHECK_SUPPRESS = --suppress=missingIncludeSystem +CPPCHECK_SUPPRESS += --suppress=unusedFunction + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(CPPCHECK_REPORT_DIR) +endif +endif + diff --git a/mk/check-cppcheck-rule.mk b/mk/check-cppcheck-rule.mk new file mode 100644 index 0000000..a8420d3 --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) $(CPPCHECK_REPORT_DIR) + $(CPPCHECK) $(CPPCHECK_FLAGS) $(CPPCHECK_SUPPRESS) $(INCLUDES) $(SRCDIR) 2> $(CPPCHECK_LOG) +endif +endif + diff --git a/mk/check-lcov-cobertura-conf.mk b/mk/check-lcov-cobertura-conf.mk new file mode 100644 index 0000000..8ca940f --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,13 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura.py +LCOV_COBERTURA_REPORT_DIR = report/lcov +LCOV_COBERTURA_INFO = $(LCOV_COBERTURA_REPORT_DIR)/lcov.info + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d855a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = test +TARGET = $(NAME).a +SUBDIR = + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/README.md diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..29eee10 --- /dev/null +++ b/config.mk @@ -0,0 +1,71 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + + + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + + + +# +# アーキテクチャ指定 +# +ARCH ?= x86_64 +# ARCH ?= aarch64 + + + +# +# クロスコンパイラ指定 +# +ifeq ($(strip $(ARCH)),aarch64) +CROSS_COMPILE = +else +CROSS_COMPILE = +endif + + + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (X==03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++14 + + + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + + + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + + + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += -lpthread -lrt + + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..3cf2923 --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif + diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..b35372c --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,78 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += ../include +DEFINE += -DUNITTEST +endif + + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + + +# ------------------------------------------------------------------------------ +# CFLAGS, CXXFLAGS, LDFLAGS 設定 +# ------------------------------------------------------------------------------ +CFLAGS += $(INCLUDES) +CFLAGS += $(C_VERSION) +CFLAGS += $(C_WARNING_OPTIONS) +CFLAGS += $(DEFINE) +CFLAGS += $(DEPENDS_OPTIONS) + +CXXFLAGS += $(INCLUDES) +CXXFLAGS += $(CXX_VERSION) +CXXFLAGS += $(CXX_WARNING_OPTIONS) +CXXFLAGS += $(DEFINE) +CXXFLAGS += $(DEPENDS_OPTIONS) + + + +ifeq ($(strip $(DEBUG)),) +# For Release +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# For Debug +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +endif + diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..b0c78de --- /dev/null +++ b/mk/base-cmd.mk @@ -0,0 +1,49 @@ +# ============================================================================== +# コマンド設定 +# ============================================================================== +AWK = awk +CAT = cat +CHMOD = chmod +CHOWN = chown +CP = cp +CPPCHECK = cppcheck +DATE = date +DOXYGEN = doxygen +ECHO = echo +GIT = git +GREP = grep +HEAD = head +INSTALL = install +KILL = kill +LS = ls +LN = ln +MAKE = make +MKDIR = mkdir +MKNOD = mknod +MV = mv +RM = rm +RMDIR = rmdir +PS = ps +PWD = pwd +SED = sed +SORT = sort +TAIL = tail +TAR = tar +TOUCH = touch + +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +RANLIB = $(CROSS_COMPILE)ranlib +ADDR2LINE = $(CROSS_COMPILE)addr2line +AR = $(CROSS_COMPILE)ar +AS = $(CROSS_COMPILE)as +CPP = $(CROSS_COMPILE)cpp +GCOV = $(CROSS_COMPILE)gcov +GDB = $(CROSS_COMPILE)gdb +LD = $(CROSS_COMPILE)ld +NM = $(CROSS_COMPILE)nm +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump +READELF = $(CROSS_COMPILE)readelf +STRIP = $(CROSS_COMPILE)strip + diff --git a/mk/base-conf.mk b/mk/base-conf.mk new file mode 100644 index 0000000..64f0e24 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,89 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= + + + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -O0 最適化無効。 +# -O1 速度最適化(低)。 +# -O2 速度最適化(中)[推奨]。 +# -O3 速度最適化(高)。 +# -Os サイズ最適化。 +# その他のフラグについては、gcc のヘルプを参照ください。 +# ------------------------------------------------------------------------------ +OPTIMIZATION = -O2 + + + +# ------------------------------------------------------------------------------ +# ヘッダー依存関係出力 +# 基本的に変更しないでください。 +# +# -MMD +# コンパイル時に依存関係を .d ファイルに出力する。 +# -MP +# .d ファイルにヘッダファイル用のターゲットも出力する。 +# ------------------------------------------------------------------------------ +DEPENDS_OPTIONS = -MMD -MP + + + +# ------------------------------------------------------------------------------ +# 警告オプション +# -pedantic +# ANSI C/ISO C++ により要求される警告をすべて出力する。 +# gcc の HELP にも記載されている通り、基本的に使べきではありません。 +# -pedantic-errors +# 警告ではなくエラーが出力される点を除けば -pedantic と同様です。 +# -w +# すべての警告メッセージの出力を禁止します。 +# -Wall +# 基本的な警告オプションを有効にします。 +# -Wextra +# 追加の警告オプションを有効にします。 +# -Weffc++ +# Effective C++ による方針に沿わない記述に警告を出します。 +# ------------------------------------------------------------------------------ +C_WARNING_OPTIONS += -Wall -Wextra -Werror +CXX_WARNING_OPTIONS += -Wall -Wextra -Werror -Weffc++ + + + +# ------------------------------------------------------------------------------ +# デバッグ用オプション +# デバッグ、単体テストの際のオプションを指定します。 +# +# -fstack-protector スタック・オーバーフロー・セキュリティチェックを有効にします。 +# --coverage カバレッジ計測します。(-fprofile-arcs -ftest-coverage オプションと同じ) +# -g0 デバッグオプション無効。 +# -g1 最小限のデバッグ情報を生成します。 +# -g2 (-g) デバッグ情報を生成します。 +# -g3 マクロ定義を含んだデバッグ情報を生成します。 +# -ggdb gdb で使うためのデバッグ情報を生成します。 +# -D_FACTORY_SOURCE=[値] +# 文字列やメモリ操作を行う glibc の関数を使用する際に、バッファオーバーフローを検出します。 +# ※すべてのパターンではなく、よくある例についてのみ検出可能。 +# 値が1の場合、規格に準拠するプログラムの振る舞いを変化させないようなチェックが実行される。 +# 値が2の場合、さらなるチェックを追加するが、規格準拠のプログラムが失敗する可能性がある。 +# いくつかのチェックは、コンパイル時に実行され、コンパイラの警告として表示される。 +# ------------------------------------------------------------------------------ +DEBUG_OPTIONS += -fstack-protector +DEBUG_OPTIONS += --coverage +DEBUG_OPTIONS += -g3 -ggdb +DEBUG_OPTIONS += -O0 +DEBUG_OPTIONS += -D_FACTORY_SOURCE=2 +DEBUG_OPTIONS += -D_DEBUG + +DEBUG_LDFLAGS += --coverage +DEBUG_LDFLAGS += -g3 -ggdb + diff --git a/mk/check-cppcheck-conf.mk b/mk/check-cppcheck-conf.mk new file mode 100644 index 0000000..ca3db60 --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,36 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPHECK_REPORT_DIR = report/cppcheck +CPPCHECK_LOG = $(CPPCHECK_REPORT_DIR)/cppcheck.xml + + + +# ------------------------------------------------------------------------------ +# 警告抑止 +# ------------------------------------------------------------------------------ +# 次の警告を抑止します。 +# - システムヘッダー読み込み失敗 (読み込むと非常に時間がかかります。) +# - 未使用関数 (チェック単位が異なり、public な関数が呼び出されないと誤検知する) +CPPCHECK_SUPPRESS = --suppress=missingIncludeSystem +CPPCHECK_SUPPRESS += --suppress=unusedFunction + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(CPPCHECK_REPORT_DIR) +endif +endif + diff --git a/mk/check-cppcheck-rule.mk b/mk/check-cppcheck-rule.mk new file mode 100644 index 0000000..a8420d3 --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) $(CPPCHECK_REPORT_DIR) + $(CPPCHECK) $(CPPCHECK_FLAGS) $(CPPCHECK_SUPPRESS) $(INCLUDES) $(SRCDIR) 2> $(CPPCHECK_LOG) +endif +endif + diff --git a/mk/check-lcov-cobertura-conf.mk b/mk/check-lcov-cobertura-conf.mk new file mode 100644 index 0000000..8ca940f --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,13 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura.py +LCOV_COBERTURA_REPORT_DIR = report/lcov +LCOV_COBERTURA_INFO = $(LCOV_COBERTURA_REPORT_DIR)/lcov.info + diff --git a/mk/check-lcov-cobertura-rule.mk b/mk/check-lcov-cobertura-rule.mk new file mode 100644 index 0000000..110134d --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# lcov cobertura ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov-cobertura +lcov-cobertura: lcov + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov-cobertura -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(LCOV_COBERTURA) $(LCOV_COBERTURA_INFO) -b `pwd` -o $(LCOV_COBERTURA_REPORT_DIR)/lcov-coverage.xml +endif + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d855a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = test +TARGET = $(NAME).a +SUBDIR = + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/README.md diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..29eee10 --- /dev/null +++ b/config.mk @@ -0,0 +1,71 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + + + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + + + +# +# アーキテクチャ指定 +# +ARCH ?= x86_64 +# ARCH ?= aarch64 + + + +# +# クロスコンパイラ指定 +# +ifeq ($(strip $(ARCH)),aarch64) +CROSS_COMPILE = +else +CROSS_COMPILE = +endif + + + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (X==03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++14 + + + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + + + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + + + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += -lpthread -lrt + + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..3cf2923 --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif + diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..b35372c --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,78 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += ../include +DEFINE += -DUNITTEST +endif + + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + + +# ------------------------------------------------------------------------------ +# CFLAGS, CXXFLAGS, LDFLAGS 設定 +# ------------------------------------------------------------------------------ +CFLAGS += $(INCLUDES) +CFLAGS += $(C_VERSION) +CFLAGS += $(C_WARNING_OPTIONS) +CFLAGS += $(DEFINE) +CFLAGS += $(DEPENDS_OPTIONS) + +CXXFLAGS += $(INCLUDES) +CXXFLAGS += $(CXX_VERSION) +CXXFLAGS += $(CXX_WARNING_OPTIONS) +CXXFLAGS += $(DEFINE) +CXXFLAGS += $(DEPENDS_OPTIONS) + + + +ifeq ($(strip $(DEBUG)),) +# For Release +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# For Debug +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +endif + diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..b0c78de --- /dev/null +++ b/mk/base-cmd.mk @@ -0,0 +1,49 @@ +# ============================================================================== +# コマンド設定 +# ============================================================================== +AWK = awk +CAT = cat +CHMOD = chmod +CHOWN = chown +CP = cp +CPPCHECK = cppcheck +DATE = date +DOXYGEN = doxygen +ECHO = echo +GIT = git +GREP = grep +HEAD = head +INSTALL = install +KILL = kill +LS = ls +LN = ln +MAKE = make +MKDIR = mkdir +MKNOD = mknod +MV = mv +RM = rm +RMDIR = rmdir +PS = ps +PWD = pwd +SED = sed +SORT = sort +TAIL = tail +TAR = tar +TOUCH = touch + +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +RANLIB = $(CROSS_COMPILE)ranlib +ADDR2LINE = $(CROSS_COMPILE)addr2line +AR = $(CROSS_COMPILE)ar +AS = $(CROSS_COMPILE)as +CPP = $(CROSS_COMPILE)cpp +GCOV = $(CROSS_COMPILE)gcov +GDB = $(CROSS_COMPILE)gdb +LD = $(CROSS_COMPILE)ld +NM = $(CROSS_COMPILE)nm +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump +READELF = $(CROSS_COMPILE)readelf +STRIP = $(CROSS_COMPILE)strip + diff --git a/mk/base-conf.mk b/mk/base-conf.mk new file mode 100644 index 0000000..64f0e24 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,89 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= + + + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -O0 最適化無効。 +# -O1 速度最適化(低)。 +# -O2 速度最適化(中)[推奨]。 +# -O3 速度最適化(高)。 +# -Os サイズ最適化。 +# その他のフラグについては、gcc のヘルプを参照ください。 +# ------------------------------------------------------------------------------ +OPTIMIZATION = -O2 + + + +# ------------------------------------------------------------------------------ +# ヘッダー依存関係出力 +# 基本的に変更しないでください。 +# +# -MMD +# コンパイル時に依存関係を .d ファイルに出力する。 +# -MP +# .d ファイルにヘッダファイル用のターゲットも出力する。 +# ------------------------------------------------------------------------------ +DEPENDS_OPTIONS = -MMD -MP + + + +# ------------------------------------------------------------------------------ +# 警告オプション +# -pedantic +# ANSI C/ISO C++ により要求される警告をすべて出力する。 +# gcc の HELP にも記載されている通り、基本的に使べきではありません。 +# -pedantic-errors +# 警告ではなくエラーが出力される点を除けば -pedantic と同様です。 +# -w +# すべての警告メッセージの出力を禁止します。 +# -Wall +# 基本的な警告オプションを有効にします。 +# -Wextra +# 追加の警告オプションを有効にします。 +# -Weffc++ +# Effective C++ による方針に沿わない記述に警告を出します。 +# ------------------------------------------------------------------------------ +C_WARNING_OPTIONS += -Wall -Wextra -Werror +CXX_WARNING_OPTIONS += -Wall -Wextra -Werror -Weffc++ + + + +# ------------------------------------------------------------------------------ +# デバッグ用オプション +# デバッグ、単体テストの際のオプションを指定します。 +# +# -fstack-protector スタック・オーバーフロー・セキュリティチェックを有効にします。 +# --coverage カバレッジ計測します。(-fprofile-arcs -ftest-coverage オプションと同じ) +# -g0 デバッグオプション無効。 +# -g1 最小限のデバッグ情報を生成します。 +# -g2 (-g) デバッグ情報を生成します。 +# -g3 マクロ定義を含んだデバッグ情報を生成します。 +# -ggdb gdb で使うためのデバッグ情報を生成します。 +# -D_FACTORY_SOURCE=[値] +# 文字列やメモリ操作を行う glibc の関数を使用する際に、バッファオーバーフローを検出します。 +# ※すべてのパターンではなく、よくある例についてのみ検出可能。 +# 値が1の場合、規格に準拠するプログラムの振る舞いを変化させないようなチェックが実行される。 +# 値が2の場合、さらなるチェックを追加するが、規格準拠のプログラムが失敗する可能性がある。 +# いくつかのチェックは、コンパイル時に実行され、コンパイラの警告として表示される。 +# ------------------------------------------------------------------------------ +DEBUG_OPTIONS += -fstack-protector +DEBUG_OPTIONS += --coverage +DEBUG_OPTIONS += -g3 -ggdb +DEBUG_OPTIONS += -O0 +DEBUG_OPTIONS += -D_FACTORY_SOURCE=2 +DEBUG_OPTIONS += -D_DEBUG + +DEBUG_LDFLAGS += --coverage +DEBUG_LDFLAGS += -g3 -ggdb + diff --git a/mk/check-cppcheck-conf.mk b/mk/check-cppcheck-conf.mk new file mode 100644 index 0000000..ca3db60 --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,36 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPHECK_REPORT_DIR = report/cppcheck +CPPCHECK_LOG = $(CPPCHECK_REPORT_DIR)/cppcheck.xml + + + +# ------------------------------------------------------------------------------ +# 警告抑止 +# ------------------------------------------------------------------------------ +# 次の警告を抑止します。 +# - システムヘッダー読み込み失敗 (読み込むと非常に時間がかかります。) +# - 未使用関数 (チェック単位が異なり、public な関数が呼び出されないと誤検知する) +CPPCHECK_SUPPRESS = --suppress=missingIncludeSystem +CPPCHECK_SUPPRESS += --suppress=unusedFunction + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(CPPCHECK_REPORT_DIR) +endif +endif + diff --git a/mk/check-cppcheck-rule.mk b/mk/check-cppcheck-rule.mk new file mode 100644 index 0000000..a8420d3 --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) $(CPPCHECK_REPORT_DIR) + $(CPPCHECK) $(CPPCHECK_FLAGS) $(CPPCHECK_SUPPRESS) $(INCLUDES) $(SRCDIR) 2> $(CPPCHECK_LOG) +endif +endif + diff --git a/mk/check-lcov-cobertura-conf.mk b/mk/check-lcov-cobertura-conf.mk new file mode 100644 index 0000000..8ca940f --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,13 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura.py +LCOV_COBERTURA_REPORT_DIR = report/lcov +LCOV_COBERTURA_INFO = $(LCOV_COBERTURA_REPORT_DIR)/lcov.info + diff --git a/mk/check-lcov-cobertura-rule.mk b/mk/check-lcov-cobertura-rule.mk new file mode 100644 index 0000000..110134d --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# lcov cobertura ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov-cobertura +lcov-cobertura: lcov + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov-cobertura -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(LCOV_COBERTURA) $(LCOV_COBERTURA_INFO) -b `pwd` -o $(LCOV_COBERTURA_REPORT_DIR)/lcov-coverage.xml +endif + diff --git a/mk/check-lcov-conf.mk b/mk/check-lcov-conf.mk new file mode 100644 index 0000000..f6d536b --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,34 @@ +# ============================================================================== +# lcov 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV = lcov +LCOV_REPORT_DIR = report/lcov +LCOV_INFO = $(LCOV_REPORT_DIR)/lcov.info + +GENHTML = genhtml +GENHTML_FLAGS += --function-coverage +GENHTML_FLAGS += --branch-coverage + + + +# ------------------------------------------------------------------------------ +# C1 Coverage 有効 +# ------------------------------------------------------------------------------ +LCOV_FLAGS += --rc lcov_branch_coverage=1 +LCOV_FLAGS += --rc genhtml_branch_coverage=1 + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(LCOV_REPORT_DIR) +endif + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d855a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = test +TARGET = $(NAME).a +SUBDIR = + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/README.md diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..29eee10 --- /dev/null +++ b/config.mk @@ -0,0 +1,71 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + + + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + + + +# +# アーキテクチャ指定 +# +ARCH ?= x86_64 +# ARCH ?= aarch64 + + + +# +# クロスコンパイラ指定 +# +ifeq ($(strip $(ARCH)),aarch64) +CROSS_COMPILE = +else +CROSS_COMPILE = +endif + + + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (X==03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++14 + + + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + + + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + + + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += -lpthread -lrt + + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..3cf2923 --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif + diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..b35372c --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,78 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += ../include +DEFINE += -DUNITTEST +endif + + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + + +# ------------------------------------------------------------------------------ +# CFLAGS, CXXFLAGS, LDFLAGS 設定 +# ------------------------------------------------------------------------------ +CFLAGS += $(INCLUDES) +CFLAGS += $(C_VERSION) +CFLAGS += $(C_WARNING_OPTIONS) +CFLAGS += $(DEFINE) +CFLAGS += $(DEPENDS_OPTIONS) + +CXXFLAGS += $(INCLUDES) +CXXFLAGS += $(CXX_VERSION) +CXXFLAGS += $(CXX_WARNING_OPTIONS) +CXXFLAGS += $(DEFINE) +CXXFLAGS += $(DEPENDS_OPTIONS) + + + +ifeq ($(strip $(DEBUG)),) +# For Release +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# For Debug +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +endif + diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..b0c78de --- /dev/null +++ b/mk/base-cmd.mk @@ -0,0 +1,49 @@ +# ============================================================================== +# コマンド設定 +# ============================================================================== +AWK = awk +CAT = cat +CHMOD = chmod +CHOWN = chown +CP = cp +CPPCHECK = cppcheck +DATE = date +DOXYGEN = doxygen +ECHO = echo +GIT = git +GREP = grep +HEAD = head +INSTALL = install +KILL = kill +LS = ls +LN = ln +MAKE = make +MKDIR = mkdir +MKNOD = mknod +MV = mv +RM = rm +RMDIR = rmdir +PS = ps +PWD = pwd +SED = sed +SORT = sort +TAIL = tail +TAR = tar +TOUCH = touch + +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +RANLIB = $(CROSS_COMPILE)ranlib +ADDR2LINE = $(CROSS_COMPILE)addr2line +AR = $(CROSS_COMPILE)ar +AS = $(CROSS_COMPILE)as +CPP = $(CROSS_COMPILE)cpp +GCOV = $(CROSS_COMPILE)gcov +GDB = $(CROSS_COMPILE)gdb +LD = $(CROSS_COMPILE)ld +NM = $(CROSS_COMPILE)nm +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump +READELF = $(CROSS_COMPILE)readelf +STRIP = $(CROSS_COMPILE)strip + diff --git a/mk/base-conf.mk b/mk/base-conf.mk new file mode 100644 index 0000000..64f0e24 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,89 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= + + + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -O0 最適化無効。 +# -O1 速度最適化(低)。 +# -O2 速度最適化(中)[推奨]。 +# -O3 速度最適化(高)。 +# -Os サイズ最適化。 +# その他のフラグについては、gcc のヘルプを参照ください。 +# ------------------------------------------------------------------------------ +OPTIMIZATION = -O2 + + + +# ------------------------------------------------------------------------------ +# ヘッダー依存関係出力 +# 基本的に変更しないでください。 +# +# -MMD +# コンパイル時に依存関係を .d ファイルに出力する。 +# -MP +# .d ファイルにヘッダファイル用のターゲットも出力する。 +# ------------------------------------------------------------------------------ +DEPENDS_OPTIONS = -MMD -MP + + + +# ------------------------------------------------------------------------------ +# 警告オプション +# -pedantic +# ANSI C/ISO C++ により要求される警告をすべて出力する。 +# gcc の HELP にも記載されている通り、基本的に使べきではありません。 +# -pedantic-errors +# 警告ではなくエラーが出力される点を除けば -pedantic と同様です。 +# -w +# すべての警告メッセージの出力を禁止します。 +# -Wall +# 基本的な警告オプションを有効にします。 +# -Wextra +# 追加の警告オプションを有効にします。 +# -Weffc++ +# Effective C++ による方針に沿わない記述に警告を出します。 +# ------------------------------------------------------------------------------ +C_WARNING_OPTIONS += -Wall -Wextra -Werror +CXX_WARNING_OPTIONS += -Wall -Wextra -Werror -Weffc++ + + + +# ------------------------------------------------------------------------------ +# デバッグ用オプション +# デバッグ、単体テストの際のオプションを指定します。 +# +# -fstack-protector スタック・オーバーフロー・セキュリティチェックを有効にします。 +# --coverage カバレッジ計測します。(-fprofile-arcs -ftest-coverage オプションと同じ) +# -g0 デバッグオプション無効。 +# -g1 最小限のデバッグ情報を生成します。 +# -g2 (-g) デバッグ情報を生成します。 +# -g3 マクロ定義を含んだデバッグ情報を生成します。 +# -ggdb gdb で使うためのデバッグ情報を生成します。 +# -D_FACTORY_SOURCE=[値] +# 文字列やメモリ操作を行う glibc の関数を使用する際に、バッファオーバーフローを検出します。 +# ※すべてのパターンではなく、よくある例についてのみ検出可能。 +# 値が1の場合、規格に準拠するプログラムの振る舞いを変化させないようなチェックが実行される。 +# 値が2の場合、さらなるチェックを追加するが、規格準拠のプログラムが失敗する可能性がある。 +# いくつかのチェックは、コンパイル時に実行され、コンパイラの警告として表示される。 +# ------------------------------------------------------------------------------ +DEBUG_OPTIONS += -fstack-protector +DEBUG_OPTIONS += --coverage +DEBUG_OPTIONS += -g3 -ggdb +DEBUG_OPTIONS += -O0 +DEBUG_OPTIONS += -D_FACTORY_SOURCE=2 +DEBUG_OPTIONS += -D_DEBUG + +DEBUG_LDFLAGS += --coverage +DEBUG_LDFLAGS += -g3 -ggdb + diff --git a/mk/check-cppcheck-conf.mk b/mk/check-cppcheck-conf.mk new file mode 100644 index 0000000..ca3db60 --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,36 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPHECK_REPORT_DIR = report/cppcheck +CPPCHECK_LOG = $(CPPCHECK_REPORT_DIR)/cppcheck.xml + + + +# ------------------------------------------------------------------------------ +# 警告抑止 +# ------------------------------------------------------------------------------ +# 次の警告を抑止します。 +# - システムヘッダー読み込み失敗 (読み込むと非常に時間がかかります。) +# - 未使用関数 (チェック単位が異なり、public な関数が呼び出されないと誤検知する) +CPPCHECK_SUPPRESS = --suppress=missingIncludeSystem +CPPCHECK_SUPPRESS += --suppress=unusedFunction + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(CPPCHECK_REPORT_DIR) +endif +endif + diff --git a/mk/check-cppcheck-rule.mk b/mk/check-cppcheck-rule.mk new file mode 100644 index 0000000..a8420d3 --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) $(CPPCHECK_REPORT_DIR) + $(CPPCHECK) $(CPPCHECK_FLAGS) $(CPPCHECK_SUPPRESS) $(INCLUDES) $(SRCDIR) 2> $(CPPCHECK_LOG) +endif +endif + diff --git a/mk/check-lcov-cobertura-conf.mk b/mk/check-lcov-cobertura-conf.mk new file mode 100644 index 0000000..8ca940f --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,13 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura.py +LCOV_COBERTURA_REPORT_DIR = report/lcov +LCOV_COBERTURA_INFO = $(LCOV_COBERTURA_REPORT_DIR)/lcov.info + diff --git a/mk/check-lcov-cobertura-rule.mk b/mk/check-lcov-cobertura-rule.mk new file mode 100644 index 0000000..110134d --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# lcov cobertura ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov-cobertura +lcov-cobertura: lcov + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov-cobertura -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(LCOV_COBERTURA) $(LCOV_COBERTURA_INFO) -b `pwd` -o $(LCOV_COBERTURA_REPORT_DIR)/lcov-coverage.xml +endif + diff --git a/mk/check-lcov-conf.mk b/mk/check-lcov-conf.mk new file mode 100644 index 0000000..f6d536b --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,34 @@ +# ============================================================================== +# lcov 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV = lcov +LCOV_REPORT_DIR = report/lcov +LCOV_INFO = $(LCOV_REPORT_DIR)/lcov.info + +GENHTML = genhtml +GENHTML_FLAGS += --function-coverage +GENHTML_FLAGS += --branch-coverage + + + +# ------------------------------------------------------------------------------ +# C1 Coverage 有効 +# ------------------------------------------------------------------------------ +LCOV_FLAGS += --rc lcov_branch_coverage=1 +LCOV_FLAGS += --rc genhtml_branch_coverage=1 + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(LCOV_REPORT_DIR) +endif + diff --git a/mk/check-lcov-rule.mk b/mk/check-lcov-rule.mk new file mode 100644 index 0000000..b75e472 --- /dev/null +++ b/mk/check-lcov-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# lcov ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov +lcov: + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(LCOV_REPORT_DIR) + $(LCOV) -c -d $(OBJDIR) $(LCOV_FLAGS) -o $(LCOV_INFO) + $(LCOV) $(LCOV_FLAGS) -r $(LCOV_INFO) "*/test/*" -o $(LCOV_INFO) + $(GENHTML) $(GENHTML_FLAGS) -o $(LCOV_REPORT_DIR) $(LCOV_INFO) +endif + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d855a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = test +TARGET = $(NAME).a +SUBDIR = + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/README.md diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..29eee10 --- /dev/null +++ b/config.mk @@ -0,0 +1,71 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + + + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + + + +# +# アーキテクチャ指定 +# +ARCH ?= x86_64 +# ARCH ?= aarch64 + + + +# +# クロスコンパイラ指定 +# +ifeq ($(strip $(ARCH)),aarch64) +CROSS_COMPILE = +else +CROSS_COMPILE = +endif + + + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (X==03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++14 + + + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + + + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + + + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += -lpthread -lrt + + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..3cf2923 --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif + diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..b35372c --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,78 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += ../include +DEFINE += -DUNITTEST +endif + + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + + +# ------------------------------------------------------------------------------ +# CFLAGS, CXXFLAGS, LDFLAGS 設定 +# ------------------------------------------------------------------------------ +CFLAGS += $(INCLUDES) +CFLAGS += $(C_VERSION) +CFLAGS += $(C_WARNING_OPTIONS) +CFLAGS += $(DEFINE) +CFLAGS += $(DEPENDS_OPTIONS) + +CXXFLAGS += $(INCLUDES) +CXXFLAGS += $(CXX_VERSION) +CXXFLAGS += $(CXX_WARNING_OPTIONS) +CXXFLAGS += $(DEFINE) +CXXFLAGS += $(DEPENDS_OPTIONS) + + + +ifeq ($(strip $(DEBUG)),) +# For Release +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# For Debug +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +endif + diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..b0c78de --- /dev/null +++ b/mk/base-cmd.mk @@ -0,0 +1,49 @@ +# ============================================================================== +# コマンド設定 +# ============================================================================== +AWK = awk +CAT = cat +CHMOD = chmod +CHOWN = chown +CP = cp +CPPCHECK = cppcheck +DATE = date +DOXYGEN = doxygen +ECHO = echo +GIT = git +GREP = grep +HEAD = head +INSTALL = install +KILL = kill +LS = ls +LN = ln +MAKE = make +MKDIR = mkdir +MKNOD = mknod +MV = mv +RM = rm +RMDIR = rmdir +PS = ps +PWD = pwd +SED = sed +SORT = sort +TAIL = tail +TAR = tar +TOUCH = touch + +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +RANLIB = $(CROSS_COMPILE)ranlib +ADDR2LINE = $(CROSS_COMPILE)addr2line +AR = $(CROSS_COMPILE)ar +AS = $(CROSS_COMPILE)as +CPP = $(CROSS_COMPILE)cpp +GCOV = $(CROSS_COMPILE)gcov +GDB = $(CROSS_COMPILE)gdb +LD = $(CROSS_COMPILE)ld +NM = $(CROSS_COMPILE)nm +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump +READELF = $(CROSS_COMPILE)readelf +STRIP = $(CROSS_COMPILE)strip + diff --git a/mk/base-conf.mk b/mk/base-conf.mk new file mode 100644 index 0000000..64f0e24 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,89 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= + + + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -O0 最適化無効。 +# -O1 速度最適化(低)。 +# -O2 速度最適化(中)[推奨]。 +# -O3 速度最適化(高)。 +# -Os サイズ最適化。 +# その他のフラグについては、gcc のヘルプを参照ください。 +# ------------------------------------------------------------------------------ +OPTIMIZATION = -O2 + + + +# ------------------------------------------------------------------------------ +# ヘッダー依存関係出力 +# 基本的に変更しないでください。 +# +# -MMD +# コンパイル時に依存関係を .d ファイルに出力する。 +# -MP +# .d ファイルにヘッダファイル用のターゲットも出力する。 +# ------------------------------------------------------------------------------ +DEPENDS_OPTIONS = -MMD -MP + + + +# ------------------------------------------------------------------------------ +# 警告オプション +# -pedantic +# ANSI C/ISO C++ により要求される警告をすべて出力する。 +# gcc の HELP にも記載されている通り、基本的に使べきではありません。 +# -pedantic-errors +# 警告ではなくエラーが出力される点を除けば -pedantic と同様です。 +# -w +# すべての警告メッセージの出力を禁止します。 +# -Wall +# 基本的な警告オプションを有効にします。 +# -Wextra +# 追加の警告オプションを有効にします。 +# -Weffc++ +# Effective C++ による方針に沿わない記述に警告を出します。 +# ------------------------------------------------------------------------------ +C_WARNING_OPTIONS += -Wall -Wextra -Werror +CXX_WARNING_OPTIONS += -Wall -Wextra -Werror -Weffc++ + + + +# ------------------------------------------------------------------------------ +# デバッグ用オプション +# デバッグ、単体テストの際のオプションを指定します。 +# +# -fstack-protector スタック・オーバーフロー・セキュリティチェックを有効にします。 +# --coverage カバレッジ計測します。(-fprofile-arcs -ftest-coverage オプションと同じ) +# -g0 デバッグオプション無効。 +# -g1 最小限のデバッグ情報を生成します。 +# -g2 (-g) デバッグ情報を生成します。 +# -g3 マクロ定義を含んだデバッグ情報を生成します。 +# -ggdb gdb で使うためのデバッグ情報を生成します。 +# -D_FACTORY_SOURCE=[値] +# 文字列やメモリ操作を行う glibc の関数を使用する際に、バッファオーバーフローを検出します。 +# ※すべてのパターンではなく、よくある例についてのみ検出可能。 +# 値が1の場合、規格に準拠するプログラムの振る舞いを変化させないようなチェックが実行される。 +# 値が2の場合、さらなるチェックを追加するが、規格準拠のプログラムが失敗する可能性がある。 +# いくつかのチェックは、コンパイル時に実行され、コンパイラの警告として表示される。 +# ------------------------------------------------------------------------------ +DEBUG_OPTIONS += -fstack-protector +DEBUG_OPTIONS += --coverage +DEBUG_OPTIONS += -g3 -ggdb +DEBUG_OPTIONS += -O0 +DEBUG_OPTIONS += -D_FACTORY_SOURCE=2 +DEBUG_OPTIONS += -D_DEBUG + +DEBUG_LDFLAGS += --coverage +DEBUG_LDFLAGS += -g3 -ggdb + diff --git a/mk/check-cppcheck-conf.mk b/mk/check-cppcheck-conf.mk new file mode 100644 index 0000000..ca3db60 --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,36 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPHECK_REPORT_DIR = report/cppcheck +CPPCHECK_LOG = $(CPPCHECK_REPORT_DIR)/cppcheck.xml + + + +# ------------------------------------------------------------------------------ +# 警告抑止 +# ------------------------------------------------------------------------------ +# 次の警告を抑止します。 +# - システムヘッダー読み込み失敗 (読み込むと非常に時間がかかります。) +# - 未使用関数 (チェック単位が異なり、public な関数が呼び出されないと誤検知する) +CPPCHECK_SUPPRESS = --suppress=missingIncludeSystem +CPPCHECK_SUPPRESS += --suppress=unusedFunction + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(CPPCHECK_REPORT_DIR) +endif +endif + diff --git a/mk/check-cppcheck-rule.mk b/mk/check-cppcheck-rule.mk new file mode 100644 index 0000000..a8420d3 --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) $(CPPCHECK_REPORT_DIR) + $(CPPCHECK) $(CPPCHECK_FLAGS) $(CPPCHECK_SUPPRESS) $(INCLUDES) $(SRCDIR) 2> $(CPPCHECK_LOG) +endif +endif + diff --git a/mk/check-lcov-cobertura-conf.mk b/mk/check-lcov-cobertura-conf.mk new file mode 100644 index 0000000..8ca940f --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,13 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura.py +LCOV_COBERTURA_REPORT_DIR = report/lcov +LCOV_COBERTURA_INFO = $(LCOV_COBERTURA_REPORT_DIR)/lcov.info + diff --git a/mk/check-lcov-cobertura-rule.mk b/mk/check-lcov-cobertura-rule.mk new file mode 100644 index 0000000..110134d --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# lcov cobertura ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov-cobertura +lcov-cobertura: lcov + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov-cobertura -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(LCOV_COBERTURA) $(LCOV_COBERTURA_INFO) -b `pwd` -o $(LCOV_COBERTURA_REPORT_DIR)/lcov-coverage.xml +endif + diff --git a/mk/check-lcov-conf.mk b/mk/check-lcov-conf.mk new file mode 100644 index 0000000..f6d536b --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,34 @@ +# ============================================================================== +# lcov 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV = lcov +LCOV_REPORT_DIR = report/lcov +LCOV_INFO = $(LCOV_REPORT_DIR)/lcov.info + +GENHTML = genhtml +GENHTML_FLAGS += --function-coverage +GENHTML_FLAGS += --branch-coverage + + + +# ------------------------------------------------------------------------------ +# C1 Coverage 有効 +# ------------------------------------------------------------------------------ +LCOV_FLAGS += --rc lcov_branch_coverage=1 +LCOV_FLAGS += --rc genhtml_branch_coverage=1 + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(LCOV_REPORT_DIR) +endif + diff --git a/mk/check-lcov-rule.mk b/mk/check-lcov-rule.mk new file mode 100644 index 0000000..b75e472 --- /dev/null +++ b/mk/check-lcov-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# lcov ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov +lcov: + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(LCOV_REPORT_DIR) + $(LCOV) -c -d $(OBJDIR) $(LCOV_FLAGS) -o $(LCOV_INFO) + $(LCOV) $(LCOV_FLAGS) -r $(LCOV_INFO) "*/test/*" -o $(LCOV_INFO) + $(GENHTML) $(GENHTML_FLAGS) -o $(LCOV_REPORT_DIR) $(LCOV_INFO) +endif + diff --git a/mk/check-rule.mk b/mk/check-rule.mk new file mode 100644 index 0000000..3c516c5 --- /dev/null +++ b/mk/check-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# check ルール +# ------------------------------------------------------------------------------ +.PHONY: check +check: + @for subdir in $(SUBDIRS); do \ + $(MAKE) check -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) + ./ut.exe +endif + + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d855a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = test +TARGET = $(NAME).a +SUBDIR = + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/README.md diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..29eee10 --- /dev/null +++ b/config.mk @@ -0,0 +1,71 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + + + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + + + +# +# アーキテクチャ指定 +# +ARCH ?= x86_64 +# ARCH ?= aarch64 + + + +# +# クロスコンパイラ指定 +# +ifeq ($(strip $(ARCH)),aarch64) +CROSS_COMPILE = +else +CROSS_COMPILE = +endif + + + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (X==03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++14 + + + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + + + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + + + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += -lpthread -lrt + + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..3cf2923 --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif + diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..b35372c --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,78 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += ../include +DEFINE += -DUNITTEST +endif + + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + + +# ------------------------------------------------------------------------------ +# CFLAGS, CXXFLAGS, LDFLAGS 設定 +# ------------------------------------------------------------------------------ +CFLAGS += $(INCLUDES) +CFLAGS += $(C_VERSION) +CFLAGS += $(C_WARNING_OPTIONS) +CFLAGS += $(DEFINE) +CFLAGS += $(DEPENDS_OPTIONS) + +CXXFLAGS += $(INCLUDES) +CXXFLAGS += $(CXX_VERSION) +CXXFLAGS += $(CXX_WARNING_OPTIONS) +CXXFLAGS += $(DEFINE) +CXXFLAGS += $(DEPENDS_OPTIONS) + + + +ifeq ($(strip $(DEBUG)),) +# For Release +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# For Debug +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +endif + diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..b0c78de --- /dev/null +++ b/mk/base-cmd.mk @@ -0,0 +1,49 @@ +# ============================================================================== +# コマンド設定 +# ============================================================================== +AWK = awk +CAT = cat +CHMOD = chmod +CHOWN = chown +CP = cp +CPPCHECK = cppcheck +DATE = date +DOXYGEN = doxygen +ECHO = echo +GIT = git +GREP = grep +HEAD = head +INSTALL = install +KILL = kill +LS = ls +LN = ln +MAKE = make +MKDIR = mkdir +MKNOD = mknod +MV = mv +RM = rm +RMDIR = rmdir +PS = ps +PWD = pwd +SED = sed +SORT = sort +TAIL = tail +TAR = tar +TOUCH = touch + +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +RANLIB = $(CROSS_COMPILE)ranlib +ADDR2LINE = $(CROSS_COMPILE)addr2line +AR = $(CROSS_COMPILE)ar +AS = $(CROSS_COMPILE)as +CPP = $(CROSS_COMPILE)cpp +GCOV = $(CROSS_COMPILE)gcov +GDB = $(CROSS_COMPILE)gdb +LD = $(CROSS_COMPILE)ld +NM = $(CROSS_COMPILE)nm +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump +READELF = $(CROSS_COMPILE)readelf +STRIP = $(CROSS_COMPILE)strip + diff --git a/mk/base-conf.mk b/mk/base-conf.mk new file mode 100644 index 0000000..64f0e24 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,89 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= + + + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -O0 最適化無効。 +# -O1 速度最適化(低)。 +# -O2 速度最適化(中)[推奨]。 +# -O3 速度最適化(高)。 +# -Os サイズ最適化。 +# その他のフラグについては、gcc のヘルプを参照ください。 +# ------------------------------------------------------------------------------ +OPTIMIZATION = -O2 + + + +# ------------------------------------------------------------------------------ +# ヘッダー依存関係出力 +# 基本的に変更しないでください。 +# +# -MMD +# コンパイル時に依存関係を .d ファイルに出力する。 +# -MP +# .d ファイルにヘッダファイル用のターゲットも出力する。 +# ------------------------------------------------------------------------------ +DEPENDS_OPTIONS = -MMD -MP + + + +# ------------------------------------------------------------------------------ +# 警告オプション +# -pedantic +# ANSI C/ISO C++ により要求される警告をすべて出力する。 +# gcc の HELP にも記載されている通り、基本的に使べきではありません。 +# -pedantic-errors +# 警告ではなくエラーが出力される点を除けば -pedantic と同様です。 +# -w +# すべての警告メッセージの出力を禁止します。 +# -Wall +# 基本的な警告オプションを有効にします。 +# -Wextra +# 追加の警告オプションを有効にします。 +# -Weffc++ +# Effective C++ による方針に沿わない記述に警告を出します。 +# ------------------------------------------------------------------------------ +C_WARNING_OPTIONS += -Wall -Wextra -Werror +CXX_WARNING_OPTIONS += -Wall -Wextra -Werror -Weffc++ + + + +# ------------------------------------------------------------------------------ +# デバッグ用オプション +# デバッグ、単体テストの際のオプションを指定します。 +# +# -fstack-protector スタック・オーバーフロー・セキュリティチェックを有効にします。 +# --coverage カバレッジ計測します。(-fprofile-arcs -ftest-coverage オプションと同じ) +# -g0 デバッグオプション無効。 +# -g1 最小限のデバッグ情報を生成します。 +# -g2 (-g) デバッグ情報を生成します。 +# -g3 マクロ定義を含んだデバッグ情報を生成します。 +# -ggdb gdb で使うためのデバッグ情報を生成します。 +# -D_FACTORY_SOURCE=[値] +# 文字列やメモリ操作を行う glibc の関数を使用する際に、バッファオーバーフローを検出します。 +# ※すべてのパターンではなく、よくある例についてのみ検出可能。 +# 値が1の場合、規格に準拠するプログラムの振る舞いを変化させないようなチェックが実行される。 +# 値が2の場合、さらなるチェックを追加するが、規格準拠のプログラムが失敗する可能性がある。 +# いくつかのチェックは、コンパイル時に実行され、コンパイラの警告として表示される。 +# ------------------------------------------------------------------------------ +DEBUG_OPTIONS += -fstack-protector +DEBUG_OPTIONS += --coverage +DEBUG_OPTIONS += -g3 -ggdb +DEBUG_OPTIONS += -O0 +DEBUG_OPTIONS += -D_FACTORY_SOURCE=2 +DEBUG_OPTIONS += -D_DEBUG + +DEBUG_LDFLAGS += --coverage +DEBUG_LDFLAGS += -g3 -ggdb + diff --git a/mk/check-cppcheck-conf.mk b/mk/check-cppcheck-conf.mk new file mode 100644 index 0000000..ca3db60 --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,36 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPHECK_REPORT_DIR = report/cppcheck +CPPCHECK_LOG = $(CPPCHECK_REPORT_DIR)/cppcheck.xml + + + +# ------------------------------------------------------------------------------ +# 警告抑止 +# ------------------------------------------------------------------------------ +# 次の警告を抑止します。 +# - システムヘッダー読み込み失敗 (読み込むと非常に時間がかかります。) +# - 未使用関数 (チェック単位が異なり、public な関数が呼び出されないと誤検知する) +CPPCHECK_SUPPRESS = --suppress=missingIncludeSystem +CPPCHECK_SUPPRESS += --suppress=unusedFunction + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(CPPCHECK_REPORT_DIR) +endif +endif + diff --git a/mk/check-cppcheck-rule.mk b/mk/check-cppcheck-rule.mk new file mode 100644 index 0000000..a8420d3 --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) $(CPPCHECK_REPORT_DIR) + $(CPPCHECK) $(CPPCHECK_FLAGS) $(CPPCHECK_SUPPRESS) $(INCLUDES) $(SRCDIR) 2> $(CPPCHECK_LOG) +endif +endif + diff --git a/mk/check-lcov-cobertura-conf.mk b/mk/check-lcov-cobertura-conf.mk new file mode 100644 index 0000000..8ca940f --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,13 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura.py +LCOV_COBERTURA_REPORT_DIR = report/lcov +LCOV_COBERTURA_INFO = $(LCOV_COBERTURA_REPORT_DIR)/lcov.info + diff --git a/mk/check-lcov-cobertura-rule.mk b/mk/check-lcov-cobertura-rule.mk new file mode 100644 index 0000000..110134d --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# lcov cobertura ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov-cobertura +lcov-cobertura: lcov + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov-cobertura -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(LCOV_COBERTURA) $(LCOV_COBERTURA_INFO) -b `pwd` -o $(LCOV_COBERTURA_REPORT_DIR)/lcov-coverage.xml +endif + diff --git a/mk/check-lcov-conf.mk b/mk/check-lcov-conf.mk new file mode 100644 index 0000000..f6d536b --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,34 @@ +# ============================================================================== +# lcov 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV = lcov +LCOV_REPORT_DIR = report/lcov +LCOV_INFO = $(LCOV_REPORT_DIR)/lcov.info + +GENHTML = genhtml +GENHTML_FLAGS += --function-coverage +GENHTML_FLAGS += --branch-coverage + + + +# ------------------------------------------------------------------------------ +# C1 Coverage 有効 +# ------------------------------------------------------------------------------ +LCOV_FLAGS += --rc lcov_branch_coverage=1 +LCOV_FLAGS += --rc genhtml_branch_coverage=1 + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(LCOV_REPORT_DIR) +endif + diff --git a/mk/check-lcov-rule.mk b/mk/check-lcov-rule.mk new file mode 100644 index 0000000..b75e472 --- /dev/null +++ b/mk/check-lcov-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# lcov ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov +lcov: + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(LCOV_REPORT_DIR) + $(LCOV) -c -d $(OBJDIR) $(LCOV_FLAGS) -o $(LCOV_INFO) + $(LCOV) $(LCOV_FLAGS) -r $(LCOV_INFO) "*/test/*" -o $(LCOV_INFO) + $(GENHTML) $(GENHTML_FLAGS) -o $(LCOV_REPORT_DIR) $(LCOV_INFO) +endif + diff --git a/mk/check-rule.mk b/mk/check-rule.mk new file mode 100644 index 0000000..3c516c5 --- /dev/null +++ b/mk/check-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# check ルール +# ------------------------------------------------------------------------------ +.PHONY: check +check: + @for subdir in $(SUBDIRS); do \ + $(MAKE) check -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) + ./ut.exe +endif + + diff --git a/mk/check-ut.rule.mk b/mk/check-ut.rule.mk new file mode 100644 index 0000000..0970bb9 --- /dev/null +++ b/mk/check-ut.rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# ut ルール +# ------------------------------------------------------------------------------ +.PHONY: ut +ut: $(TARGET) + ./ut.exe + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d855a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = test +TARGET = $(NAME).a +SUBDIR = + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/README.md diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..29eee10 --- /dev/null +++ b/config.mk @@ -0,0 +1,71 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + + + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + + + +# +# アーキテクチャ指定 +# +ARCH ?= x86_64 +# ARCH ?= aarch64 + + + +# +# クロスコンパイラ指定 +# +ifeq ($(strip $(ARCH)),aarch64) +CROSS_COMPILE = +else +CROSS_COMPILE = +endif + + + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (X==03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++14 + + + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + + + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + + + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += -lpthread -lrt + + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..3cf2923 --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif + diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..b35372c --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,78 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += ../include +DEFINE += -DUNITTEST +endif + + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + + +# ------------------------------------------------------------------------------ +# CFLAGS, CXXFLAGS, LDFLAGS 設定 +# ------------------------------------------------------------------------------ +CFLAGS += $(INCLUDES) +CFLAGS += $(C_VERSION) +CFLAGS += $(C_WARNING_OPTIONS) +CFLAGS += $(DEFINE) +CFLAGS += $(DEPENDS_OPTIONS) + +CXXFLAGS += $(INCLUDES) +CXXFLAGS += $(CXX_VERSION) +CXXFLAGS += $(CXX_WARNING_OPTIONS) +CXXFLAGS += $(DEFINE) +CXXFLAGS += $(DEPENDS_OPTIONS) + + + +ifeq ($(strip $(DEBUG)),) +# For Release +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# For Debug +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +endif + diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..b0c78de --- /dev/null +++ b/mk/base-cmd.mk @@ -0,0 +1,49 @@ +# ============================================================================== +# コマンド設定 +# ============================================================================== +AWK = awk +CAT = cat +CHMOD = chmod +CHOWN = chown +CP = cp +CPPCHECK = cppcheck +DATE = date +DOXYGEN = doxygen +ECHO = echo +GIT = git +GREP = grep +HEAD = head +INSTALL = install +KILL = kill +LS = ls +LN = ln +MAKE = make +MKDIR = mkdir +MKNOD = mknod +MV = mv +RM = rm +RMDIR = rmdir +PS = ps +PWD = pwd +SED = sed +SORT = sort +TAIL = tail +TAR = tar +TOUCH = touch + +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +RANLIB = $(CROSS_COMPILE)ranlib +ADDR2LINE = $(CROSS_COMPILE)addr2line +AR = $(CROSS_COMPILE)ar +AS = $(CROSS_COMPILE)as +CPP = $(CROSS_COMPILE)cpp +GCOV = $(CROSS_COMPILE)gcov +GDB = $(CROSS_COMPILE)gdb +LD = $(CROSS_COMPILE)ld +NM = $(CROSS_COMPILE)nm +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump +READELF = $(CROSS_COMPILE)readelf +STRIP = $(CROSS_COMPILE)strip + diff --git a/mk/base-conf.mk b/mk/base-conf.mk new file mode 100644 index 0000000..64f0e24 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,89 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= + + + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -O0 最適化無効。 +# -O1 速度最適化(低)。 +# -O2 速度最適化(中)[推奨]。 +# -O3 速度最適化(高)。 +# -Os サイズ最適化。 +# その他のフラグについては、gcc のヘルプを参照ください。 +# ------------------------------------------------------------------------------ +OPTIMIZATION = -O2 + + + +# ------------------------------------------------------------------------------ +# ヘッダー依存関係出力 +# 基本的に変更しないでください。 +# +# -MMD +# コンパイル時に依存関係を .d ファイルに出力する。 +# -MP +# .d ファイルにヘッダファイル用のターゲットも出力する。 +# ------------------------------------------------------------------------------ +DEPENDS_OPTIONS = -MMD -MP + + + +# ------------------------------------------------------------------------------ +# 警告オプション +# -pedantic +# ANSI C/ISO C++ により要求される警告をすべて出力する。 +# gcc の HELP にも記載されている通り、基本的に使べきではありません。 +# -pedantic-errors +# 警告ではなくエラーが出力される点を除けば -pedantic と同様です。 +# -w +# すべての警告メッセージの出力を禁止します。 +# -Wall +# 基本的な警告オプションを有効にします。 +# -Wextra +# 追加の警告オプションを有効にします。 +# -Weffc++ +# Effective C++ による方針に沿わない記述に警告を出します。 +# ------------------------------------------------------------------------------ +C_WARNING_OPTIONS += -Wall -Wextra -Werror +CXX_WARNING_OPTIONS += -Wall -Wextra -Werror -Weffc++ + + + +# ------------------------------------------------------------------------------ +# デバッグ用オプション +# デバッグ、単体テストの際のオプションを指定します。 +# +# -fstack-protector スタック・オーバーフロー・セキュリティチェックを有効にします。 +# --coverage カバレッジ計測します。(-fprofile-arcs -ftest-coverage オプションと同じ) +# -g0 デバッグオプション無効。 +# -g1 最小限のデバッグ情報を生成します。 +# -g2 (-g) デバッグ情報を生成します。 +# -g3 マクロ定義を含んだデバッグ情報を生成します。 +# -ggdb gdb で使うためのデバッグ情報を生成します。 +# -D_FACTORY_SOURCE=[値] +# 文字列やメモリ操作を行う glibc の関数を使用する際に、バッファオーバーフローを検出します。 +# ※すべてのパターンではなく、よくある例についてのみ検出可能。 +# 値が1の場合、規格に準拠するプログラムの振る舞いを変化させないようなチェックが実行される。 +# 値が2の場合、さらなるチェックを追加するが、規格準拠のプログラムが失敗する可能性がある。 +# いくつかのチェックは、コンパイル時に実行され、コンパイラの警告として表示される。 +# ------------------------------------------------------------------------------ +DEBUG_OPTIONS += -fstack-protector +DEBUG_OPTIONS += --coverage +DEBUG_OPTIONS += -g3 -ggdb +DEBUG_OPTIONS += -O0 +DEBUG_OPTIONS += -D_FACTORY_SOURCE=2 +DEBUG_OPTIONS += -D_DEBUG + +DEBUG_LDFLAGS += --coverage +DEBUG_LDFLAGS += -g3 -ggdb + diff --git a/mk/check-cppcheck-conf.mk b/mk/check-cppcheck-conf.mk new file mode 100644 index 0000000..ca3db60 --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,36 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPHECK_REPORT_DIR = report/cppcheck +CPPCHECK_LOG = $(CPPCHECK_REPORT_DIR)/cppcheck.xml + + + +# ------------------------------------------------------------------------------ +# 警告抑止 +# ------------------------------------------------------------------------------ +# 次の警告を抑止します。 +# - システムヘッダー読み込み失敗 (読み込むと非常に時間がかかります。) +# - 未使用関数 (チェック単位が異なり、public な関数が呼び出されないと誤検知する) +CPPCHECK_SUPPRESS = --suppress=missingIncludeSystem +CPPCHECK_SUPPRESS += --suppress=unusedFunction + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(CPPCHECK_REPORT_DIR) +endif +endif + diff --git a/mk/check-cppcheck-rule.mk b/mk/check-cppcheck-rule.mk new file mode 100644 index 0000000..a8420d3 --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) $(CPPCHECK_REPORT_DIR) + $(CPPCHECK) $(CPPCHECK_FLAGS) $(CPPCHECK_SUPPRESS) $(INCLUDES) $(SRCDIR) 2> $(CPPCHECK_LOG) +endif +endif + diff --git a/mk/check-lcov-cobertura-conf.mk b/mk/check-lcov-cobertura-conf.mk new file mode 100644 index 0000000..8ca940f --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,13 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura.py +LCOV_COBERTURA_REPORT_DIR = report/lcov +LCOV_COBERTURA_INFO = $(LCOV_COBERTURA_REPORT_DIR)/lcov.info + diff --git a/mk/check-lcov-cobertura-rule.mk b/mk/check-lcov-cobertura-rule.mk new file mode 100644 index 0000000..110134d --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# lcov cobertura ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov-cobertura +lcov-cobertura: lcov + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov-cobertura -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(LCOV_COBERTURA) $(LCOV_COBERTURA_INFO) -b `pwd` -o $(LCOV_COBERTURA_REPORT_DIR)/lcov-coverage.xml +endif + diff --git a/mk/check-lcov-conf.mk b/mk/check-lcov-conf.mk new file mode 100644 index 0000000..f6d536b --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,34 @@ +# ============================================================================== +# lcov 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV = lcov +LCOV_REPORT_DIR = report/lcov +LCOV_INFO = $(LCOV_REPORT_DIR)/lcov.info + +GENHTML = genhtml +GENHTML_FLAGS += --function-coverage +GENHTML_FLAGS += --branch-coverage + + + +# ------------------------------------------------------------------------------ +# C1 Coverage 有効 +# ------------------------------------------------------------------------------ +LCOV_FLAGS += --rc lcov_branch_coverage=1 +LCOV_FLAGS += --rc genhtml_branch_coverage=1 + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(LCOV_REPORT_DIR) +endif + diff --git a/mk/check-lcov-rule.mk b/mk/check-lcov-rule.mk new file mode 100644 index 0000000..b75e472 --- /dev/null +++ b/mk/check-lcov-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# lcov ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov +lcov: + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(LCOV_REPORT_DIR) + $(LCOV) -c -d $(OBJDIR) $(LCOV_FLAGS) -o $(LCOV_INFO) + $(LCOV) $(LCOV_FLAGS) -r $(LCOV_INFO) "*/test/*" -o $(LCOV_INFO) + $(GENHTML) $(GENHTML_FLAGS) -o $(LCOV_REPORT_DIR) $(LCOV_INFO) +endif + diff --git a/mk/check-rule.mk b/mk/check-rule.mk new file mode 100644 index 0000000..3c516c5 --- /dev/null +++ b/mk/check-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# check ルール +# ------------------------------------------------------------------------------ +.PHONY: check +check: + @for subdir in $(SUBDIRS); do \ + $(MAKE) check -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) + ./ut.exe +endif + + diff --git a/mk/check-ut.rule.mk b/mk/check-ut.rule.mk new file mode 100644 index 0000000..0970bb9 --- /dev/null +++ b/mk/check-ut.rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# ut ルール +# ------------------------------------------------------------------------------ +.PHONY: ut +ut: $(TARGET) + ./ut.exe + diff --git a/mk/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..0d3e443 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# TARGET ファイル削除設定 +# ============================================================================== +# +# CLEAN 時に削除されるファイルを追加 +# + +ifneq ($(strip $(TARGET)),) + +CLEAN_FILES += $(OBJDIR)/*.o $(OBJDIR)/*.d $(OBJDIR)/*.gcno $(OBJDIR)/*.gcda +CLEAN_FILES += $(TARGET) + +# $(TOPDIR) に置かれたファイルの削除 +ifneq ($(strip $(TARGET)),$(strip $(NAME))) +# TARGET がライブラリの場合 +CLEAN_FILES += $(addprefix $(TOPDIR)/include/,$(notdir $(wildcard include/*.h))) +CLEAN_FILES += $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +else +# TARGET が実行ファイルの場合 +CLEAN_FILES += $(addprefix $(TOPDIR)/,$(TARGET)) + +endif +endif + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d855a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = test +TARGET = $(NAME).a +SUBDIR = + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/README.md diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..29eee10 --- /dev/null +++ b/config.mk @@ -0,0 +1,71 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + + + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + + + +# +# アーキテクチャ指定 +# +ARCH ?= x86_64 +# ARCH ?= aarch64 + + + +# +# クロスコンパイラ指定 +# +ifeq ($(strip $(ARCH)),aarch64) +CROSS_COMPILE = +else +CROSS_COMPILE = +endif + + + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (X==03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++14 + + + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + + + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + + + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += -lpthread -lrt + + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..3cf2923 --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif + diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..b35372c --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,78 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += ../include +DEFINE += -DUNITTEST +endif + + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + + +# ------------------------------------------------------------------------------ +# CFLAGS, CXXFLAGS, LDFLAGS 設定 +# ------------------------------------------------------------------------------ +CFLAGS += $(INCLUDES) +CFLAGS += $(C_VERSION) +CFLAGS += $(C_WARNING_OPTIONS) +CFLAGS += $(DEFINE) +CFLAGS += $(DEPENDS_OPTIONS) + +CXXFLAGS += $(INCLUDES) +CXXFLAGS += $(CXX_VERSION) +CXXFLAGS += $(CXX_WARNING_OPTIONS) +CXXFLAGS += $(DEFINE) +CXXFLAGS += $(DEPENDS_OPTIONS) + + + +ifeq ($(strip $(DEBUG)),) +# For Release +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# For Debug +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +endif + diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..b0c78de --- /dev/null +++ b/mk/base-cmd.mk @@ -0,0 +1,49 @@ +# ============================================================================== +# コマンド設定 +# ============================================================================== +AWK = awk +CAT = cat +CHMOD = chmod +CHOWN = chown +CP = cp +CPPCHECK = cppcheck +DATE = date +DOXYGEN = doxygen +ECHO = echo +GIT = git +GREP = grep +HEAD = head +INSTALL = install +KILL = kill +LS = ls +LN = ln +MAKE = make +MKDIR = mkdir +MKNOD = mknod +MV = mv +RM = rm +RMDIR = rmdir +PS = ps +PWD = pwd +SED = sed +SORT = sort +TAIL = tail +TAR = tar +TOUCH = touch + +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +RANLIB = $(CROSS_COMPILE)ranlib +ADDR2LINE = $(CROSS_COMPILE)addr2line +AR = $(CROSS_COMPILE)ar +AS = $(CROSS_COMPILE)as +CPP = $(CROSS_COMPILE)cpp +GCOV = $(CROSS_COMPILE)gcov +GDB = $(CROSS_COMPILE)gdb +LD = $(CROSS_COMPILE)ld +NM = $(CROSS_COMPILE)nm +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump +READELF = $(CROSS_COMPILE)readelf +STRIP = $(CROSS_COMPILE)strip + diff --git a/mk/base-conf.mk b/mk/base-conf.mk new file mode 100644 index 0000000..64f0e24 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,89 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= + + + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -O0 最適化無効。 +# -O1 速度最適化(低)。 +# -O2 速度最適化(中)[推奨]。 +# -O3 速度最適化(高)。 +# -Os サイズ最適化。 +# その他のフラグについては、gcc のヘルプを参照ください。 +# ------------------------------------------------------------------------------ +OPTIMIZATION = -O2 + + + +# ------------------------------------------------------------------------------ +# ヘッダー依存関係出力 +# 基本的に変更しないでください。 +# +# -MMD +# コンパイル時に依存関係を .d ファイルに出力する。 +# -MP +# .d ファイルにヘッダファイル用のターゲットも出力する。 +# ------------------------------------------------------------------------------ +DEPENDS_OPTIONS = -MMD -MP + + + +# ------------------------------------------------------------------------------ +# 警告オプション +# -pedantic +# ANSI C/ISO C++ により要求される警告をすべて出力する。 +# gcc の HELP にも記載されている通り、基本的に使べきではありません。 +# -pedantic-errors +# 警告ではなくエラーが出力される点を除けば -pedantic と同様です。 +# -w +# すべての警告メッセージの出力を禁止します。 +# -Wall +# 基本的な警告オプションを有効にします。 +# -Wextra +# 追加の警告オプションを有効にします。 +# -Weffc++ +# Effective C++ による方針に沿わない記述に警告を出します。 +# ------------------------------------------------------------------------------ +C_WARNING_OPTIONS += -Wall -Wextra -Werror +CXX_WARNING_OPTIONS += -Wall -Wextra -Werror -Weffc++ + + + +# ------------------------------------------------------------------------------ +# デバッグ用オプション +# デバッグ、単体テストの際のオプションを指定します。 +# +# -fstack-protector スタック・オーバーフロー・セキュリティチェックを有効にします。 +# --coverage カバレッジ計測します。(-fprofile-arcs -ftest-coverage オプションと同じ) +# -g0 デバッグオプション無効。 +# -g1 最小限のデバッグ情報を生成します。 +# -g2 (-g) デバッグ情報を生成します。 +# -g3 マクロ定義を含んだデバッグ情報を生成します。 +# -ggdb gdb で使うためのデバッグ情報を生成します。 +# -D_FACTORY_SOURCE=[値] +# 文字列やメモリ操作を行う glibc の関数を使用する際に、バッファオーバーフローを検出します。 +# ※すべてのパターンではなく、よくある例についてのみ検出可能。 +# 値が1の場合、規格に準拠するプログラムの振る舞いを変化させないようなチェックが実行される。 +# 値が2の場合、さらなるチェックを追加するが、規格準拠のプログラムが失敗する可能性がある。 +# いくつかのチェックは、コンパイル時に実行され、コンパイラの警告として表示される。 +# ------------------------------------------------------------------------------ +DEBUG_OPTIONS += -fstack-protector +DEBUG_OPTIONS += --coverage +DEBUG_OPTIONS += -g3 -ggdb +DEBUG_OPTIONS += -O0 +DEBUG_OPTIONS += -D_FACTORY_SOURCE=2 +DEBUG_OPTIONS += -D_DEBUG + +DEBUG_LDFLAGS += --coverage +DEBUG_LDFLAGS += -g3 -ggdb + diff --git a/mk/check-cppcheck-conf.mk b/mk/check-cppcheck-conf.mk new file mode 100644 index 0000000..ca3db60 --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,36 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPHECK_REPORT_DIR = report/cppcheck +CPPCHECK_LOG = $(CPPCHECK_REPORT_DIR)/cppcheck.xml + + + +# ------------------------------------------------------------------------------ +# 警告抑止 +# ------------------------------------------------------------------------------ +# 次の警告を抑止します。 +# - システムヘッダー読み込み失敗 (読み込むと非常に時間がかかります。) +# - 未使用関数 (チェック単位が異なり、public な関数が呼び出されないと誤検知する) +CPPCHECK_SUPPRESS = --suppress=missingIncludeSystem +CPPCHECK_SUPPRESS += --suppress=unusedFunction + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(CPPCHECK_REPORT_DIR) +endif +endif + diff --git a/mk/check-cppcheck-rule.mk b/mk/check-cppcheck-rule.mk new file mode 100644 index 0000000..a8420d3 --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) $(CPPCHECK_REPORT_DIR) + $(CPPCHECK) $(CPPCHECK_FLAGS) $(CPPCHECK_SUPPRESS) $(INCLUDES) $(SRCDIR) 2> $(CPPCHECK_LOG) +endif +endif + diff --git a/mk/check-lcov-cobertura-conf.mk b/mk/check-lcov-cobertura-conf.mk new file mode 100644 index 0000000..8ca940f --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,13 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura.py +LCOV_COBERTURA_REPORT_DIR = report/lcov +LCOV_COBERTURA_INFO = $(LCOV_COBERTURA_REPORT_DIR)/lcov.info + diff --git a/mk/check-lcov-cobertura-rule.mk b/mk/check-lcov-cobertura-rule.mk new file mode 100644 index 0000000..110134d --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# lcov cobertura ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov-cobertura +lcov-cobertura: lcov + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov-cobertura -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(LCOV_COBERTURA) $(LCOV_COBERTURA_INFO) -b `pwd` -o $(LCOV_COBERTURA_REPORT_DIR)/lcov-coverage.xml +endif + diff --git a/mk/check-lcov-conf.mk b/mk/check-lcov-conf.mk new file mode 100644 index 0000000..f6d536b --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,34 @@ +# ============================================================================== +# lcov 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV = lcov +LCOV_REPORT_DIR = report/lcov +LCOV_INFO = $(LCOV_REPORT_DIR)/lcov.info + +GENHTML = genhtml +GENHTML_FLAGS += --function-coverage +GENHTML_FLAGS += --branch-coverage + + + +# ------------------------------------------------------------------------------ +# C1 Coverage 有効 +# ------------------------------------------------------------------------------ +LCOV_FLAGS += --rc lcov_branch_coverage=1 +LCOV_FLAGS += --rc genhtml_branch_coverage=1 + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(LCOV_REPORT_DIR) +endif + diff --git a/mk/check-lcov-rule.mk b/mk/check-lcov-rule.mk new file mode 100644 index 0000000..b75e472 --- /dev/null +++ b/mk/check-lcov-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# lcov ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov +lcov: + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(LCOV_REPORT_DIR) + $(LCOV) -c -d $(OBJDIR) $(LCOV_FLAGS) -o $(LCOV_INFO) + $(LCOV) $(LCOV_FLAGS) -r $(LCOV_INFO) "*/test/*" -o $(LCOV_INFO) + $(GENHTML) $(GENHTML_FLAGS) -o $(LCOV_REPORT_DIR) $(LCOV_INFO) +endif + diff --git a/mk/check-rule.mk b/mk/check-rule.mk new file mode 100644 index 0000000..3c516c5 --- /dev/null +++ b/mk/check-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# check ルール +# ------------------------------------------------------------------------------ +.PHONY: check +check: + @for subdir in $(SUBDIRS); do \ + $(MAKE) check -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) + ./ut.exe +endif + + diff --git a/mk/check-ut.rule.mk b/mk/check-ut.rule.mk new file mode 100644 index 0000000..0970bb9 --- /dev/null +++ b/mk/check-ut.rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# ut ルール +# ------------------------------------------------------------------------------ +.PHONY: ut +ut: $(TARGET) + ./ut.exe + diff --git a/mk/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..0d3e443 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# TARGET ファイル削除設定 +# ============================================================================== +# +# CLEAN 時に削除されるファイルを追加 +# + +ifneq ($(strip $(TARGET)),) + +CLEAN_FILES += $(OBJDIR)/*.o $(OBJDIR)/*.d $(OBJDIR)/*.gcno $(OBJDIR)/*.gcda +CLEAN_FILES += $(TARGET) + +# $(TOPDIR) に置かれたファイルの削除 +ifneq ($(strip $(TARGET)),$(strip $(NAME))) +# TARGET がライブラリの場合 +CLEAN_FILES += $(addprefix $(TOPDIR)/include/,$(notdir $(wildcard include/*.h))) +CLEAN_FILES += $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +else +# TARGET が実行ファイルの場合 +CLEAN_FILES += $(addprefix $(TOPDIR)/,$(TARGET)) + +endif +endif + diff --git a/mk/clean-rule.mk b/mk/clean-rule.mk new file mode 100644 index 0000000..0575dc5 --- /dev/null +++ b/mk/clean-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# clean ルール +# ------------------------------------------------------------------------------ +.PHONY: clean +clean: + @for subdir in $(SUBDIRS); do \ + $(MAKE) clean -C $$subdir; \ + done +ifneq ($(strip $(CLEAN_FILES)),) + $(RM) -f $(CLEAN_FILES) +endif +ifneq ($(strip $(CLEAN_DIRS)),) + $(RM) -f $(CLEAN_DIRS) +endif + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d855a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = test +TARGET = $(NAME).a +SUBDIR = + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/README.md diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..29eee10 --- /dev/null +++ b/config.mk @@ -0,0 +1,71 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + + + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + + + +# +# アーキテクチャ指定 +# +ARCH ?= x86_64 +# ARCH ?= aarch64 + + + +# +# クロスコンパイラ指定 +# +ifeq ($(strip $(ARCH)),aarch64) +CROSS_COMPILE = +else +CROSS_COMPILE = +endif + + + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (X==03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++14 + + + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + + + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + + + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += -lpthread -lrt + + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..3cf2923 --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif + diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..b35372c --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,78 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += ../include +DEFINE += -DUNITTEST +endif + + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + + +# ------------------------------------------------------------------------------ +# CFLAGS, CXXFLAGS, LDFLAGS 設定 +# ------------------------------------------------------------------------------ +CFLAGS += $(INCLUDES) +CFLAGS += $(C_VERSION) +CFLAGS += $(C_WARNING_OPTIONS) +CFLAGS += $(DEFINE) +CFLAGS += $(DEPENDS_OPTIONS) + +CXXFLAGS += $(INCLUDES) +CXXFLAGS += $(CXX_VERSION) +CXXFLAGS += $(CXX_WARNING_OPTIONS) +CXXFLAGS += $(DEFINE) +CXXFLAGS += $(DEPENDS_OPTIONS) + + + +ifeq ($(strip $(DEBUG)),) +# For Release +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# For Debug +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +endif + diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..b0c78de --- /dev/null +++ b/mk/base-cmd.mk @@ -0,0 +1,49 @@ +# ============================================================================== +# コマンド設定 +# ============================================================================== +AWK = awk +CAT = cat +CHMOD = chmod +CHOWN = chown +CP = cp +CPPCHECK = cppcheck +DATE = date +DOXYGEN = doxygen +ECHO = echo +GIT = git +GREP = grep +HEAD = head +INSTALL = install +KILL = kill +LS = ls +LN = ln +MAKE = make +MKDIR = mkdir +MKNOD = mknod +MV = mv +RM = rm +RMDIR = rmdir +PS = ps +PWD = pwd +SED = sed +SORT = sort +TAIL = tail +TAR = tar +TOUCH = touch + +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +RANLIB = $(CROSS_COMPILE)ranlib +ADDR2LINE = $(CROSS_COMPILE)addr2line +AR = $(CROSS_COMPILE)ar +AS = $(CROSS_COMPILE)as +CPP = $(CROSS_COMPILE)cpp +GCOV = $(CROSS_COMPILE)gcov +GDB = $(CROSS_COMPILE)gdb +LD = $(CROSS_COMPILE)ld +NM = $(CROSS_COMPILE)nm +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump +READELF = $(CROSS_COMPILE)readelf +STRIP = $(CROSS_COMPILE)strip + diff --git a/mk/base-conf.mk b/mk/base-conf.mk new file mode 100644 index 0000000..64f0e24 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,89 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= + + + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -O0 最適化無効。 +# -O1 速度最適化(低)。 +# -O2 速度最適化(中)[推奨]。 +# -O3 速度最適化(高)。 +# -Os サイズ最適化。 +# その他のフラグについては、gcc のヘルプを参照ください。 +# ------------------------------------------------------------------------------ +OPTIMIZATION = -O2 + + + +# ------------------------------------------------------------------------------ +# ヘッダー依存関係出力 +# 基本的に変更しないでください。 +# +# -MMD +# コンパイル時に依存関係を .d ファイルに出力する。 +# -MP +# .d ファイルにヘッダファイル用のターゲットも出力する。 +# ------------------------------------------------------------------------------ +DEPENDS_OPTIONS = -MMD -MP + + + +# ------------------------------------------------------------------------------ +# 警告オプション +# -pedantic +# ANSI C/ISO C++ により要求される警告をすべて出力する。 +# gcc の HELP にも記載されている通り、基本的に使べきではありません。 +# -pedantic-errors +# 警告ではなくエラーが出力される点を除けば -pedantic と同様です。 +# -w +# すべての警告メッセージの出力を禁止します。 +# -Wall +# 基本的な警告オプションを有効にします。 +# -Wextra +# 追加の警告オプションを有効にします。 +# -Weffc++ +# Effective C++ による方針に沿わない記述に警告を出します。 +# ------------------------------------------------------------------------------ +C_WARNING_OPTIONS += -Wall -Wextra -Werror +CXX_WARNING_OPTIONS += -Wall -Wextra -Werror -Weffc++ + + + +# ------------------------------------------------------------------------------ +# デバッグ用オプション +# デバッグ、単体テストの際のオプションを指定します。 +# +# -fstack-protector スタック・オーバーフロー・セキュリティチェックを有効にします。 +# --coverage カバレッジ計測します。(-fprofile-arcs -ftest-coverage オプションと同じ) +# -g0 デバッグオプション無効。 +# -g1 最小限のデバッグ情報を生成します。 +# -g2 (-g) デバッグ情報を生成します。 +# -g3 マクロ定義を含んだデバッグ情報を生成します。 +# -ggdb gdb で使うためのデバッグ情報を生成します。 +# -D_FACTORY_SOURCE=[値] +# 文字列やメモリ操作を行う glibc の関数を使用する際に、バッファオーバーフローを検出します。 +# ※すべてのパターンではなく、よくある例についてのみ検出可能。 +# 値が1の場合、規格に準拠するプログラムの振る舞いを変化させないようなチェックが実行される。 +# 値が2の場合、さらなるチェックを追加するが、規格準拠のプログラムが失敗する可能性がある。 +# いくつかのチェックは、コンパイル時に実行され、コンパイラの警告として表示される。 +# ------------------------------------------------------------------------------ +DEBUG_OPTIONS += -fstack-protector +DEBUG_OPTIONS += --coverage +DEBUG_OPTIONS += -g3 -ggdb +DEBUG_OPTIONS += -O0 +DEBUG_OPTIONS += -D_FACTORY_SOURCE=2 +DEBUG_OPTIONS += -D_DEBUG + +DEBUG_LDFLAGS += --coverage +DEBUG_LDFLAGS += -g3 -ggdb + diff --git a/mk/check-cppcheck-conf.mk b/mk/check-cppcheck-conf.mk new file mode 100644 index 0000000..ca3db60 --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,36 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPHECK_REPORT_DIR = report/cppcheck +CPPCHECK_LOG = $(CPPCHECK_REPORT_DIR)/cppcheck.xml + + + +# ------------------------------------------------------------------------------ +# 警告抑止 +# ------------------------------------------------------------------------------ +# 次の警告を抑止します。 +# - システムヘッダー読み込み失敗 (読み込むと非常に時間がかかります。) +# - 未使用関数 (チェック単位が異なり、public な関数が呼び出されないと誤検知する) +CPPCHECK_SUPPRESS = --suppress=missingIncludeSystem +CPPCHECK_SUPPRESS += --suppress=unusedFunction + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(CPPCHECK_REPORT_DIR) +endif +endif + diff --git a/mk/check-cppcheck-rule.mk b/mk/check-cppcheck-rule.mk new file mode 100644 index 0000000..a8420d3 --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) $(CPPCHECK_REPORT_DIR) + $(CPPCHECK) $(CPPCHECK_FLAGS) $(CPPCHECK_SUPPRESS) $(INCLUDES) $(SRCDIR) 2> $(CPPCHECK_LOG) +endif +endif + diff --git a/mk/check-lcov-cobertura-conf.mk b/mk/check-lcov-cobertura-conf.mk new file mode 100644 index 0000000..8ca940f --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,13 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura.py +LCOV_COBERTURA_REPORT_DIR = report/lcov +LCOV_COBERTURA_INFO = $(LCOV_COBERTURA_REPORT_DIR)/lcov.info + diff --git a/mk/check-lcov-cobertura-rule.mk b/mk/check-lcov-cobertura-rule.mk new file mode 100644 index 0000000..110134d --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# lcov cobertura ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov-cobertura +lcov-cobertura: lcov + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov-cobertura -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(LCOV_COBERTURA) $(LCOV_COBERTURA_INFO) -b `pwd` -o $(LCOV_COBERTURA_REPORT_DIR)/lcov-coverage.xml +endif + diff --git a/mk/check-lcov-conf.mk b/mk/check-lcov-conf.mk new file mode 100644 index 0000000..f6d536b --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,34 @@ +# ============================================================================== +# lcov 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV = lcov +LCOV_REPORT_DIR = report/lcov +LCOV_INFO = $(LCOV_REPORT_DIR)/lcov.info + +GENHTML = genhtml +GENHTML_FLAGS += --function-coverage +GENHTML_FLAGS += --branch-coverage + + + +# ------------------------------------------------------------------------------ +# C1 Coverage 有効 +# ------------------------------------------------------------------------------ +LCOV_FLAGS += --rc lcov_branch_coverage=1 +LCOV_FLAGS += --rc genhtml_branch_coverage=1 + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(LCOV_REPORT_DIR) +endif + diff --git a/mk/check-lcov-rule.mk b/mk/check-lcov-rule.mk new file mode 100644 index 0000000..b75e472 --- /dev/null +++ b/mk/check-lcov-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# lcov ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov +lcov: + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(LCOV_REPORT_DIR) + $(LCOV) -c -d $(OBJDIR) $(LCOV_FLAGS) -o $(LCOV_INFO) + $(LCOV) $(LCOV_FLAGS) -r $(LCOV_INFO) "*/test/*" -o $(LCOV_INFO) + $(GENHTML) $(GENHTML_FLAGS) -o $(LCOV_REPORT_DIR) $(LCOV_INFO) +endif + diff --git a/mk/check-rule.mk b/mk/check-rule.mk new file mode 100644 index 0000000..3c516c5 --- /dev/null +++ b/mk/check-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# check ルール +# ------------------------------------------------------------------------------ +.PHONY: check +check: + @for subdir in $(SUBDIRS); do \ + $(MAKE) check -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) + ./ut.exe +endif + + diff --git a/mk/check-ut.rule.mk b/mk/check-ut.rule.mk new file mode 100644 index 0000000..0970bb9 --- /dev/null +++ b/mk/check-ut.rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# ut ルール +# ------------------------------------------------------------------------------ +.PHONY: ut +ut: $(TARGET) + ./ut.exe + diff --git a/mk/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..0d3e443 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# TARGET ファイル削除設定 +# ============================================================================== +# +# CLEAN 時に削除されるファイルを追加 +# + +ifneq ($(strip $(TARGET)),) + +CLEAN_FILES += $(OBJDIR)/*.o $(OBJDIR)/*.d $(OBJDIR)/*.gcno $(OBJDIR)/*.gcda +CLEAN_FILES += $(TARGET) + +# $(TOPDIR) に置かれたファイルの削除 +ifneq ($(strip $(TARGET)),$(strip $(NAME))) +# TARGET がライブラリの場合 +CLEAN_FILES += $(addprefix $(TOPDIR)/include/,$(notdir $(wildcard include/*.h))) +CLEAN_FILES += $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +else +# TARGET が実行ファイルの場合 +CLEAN_FILES += $(addprefix $(TOPDIR)/,$(TARGET)) + +endif +endif + diff --git a/mk/clean-rule.mk b/mk/clean-rule.mk new file mode 100644 index 0000000..0575dc5 --- /dev/null +++ b/mk/clean-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# clean ルール +# ------------------------------------------------------------------------------ +.PHONY: clean +clean: + @for subdir in $(SUBDIRS); do \ + $(MAKE) clean -C $$subdir; \ + done +ifneq ($(strip $(CLEAN_FILES)),) + $(RM) -f $(CLEAN_FILES) +endif +ifneq ($(strip $(CLEAN_DIRS)),) + $(RM) -f $(CLEAN_DIRS) +endif + diff --git a/mk/compile-c-rule.mk b/mk/compile-c-rule.mk new file mode 100644 index 0000000..f523b94 --- /dev/null +++ b/mk/compile-c-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# C言語 コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.c + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d855a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = test +TARGET = $(NAME).a +SUBDIR = + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/README.md diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..29eee10 --- /dev/null +++ b/config.mk @@ -0,0 +1,71 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + + + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + + + +# +# アーキテクチャ指定 +# +ARCH ?= x86_64 +# ARCH ?= aarch64 + + + +# +# クロスコンパイラ指定 +# +ifeq ($(strip $(ARCH)),aarch64) +CROSS_COMPILE = +else +CROSS_COMPILE = +endif + + + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (X==03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++14 + + + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + + + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + + + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += -lpthread -lrt + + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..3cf2923 --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif + diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..b35372c --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,78 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += ../include +DEFINE += -DUNITTEST +endif + + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + + +# ------------------------------------------------------------------------------ +# CFLAGS, CXXFLAGS, LDFLAGS 設定 +# ------------------------------------------------------------------------------ +CFLAGS += $(INCLUDES) +CFLAGS += $(C_VERSION) +CFLAGS += $(C_WARNING_OPTIONS) +CFLAGS += $(DEFINE) +CFLAGS += $(DEPENDS_OPTIONS) + +CXXFLAGS += $(INCLUDES) +CXXFLAGS += $(CXX_VERSION) +CXXFLAGS += $(CXX_WARNING_OPTIONS) +CXXFLAGS += $(DEFINE) +CXXFLAGS += $(DEPENDS_OPTIONS) + + + +ifeq ($(strip $(DEBUG)),) +# For Release +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# For Debug +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +endif + diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..b0c78de --- /dev/null +++ b/mk/base-cmd.mk @@ -0,0 +1,49 @@ +# ============================================================================== +# コマンド設定 +# ============================================================================== +AWK = awk +CAT = cat +CHMOD = chmod +CHOWN = chown +CP = cp +CPPCHECK = cppcheck +DATE = date +DOXYGEN = doxygen +ECHO = echo +GIT = git +GREP = grep +HEAD = head +INSTALL = install +KILL = kill +LS = ls +LN = ln +MAKE = make +MKDIR = mkdir +MKNOD = mknod +MV = mv +RM = rm +RMDIR = rmdir +PS = ps +PWD = pwd +SED = sed +SORT = sort +TAIL = tail +TAR = tar +TOUCH = touch + +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +RANLIB = $(CROSS_COMPILE)ranlib +ADDR2LINE = $(CROSS_COMPILE)addr2line +AR = $(CROSS_COMPILE)ar +AS = $(CROSS_COMPILE)as +CPP = $(CROSS_COMPILE)cpp +GCOV = $(CROSS_COMPILE)gcov +GDB = $(CROSS_COMPILE)gdb +LD = $(CROSS_COMPILE)ld +NM = $(CROSS_COMPILE)nm +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump +READELF = $(CROSS_COMPILE)readelf +STRIP = $(CROSS_COMPILE)strip + diff --git a/mk/base-conf.mk b/mk/base-conf.mk new file mode 100644 index 0000000..64f0e24 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,89 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= + + + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -O0 最適化無効。 +# -O1 速度最適化(低)。 +# -O2 速度最適化(中)[推奨]。 +# -O3 速度最適化(高)。 +# -Os サイズ最適化。 +# その他のフラグについては、gcc のヘルプを参照ください。 +# ------------------------------------------------------------------------------ +OPTIMIZATION = -O2 + + + +# ------------------------------------------------------------------------------ +# ヘッダー依存関係出力 +# 基本的に変更しないでください。 +# +# -MMD +# コンパイル時に依存関係を .d ファイルに出力する。 +# -MP +# .d ファイルにヘッダファイル用のターゲットも出力する。 +# ------------------------------------------------------------------------------ +DEPENDS_OPTIONS = -MMD -MP + + + +# ------------------------------------------------------------------------------ +# 警告オプション +# -pedantic +# ANSI C/ISO C++ により要求される警告をすべて出力する。 +# gcc の HELP にも記載されている通り、基本的に使べきではありません。 +# -pedantic-errors +# 警告ではなくエラーが出力される点を除けば -pedantic と同様です。 +# -w +# すべての警告メッセージの出力を禁止します。 +# -Wall +# 基本的な警告オプションを有効にします。 +# -Wextra +# 追加の警告オプションを有効にします。 +# -Weffc++ +# Effective C++ による方針に沿わない記述に警告を出します。 +# ------------------------------------------------------------------------------ +C_WARNING_OPTIONS += -Wall -Wextra -Werror +CXX_WARNING_OPTIONS += -Wall -Wextra -Werror -Weffc++ + + + +# ------------------------------------------------------------------------------ +# デバッグ用オプション +# デバッグ、単体テストの際のオプションを指定します。 +# +# -fstack-protector スタック・オーバーフロー・セキュリティチェックを有効にします。 +# --coverage カバレッジ計測します。(-fprofile-arcs -ftest-coverage オプションと同じ) +# -g0 デバッグオプション無効。 +# -g1 最小限のデバッグ情報を生成します。 +# -g2 (-g) デバッグ情報を生成します。 +# -g3 マクロ定義を含んだデバッグ情報を生成します。 +# -ggdb gdb で使うためのデバッグ情報を生成します。 +# -D_FACTORY_SOURCE=[値] +# 文字列やメモリ操作を行う glibc の関数を使用する際に、バッファオーバーフローを検出します。 +# ※すべてのパターンではなく、よくある例についてのみ検出可能。 +# 値が1の場合、規格に準拠するプログラムの振る舞いを変化させないようなチェックが実行される。 +# 値が2の場合、さらなるチェックを追加するが、規格準拠のプログラムが失敗する可能性がある。 +# いくつかのチェックは、コンパイル時に実行され、コンパイラの警告として表示される。 +# ------------------------------------------------------------------------------ +DEBUG_OPTIONS += -fstack-protector +DEBUG_OPTIONS += --coverage +DEBUG_OPTIONS += -g3 -ggdb +DEBUG_OPTIONS += -O0 +DEBUG_OPTIONS += -D_FACTORY_SOURCE=2 +DEBUG_OPTIONS += -D_DEBUG + +DEBUG_LDFLAGS += --coverage +DEBUG_LDFLAGS += -g3 -ggdb + diff --git a/mk/check-cppcheck-conf.mk b/mk/check-cppcheck-conf.mk new file mode 100644 index 0000000..ca3db60 --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,36 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPHECK_REPORT_DIR = report/cppcheck +CPPCHECK_LOG = $(CPPCHECK_REPORT_DIR)/cppcheck.xml + + + +# ------------------------------------------------------------------------------ +# 警告抑止 +# ------------------------------------------------------------------------------ +# 次の警告を抑止します。 +# - システムヘッダー読み込み失敗 (読み込むと非常に時間がかかります。) +# - 未使用関数 (チェック単位が異なり、public な関数が呼び出されないと誤検知する) +CPPCHECK_SUPPRESS = --suppress=missingIncludeSystem +CPPCHECK_SUPPRESS += --suppress=unusedFunction + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(CPPCHECK_REPORT_DIR) +endif +endif + diff --git a/mk/check-cppcheck-rule.mk b/mk/check-cppcheck-rule.mk new file mode 100644 index 0000000..a8420d3 --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) $(CPPCHECK_REPORT_DIR) + $(CPPCHECK) $(CPPCHECK_FLAGS) $(CPPCHECK_SUPPRESS) $(INCLUDES) $(SRCDIR) 2> $(CPPCHECK_LOG) +endif +endif + diff --git a/mk/check-lcov-cobertura-conf.mk b/mk/check-lcov-cobertura-conf.mk new file mode 100644 index 0000000..8ca940f --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,13 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura.py +LCOV_COBERTURA_REPORT_DIR = report/lcov +LCOV_COBERTURA_INFO = $(LCOV_COBERTURA_REPORT_DIR)/lcov.info + diff --git a/mk/check-lcov-cobertura-rule.mk b/mk/check-lcov-cobertura-rule.mk new file mode 100644 index 0000000..110134d --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# lcov cobertura ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov-cobertura +lcov-cobertura: lcov + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov-cobertura -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(LCOV_COBERTURA) $(LCOV_COBERTURA_INFO) -b `pwd` -o $(LCOV_COBERTURA_REPORT_DIR)/lcov-coverage.xml +endif + diff --git a/mk/check-lcov-conf.mk b/mk/check-lcov-conf.mk new file mode 100644 index 0000000..f6d536b --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,34 @@ +# ============================================================================== +# lcov 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV = lcov +LCOV_REPORT_DIR = report/lcov +LCOV_INFO = $(LCOV_REPORT_DIR)/lcov.info + +GENHTML = genhtml +GENHTML_FLAGS += --function-coverage +GENHTML_FLAGS += --branch-coverage + + + +# ------------------------------------------------------------------------------ +# C1 Coverage 有効 +# ------------------------------------------------------------------------------ +LCOV_FLAGS += --rc lcov_branch_coverage=1 +LCOV_FLAGS += --rc genhtml_branch_coverage=1 + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(LCOV_REPORT_DIR) +endif + diff --git a/mk/check-lcov-rule.mk b/mk/check-lcov-rule.mk new file mode 100644 index 0000000..b75e472 --- /dev/null +++ b/mk/check-lcov-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# lcov ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov +lcov: + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(LCOV_REPORT_DIR) + $(LCOV) -c -d $(OBJDIR) $(LCOV_FLAGS) -o $(LCOV_INFO) + $(LCOV) $(LCOV_FLAGS) -r $(LCOV_INFO) "*/test/*" -o $(LCOV_INFO) + $(GENHTML) $(GENHTML_FLAGS) -o $(LCOV_REPORT_DIR) $(LCOV_INFO) +endif + diff --git a/mk/check-rule.mk b/mk/check-rule.mk new file mode 100644 index 0000000..3c516c5 --- /dev/null +++ b/mk/check-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# check ルール +# ------------------------------------------------------------------------------ +.PHONY: check +check: + @for subdir in $(SUBDIRS); do \ + $(MAKE) check -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) + ./ut.exe +endif + + diff --git a/mk/check-ut.rule.mk b/mk/check-ut.rule.mk new file mode 100644 index 0000000..0970bb9 --- /dev/null +++ b/mk/check-ut.rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# ut ルール +# ------------------------------------------------------------------------------ +.PHONY: ut +ut: $(TARGET) + ./ut.exe + diff --git a/mk/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..0d3e443 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# TARGET ファイル削除設定 +# ============================================================================== +# +# CLEAN 時に削除されるファイルを追加 +# + +ifneq ($(strip $(TARGET)),) + +CLEAN_FILES += $(OBJDIR)/*.o $(OBJDIR)/*.d $(OBJDIR)/*.gcno $(OBJDIR)/*.gcda +CLEAN_FILES += $(TARGET) + +# $(TOPDIR) に置かれたファイルの削除 +ifneq ($(strip $(TARGET)),$(strip $(NAME))) +# TARGET がライブラリの場合 +CLEAN_FILES += $(addprefix $(TOPDIR)/include/,$(notdir $(wildcard include/*.h))) +CLEAN_FILES += $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +else +# TARGET が実行ファイルの場合 +CLEAN_FILES += $(addprefix $(TOPDIR)/,$(TARGET)) + +endif +endif + diff --git a/mk/clean-rule.mk b/mk/clean-rule.mk new file mode 100644 index 0000000..0575dc5 --- /dev/null +++ b/mk/clean-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# clean ルール +# ------------------------------------------------------------------------------ +.PHONY: clean +clean: + @for subdir in $(SUBDIRS); do \ + $(MAKE) clean -C $$subdir; \ + done +ifneq ($(strip $(CLEAN_FILES)),) + $(RM) -f $(CLEAN_FILES) +endif +ifneq ($(strip $(CLEAN_DIRS)),) + $(RM) -f $(CLEAN_DIRS) +endif + diff --git a/mk/compile-c-rule.mk b/mk/compile-c-rule.mk new file mode 100644 index 0000000..f523b94 --- /dev/null +++ b/mk/compile-c-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# C言語 コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.c + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + diff --git a/mk/compile-cpp-rule.mk b/mk/compile-cpp-rule.mk new file mode 100644 index 0000000..393dea2 --- /dev/null +++ b/mk/compile-cpp-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# C++ コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.cpp + -@$(MKDIR) -p $(OBJDIR) + $(CXX) $(CXXFLAGS) -c -o $@ $< + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d855a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = test +TARGET = $(NAME).a +SUBDIR = + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/README.md diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..29eee10 --- /dev/null +++ b/config.mk @@ -0,0 +1,71 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + + + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + + + +# +# アーキテクチャ指定 +# +ARCH ?= x86_64 +# ARCH ?= aarch64 + + + +# +# クロスコンパイラ指定 +# +ifeq ($(strip $(ARCH)),aarch64) +CROSS_COMPILE = +else +CROSS_COMPILE = +endif + + + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (X==03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++14 + + + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + + + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + + + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += -lpthread -lrt + + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..3cf2923 --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif + diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..b35372c --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,78 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += ../include +DEFINE += -DUNITTEST +endif + + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + + +# ------------------------------------------------------------------------------ +# CFLAGS, CXXFLAGS, LDFLAGS 設定 +# ------------------------------------------------------------------------------ +CFLAGS += $(INCLUDES) +CFLAGS += $(C_VERSION) +CFLAGS += $(C_WARNING_OPTIONS) +CFLAGS += $(DEFINE) +CFLAGS += $(DEPENDS_OPTIONS) + +CXXFLAGS += $(INCLUDES) +CXXFLAGS += $(CXX_VERSION) +CXXFLAGS += $(CXX_WARNING_OPTIONS) +CXXFLAGS += $(DEFINE) +CXXFLAGS += $(DEPENDS_OPTIONS) + + + +ifeq ($(strip $(DEBUG)),) +# For Release +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# For Debug +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +endif + diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..b0c78de --- /dev/null +++ b/mk/base-cmd.mk @@ -0,0 +1,49 @@ +# ============================================================================== +# コマンド設定 +# ============================================================================== +AWK = awk +CAT = cat +CHMOD = chmod +CHOWN = chown +CP = cp +CPPCHECK = cppcheck +DATE = date +DOXYGEN = doxygen +ECHO = echo +GIT = git +GREP = grep +HEAD = head +INSTALL = install +KILL = kill +LS = ls +LN = ln +MAKE = make +MKDIR = mkdir +MKNOD = mknod +MV = mv +RM = rm +RMDIR = rmdir +PS = ps +PWD = pwd +SED = sed +SORT = sort +TAIL = tail +TAR = tar +TOUCH = touch + +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +RANLIB = $(CROSS_COMPILE)ranlib +ADDR2LINE = $(CROSS_COMPILE)addr2line +AR = $(CROSS_COMPILE)ar +AS = $(CROSS_COMPILE)as +CPP = $(CROSS_COMPILE)cpp +GCOV = $(CROSS_COMPILE)gcov +GDB = $(CROSS_COMPILE)gdb +LD = $(CROSS_COMPILE)ld +NM = $(CROSS_COMPILE)nm +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump +READELF = $(CROSS_COMPILE)readelf +STRIP = $(CROSS_COMPILE)strip + diff --git a/mk/base-conf.mk b/mk/base-conf.mk new file mode 100644 index 0000000..64f0e24 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,89 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= + + + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -O0 最適化無効。 +# -O1 速度最適化(低)。 +# -O2 速度最適化(中)[推奨]。 +# -O3 速度最適化(高)。 +# -Os サイズ最適化。 +# その他のフラグについては、gcc のヘルプを参照ください。 +# ------------------------------------------------------------------------------ +OPTIMIZATION = -O2 + + + +# ------------------------------------------------------------------------------ +# ヘッダー依存関係出力 +# 基本的に変更しないでください。 +# +# -MMD +# コンパイル時に依存関係を .d ファイルに出力する。 +# -MP +# .d ファイルにヘッダファイル用のターゲットも出力する。 +# ------------------------------------------------------------------------------ +DEPENDS_OPTIONS = -MMD -MP + + + +# ------------------------------------------------------------------------------ +# 警告オプション +# -pedantic +# ANSI C/ISO C++ により要求される警告をすべて出力する。 +# gcc の HELP にも記載されている通り、基本的に使べきではありません。 +# -pedantic-errors +# 警告ではなくエラーが出力される点を除けば -pedantic と同様です。 +# -w +# すべての警告メッセージの出力を禁止します。 +# -Wall +# 基本的な警告オプションを有効にします。 +# -Wextra +# 追加の警告オプションを有効にします。 +# -Weffc++ +# Effective C++ による方針に沿わない記述に警告を出します。 +# ------------------------------------------------------------------------------ +C_WARNING_OPTIONS += -Wall -Wextra -Werror +CXX_WARNING_OPTIONS += -Wall -Wextra -Werror -Weffc++ + + + +# ------------------------------------------------------------------------------ +# デバッグ用オプション +# デバッグ、単体テストの際のオプションを指定します。 +# +# -fstack-protector スタック・オーバーフロー・セキュリティチェックを有効にします。 +# --coverage カバレッジ計測します。(-fprofile-arcs -ftest-coverage オプションと同じ) +# -g0 デバッグオプション無効。 +# -g1 最小限のデバッグ情報を生成します。 +# -g2 (-g) デバッグ情報を生成します。 +# -g3 マクロ定義を含んだデバッグ情報を生成します。 +# -ggdb gdb で使うためのデバッグ情報を生成します。 +# -D_FACTORY_SOURCE=[値] +# 文字列やメモリ操作を行う glibc の関数を使用する際に、バッファオーバーフローを検出します。 +# ※すべてのパターンではなく、よくある例についてのみ検出可能。 +# 値が1の場合、規格に準拠するプログラムの振る舞いを変化させないようなチェックが実行される。 +# 値が2の場合、さらなるチェックを追加するが、規格準拠のプログラムが失敗する可能性がある。 +# いくつかのチェックは、コンパイル時に実行され、コンパイラの警告として表示される。 +# ------------------------------------------------------------------------------ +DEBUG_OPTIONS += -fstack-protector +DEBUG_OPTIONS += --coverage +DEBUG_OPTIONS += -g3 -ggdb +DEBUG_OPTIONS += -O0 +DEBUG_OPTIONS += -D_FACTORY_SOURCE=2 +DEBUG_OPTIONS += -D_DEBUG + +DEBUG_LDFLAGS += --coverage +DEBUG_LDFLAGS += -g3 -ggdb + diff --git a/mk/check-cppcheck-conf.mk b/mk/check-cppcheck-conf.mk new file mode 100644 index 0000000..ca3db60 --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,36 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPHECK_REPORT_DIR = report/cppcheck +CPPCHECK_LOG = $(CPPCHECK_REPORT_DIR)/cppcheck.xml + + + +# ------------------------------------------------------------------------------ +# 警告抑止 +# ------------------------------------------------------------------------------ +# 次の警告を抑止します。 +# - システムヘッダー読み込み失敗 (読み込むと非常に時間がかかります。) +# - 未使用関数 (チェック単位が異なり、public な関数が呼び出されないと誤検知する) +CPPCHECK_SUPPRESS = --suppress=missingIncludeSystem +CPPCHECK_SUPPRESS += --suppress=unusedFunction + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(CPPCHECK_REPORT_DIR) +endif +endif + diff --git a/mk/check-cppcheck-rule.mk b/mk/check-cppcheck-rule.mk new file mode 100644 index 0000000..a8420d3 --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) $(CPPCHECK_REPORT_DIR) + $(CPPCHECK) $(CPPCHECK_FLAGS) $(CPPCHECK_SUPPRESS) $(INCLUDES) $(SRCDIR) 2> $(CPPCHECK_LOG) +endif +endif + diff --git a/mk/check-lcov-cobertura-conf.mk b/mk/check-lcov-cobertura-conf.mk new file mode 100644 index 0000000..8ca940f --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,13 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura.py +LCOV_COBERTURA_REPORT_DIR = report/lcov +LCOV_COBERTURA_INFO = $(LCOV_COBERTURA_REPORT_DIR)/lcov.info + diff --git a/mk/check-lcov-cobertura-rule.mk b/mk/check-lcov-cobertura-rule.mk new file mode 100644 index 0000000..110134d --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# lcov cobertura ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov-cobertura +lcov-cobertura: lcov + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov-cobertura -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(LCOV_COBERTURA) $(LCOV_COBERTURA_INFO) -b `pwd` -o $(LCOV_COBERTURA_REPORT_DIR)/lcov-coverage.xml +endif + diff --git a/mk/check-lcov-conf.mk b/mk/check-lcov-conf.mk new file mode 100644 index 0000000..f6d536b --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,34 @@ +# ============================================================================== +# lcov 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV = lcov +LCOV_REPORT_DIR = report/lcov +LCOV_INFO = $(LCOV_REPORT_DIR)/lcov.info + +GENHTML = genhtml +GENHTML_FLAGS += --function-coverage +GENHTML_FLAGS += --branch-coverage + + + +# ------------------------------------------------------------------------------ +# C1 Coverage 有効 +# ------------------------------------------------------------------------------ +LCOV_FLAGS += --rc lcov_branch_coverage=1 +LCOV_FLAGS += --rc genhtml_branch_coverage=1 + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(LCOV_REPORT_DIR) +endif + diff --git a/mk/check-lcov-rule.mk b/mk/check-lcov-rule.mk new file mode 100644 index 0000000..b75e472 --- /dev/null +++ b/mk/check-lcov-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# lcov ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov +lcov: + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(LCOV_REPORT_DIR) + $(LCOV) -c -d $(OBJDIR) $(LCOV_FLAGS) -o $(LCOV_INFO) + $(LCOV) $(LCOV_FLAGS) -r $(LCOV_INFO) "*/test/*" -o $(LCOV_INFO) + $(GENHTML) $(GENHTML_FLAGS) -o $(LCOV_REPORT_DIR) $(LCOV_INFO) +endif + diff --git a/mk/check-rule.mk b/mk/check-rule.mk new file mode 100644 index 0000000..3c516c5 --- /dev/null +++ b/mk/check-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# check ルール +# ------------------------------------------------------------------------------ +.PHONY: check +check: + @for subdir in $(SUBDIRS); do \ + $(MAKE) check -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) + ./ut.exe +endif + + diff --git a/mk/check-ut.rule.mk b/mk/check-ut.rule.mk new file mode 100644 index 0000000..0970bb9 --- /dev/null +++ b/mk/check-ut.rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# ut ルール +# ------------------------------------------------------------------------------ +.PHONY: ut +ut: $(TARGET) + ./ut.exe + diff --git a/mk/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..0d3e443 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# TARGET ファイル削除設定 +# ============================================================================== +# +# CLEAN 時に削除されるファイルを追加 +# + +ifneq ($(strip $(TARGET)),) + +CLEAN_FILES += $(OBJDIR)/*.o $(OBJDIR)/*.d $(OBJDIR)/*.gcno $(OBJDIR)/*.gcda +CLEAN_FILES += $(TARGET) + +# $(TOPDIR) に置かれたファイルの削除 +ifneq ($(strip $(TARGET)),$(strip $(NAME))) +# TARGET がライブラリの場合 +CLEAN_FILES += $(addprefix $(TOPDIR)/include/,$(notdir $(wildcard include/*.h))) +CLEAN_FILES += $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +else +# TARGET が実行ファイルの場合 +CLEAN_FILES += $(addprefix $(TOPDIR)/,$(TARGET)) + +endif +endif + diff --git a/mk/clean-rule.mk b/mk/clean-rule.mk new file mode 100644 index 0000000..0575dc5 --- /dev/null +++ b/mk/clean-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# clean ルール +# ------------------------------------------------------------------------------ +.PHONY: clean +clean: + @for subdir in $(SUBDIRS); do \ + $(MAKE) clean -C $$subdir; \ + done +ifneq ($(strip $(CLEAN_FILES)),) + $(RM) -f $(CLEAN_FILES) +endif +ifneq ($(strip $(CLEAN_DIRS)),) + $(RM) -f $(CLEAN_DIRS) +endif + diff --git a/mk/compile-c-rule.mk b/mk/compile-c-rule.mk new file mode 100644 index 0000000..f523b94 --- /dev/null +++ b/mk/compile-c-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# C言語 コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.c + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + diff --git a/mk/compile-cpp-rule.mk b/mk/compile-cpp-rule.mk new file mode 100644 index 0000000..393dea2 --- /dev/null +++ b/mk/compile-cpp-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# C++ コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.cpp + -@$(MKDIR) -p $(OBJDIR) + $(CXX) $(CXXFLAGS) -c -o $@ $< + diff --git a/mk/git-info-conf.mk b/mk/git-info-conf.mk new file mode 100644 index 0000000..7fe4f72 --- /dev/null +++ b/mk/git-info-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# git 情報 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# git のタグなどから取得可能なバージョン情報を DEFINE に設定します。 +# +# VERSION : git tag (v[Major].[Minor].[Release] の [Major].[Minor].[Release] 部分) +# MAJOR : git tag (v[Major].[Minor].[Release] の [Major] 部分) +# MINOR : git tag (v[Major].[Minor].[Release] の [Minor] 部分) +# RELEASE : git tag (v[Major].[Minor].[Release] の [Release] 部分) +# REVISION : git revision +# DATETIME : datetime (ISO8601形式) +# ------------------------------------------------------------------------------ +VERSION := $(shell $(GIT) tag | $(SORT) -V | $(TAIL) -1 | $(SED) -e 's/^[^0-9]\+//') +REVISION := $(shell $(GIT) rev-parse --short HEAD) +DATETIME := $(shell $(DATE) "+Y%m%dT%H%M%S") + +ifeq ($(strip $(VERSION)),) +VERSION := v1.0.0 +endif + +MAJOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\1/') +MINOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\2/') +RELEASE := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\3/') + +DEFINE += -DVERSION='"$(VERSION)"' -DMAJOR='"$(MAJOR)"' -DMINOR='"$(MINOR)"' -DRELEASE='"$(RELEASE)"' +DEFINE += -DREVISION='"$(REVISION)"' +DEFINE += -DDATETIME='"$(DATETIME)"' + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d855a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = test +TARGET = $(NAME).a +SUBDIR = + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/README.md diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..29eee10 --- /dev/null +++ b/config.mk @@ -0,0 +1,71 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + + + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + + + +# +# アーキテクチャ指定 +# +ARCH ?= x86_64 +# ARCH ?= aarch64 + + + +# +# クロスコンパイラ指定 +# +ifeq ($(strip $(ARCH)),aarch64) +CROSS_COMPILE = +else +CROSS_COMPILE = +endif + + + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (X==03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++14 + + + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + + + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + + + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += -lpthread -lrt + + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..3cf2923 --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif + diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..b35372c --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,78 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += ../include +DEFINE += -DUNITTEST +endif + + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + + +# ------------------------------------------------------------------------------ +# CFLAGS, CXXFLAGS, LDFLAGS 設定 +# ------------------------------------------------------------------------------ +CFLAGS += $(INCLUDES) +CFLAGS += $(C_VERSION) +CFLAGS += $(C_WARNING_OPTIONS) +CFLAGS += $(DEFINE) +CFLAGS += $(DEPENDS_OPTIONS) + +CXXFLAGS += $(INCLUDES) +CXXFLAGS += $(CXX_VERSION) +CXXFLAGS += $(CXX_WARNING_OPTIONS) +CXXFLAGS += $(DEFINE) +CXXFLAGS += $(DEPENDS_OPTIONS) + + + +ifeq ($(strip $(DEBUG)),) +# For Release +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# For Debug +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +endif + diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..b0c78de --- /dev/null +++ b/mk/base-cmd.mk @@ -0,0 +1,49 @@ +# ============================================================================== +# コマンド設定 +# ============================================================================== +AWK = awk +CAT = cat +CHMOD = chmod +CHOWN = chown +CP = cp +CPPCHECK = cppcheck +DATE = date +DOXYGEN = doxygen +ECHO = echo +GIT = git +GREP = grep +HEAD = head +INSTALL = install +KILL = kill +LS = ls +LN = ln +MAKE = make +MKDIR = mkdir +MKNOD = mknod +MV = mv +RM = rm +RMDIR = rmdir +PS = ps +PWD = pwd +SED = sed +SORT = sort +TAIL = tail +TAR = tar +TOUCH = touch + +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +RANLIB = $(CROSS_COMPILE)ranlib +ADDR2LINE = $(CROSS_COMPILE)addr2line +AR = $(CROSS_COMPILE)ar +AS = $(CROSS_COMPILE)as +CPP = $(CROSS_COMPILE)cpp +GCOV = $(CROSS_COMPILE)gcov +GDB = $(CROSS_COMPILE)gdb +LD = $(CROSS_COMPILE)ld +NM = $(CROSS_COMPILE)nm +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump +READELF = $(CROSS_COMPILE)readelf +STRIP = $(CROSS_COMPILE)strip + diff --git a/mk/base-conf.mk b/mk/base-conf.mk new file mode 100644 index 0000000..64f0e24 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,89 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= + + + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -O0 最適化無効。 +# -O1 速度最適化(低)。 +# -O2 速度最適化(中)[推奨]。 +# -O3 速度最適化(高)。 +# -Os サイズ最適化。 +# その他のフラグについては、gcc のヘルプを参照ください。 +# ------------------------------------------------------------------------------ +OPTIMIZATION = -O2 + + + +# ------------------------------------------------------------------------------ +# ヘッダー依存関係出力 +# 基本的に変更しないでください。 +# +# -MMD +# コンパイル時に依存関係を .d ファイルに出力する。 +# -MP +# .d ファイルにヘッダファイル用のターゲットも出力する。 +# ------------------------------------------------------------------------------ +DEPENDS_OPTIONS = -MMD -MP + + + +# ------------------------------------------------------------------------------ +# 警告オプション +# -pedantic +# ANSI C/ISO C++ により要求される警告をすべて出力する。 +# gcc の HELP にも記載されている通り、基本的に使べきではありません。 +# -pedantic-errors +# 警告ではなくエラーが出力される点を除けば -pedantic と同様です。 +# -w +# すべての警告メッセージの出力を禁止します。 +# -Wall +# 基本的な警告オプションを有効にします。 +# -Wextra +# 追加の警告オプションを有効にします。 +# -Weffc++ +# Effective C++ による方針に沿わない記述に警告を出します。 +# ------------------------------------------------------------------------------ +C_WARNING_OPTIONS += -Wall -Wextra -Werror +CXX_WARNING_OPTIONS += -Wall -Wextra -Werror -Weffc++ + + + +# ------------------------------------------------------------------------------ +# デバッグ用オプション +# デバッグ、単体テストの際のオプションを指定します。 +# +# -fstack-protector スタック・オーバーフロー・セキュリティチェックを有効にします。 +# --coverage カバレッジ計測します。(-fprofile-arcs -ftest-coverage オプションと同じ) +# -g0 デバッグオプション無効。 +# -g1 最小限のデバッグ情報を生成します。 +# -g2 (-g) デバッグ情報を生成します。 +# -g3 マクロ定義を含んだデバッグ情報を生成します。 +# -ggdb gdb で使うためのデバッグ情報を生成します。 +# -D_FACTORY_SOURCE=[値] +# 文字列やメモリ操作を行う glibc の関数を使用する際に、バッファオーバーフローを検出します。 +# ※すべてのパターンではなく、よくある例についてのみ検出可能。 +# 値が1の場合、規格に準拠するプログラムの振る舞いを変化させないようなチェックが実行される。 +# 値が2の場合、さらなるチェックを追加するが、規格準拠のプログラムが失敗する可能性がある。 +# いくつかのチェックは、コンパイル時に実行され、コンパイラの警告として表示される。 +# ------------------------------------------------------------------------------ +DEBUG_OPTIONS += -fstack-protector +DEBUG_OPTIONS += --coverage +DEBUG_OPTIONS += -g3 -ggdb +DEBUG_OPTIONS += -O0 +DEBUG_OPTIONS += -D_FACTORY_SOURCE=2 +DEBUG_OPTIONS += -D_DEBUG + +DEBUG_LDFLAGS += --coverage +DEBUG_LDFLAGS += -g3 -ggdb + diff --git a/mk/check-cppcheck-conf.mk b/mk/check-cppcheck-conf.mk new file mode 100644 index 0000000..ca3db60 --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,36 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPHECK_REPORT_DIR = report/cppcheck +CPPCHECK_LOG = $(CPPCHECK_REPORT_DIR)/cppcheck.xml + + + +# ------------------------------------------------------------------------------ +# 警告抑止 +# ------------------------------------------------------------------------------ +# 次の警告を抑止します。 +# - システムヘッダー読み込み失敗 (読み込むと非常に時間がかかります。) +# - 未使用関数 (チェック単位が異なり、public な関数が呼び出されないと誤検知する) +CPPCHECK_SUPPRESS = --suppress=missingIncludeSystem +CPPCHECK_SUPPRESS += --suppress=unusedFunction + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(CPPCHECK_REPORT_DIR) +endif +endif + diff --git a/mk/check-cppcheck-rule.mk b/mk/check-cppcheck-rule.mk new file mode 100644 index 0000000..a8420d3 --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) $(CPPCHECK_REPORT_DIR) + $(CPPCHECK) $(CPPCHECK_FLAGS) $(CPPCHECK_SUPPRESS) $(INCLUDES) $(SRCDIR) 2> $(CPPCHECK_LOG) +endif +endif + diff --git a/mk/check-lcov-cobertura-conf.mk b/mk/check-lcov-cobertura-conf.mk new file mode 100644 index 0000000..8ca940f --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,13 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura.py +LCOV_COBERTURA_REPORT_DIR = report/lcov +LCOV_COBERTURA_INFO = $(LCOV_COBERTURA_REPORT_DIR)/lcov.info + diff --git a/mk/check-lcov-cobertura-rule.mk b/mk/check-lcov-cobertura-rule.mk new file mode 100644 index 0000000..110134d --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# lcov cobertura ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov-cobertura +lcov-cobertura: lcov + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov-cobertura -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(LCOV_COBERTURA) $(LCOV_COBERTURA_INFO) -b `pwd` -o $(LCOV_COBERTURA_REPORT_DIR)/lcov-coverage.xml +endif + diff --git a/mk/check-lcov-conf.mk b/mk/check-lcov-conf.mk new file mode 100644 index 0000000..f6d536b --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,34 @@ +# ============================================================================== +# lcov 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV = lcov +LCOV_REPORT_DIR = report/lcov +LCOV_INFO = $(LCOV_REPORT_DIR)/lcov.info + +GENHTML = genhtml +GENHTML_FLAGS += --function-coverage +GENHTML_FLAGS += --branch-coverage + + + +# ------------------------------------------------------------------------------ +# C1 Coverage 有効 +# ------------------------------------------------------------------------------ +LCOV_FLAGS += --rc lcov_branch_coverage=1 +LCOV_FLAGS += --rc genhtml_branch_coverage=1 + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(LCOV_REPORT_DIR) +endif + diff --git a/mk/check-lcov-rule.mk b/mk/check-lcov-rule.mk new file mode 100644 index 0000000..b75e472 --- /dev/null +++ b/mk/check-lcov-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# lcov ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov +lcov: + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(LCOV_REPORT_DIR) + $(LCOV) -c -d $(OBJDIR) $(LCOV_FLAGS) -o $(LCOV_INFO) + $(LCOV) $(LCOV_FLAGS) -r $(LCOV_INFO) "*/test/*" -o $(LCOV_INFO) + $(GENHTML) $(GENHTML_FLAGS) -o $(LCOV_REPORT_DIR) $(LCOV_INFO) +endif + diff --git a/mk/check-rule.mk b/mk/check-rule.mk new file mode 100644 index 0000000..3c516c5 --- /dev/null +++ b/mk/check-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# check ルール +# ------------------------------------------------------------------------------ +.PHONY: check +check: + @for subdir in $(SUBDIRS); do \ + $(MAKE) check -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) + ./ut.exe +endif + + diff --git a/mk/check-ut.rule.mk b/mk/check-ut.rule.mk new file mode 100644 index 0000000..0970bb9 --- /dev/null +++ b/mk/check-ut.rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# ut ルール +# ------------------------------------------------------------------------------ +.PHONY: ut +ut: $(TARGET) + ./ut.exe + diff --git a/mk/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..0d3e443 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# TARGET ファイル削除設定 +# ============================================================================== +# +# CLEAN 時に削除されるファイルを追加 +# + +ifneq ($(strip $(TARGET)),) + +CLEAN_FILES += $(OBJDIR)/*.o $(OBJDIR)/*.d $(OBJDIR)/*.gcno $(OBJDIR)/*.gcda +CLEAN_FILES += $(TARGET) + +# $(TOPDIR) に置かれたファイルの削除 +ifneq ($(strip $(TARGET)),$(strip $(NAME))) +# TARGET がライブラリの場合 +CLEAN_FILES += $(addprefix $(TOPDIR)/include/,$(notdir $(wildcard include/*.h))) +CLEAN_FILES += $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +else +# TARGET が実行ファイルの場合 +CLEAN_FILES += $(addprefix $(TOPDIR)/,$(TARGET)) + +endif +endif + diff --git a/mk/clean-rule.mk b/mk/clean-rule.mk new file mode 100644 index 0000000..0575dc5 --- /dev/null +++ b/mk/clean-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# clean ルール +# ------------------------------------------------------------------------------ +.PHONY: clean +clean: + @for subdir in $(SUBDIRS); do \ + $(MAKE) clean -C $$subdir; \ + done +ifneq ($(strip $(CLEAN_FILES)),) + $(RM) -f $(CLEAN_FILES) +endif +ifneq ($(strip $(CLEAN_DIRS)),) + $(RM) -f $(CLEAN_DIRS) +endif + diff --git a/mk/compile-c-rule.mk b/mk/compile-c-rule.mk new file mode 100644 index 0000000..f523b94 --- /dev/null +++ b/mk/compile-c-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# C言語 コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.c + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + diff --git a/mk/compile-cpp-rule.mk b/mk/compile-cpp-rule.mk new file mode 100644 index 0000000..393dea2 --- /dev/null +++ b/mk/compile-cpp-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# C++ コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.cpp + -@$(MKDIR) -p $(OBJDIR) + $(CXX) $(CXXFLAGS) -c -o $@ $< + diff --git a/mk/git-info-conf.mk b/mk/git-info-conf.mk new file mode 100644 index 0000000..7fe4f72 --- /dev/null +++ b/mk/git-info-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# git 情報 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# git のタグなどから取得可能なバージョン情報を DEFINE に設定します。 +# +# VERSION : git tag (v[Major].[Minor].[Release] の [Major].[Minor].[Release] 部分) +# MAJOR : git tag (v[Major].[Minor].[Release] の [Major] 部分) +# MINOR : git tag (v[Major].[Minor].[Release] の [Minor] 部分) +# RELEASE : git tag (v[Major].[Minor].[Release] の [Release] 部分) +# REVISION : git revision +# DATETIME : datetime (ISO8601形式) +# ------------------------------------------------------------------------------ +VERSION := $(shell $(GIT) tag | $(SORT) -V | $(TAIL) -1 | $(SED) -e 's/^[^0-9]\+//') +REVISION := $(shell $(GIT) rev-parse --short HEAD) +DATETIME := $(shell $(DATE) "+Y%m%dT%H%M%S") + +ifeq ($(strip $(VERSION)),) +VERSION := v1.0.0 +endif + +MAJOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\1/') +MINOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\2/') +RELEASE := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\3/') + +DEFINE += -DVERSION='"$(VERSION)"' -DMAJOR='"$(MAJOR)"' -DMINOR='"$(MINOR)"' -DRELEASE='"$(RELEASE)"' +DEFINE += -DREVISION='"$(REVISION)"' +DEFINE += -DDATETIME='"$(DATETIME)"' + diff --git a/mk/header-rule.mk b/mk/header-rule.mk new file mode 100644 index 0000000..82db9d4 --- /dev/null +++ b/mk/header-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# .h -> .c 依存関係ルール +# ------------------------------------------------------------------------------ +ifneq ($(MAKECMDGOALS),clean) +-include $(DEPS) +endif + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d855a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = test +TARGET = $(NAME).a +SUBDIR = + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/README.md diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..29eee10 --- /dev/null +++ b/config.mk @@ -0,0 +1,71 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + + + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + + + +# +# アーキテクチャ指定 +# +ARCH ?= x86_64 +# ARCH ?= aarch64 + + + +# +# クロスコンパイラ指定 +# +ifeq ($(strip $(ARCH)),aarch64) +CROSS_COMPILE = +else +CROSS_COMPILE = +endif + + + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (X==03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++14 + + + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + + + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + + + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += -lpthread -lrt + + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..3cf2923 --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif + diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..b35372c --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,78 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += ../include +DEFINE += -DUNITTEST +endif + + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + + +# ------------------------------------------------------------------------------ +# CFLAGS, CXXFLAGS, LDFLAGS 設定 +# ------------------------------------------------------------------------------ +CFLAGS += $(INCLUDES) +CFLAGS += $(C_VERSION) +CFLAGS += $(C_WARNING_OPTIONS) +CFLAGS += $(DEFINE) +CFLAGS += $(DEPENDS_OPTIONS) + +CXXFLAGS += $(INCLUDES) +CXXFLAGS += $(CXX_VERSION) +CXXFLAGS += $(CXX_WARNING_OPTIONS) +CXXFLAGS += $(DEFINE) +CXXFLAGS += $(DEPENDS_OPTIONS) + + + +ifeq ($(strip $(DEBUG)),) +# For Release +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# For Debug +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +endif + diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..b0c78de --- /dev/null +++ b/mk/base-cmd.mk @@ -0,0 +1,49 @@ +# ============================================================================== +# コマンド設定 +# ============================================================================== +AWK = awk +CAT = cat +CHMOD = chmod +CHOWN = chown +CP = cp +CPPCHECK = cppcheck +DATE = date +DOXYGEN = doxygen +ECHO = echo +GIT = git +GREP = grep +HEAD = head +INSTALL = install +KILL = kill +LS = ls +LN = ln +MAKE = make +MKDIR = mkdir +MKNOD = mknod +MV = mv +RM = rm +RMDIR = rmdir +PS = ps +PWD = pwd +SED = sed +SORT = sort +TAIL = tail +TAR = tar +TOUCH = touch + +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +RANLIB = $(CROSS_COMPILE)ranlib +ADDR2LINE = $(CROSS_COMPILE)addr2line +AR = $(CROSS_COMPILE)ar +AS = $(CROSS_COMPILE)as +CPP = $(CROSS_COMPILE)cpp +GCOV = $(CROSS_COMPILE)gcov +GDB = $(CROSS_COMPILE)gdb +LD = $(CROSS_COMPILE)ld +NM = $(CROSS_COMPILE)nm +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump +READELF = $(CROSS_COMPILE)readelf +STRIP = $(CROSS_COMPILE)strip + diff --git a/mk/base-conf.mk b/mk/base-conf.mk new file mode 100644 index 0000000..64f0e24 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,89 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= + + + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -O0 最適化無効。 +# -O1 速度最適化(低)。 +# -O2 速度最適化(中)[推奨]。 +# -O3 速度最適化(高)。 +# -Os サイズ最適化。 +# その他のフラグについては、gcc のヘルプを参照ください。 +# ------------------------------------------------------------------------------ +OPTIMIZATION = -O2 + + + +# ------------------------------------------------------------------------------ +# ヘッダー依存関係出力 +# 基本的に変更しないでください。 +# +# -MMD +# コンパイル時に依存関係を .d ファイルに出力する。 +# -MP +# .d ファイルにヘッダファイル用のターゲットも出力する。 +# ------------------------------------------------------------------------------ +DEPENDS_OPTIONS = -MMD -MP + + + +# ------------------------------------------------------------------------------ +# 警告オプション +# -pedantic +# ANSI C/ISO C++ により要求される警告をすべて出力する。 +# gcc の HELP にも記載されている通り、基本的に使べきではありません。 +# -pedantic-errors +# 警告ではなくエラーが出力される点を除けば -pedantic と同様です。 +# -w +# すべての警告メッセージの出力を禁止します。 +# -Wall +# 基本的な警告オプションを有効にします。 +# -Wextra +# 追加の警告オプションを有効にします。 +# -Weffc++ +# Effective C++ による方針に沿わない記述に警告を出します。 +# ------------------------------------------------------------------------------ +C_WARNING_OPTIONS += -Wall -Wextra -Werror +CXX_WARNING_OPTIONS += -Wall -Wextra -Werror -Weffc++ + + + +# ------------------------------------------------------------------------------ +# デバッグ用オプション +# デバッグ、単体テストの際のオプションを指定します。 +# +# -fstack-protector スタック・オーバーフロー・セキュリティチェックを有効にします。 +# --coverage カバレッジ計測します。(-fprofile-arcs -ftest-coverage オプションと同じ) +# -g0 デバッグオプション無効。 +# -g1 最小限のデバッグ情報を生成します。 +# -g2 (-g) デバッグ情報を生成します。 +# -g3 マクロ定義を含んだデバッグ情報を生成します。 +# -ggdb gdb で使うためのデバッグ情報を生成します。 +# -D_FACTORY_SOURCE=[値] +# 文字列やメモリ操作を行う glibc の関数を使用する際に、バッファオーバーフローを検出します。 +# ※すべてのパターンではなく、よくある例についてのみ検出可能。 +# 値が1の場合、規格に準拠するプログラムの振る舞いを変化させないようなチェックが実行される。 +# 値が2の場合、さらなるチェックを追加するが、規格準拠のプログラムが失敗する可能性がある。 +# いくつかのチェックは、コンパイル時に実行され、コンパイラの警告として表示される。 +# ------------------------------------------------------------------------------ +DEBUG_OPTIONS += -fstack-protector +DEBUG_OPTIONS += --coverage +DEBUG_OPTIONS += -g3 -ggdb +DEBUG_OPTIONS += -O0 +DEBUG_OPTIONS += -D_FACTORY_SOURCE=2 +DEBUG_OPTIONS += -D_DEBUG + +DEBUG_LDFLAGS += --coverage +DEBUG_LDFLAGS += -g3 -ggdb + diff --git a/mk/check-cppcheck-conf.mk b/mk/check-cppcheck-conf.mk new file mode 100644 index 0000000..ca3db60 --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,36 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPHECK_REPORT_DIR = report/cppcheck +CPPCHECK_LOG = $(CPPCHECK_REPORT_DIR)/cppcheck.xml + + + +# ------------------------------------------------------------------------------ +# 警告抑止 +# ------------------------------------------------------------------------------ +# 次の警告を抑止します。 +# - システムヘッダー読み込み失敗 (読み込むと非常に時間がかかります。) +# - 未使用関数 (チェック単位が異なり、public な関数が呼び出されないと誤検知する) +CPPCHECK_SUPPRESS = --suppress=missingIncludeSystem +CPPCHECK_SUPPRESS += --suppress=unusedFunction + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(CPPCHECK_REPORT_DIR) +endif +endif + diff --git a/mk/check-cppcheck-rule.mk b/mk/check-cppcheck-rule.mk new file mode 100644 index 0000000..a8420d3 --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) $(CPPCHECK_REPORT_DIR) + $(CPPCHECK) $(CPPCHECK_FLAGS) $(CPPCHECK_SUPPRESS) $(INCLUDES) $(SRCDIR) 2> $(CPPCHECK_LOG) +endif +endif + diff --git a/mk/check-lcov-cobertura-conf.mk b/mk/check-lcov-cobertura-conf.mk new file mode 100644 index 0000000..8ca940f --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,13 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura.py +LCOV_COBERTURA_REPORT_DIR = report/lcov +LCOV_COBERTURA_INFO = $(LCOV_COBERTURA_REPORT_DIR)/lcov.info + diff --git a/mk/check-lcov-cobertura-rule.mk b/mk/check-lcov-cobertura-rule.mk new file mode 100644 index 0000000..110134d --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# lcov cobertura ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov-cobertura +lcov-cobertura: lcov + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov-cobertura -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(LCOV_COBERTURA) $(LCOV_COBERTURA_INFO) -b `pwd` -o $(LCOV_COBERTURA_REPORT_DIR)/lcov-coverage.xml +endif + diff --git a/mk/check-lcov-conf.mk b/mk/check-lcov-conf.mk new file mode 100644 index 0000000..f6d536b --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,34 @@ +# ============================================================================== +# lcov 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV = lcov +LCOV_REPORT_DIR = report/lcov +LCOV_INFO = $(LCOV_REPORT_DIR)/lcov.info + +GENHTML = genhtml +GENHTML_FLAGS += --function-coverage +GENHTML_FLAGS += --branch-coverage + + + +# ------------------------------------------------------------------------------ +# C1 Coverage 有効 +# ------------------------------------------------------------------------------ +LCOV_FLAGS += --rc lcov_branch_coverage=1 +LCOV_FLAGS += --rc genhtml_branch_coverage=1 + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(LCOV_REPORT_DIR) +endif + diff --git a/mk/check-lcov-rule.mk b/mk/check-lcov-rule.mk new file mode 100644 index 0000000..b75e472 --- /dev/null +++ b/mk/check-lcov-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# lcov ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov +lcov: + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(LCOV_REPORT_DIR) + $(LCOV) -c -d $(OBJDIR) $(LCOV_FLAGS) -o $(LCOV_INFO) + $(LCOV) $(LCOV_FLAGS) -r $(LCOV_INFO) "*/test/*" -o $(LCOV_INFO) + $(GENHTML) $(GENHTML_FLAGS) -o $(LCOV_REPORT_DIR) $(LCOV_INFO) +endif + diff --git a/mk/check-rule.mk b/mk/check-rule.mk new file mode 100644 index 0000000..3c516c5 --- /dev/null +++ b/mk/check-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# check ルール +# ------------------------------------------------------------------------------ +.PHONY: check +check: + @for subdir in $(SUBDIRS); do \ + $(MAKE) check -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) + ./ut.exe +endif + + diff --git a/mk/check-ut.rule.mk b/mk/check-ut.rule.mk new file mode 100644 index 0000000..0970bb9 --- /dev/null +++ b/mk/check-ut.rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# ut ルール +# ------------------------------------------------------------------------------ +.PHONY: ut +ut: $(TARGET) + ./ut.exe + diff --git a/mk/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..0d3e443 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# TARGET ファイル削除設定 +# ============================================================================== +# +# CLEAN 時に削除されるファイルを追加 +# + +ifneq ($(strip $(TARGET)),) + +CLEAN_FILES += $(OBJDIR)/*.o $(OBJDIR)/*.d $(OBJDIR)/*.gcno $(OBJDIR)/*.gcda +CLEAN_FILES += $(TARGET) + +# $(TOPDIR) に置かれたファイルの削除 +ifneq ($(strip $(TARGET)),$(strip $(NAME))) +# TARGET がライブラリの場合 +CLEAN_FILES += $(addprefix $(TOPDIR)/include/,$(notdir $(wildcard include/*.h))) +CLEAN_FILES += $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +else +# TARGET が実行ファイルの場合 +CLEAN_FILES += $(addprefix $(TOPDIR)/,$(TARGET)) + +endif +endif + diff --git a/mk/clean-rule.mk b/mk/clean-rule.mk new file mode 100644 index 0000000..0575dc5 --- /dev/null +++ b/mk/clean-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# clean ルール +# ------------------------------------------------------------------------------ +.PHONY: clean +clean: + @for subdir in $(SUBDIRS); do \ + $(MAKE) clean -C $$subdir; \ + done +ifneq ($(strip $(CLEAN_FILES)),) + $(RM) -f $(CLEAN_FILES) +endif +ifneq ($(strip $(CLEAN_DIRS)),) + $(RM) -f $(CLEAN_DIRS) +endif + diff --git a/mk/compile-c-rule.mk b/mk/compile-c-rule.mk new file mode 100644 index 0000000..f523b94 --- /dev/null +++ b/mk/compile-c-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# C言語 コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.c + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + diff --git a/mk/compile-cpp-rule.mk b/mk/compile-cpp-rule.mk new file mode 100644 index 0000000..393dea2 --- /dev/null +++ b/mk/compile-cpp-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# C++ コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.cpp + -@$(MKDIR) -p $(OBJDIR) + $(CXX) $(CXXFLAGS) -c -o $@ $< + diff --git a/mk/git-info-conf.mk b/mk/git-info-conf.mk new file mode 100644 index 0000000..7fe4f72 --- /dev/null +++ b/mk/git-info-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# git 情報 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# git のタグなどから取得可能なバージョン情報を DEFINE に設定します。 +# +# VERSION : git tag (v[Major].[Minor].[Release] の [Major].[Minor].[Release] 部分) +# MAJOR : git tag (v[Major].[Minor].[Release] の [Major] 部分) +# MINOR : git tag (v[Major].[Minor].[Release] の [Minor] 部分) +# RELEASE : git tag (v[Major].[Minor].[Release] の [Release] 部分) +# REVISION : git revision +# DATETIME : datetime (ISO8601形式) +# ------------------------------------------------------------------------------ +VERSION := $(shell $(GIT) tag | $(SORT) -V | $(TAIL) -1 | $(SED) -e 's/^[^0-9]\+//') +REVISION := $(shell $(GIT) rev-parse --short HEAD) +DATETIME := $(shell $(DATE) "+Y%m%dT%H%M%S") + +ifeq ($(strip $(VERSION)),) +VERSION := v1.0.0 +endif + +MAJOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\1/') +MINOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\2/') +RELEASE := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\3/') + +DEFINE += -DVERSION='"$(VERSION)"' -DMAJOR='"$(MAJOR)"' -DMINOR='"$(MINOR)"' -DRELEASE='"$(RELEASE)"' +DEFINE += -DREVISION='"$(REVISION)"' +DEFINE += -DDATETIME='"$(DATETIME)"' + diff --git a/mk/header-rule.mk b/mk/header-rule.mk new file mode 100644 index 0000000..82db9d4 --- /dev/null +++ b/mk/header-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# .h -> .c 依存関係ルール +# ------------------------------------------------------------------------------ +ifneq ($(MAKECMDGOALS),clean) +-include $(DEPS) +endif + diff --git a/mk/link-a-conf.mk b/mk/link-a-conf.mk new file mode 100644 index 0000000..8a53da6 --- /dev/null +++ b/mk/link-a-conf.mk @@ -0,0 +1,18 @@ +# ============================================================================== +# 静的ライブラリ 生成に関する設定 +# ============================================================================== + +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).a),$(strip $(TARGET))) + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) + +endif +endif + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d855a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = test +TARGET = $(NAME).a +SUBDIR = + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/README.md diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..29eee10 --- /dev/null +++ b/config.mk @@ -0,0 +1,71 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + + + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + + + +# +# アーキテクチャ指定 +# +ARCH ?= x86_64 +# ARCH ?= aarch64 + + + +# +# クロスコンパイラ指定 +# +ifeq ($(strip $(ARCH)),aarch64) +CROSS_COMPILE = +else +CROSS_COMPILE = +endif + + + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (X==03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++14 + + + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + + + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + + + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += -lpthread -lrt + + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..3cf2923 --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif + diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..b35372c --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,78 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += ../include +DEFINE += -DUNITTEST +endif + + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + + +# ------------------------------------------------------------------------------ +# CFLAGS, CXXFLAGS, LDFLAGS 設定 +# ------------------------------------------------------------------------------ +CFLAGS += $(INCLUDES) +CFLAGS += $(C_VERSION) +CFLAGS += $(C_WARNING_OPTIONS) +CFLAGS += $(DEFINE) +CFLAGS += $(DEPENDS_OPTIONS) + +CXXFLAGS += $(INCLUDES) +CXXFLAGS += $(CXX_VERSION) +CXXFLAGS += $(CXX_WARNING_OPTIONS) +CXXFLAGS += $(DEFINE) +CXXFLAGS += $(DEPENDS_OPTIONS) + + + +ifeq ($(strip $(DEBUG)),) +# For Release +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# For Debug +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +endif + diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..b0c78de --- /dev/null +++ b/mk/base-cmd.mk @@ -0,0 +1,49 @@ +# ============================================================================== +# コマンド設定 +# ============================================================================== +AWK = awk +CAT = cat +CHMOD = chmod +CHOWN = chown +CP = cp +CPPCHECK = cppcheck +DATE = date +DOXYGEN = doxygen +ECHO = echo +GIT = git +GREP = grep +HEAD = head +INSTALL = install +KILL = kill +LS = ls +LN = ln +MAKE = make +MKDIR = mkdir +MKNOD = mknod +MV = mv +RM = rm +RMDIR = rmdir +PS = ps +PWD = pwd +SED = sed +SORT = sort +TAIL = tail +TAR = tar +TOUCH = touch + +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +RANLIB = $(CROSS_COMPILE)ranlib +ADDR2LINE = $(CROSS_COMPILE)addr2line +AR = $(CROSS_COMPILE)ar +AS = $(CROSS_COMPILE)as +CPP = $(CROSS_COMPILE)cpp +GCOV = $(CROSS_COMPILE)gcov +GDB = $(CROSS_COMPILE)gdb +LD = $(CROSS_COMPILE)ld +NM = $(CROSS_COMPILE)nm +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump +READELF = $(CROSS_COMPILE)readelf +STRIP = $(CROSS_COMPILE)strip + diff --git a/mk/base-conf.mk b/mk/base-conf.mk new file mode 100644 index 0000000..64f0e24 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,89 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= + + + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -O0 最適化無効。 +# -O1 速度最適化(低)。 +# -O2 速度最適化(中)[推奨]。 +# -O3 速度最適化(高)。 +# -Os サイズ最適化。 +# その他のフラグについては、gcc のヘルプを参照ください。 +# ------------------------------------------------------------------------------ +OPTIMIZATION = -O2 + + + +# ------------------------------------------------------------------------------ +# ヘッダー依存関係出力 +# 基本的に変更しないでください。 +# +# -MMD +# コンパイル時に依存関係を .d ファイルに出力する。 +# -MP +# .d ファイルにヘッダファイル用のターゲットも出力する。 +# ------------------------------------------------------------------------------ +DEPENDS_OPTIONS = -MMD -MP + + + +# ------------------------------------------------------------------------------ +# 警告オプション +# -pedantic +# ANSI C/ISO C++ により要求される警告をすべて出力する。 +# gcc の HELP にも記載されている通り、基本的に使べきではありません。 +# -pedantic-errors +# 警告ではなくエラーが出力される点を除けば -pedantic と同様です。 +# -w +# すべての警告メッセージの出力を禁止します。 +# -Wall +# 基本的な警告オプションを有効にします。 +# -Wextra +# 追加の警告オプションを有効にします。 +# -Weffc++ +# Effective C++ による方針に沿わない記述に警告を出します。 +# ------------------------------------------------------------------------------ +C_WARNING_OPTIONS += -Wall -Wextra -Werror +CXX_WARNING_OPTIONS += -Wall -Wextra -Werror -Weffc++ + + + +# ------------------------------------------------------------------------------ +# デバッグ用オプション +# デバッグ、単体テストの際のオプションを指定します。 +# +# -fstack-protector スタック・オーバーフロー・セキュリティチェックを有効にします。 +# --coverage カバレッジ計測します。(-fprofile-arcs -ftest-coverage オプションと同じ) +# -g0 デバッグオプション無効。 +# -g1 最小限のデバッグ情報を生成します。 +# -g2 (-g) デバッグ情報を生成します。 +# -g3 マクロ定義を含んだデバッグ情報を生成します。 +# -ggdb gdb で使うためのデバッグ情報を生成します。 +# -D_FACTORY_SOURCE=[値] +# 文字列やメモリ操作を行う glibc の関数を使用する際に、バッファオーバーフローを検出します。 +# ※すべてのパターンではなく、よくある例についてのみ検出可能。 +# 値が1の場合、規格に準拠するプログラムの振る舞いを変化させないようなチェックが実行される。 +# 値が2の場合、さらなるチェックを追加するが、規格準拠のプログラムが失敗する可能性がある。 +# いくつかのチェックは、コンパイル時に実行され、コンパイラの警告として表示される。 +# ------------------------------------------------------------------------------ +DEBUG_OPTIONS += -fstack-protector +DEBUG_OPTIONS += --coverage +DEBUG_OPTIONS += -g3 -ggdb +DEBUG_OPTIONS += -O0 +DEBUG_OPTIONS += -D_FACTORY_SOURCE=2 +DEBUG_OPTIONS += -D_DEBUG + +DEBUG_LDFLAGS += --coverage +DEBUG_LDFLAGS += -g3 -ggdb + diff --git a/mk/check-cppcheck-conf.mk b/mk/check-cppcheck-conf.mk new file mode 100644 index 0000000..ca3db60 --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,36 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPHECK_REPORT_DIR = report/cppcheck +CPPCHECK_LOG = $(CPPCHECK_REPORT_DIR)/cppcheck.xml + + + +# ------------------------------------------------------------------------------ +# 警告抑止 +# ------------------------------------------------------------------------------ +# 次の警告を抑止します。 +# - システムヘッダー読み込み失敗 (読み込むと非常に時間がかかります。) +# - 未使用関数 (チェック単位が異なり、public な関数が呼び出されないと誤検知する) +CPPCHECK_SUPPRESS = --suppress=missingIncludeSystem +CPPCHECK_SUPPRESS += --suppress=unusedFunction + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(CPPCHECK_REPORT_DIR) +endif +endif + diff --git a/mk/check-cppcheck-rule.mk b/mk/check-cppcheck-rule.mk new file mode 100644 index 0000000..a8420d3 --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) $(CPPCHECK_REPORT_DIR) + $(CPPCHECK) $(CPPCHECK_FLAGS) $(CPPCHECK_SUPPRESS) $(INCLUDES) $(SRCDIR) 2> $(CPPCHECK_LOG) +endif +endif + diff --git a/mk/check-lcov-cobertura-conf.mk b/mk/check-lcov-cobertura-conf.mk new file mode 100644 index 0000000..8ca940f --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,13 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura.py +LCOV_COBERTURA_REPORT_DIR = report/lcov +LCOV_COBERTURA_INFO = $(LCOV_COBERTURA_REPORT_DIR)/lcov.info + diff --git a/mk/check-lcov-cobertura-rule.mk b/mk/check-lcov-cobertura-rule.mk new file mode 100644 index 0000000..110134d --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# lcov cobertura ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov-cobertura +lcov-cobertura: lcov + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov-cobertura -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(LCOV_COBERTURA) $(LCOV_COBERTURA_INFO) -b `pwd` -o $(LCOV_COBERTURA_REPORT_DIR)/lcov-coverage.xml +endif + diff --git a/mk/check-lcov-conf.mk b/mk/check-lcov-conf.mk new file mode 100644 index 0000000..f6d536b --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,34 @@ +# ============================================================================== +# lcov 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV = lcov +LCOV_REPORT_DIR = report/lcov +LCOV_INFO = $(LCOV_REPORT_DIR)/lcov.info + +GENHTML = genhtml +GENHTML_FLAGS += --function-coverage +GENHTML_FLAGS += --branch-coverage + + + +# ------------------------------------------------------------------------------ +# C1 Coverage 有効 +# ------------------------------------------------------------------------------ +LCOV_FLAGS += --rc lcov_branch_coverage=1 +LCOV_FLAGS += --rc genhtml_branch_coverage=1 + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(LCOV_REPORT_DIR) +endif + diff --git a/mk/check-lcov-rule.mk b/mk/check-lcov-rule.mk new file mode 100644 index 0000000..b75e472 --- /dev/null +++ b/mk/check-lcov-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# lcov ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov +lcov: + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(LCOV_REPORT_DIR) + $(LCOV) -c -d $(OBJDIR) $(LCOV_FLAGS) -o $(LCOV_INFO) + $(LCOV) $(LCOV_FLAGS) -r $(LCOV_INFO) "*/test/*" -o $(LCOV_INFO) + $(GENHTML) $(GENHTML_FLAGS) -o $(LCOV_REPORT_DIR) $(LCOV_INFO) +endif + diff --git a/mk/check-rule.mk b/mk/check-rule.mk new file mode 100644 index 0000000..3c516c5 --- /dev/null +++ b/mk/check-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# check ルール +# ------------------------------------------------------------------------------ +.PHONY: check +check: + @for subdir in $(SUBDIRS); do \ + $(MAKE) check -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) + ./ut.exe +endif + + diff --git a/mk/check-ut.rule.mk b/mk/check-ut.rule.mk new file mode 100644 index 0000000..0970bb9 --- /dev/null +++ b/mk/check-ut.rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# ut ルール +# ------------------------------------------------------------------------------ +.PHONY: ut +ut: $(TARGET) + ./ut.exe + diff --git a/mk/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..0d3e443 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# TARGET ファイル削除設定 +# ============================================================================== +# +# CLEAN 時に削除されるファイルを追加 +# + +ifneq ($(strip $(TARGET)),) + +CLEAN_FILES += $(OBJDIR)/*.o $(OBJDIR)/*.d $(OBJDIR)/*.gcno $(OBJDIR)/*.gcda +CLEAN_FILES += $(TARGET) + +# $(TOPDIR) に置かれたファイルの削除 +ifneq ($(strip $(TARGET)),$(strip $(NAME))) +# TARGET がライブラリの場合 +CLEAN_FILES += $(addprefix $(TOPDIR)/include/,$(notdir $(wildcard include/*.h))) +CLEAN_FILES += $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +else +# TARGET が実行ファイルの場合 +CLEAN_FILES += $(addprefix $(TOPDIR)/,$(TARGET)) + +endif +endif + diff --git a/mk/clean-rule.mk b/mk/clean-rule.mk new file mode 100644 index 0000000..0575dc5 --- /dev/null +++ b/mk/clean-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# clean ルール +# ------------------------------------------------------------------------------ +.PHONY: clean +clean: + @for subdir in $(SUBDIRS); do \ + $(MAKE) clean -C $$subdir; \ + done +ifneq ($(strip $(CLEAN_FILES)),) + $(RM) -f $(CLEAN_FILES) +endif +ifneq ($(strip $(CLEAN_DIRS)),) + $(RM) -f $(CLEAN_DIRS) +endif + diff --git a/mk/compile-c-rule.mk b/mk/compile-c-rule.mk new file mode 100644 index 0000000..f523b94 --- /dev/null +++ b/mk/compile-c-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# C言語 コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.c + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + diff --git a/mk/compile-cpp-rule.mk b/mk/compile-cpp-rule.mk new file mode 100644 index 0000000..393dea2 --- /dev/null +++ b/mk/compile-cpp-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# C++ コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.cpp + -@$(MKDIR) -p $(OBJDIR) + $(CXX) $(CXXFLAGS) -c -o $@ $< + diff --git a/mk/git-info-conf.mk b/mk/git-info-conf.mk new file mode 100644 index 0000000..7fe4f72 --- /dev/null +++ b/mk/git-info-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# git 情報 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# git のタグなどから取得可能なバージョン情報を DEFINE に設定します。 +# +# VERSION : git tag (v[Major].[Minor].[Release] の [Major].[Minor].[Release] 部分) +# MAJOR : git tag (v[Major].[Minor].[Release] の [Major] 部分) +# MINOR : git tag (v[Major].[Minor].[Release] の [Minor] 部分) +# RELEASE : git tag (v[Major].[Minor].[Release] の [Release] 部分) +# REVISION : git revision +# DATETIME : datetime (ISO8601形式) +# ------------------------------------------------------------------------------ +VERSION := $(shell $(GIT) tag | $(SORT) -V | $(TAIL) -1 | $(SED) -e 's/^[^0-9]\+//') +REVISION := $(shell $(GIT) rev-parse --short HEAD) +DATETIME := $(shell $(DATE) "+Y%m%dT%H%M%S") + +ifeq ($(strip $(VERSION)),) +VERSION := v1.0.0 +endif + +MAJOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\1/') +MINOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\2/') +RELEASE := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\3/') + +DEFINE += -DVERSION='"$(VERSION)"' -DMAJOR='"$(MAJOR)"' -DMINOR='"$(MINOR)"' -DRELEASE='"$(RELEASE)"' +DEFINE += -DREVISION='"$(REVISION)"' +DEFINE += -DDATETIME='"$(DATETIME)"' + diff --git a/mk/header-rule.mk b/mk/header-rule.mk new file mode 100644 index 0000000..82db9d4 --- /dev/null +++ b/mk/header-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# .h -> .c 依存関係ルール +# ------------------------------------------------------------------------------ +ifneq ($(MAKECMDGOALS),clean) +-include $(DEPS) +endif + diff --git a/mk/link-a-conf.mk b/mk/link-a-conf.mk new file mode 100644 index 0000000..8a53da6 --- /dev/null +++ b/mk/link-a-conf.mk @@ -0,0 +1,18 @@ +# ============================================================================== +# 静的ライブラリ 生成に関する設定 +# ============================================================================== + +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).a),$(strip $(TARGET))) + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) + +endif +endif + diff --git a/mk/link-a-rule.mk b/mk/link-a-rule.mk new file mode 100644 index 0000000..d94a54a --- /dev/null +++ b/mk/link-a-rule.mk @@ -0,0 +1,18 @@ +# ------------------------------------------------------------------------------ +# 静的ライブラリ 生成ルール +# ------------------------------------------------------------------------------ +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).a),$(strip $(TARGET))) +$(TARGET): $(OBJS) + $(AR) rv $@ $^ + $(RANLIB) $@ + +$(TOP_TARGET): $(TARGET) +ifneq ($(strip $(HEADER_FILES)),) + $(CP) -f $(HEADER_FILES) $(TOPDIR)/include/ +endif + $(CP) -f $(TARGET) $(TOPDIR)/lib/ + +endif +endif + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d855a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = test +TARGET = $(NAME).a +SUBDIR = + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/README.md diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..29eee10 --- /dev/null +++ b/config.mk @@ -0,0 +1,71 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + + + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + + + +# +# アーキテクチャ指定 +# +ARCH ?= x86_64 +# ARCH ?= aarch64 + + + +# +# クロスコンパイラ指定 +# +ifeq ($(strip $(ARCH)),aarch64) +CROSS_COMPILE = +else +CROSS_COMPILE = +endif + + + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (X==03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++14 + + + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + + + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + + + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += -lpthread -lrt + + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..3cf2923 --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif + diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..b35372c --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,78 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += ../include +DEFINE += -DUNITTEST +endif + + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + + +# ------------------------------------------------------------------------------ +# CFLAGS, CXXFLAGS, LDFLAGS 設定 +# ------------------------------------------------------------------------------ +CFLAGS += $(INCLUDES) +CFLAGS += $(C_VERSION) +CFLAGS += $(C_WARNING_OPTIONS) +CFLAGS += $(DEFINE) +CFLAGS += $(DEPENDS_OPTIONS) + +CXXFLAGS += $(INCLUDES) +CXXFLAGS += $(CXX_VERSION) +CXXFLAGS += $(CXX_WARNING_OPTIONS) +CXXFLAGS += $(DEFINE) +CXXFLAGS += $(DEPENDS_OPTIONS) + + + +ifeq ($(strip $(DEBUG)),) +# For Release +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# For Debug +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +endif + diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..b0c78de --- /dev/null +++ b/mk/base-cmd.mk @@ -0,0 +1,49 @@ +# ============================================================================== +# コマンド設定 +# ============================================================================== +AWK = awk +CAT = cat +CHMOD = chmod +CHOWN = chown +CP = cp +CPPCHECK = cppcheck +DATE = date +DOXYGEN = doxygen +ECHO = echo +GIT = git +GREP = grep +HEAD = head +INSTALL = install +KILL = kill +LS = ls +LN = ln +MAKE = make +MKDIR = mkdir +MKNOD = mknod +MV = mv +RM = rm +RMDIR = rmdir +PS = ps +PWD = pwd +SED = sed +SORT = sort +TAIL = tail +TAR = tar +TOUCH = touch + +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +RANLIB = $(CROSS_COMPILE)ranlib +ADDR2LINE = $(CROSS_COMPILE)addr2line +AR = $(CROSS_COMPILE)ar +AS = $(CROSS_COMPILE)as +CPP = $(CROSS_COMPILE)cpp +GCOV = $(CROSS_COMPILE)gcov +GDB = $(CROSS_COMPILE)gdb +LD = $(CROSS_COMPILE)ld +NM = $(CROSS_COMPILE)nm +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump +READELF = $(CROSS_COMPILE)readelf +STRIP = $(CROSS_COMPILE)strip + diff --git a/mk/base-conf.mk b/mk/base-conf.mk new file mode 100644 index 0000000..64f0e24 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,89 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= + + + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -O0 最適化無効。 +# -O1 速度最適化(低)。 +# -O2 速度最適化(中)[推奨]。 +# -O3 速度最適化(高)。 +# -Os サイズ最適化。 +# その他のフラグについては、gcc のヘルプを参照ください。 +# ------------------------------------------------------------------------------ +OPTIMIZATION = -O2 + + + +# ------------------------------------------------------------------------------ +# ヘッダー依存関係出力 +# 基本的に変更しないでください。 +# +# -MMD +# コンパイル時に依存関係を .d ファイルに出力する。 +# -MP +# .d ファイルにヘッダファイル用のターゲットも出力する。 +# ------------------------------------------------------------------------------ +DEPENDS_OPTIONS = -MMD -MP + + + +# ------------------------------------------------------------------------------ +# 警告オプション +# -pedantic +# ANSI C/ISO C++ により要求される警告をすべて出力する。 +# gcc の HELP にも記載されている通り、基本的に使べきではありません。 +# -pedantic-errors +# 警告ではなくエラーが出力される点を除けば -pedantic と同様です。 +# -w +# すべての警告メッセージの出力を禁止します。 +# -Wall +# 基本的な警告オプションを有効にします。 +# -Wextra +# 追加の警告オプションを有効にします。 +# -Weffc++ +# Effective C++ による方針に沿わない記述に警告を出します。 +# ------------------------------------------------------------------------------ +C_WARNING_OPTIONS += -Wall -Wextra -Werror +CXX_WARNING_OPTIONS += -Wall -Wextra -Werror -Weffc++ + + + +# ------------------------------------------------------------------------------ +# デバッグ用オプション +# デバッグ、単体テストの際のオプションを指定します。 +# +# -fstack-protector スタック・オーバーフロー・セキュリティチェックを有効にします。 +# --coverage カバレッジ計測します。(-fprofile-arcs -ftest-coverage オプションと同じ) +# -g0 デバッグオプション無効。 +# -g1 最小限のデバッグ情報を生成します。 +# -g2 (-g) デバッグ情報を生成します。 +# -g3 マクロ定義を含んだデバッグ情報を生成します。 +# -ggdb gdb で使うためのデバッグ情報を生成します。 +# -D_FACTORY_SOURCE=[値] +# 文字列やメモリ操作を行う glibc の関数を使用する際に、バッファオーバーフローを検出します。 +# ※すべてのパターンではなく、よくある例についてのみ検出可能。 +# 値が1の場合、規格に準拠するプログラムの振る舞いを変化させないようなチェックが実行される。 +# 値が2の場合、さらなるチェックを追加するが、規格準拠のプログラムが失敗する可能性がある。 +# いくつかのチェックは、コンパイル時に実行され、コンパイラの警告として表示される。 +# ------------------------------------------------------------------------------ +DEBUG_OPTIONS += -fstack-protector +DEBUG_OPTIONS += --coverage +DEBUG_OPTIONS += -g3 -ggdb +DEBUG_OPTIONS += -O0 +DEBUG_OPTIONS += -D_FACTORY_SOURCE=2 +DEBUG_OPTIONS += -D_DEBUG + +DEBUG_LDFLAGS += --coverage +DEBUG_LDFLAGS += -g3 -ggdb + diff --git a/mk/check-cppcheck-conf.mk b/mk/check-cppcheck-conf.mk new file mode 100644 index 0000000..ca3db60 --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,36 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPHECK_REPORT_DIR = report/cppcheck +CPPCHECK_LOG = $(CPPCHECK_REPORT_DIR)/cppcheck.xml + + + +# ------------------------------------------------------------------------------ +# 警告抑止 +# ------------------------------------------------------------------------------ +# 次の警告を抑止します。 +# - システムヘッダー読み込み失敗 (読み込むと非常に時間がかかります。) +# - 未使用関数 (チェック単位が異なり、public な関数が呼び出されないと誤検知する) +CPPCHECK_SUPPRESS = --suppress=missingIncludeSystem +CPPCHECK_SUPPRESS += --suppress=unusedFunction + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(CPPCHECK_REPORT_DIR) +endif +endif + diff --git a/mk/check-cppcheck-rule.mk b/mk/check-cppcheck-rule.mk new file mode 100644 index 0000000..a8420d3 --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) $(CPPCHECK_REPORT_DIR) + $(CPPCHECK) $(CPPCHECK_FLAGS) $(CPPCHECK_SUPPRESS) $(INCLUDES) $(SRCDIR) 2> $(CPPCHECK_LOG) +endif +endif + diff --git a/mk/check-lcov-cobertura-conf.mk b/mk/check-lcov-cobertura-conf.mk new file mode 100644 index 0000000..8ca940f --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,13 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura.py +LCOV_COBERTURA_REPORT_DIR = report/lcov +LCOV_COBERTURA_INFO = $(LCOV_COBERTURA_REPORT_DIR)/lcov.info + diff --git a/mk/check-lcov-cobertura-rule.mk b/mk/check-lcov-cobertura-rule.mk new file mode 100644 index 0000000..110134d --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# lcov cobertura ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov-cobertura +lcov-cobertura: lcov + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov-cobertura -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(LCOV_COBERTURA) $(LCOV_COBERTURA_INFO) -b `pwd` -o $(LCOV_COBERTURA_REPORT_DIR)/lcov-coverage.xml +endif + diff --git a/mk/check-lcov-conf.mk b/mk/check-lcov-conf.mk new file mode 100644 index 0000000..f6d536b --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,34 @@ +# ============================================================================== +# lcov 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV = lcov +LCOV_REPORT_DIR = report/lcov +LCOV_INFO = $(LCOV_REPORT_DIR)/lcov.info + +GENHTML = genhtml +GENHTML_FLAGS += --function-coverage +GENHTML_FLAGS += --branch-coverage + + + +# ------------------------------------------------------------------------------ +# C1 Coverage 有効 +# ------------------------------------------------------------------------------ +LCOV_FLAGS += --rc lcov_branch_coverage=1 +LCOV_FLAGS += --rc genhtml_branch_coverage=1 + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(LCOV_REPORT_DIR) +endif + diff --git a/mk/check-lcov-rule.mk b/mk/check-lcov-rule.mk new file mode 100644 index 0000000..b75e472 --- /dev/null +++ b/mk/check-lcov-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# lcov ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov +lcov: + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(LCOV_REPORT_DIR) + $(LCOV) -c -d $(OBJDIR) $(LCOV_FLAGS) -o $(LCOV_INFO) + $(LCOV) $(LCOV_FLAGS) -r $(LCOV_INFO) "*/test/*" -o $(LCOV_INFO) + $(GENHTML) $(GENHTML_FLAGS) -o $(LCOV_REPORT_DIR) $(LCOV_INFO) +endif + diff --git a/mk/check-rule.mk b/mk/check-rule.mk new file mode 100644 index 0000000..3c516c5 --- /dev/null +++ b/mk/check-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# check ルール +# ------------------------------------------------------------------------------ +.PHONY: check +check: + @for subdir in $(SUBDIRS); do \ + $(MAKE) check -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) + ./ut.exe +endif + + diff --git a/mk/check-ut.rule.mk b/mk/check-ut.rule.mk new file mode 100644 index 0000000..0970bb9 --- /dev/null +++ b/mk/check-ut.rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# ut ルール +# ------------------------------------------------------------------------------ +.PHONY: ut +ut: $(TARGET) + ./ut.exe + diff --git a/mk/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..0d3e443 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# TARGET ファイル削除設定 +# ============================================================================== +# +# CLEAN 時に削除されるファイルを追加 +# + +ifneq ($(strip $(TARGET)),) + +CLEAN_FILES += $(OBJDIR)/*.o $(OBJDIR)/*.d $(OBJDIR)/*.gcno $(OBJDIR)/*.gcda +CLEAN_FILES += $(TARGET) + +# $(TOPDIR) に置かれたファイルの削除 +ifneq ($(strip $(TARGET)),$(strip $(NAME))) +# TARGET がライブラリの場合 +CLEAN_FILES += $(addprefix $(TOPDIR)/include/,$(notdir $(wildcard include/*.h))) +CLEAN_FILES += $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +else +# TARGET が実行ファイルの場合 +CLEAN_FILES += $(addprefix $(TOPDIR)/,$(TARGET)) + +endif +endif + diff --git a/mk/clean-rule.mk b/mk/clean-rule.mk new file mode 100644 index 0000000..0575dc5 --- /dev/null +++ b/mk/clean-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# clean ルール +# ------------------------------------------------------------------------------ +.PHONY: clean +clean: + @for subdir in $(SUBDIRS); do \ + $(MAKE) clean -C $$subdir; \ + done +ifneq ($(strip $(CLEAN_FILES)),) + $(RM) -f $(CLEAN_FILES) +endif +ifneq ($(strip $(CLEAN_DIRS)),) + $(RM) -f $(CLEAN_DIRS) +endif + diff --git a/mk/compile-c-rule.mk b/mk/compile-c-rule.mk new file mode 100644 index 0000000..f523b94 --- /dev/null +++ b/mk/compile-c-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# C言語 コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.c + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + diff --git a/mk/compile-cpp-rule.mk b/mk/compile-cpp-rule.mk new file mode 100644 index 0000000..393dea2 --- /dev/null +++ b/mk/compile-cpp-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# C++ コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.cpp + -@$(MKDIR) -p $(OBJDIR) + $(CXX) $(CXXFLAGS) -c -o $@ $< + diff --git a/mk/git-info-conf.mk b/mk/git-info-conf.mk new file mode 100644 index 0000000..7fe4f72 --- /dev/null +++ b/mk/git-info-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# git 情報 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# git のタグなどから取得可能なバージョン情報を DEFINE に設定します。 +# +# VERSION : git tag (v[Major].[Minor].[Release] の [Major].[Minor].[Release] 部分) +# MAJOR : git tag (v[Major].[Minor].[Release] の [Major] 部分) +# MINOR : git tag (v[Major].[Minor].[Release] の [Minor] 部分) +# RELEASE : git tag (v[Major].[Minor].[Release] の [Release] 部分) +# REVISION : git revision +# DATETIME : datetime (ISO8601形式) +# ------------------------------------------------------------------------------ +VERSION := $(shell $(GIT) tag | $(SORT) -V | $(TAIL) -1 | $(SED) -e 's/^[^0-9]\+//') +REVISION := $(shell $(GIT) rev-parse --short HEAD) +DATETIME := $(shell $(DATE) "+Y%m%dT%H%M%S") + +ifeq ($(strip $(VERSION)),) +VERSION := v1.0.0 +endif + +MAJOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\1/') +MINOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\2/') +RELEASE := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\3/') + +DEFINE += -DVERSION='"$(VERSION)"' -DMAJOR='"$(MAJOR)"' -DMINOR='"$(MINOR)"' -DRELEASE='"$(RELEASE)"' +DEFINE += -DREVISION='"$(REVISION)"' +DEFINE += -DDATETIME='"$(DATETIME)"' + diff --git a/mk/header-rule.mk b/mk/header-rule.mk new file mode 100644 index 0000000..82db9d4 --- /dev/null +++ b/mk/header-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# .h -> .c 依存関係ルール +# ------------------------------------------------------------------------------ +ifneq ($(MAKECMDGOALS),clean) +-include $(DEPS) +endif + diff --git a/mk/link-a-conf.mk b/mk/link-a-conf.mk new file mode 100644 index 0000000..8a53da6 --- /dev/null +++ b/mk/link-a-conf.mk @@ -0,0 +1,18 @@ +# ============================================================================== +# 静的ライブラリ 生成に関する設定 +# ============================================================================== + +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).a),$(strip $(TARGET))) + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) + +endif +endif + diff --git a/mk/link-a-rule.mk b/mk/link-a-rule.mk new file mode 100644 index 0000000..d94a54a --- /dev/null +++ b/mk/link-a-rule.mk @@ -0,0 +1,18 @@ +# ------------------------------------------------------------------------------ +# 静的ライブラリ 生成ルール +# ------------------------------------------------------------------------------ +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).a),$(strip $(TARGET))) +$(TARGET): $(OBJS) + $(AR) rv $@ $^ + $(RANLIB) $@ + +$(TOP_TARGET): $(TARGET) +ifneq ($(strip $(HEADER_FILES)),) + $(CP) -f $(HEADER_FILES) $(TOPDIR)/include/ +endif + $(CP) -f $(TARGET) $(TOPDIR)/lib/ + +endif +endif + diff --git a/mk/link-exe-rule.mk b/mk/link-exe-rule.mk new file mode 100644 index 0000000..2f73a13 --- /dev/null +++ b/mk/link-exe-rule.mk @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------------ +# 実行ファイル 生成ルール +# ------------------------------------------------------------------------------ +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +$(TARGET): $(OBJS) + $(LINK) $(LDFLAGS) -o $@ $^ $(LIBS) + +endif +endif + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d855a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = test +TARGET = $(NAME).a +SUBDIR = + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/README.md diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..29eee10 --- /dev/null +++ b/config.mk @@ -0,0 +1,71 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + + + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + + + +# +# アーキテクチャ指定 +# +ARCH ?= x86_64 +# ARCH ?= aarch64 + + + +# +# クロスコンパイラ指定 +# +ifeq ($(strip $(ARCH)),aarch64) +CROSS_COMPILE = +else +CROSS_COMPILE = +endif + + + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (X==03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++14 + + + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + + + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + + + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += -lpthread -lrt + + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..3cf2923 --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif + diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..b35372c --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,78 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += ../include +DEFINE += -DUNITTEST +endif + + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + + +# ------------------------------------------------------------------------------ +# CFLAGS, CXXFLAGS, LDFLAGS 設定 +# ------------------------------------------------------------------------------ +CFLAGS += $(INCLUDES) +CFLAGS += $(C_VERSION) +CFLAGS += $(C_WARNING_OPTIONS) +CFLAGS += $(DEFINE) +CFLAGS += $(DEPENDS_OPTIONS) + +CXXFLAGS += $(INCLUDES) +CXXFLAGS += $(CXX_VERSION) +CXXFLAGS += $(CXX_WARNING_OPTIONS) +CXXFLAGS += $(DEFINE) +CXXFLAGS += $(DEPENDS_OPTIONS) + + + +ifeq ($(strip $(DEBUG)),) +# For Release +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# For Debug +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +endif + diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..b0c78de --- /dev/null +++ b/mk/base-cmd.mk @@ -0,0 +1,49 @@ +# ============================================================================== +# コマンド設定 +# ============================================================================== +AWK = awk +CAT = cat +CHMOD = chmod +CHOWN = chown +CP = cp +CPPCHECK = cppcheck +DATE = date +DOXYGEN = doxygen +ECHO = echo +GIT = git +GREP = grep +HEAD = head +INSTALL = install +KILL = kill +LS = ls +LN = ln +MAKE = make +MKDIR = mkdir +MKNOD = mknod +MV = mv +RM = rm +RMDIR = rmdir +PS = ps +PWD = pwd +SED = sed +SORT = sort +TAIL = tail +TAR = tar +TOUCH = touch + +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +RANLIB = $(CROSS_COMPILE)ranlib +ADDR2LINE = $(CROSS_COMPILE)addr2line +AR = $(CROSS_COMPILE)ar +AS = $(CROSS_COMPILE)as +CPP = $(CROSS_COMPILE)cpp +GCOV = $(CROSS_COMPILE)gcov +GDB = $(CROSS_COMPILE)gdb +LD = $(CROSS_COMPILE)ld +NM = $(CROSS_COMPILE)nm +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump +READELF = $(CROSS_COMPILE)readelf +STRIP = $(CROSS_COMPILE)strip + diff --git a/mk/base-conf.mk b/mk/base-conf.mk new file mode 100644 index 0000000..64f0e24 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,89 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= + + + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -O0 最適化無効。 +# -O1 速度最適化(低)。 +# -O2 速度最適化(中)[推奨]。 +# -O3 速度最適化(高)。 +# -Os サイズ最適化。 +# その他のフラグについては、gcc のヘルプを参照ください。 +# ------------------------------------------------------------------------------ +OPTIMIZATION = -O2 + + + +# ------------------------------------------------------------------------------ +# ヘッダー依存関係出力 +# 基本的に変更しないでください。 +# +# -MMD +# コンパイル時に依存関係を .d ファイルに出力する。 +# -MP +# .d ファイルにヘッダファイル用のターゲットも出力する。 +# ------------------------------------------------------------------------------ +DEPENDS_OPTIONS = -MMD -MP + + + +# ------------------------------------------------------------------------------ +# 警告オプション +# -pedantic +# ANSI C/ISO C++ により要求される警告をすべて出力する。 +# gcc の HELP にも記載されている通り、基本的に使べきではありません。 +# -pedantic-errors +# 警告ではなくエラーが出力される点を除けば -pedantic と同様です。 +# -w +# すべての警告メッセージの出力を禁止します。 +# -Wall +# 基本的な警告オプションを有効にします。 +# -Wextra +# 追加の警告オプションを有効にします。 +# -Weffc++ +# Effective C++ による方針に沿わない記述に警告を出します。 +# ------------------------------------------------------------------------------ +C_WARNING_OPTIONS += -Wall -Wextra -Werror +CXX_WARNING_OPTIONS += -Wall -Wextra -Werror -Weffc++ + + + +# ------------------------------------------------------------------------------ +# デバッグ用オプション +# デバッグ、単体テストの際のオプションを指定します。 +# +# -fstack-protector スタック・オーバーフロー・セキュリティチェックを有効にします。 +# --coverage カバレッジ計測します。(-fprofile-arcs -ftest-coverage オプションと同じ) +# -g0 デバッグオプション無効。 +# -g1 最小限のデバッグ情報を生成します。 +# -g2 (-g) デバッグ情報を生成します。 +# -g3 マクロ定義を含んだデバッグ情報を生成します。 +# -ggdb gdb で使うためのデバッグ情報を生成します。 +# -D_FACTORY_SOURCE=[値] +# 文字列やメモリ操作を行う glibc の関数を使用する際に、バッファオーバーフローを検出します。 +# ※すべてのパターンではなく、よくある例についてのみ検出可能。 +# 値が1の場合、規格に準拠するプログラムの振る舞いを変化させないようなチェックが実行される。 +# 値が2の場合、さらなるチェックを追加するが、規格準拠のプログラムが失敗する可能性がある。 +# いくつかのチェックは、コンパイル時に実行され、コンパイラの警告として表示される。 +# ------------------------------------------------------------------------------ +DEBUG_OPTIONS += -fstack-protector +DEBUG_OPTIONS += --coverage +DEBUG_OPTIONS += -g3 -ggdb +DEBUG_OPTIONS += -O0 +DEBUG_OPTIONS += -D_FACTORY_SOURCE=2 +DEBUG_OPTIONS += -D_DEBUG + +DEBUG_LDFLAGS += --coverage +DEBUG_LDFLAGS += -g3 -ggdb + diff --git a/mk/check-cppcheck-conf.mk b/mk/check-cppcheck-conf.mk new file mode 100644 index 0000000..ca3db60 --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,36 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPHECK_REPORT_DIR = report/cppcheck +CPPCHECK_LOG = $(CPPCHECK_REPORT_DIR)/cppcheck.xml + + + +# ------------------------------------------------------------------------------ +# 警告抑止 +# ------------------------------------------------------------------------------ +# 次の警告を抑止します。 +# - システムヘッダー読み込み失敗 (読み込むと非常に時間がかかります。) +# - 未使用関数 (チェック単位が異なり、public な関数が呼び出されないと誤検知する) +CPPCHECK_SUPPRESS = --suppress=missingIncludeSystem +CPPCHECK_SUPPRESS += --suppress=unusedFunction + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(CPPCHECK_REPORT_DIR) +endif +endif + diff --git a/mk/check-cppcheck-rule.mk b/mk/check-cppcheck-rule.mk new file mode 100644 index 0000000..a8420d3 --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) $(CPPCHECK_REPORT_DIR) + $(CPPCHECK) $(CPPCHECK_FLAGS) $(CPPCHECK_SUPPRESS) $(INCLUDES) $(SRCDIR) 2> $(CPPCHECK_LOG) +endif +endif + diff --git a/mk/check-lcov-cobertura-conf.mk b/mk/check-lcov-cobertura-conf.mk new file mode 100644 index 0000000..8ca940f --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,13 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura.py +LCOV_COBERTURA_REPORT_DIR = report/lcov +LCOV_COBERTURA_INFO = $(LCOV_COBERTURA_REPORT_DIR)/lcov.info + diff --git a/mk/check-lcov-cobertura-rule.mk b/mk/check-lcov-cobertura-rule.mk new file mode 100644 index 0000000..110134d --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# lcov cobertura ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov-cobertura +lcov-cobertura: lcov + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov-cobertura -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(LCOV_COBERTURA) $(LCOV_COBERTURA_INFO) -b `pwd` -o $(LCOV_COBERTURA_REPORT_DIR)/lcov-coverage.xml +endif + diff --git a/mk/check-lcov-conf.mk b/mk/check-lcov-conf.mk new file mode 100644 index 0000000..f6d536b --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,34 @@ +# ============================================================================== +# lcov 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV = lcov +LCOV_REPORT_DIR = report/lcov +LCOV_INFO = $(LCOV_REPORT_DIR)/lcov.info + +GENHTML = genhtml +GENHTML_FLAGS += --function-coverage +GENHTML_FLAGS += --branch-coverage + + + +# ------------------------------------------------------------------------------ +# C1 Coverage 有効 +# ------------------------------------------------------------------------------ +LCOV_FLAGS += --rc lcov_branch_coverage=1 +LCOV_FLAGS += --rc genhtml_branch_coverage=1 + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(LCOV_REPORT_DIR) +endif + diff --git a/mk/check-lcov-rule.mk b/mk/check-lcov-rule.mk new file mode 100644 index 0000000..b75e472 --- /dev/null +++ b/mk/check-lcov-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# lcov ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov +lcov: + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(LCOV_REPORT_DIR) + $(LCOV) -c -d $(OBJDIR) $(LCOV_FLAGS) -o $(LCOV_INFO) + $(LCOV) $(LCOV_FLAGS) -r $(LCOV_INFO) "*/test/*" -o $(LCOV_INFO) + $(GENHTML) $(GENHTML_FLAGS) -o $(LCOV_REPORT_DIR) $(LCOV_INFO) +endif + diff --git a/mk/check-rule.mk b/mk/check-rule.mk new file mode 100644 index 0000000..3c516c5 --- /dev/null +++ b/mk/check-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# check ルール +# ------------------------------------------------------------------------------ +.PHONY: check +check: + @for subdir in $(SUBDIRS); do \ + $(MAKE) check -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) + ./ut.exe +endif + + diff --git a/mk/check-ut.rule.mk b/mk/check-ut.rule.mk new file mode 100644 index 0000000..0970bb9 --- /dev/null +++ b/mk/check-ut.rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# ut ルール +# ------------------------------------------------------------------------------ +.PHONY: ut +ut: $(TARGET) + ./ut.exe + diff --git a/mk/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..0d3e443 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# TARGET ファイル削除設定 +# ============================================================================== +# +# CLEAN 時に削除されるファイルを追加 +# + +ifneq ($(strip $(TARGET)),) + +CLEAN_FILES += $(OBJDIR)/*.o $(OBJDIR)/*.d $(OBJDIR)/*.gcno $(OBJDIR)/*.gcda +CLEAN_FILES += $(TARGET) + +# $(TOPDIR) に置かれたファイルの削除 +ifneq ($(strip $(TARGET)),$(strip $(NAME))) +# TARGET がライブラリの場合 +CLEAN_FILES += $(addprefix $(TOPDIR)/include/,$(notdir $(wildcard include/*.h))) +CLEAN_FILES += $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +else +# TARGET が実行ファイルの場合 +CLEAN_FILES += $(addprefix $(TOPDIR)/,$(TARGET)) + +endif +endif + diff --git a/mk/clean-rule.mk b/mk/clean-rule.mk new file mode 100644 index 0000000..0575dc5 --- /dev/null +++ b/mk/clean-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# clean ルール +# ------------------------------------------------------------------------------ +.PHONY: clean +clean: + @for subdir in $(SUBDIRS); do \ + $(MAKE) clean -C $$subdir; \ + done +ifneq ($(strip $(CLEAN_FILES)),) + $(RM) -f $(CLEAN_FILES) +endif +ifneq ($(strip $(CLEAN_DIRS)),) + $(RM) -f $(CLEAN_DIRS) +endif + diff --git a/mk/compile-c-rule.mk b/mk/compile-c-rule.mk new file mode 100644 index 0000000..f523b94 --- /dev/null +++ b/mk/compile-c-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# C言語 コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.c + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + diff --git a/mk/compile-cpp-rule.mk b/mk/compile-cpp-rule.mk new file mode 100644 index 0000000..393dea2 --- /dev/null +++ b/mk/compile-cpp-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# C++ コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.cpp + -@$(MKDIR) -p $(OBJDIR) + $(CXX) $(CXXFLAGS) -c -o $@ $< + diff --git a/mk/git-info-conf.mk b/mk/git-info-conf.mk new file mode 100644 index 0000000..7fe4f72 --- /dev/null +++ b/mk/git-info-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# git 情報 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# git のタグなどから取得可能なバージョン情報を DEFINE に設定します。 +# +# VERSION : git tag (v[Major].[Minor].[Release] の [Major].[Minor].[Release] 部分) +# MAJOR : git tag (v[Major].[Minor].[Release] の [Major] 部分) +# MINOR : git tag (v[Major].[Minor].[Release] の [Minor] 部分) +# RELEASE : git tag (v[Major].[Minor].[Release] の [Release] 部分) +# REVISION : git revision +# DATETIME : datetime (ISO8601形式) +# ------------------------------------------------------------------------------ +VERSION := $(shell $(GIT) tag | $(SORT) -V | $(TAIL) -1 | $(SED) -e 's/^[^0-9]\+//') +REVISION := $(shell $(GIT) rev-parse --short HEAD) +DATETIME := $(shell $(DATE) "+Y%m%dT%H%M%S") + +ifeq ($(strip $(VERSION)),) +VERSION := v1.0.0 +endif + +MAJOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\1/') +MINOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\2/') +RELEASE := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\3/') + +DEFINE += -DVERSION='"$(VERSION)"' -DMAJOR='"$(MAJOR)"' -DMINOR='"$(MINOR)"' -DRELEASE='"$(RELEASE)"' +DEFINE += -DREVISION='"$(REVISION)"' +DEFINE += -DDATETIME='"$(DATETIME)"' + diff --git a/mk/header-rule.mk b/mk/header-rule.mk new file mode 100644 index 0000000..82db9d4 --- /dev/null +++ b/mk/header-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# .h -> .c 依存関係ルール +# ------------------------------------------------------------------------------ +ifneq ($(MAKECMDGOALS),clean) +-include $(DEPS) +endif + diff --git a/mk/link-a-conf.mk b/mk/link-a-conf.mk new file mode 100644 index 0000000..8a53da6 --- /dev/null +++ b/mk/link-a-conf.mk @@ -0,0 +1,18 @@ +# ============================================================================== +# 静的ライブラリ 生成に関する設定 +# ============================================================================== + +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).a),$(strip $(TARGET))) + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) + +endif +endif + diff --git a/mk/link-a-rule.mk b/mk/link-a-rule.mk new file mode 100644 index 0000000..d94a54a --- /dev/null +++ b/mk/link-a-rule.mk @@ -0,0 +1,18 @@ +# ------------------------------------------------------------------------------ +# 静的ライブラリ 生成ルール +# ------------------------------------------------------------------------------ +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).a),$(strip $(TARGET))) +$(TARGET): $(OBJS) + $(AR) rv $@ $^ + $(RANLIB) $@ + +$(TOP_TARGET): $(TARGET) +ifneq ($(strip $(HEADER_FILES)),) + $(CP) -f $(HEADER_FILES) $(TOPDIR)/include/ +endif + $(CP) -f $(TARGET) $(TOPDIR)/lib/ + +endif +endif + diff --git a/mk/link-exe-rule.mk b/mk/link-exe-rule.mk new file mode 100644 index 0000000..2f73a13 --- /dev/null +++ b/mk/link-exe-rule.mk @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------------ +# 実行ファイル 生成ルール +# ------------------------------------------------------------------------------ +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +$(TARGET): $(OBJS) + $(LINK) $(LDFLAGS) -o $@ $^ $(LIBS) + +endif +endif + diff --git a/mk/link-so-conf.mk b/mk/link-so-conf.mk new file mode 100644 index 0000000..c556d40 --- /dev/null +++ b/mk/link-so-conf.mk @@ -0,0 +1,22 @@ +# ============================================================================== +# 動的ライブラリ 生成に関する設定 +# ============================================================================== +# +# -fPIC オプションを付与する。 +# +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).so),$(strip $(TARGET))) +CFLAGS += -fPIC +CXXFLAGS += -fPIC + +ifneq ($(strip $(USE_SO_VERSION)),) +# +# バージョン番号付きの so ファイルを削除対象に追加する。 +# +CLEAN_FILES += $(TARGET).* +endif + + +endif +endif + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d855a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = test +TARGET = $(NAME).a +SUBDIR = + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + + + +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/README.md diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..29eee10 --- /dev/null +++ b/config.mk @@ -0,0 +1,71 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + + + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + + + +# +# アーキテクチャ指定 +# +ARCH ?= x86_64 +# ARCH ?= aarch64 + + + +# +# クロスコンパイラ指定 +# +ifeq ($(strip $(ARCH)),aarch64) +CROSS_COMPILE = +else +CROSS_COMPILE = +endif + + + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (X==03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++14 + + + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + + + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + + + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += -lpthread -lrt + + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..3cf2923 --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif + diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..b35372c --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,78 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += ../include +DEFINE += -DUNITTEST +endif + + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + + +# ------------------------------------------------------------------------------ +# CFLAGS, CXXFLAGS, LDFLAGS 設定 +# ------------------------------------------------------------------------------ +CFLAGS += $(INCLUDES) +CFLAGS += $(C_VERSION) +CFLAGS += $(C_WARNING_OPTIONS) +CFLAGS += $(DEFINE) +CFLAGS += $(DEPENDS_OPTIONS) + +CXXFLAGS += $(INCLUDES) +CXXFLAGS += $(CXX_VERSION) +CXXFLAGS += $(CXX_WARNING_OPTIONS) +CXXFLAGS += $(DEFINE) +CXXFLAGS += $(DEPENDS_OPTIONS) + + + +ifeq ($(strip $(DEBUG)),) +# For Release +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# For Debug +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +endif + diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..b0c78de --- /dev/null +++ b/mk/base-cmd.mk @@ -0,0 +1,49 @@ +# ============================================================================== +# コマンド設定 +# ============================================================================== +AWK = awk +CAT = cat +CHMOD = chmod +CHOWN = chown +CP = cp +CPPCHECK = cppcheck +DATE = date +DOXYGEN = doxygen +ECHO = echo +GIT = git +GREP = grep +HEAD = head +INSTALL = install +KILL = kill +LS = ls +LN = ln +MAKE = make +MKDIR = mkdir +MKNOD = mknod +MV = mv +RM = rm +RMDIR = rmdir +PS = ps +PWD = pwd +SED = sed +SORT = sort +TAIL = tail +TAR = tar +TOUCH = touch + +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +RANLIB = $(CROSS_COMPILE)ranlib +ADDR2LINE = $(CROSS_COMPILE)addr2line +AR = $(CROSS_COMPILE)ar +AS = $(CROSS_COMPILE)as +CPP = $(CROSS_COMPILE)cpp +GCOV = $(CROSS_COMPILE)gcov +GDB = $(CROSS_COMPILE)gdb +LD = $(CROSS_COMPILE)ld +NM = $(CROSS_COMPILE)nm +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump +READELF = $(CROSS_COMPILE)readelf +STRIP = $(CROSS_COMPILE)strip + diff --git a/mk/base-conf.mk b/mk/base-conf.mk new file mode 100644 index 0000000..64f0e24 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,89 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= + + + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -O0 最適化無効。 +# -O1 速度最適化(低)。 +# -O2 速度最適化(中)[推奨]。 +# -O3 速度最適化(高)。 +# -Os サイズ最適化。 +# その他のフラグについては、gcc のヘルプを参照ください。 +# ------------------------------------------------------------------------------ +OPTIMIZATION = -O2 + + + +# ------------------------------------------------------------------------------ +# ヘッダー依存関係出力 +# 基本的に変更しないでください。 +# +# -MMD +# コンパイル時に依存関係を .d ファイルに出力する。 +# -MP +# .d ファイルにヘッダファイル用のターゲットも出力する。 +# ------------------------------------------------------------------------------ +DEPENDS_OPTIONS = -MMD -MP + + + +# ------------------------------------------------------------------------------ +# 警告オプション +# -pedantic +# ANSI C/ISO C++ により要求される警告をすべて出力する。 +# gcc の HELP にも記載されている通り、基本的に使べきではありません。 +# -pedantic-errors +# 警告ではなくエラーが出力される点を除けば -pedantic と同様です。 +# -w +# すべての警告メッセージの出力を禁止します。 +# -Wall +# 基本的な警告オプションを有効にします。 +# -Wextra +# 追加の警告オプションを有効にします。 +# -Weffc++ +# Effective C++ による方針に沿わない記述に警告を出します。 +# ------------------------------------------------------------------------------ +C_WARNING_OPTIONS += -Wall -Wextra -Werror +CXX_WARNING_OPTIONS += -Wall -Wextra -Werror -Weffc++ + + + +# ------------------------------------------------------------------------------ +# デバッグ用オプション +# デバッグ、単体テストの際のオプションを指定します。 +# +# -fstack-protector スタック・オーバーフロー・セキュリティチェックを有効にします。 +# --coverage カバレッジ計測します。(-fprofile-arcs -ftest-coverage オプションと同じ) +# -g0 デバッグオプション無効。 +# -g1 最小限のデバッグ情報を生成します。 +# -g2 (-g) デバッグ情報を生成します。 +# -g3 マクロ定義を含んだデバッグ情報を生成します。 +# -ggdb gdb で使うためのデバッグ情報を生成します。 +# -D_FACTORY_SOURCE=[値] +# 文字列やメモリ操作を行う glibc の関数を使用する際に、バッファオーバーフローを検出します。 +# ※すべてのパターンではなく、よくある例についてのみ検出可能。 +# 値が1の場合、規格に準拠するプログラムの振る舞いを変化させないようなチェックが実行される。 +# 値が2の場合、さらなるチェックを追加するが、規格準拠のプログラムが失敗する可能性がある。 +# いくつかのチェックは、コンパイル時に実行され、コンパイラの警告として表示される。 +# ------------------------------------------------------------------------------ +DEBUG_OPTIONS += -fstack-protector +DEBUG_OPTIONS += --coverage +DEBUG_OPTIONS += -g3 -ggdb +DEBUG_OPTIONS += -O0 +DEBUG_OPTIONS += -D_FACTORY_SOURCE=2 +DEBUG_OPTIONS += -D_DEBUG + +DEBUG_LDFLAGS += --coverage +DEBUG_LDFLAGS += -g3 -ggdb + diff --git a/mk/check-cppcheck-conf.mk b/mk/check-cppcheck-conf.mk new file mode 100644 index 0000000..ca3db60 --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,36 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPHECK_REPORT_DIR = report/cppcheck +CPPCHECK_LOG = $(CPPCHECK_REPORT_DIR)/cppcheck.xml + + + +# ------------------------------------------------------------------------------ +# 警告抑止 +# ------------------------------------------------------------------------------ +# 次の警告を抑止します。 +# - システムヘッダー読み込み失敗 (読み込むと非常に時間がかかります。) +# - 未使用関数 (チェック単位が異なり、public な関数が呼び出されないと誤検知する) +CPPCHECK_SUPPRESS = --suppress=missingIncludeSystem +CPPCHECK_SUPPRESS += --suppress=unusedFunction + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(CPPCHECK_REPORT_DIR) +endif +endif + diff --git a/mk/check-cppcheck-rule.mk b/mk/check-cppcheck-rule.mk new file mode 100644 index 0000000..a8420d3 --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) $(CPPCHECK_REPORT_DIR) + $(CPPCHECK) $(CPPCHECK_FLAGS) $(CPPCHECK_SUPPRESS) $(INCLUDES) $(SRCDIR) 2> $(CPPCHECK_LOG) +endif +endif + diff --git a/mk/check-lcov-cobertura-conf.mk b/mk/check-lcov-cobertura-conf.mk new file mode 100644 index 0000000..8ca940f --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,13 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura.py +LCOV_COBERTURA_REPORT_DIR = report/lcov +LCOV_COBERTURA_INFO = $(LCOV_COBERTURA_REPORT_DIR)/lcov.info + diff --git a/mk/check-lcov-cobertura-rule.mk b/mk/check-lcov-cobertura-rule.mk new file mode 100644 index 0000000..110134d --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# lcov cobertura ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov-cobertura +lcov-cobertura: lcov + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov-cobertura -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(LCOV_COBERTURA) $(LCOV_COBERTURA_INFO) -b `pwd` -o $(LCOV_COBERTURA_REPORT_DIR)/lcov-coverage.xml +endif + diff --git a/mk/check-lcov-conf.mk b/mk/check-lcov-conf.mk new file mode 100644 index 0000000..f6d536b --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,34 @@ +# ============================================================================== +# lcov 設定 +# ============================================================================== + + + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV = lcov +LCOV_REPORT_DIR = report/lcov +LCOV_INFO = $(LCOV_REPORT_DIR)/lcov.info + +GENHTML = genhtml +GENHTML_FLAGS += --function-coverage +GENHTML_FLAGS += --branch-coverage + + + +# ------------------------------------------------------------------------------ +# C1 Coverage 有効 +# ------------------------------------------------------------------------------ +LCOV_FLAGS += --rc lcov_branch_coverage=1 +LCOV_FLAGS += --rc genhtml_branch_coverage=1 + + + +# ------------------------------------------------------------------------------ +# CLEAN 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +CLEAN_DIRS += $(LCOV_REPORT_DIR) +endif + diff --git a/mk/check-lcov-rule.mk b/mk/check-lcov-rule.mk new file mode 100644 index 0000000..b75e472 --- /dev/null +++ b/mk/check-lcov-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# lcov ルール +# ------------------------------------------------------------------------------ +.PHONY: lcov +lcov: + @for subdir in $(SUBDIRS); do \ + $(MAKE) lcov -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(LCOV_REPORT_DIR) + $(LCOV) -c -d $(OBJDIR) $(LCOV_FLAGS) -o $(LCOV_INFO) + $(LCOV) $(LCOV_FLAGS) -r $(LCOV_INFO) "*/test/*" -o $(LCOV_INFO) + $(GENHTML) $(GENHTML_FLAGS) -o $(LCOV_REPORT_DIR) $(LCOV_INFO) +endif + diff --git a/mk/check-rule.mk b/mk/check-rule.mk new file mode 100644 index 0000000..3c516c5 --- /dev/null +++ b/mk/check-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# check ルール +# ------------------------------------------------------------------------------ +.PHONY: check +check: + @for subdir in $(SUBDIRS); do \ + $(MAKE) check -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) + ./ut.exe +endif + + diff --git a/mk/check-ut.rule.mk b/mk/check-ut.rule.mk new file mode 100644 index 0000000..0970bb9 --- /dev/null +++ b/mk/check-ut.rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# ut ルール +# ------------------------------------------------------------------------------ +.PHONY: ut +ut: $(TARGET) + ./ut.exe + diff --git a/mk/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..0d3e443 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# TARGET ファイル削除設定 +# ============================================================================== +# +# CLEAN 時に削除されるファイルを追加 +# + +ifneq ($(strip $(TARGET)),) + +CLEAN_FILES += $(OBJDIR)/*.o $(OBJDIR)/*.d $(OBJDIR)/*.gcno $(OBJDIR)/*.gcda +CLEAN_FILES += $(TARGET) + +# $(TOPDIR) に置かれたファイルの削除 +ifneq ($(strip $(TARGET)),$(strip $(NAME))) +# TARGET がライブラリの場合 +CLEAN_FILES += $(addprefix $(TOPDIR)/include/,$(notdir $(wildcard include/*.h))) +CLEAN_FILES += $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +else +# TARGET が実行ファイルの場合 +CLEAN_FILES += $(addprefix $(TOPDIR)/,$(TARGET)) + +endif +endif + diff --git a/mk/clean-rule.mk b/mk/clean-rule.mk new file mode 100644 index 0000000..0575dc5 --- /dev/null +++ b/mk/clean-rule.mk @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# clean ルール +# ------------------------------------------------------------------------------ +.PHONY: clean +clean: + @for subdir in $(SUBDIRS); do \ + $(MAKE) clean -C $$subdir; \ + done +ifneq ($(strip $(CLEAN_FILES)),) + $(RM) -f $(CLEAN_FILES) +endif +ifneq ($(strip $(CLEAN_DIRS)),) + $(RM) -f $(CLEAN_DIRS) +endif + diff --git a/mk/compile-c-rule.mk b/mk/compile-c-rule.mk new file mode 100644 index 0000000..f523b94 --- /dev/null +++ b/mk/compile-c-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# C言語 コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.c + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + diff --git a/mk/compile-cpp-rule.mk b/mk/compile-cpp-rule.mk new file mode 100644 index 0000000..393dea2 --- /dev/null +++ b/mk/compile-cpp-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# C++ コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.cpp + -@$(MKDIR) -p $(OBJDIR) + $(CXX) $(CXXFLAGS) -c -o $@ $< + diff --git a/mk/git-info-conf.mk b/mk/git-info-conf.mk new file mode 100644 index 0000000..7fe4f72 --- /dev/null +++ b/mk/git-info-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# git 情報 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# git のタグなどから取得可能なバージョン情報を DEFINE に設定します。 +# +# VERSION : git tag (v[Major].[Minor].[Release] の [Major].[Minor].[Release] 部分) +# MAJOR : git tag (v[Major].[Minor].[Release] の [Major] 部分) +# MINOR : git tag (v[Major].[Minor].[Release] の [Minor] 部分) +# RELEASE : git tag (v[Major].[Minor].[Release] の [Release] 部分) +# REVISION : git revision +# DATETIME : datetime (ISO8601形式) +# ------------------------------------------------------------------------------ +VERSION := $(shell $(GIT) tag | $(SORT) -V | $(TAIL) -1 | $(SED) -e 's/^[^0-9]\+//') +REVISION := $(shell $(GIT) rev-parse --short HEAD) +DATETIME := $(shell $(DATE) "+Y%m%dT%H%M%S") + +ifeq ($(strip $(VERSION)),) +VERSION := v1.0.0 +endif + +MAJOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\1/') +MINOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\2/') +RELEASE := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\3/') + +DEFINE += -DVERSION='"$(VERSION)"' -DMAJOR='"$(MAJOR)"' -DMINOR='"$(MINOR)"' -DRELEASE='"$(RELEASE)"' +DEFINE += -DREVISION='"$(REVISION)"' +DEFINE += -DDATETIME='"$(DATETIME)"' + diff --git a/mk/header-rule.mk b/mk/header-rule.mk new file mode 100644 index 0000000..82db9d4 --- /dev/null +++ b/mk/header-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# .h -> .c 依存関係ルール +# ------------------------------------------------------------------------------ +ifneq ($(MAKECMDGOALS),clean) +-include $(DEPS) +endif + diff --git a/mk/link-a-conf.mk b/mk/link-a-conf.mk new file mode 100644 index 0000000..8a53da6 --- /dev/null +++ b/mk/link-a-conf.mk @@ -0,0 +1,18 @@ +# ============================================================================== +# 静的ライブラリ 生成に関する設定 +# ============================================================================== + +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).a),$(strip $(TARGET))) + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) + +endif +endif + diff --git a/mk/link-a-rule.mk b/mk/link-a-rule.mk new file mode 100644 index 0000000..d94a54a --- /dev/null +++ b/mk/link-a-rule.mk @@ -0,0 +1,18 @@ +# ------------------------------------------------------------------------------ +# 静的ライブラリ 生成ルール +# ------------------------------------------------------------------------------ +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).a),$(strip $(TARGET))) +$(TARGET): $(OBJS) + $(AR) rv $@ $^ + $(RANLIB) $@ + +$(TOP_TARGET): $(TARGET) +ifneq ($(strip $(HEADER_FILES)),) + $(CP) -f $(HEADER_FILES) $(TOPDIR)/include/ +endif + $(CP) -f $(TARGET) $(TOPDIR)/lib/ + +endif +endif + diff --git a/mk/link-exe-rule.mk b/mk/link-exe-rule.mk new file mode 100644 index 0000000..2f73a13 --- /dev/null +++ b/mk/link-exe-rule.mk @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------------ +# 実行ファイル 生成ルール +# ------------------------------------------------------------------------------ +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +$(TARGET): $(OBJS) + $(LINK) $(LDFLAGS) -o $@ $^ $(LIBS) + +endif +endif + diff --git a/mk/link-so-conf.mk b/mk/link-so-conf.mk new file mode 100644 index 0000000..c556d40 --- /dev/null +++ b/mk/link-so-conf.mk @@ -0,0 +1,22 @@ +# ============================================================================== +# 動的ライブラリ 生成に関する設定 +# ============================================================================== +# +# -fPIC オプションを付与する。 +# +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).so),$(strip $(TARGET))) +CFLAGS += -fPIC +CXXFLAGS += -fPIC + +ifneq ($(strip $(USE_SO_VERSION)),) +# +# バージョン番号付きの so ファイルを削除対象に追加する。 +# +CLEAN_FILES += $(TARGET).* +endif + + +endif +endif + diff --git a/mk/link-so-rule.mk b/mk/link-so-rule.mk new file mode 100644 index 0000000..0c56e5c --- /dev/null +++ b/mk/link-so-rule.mk @@ -0,0 +1,39 @@ +# ------------------------------------------------------------------------------ +# 動的ライブラリ 生成ルール +# ------------------------------------------------------------------------------ +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).so),$(strip $(TARGET))) + +ifneq ($(strip $(USE_SO_VERSION)),) +## +## バージョン番号付き so ファイル生成 +## + +# .so ファイル生成 (シンボリックリンク) +$(TARGET): $(TARGET).$(MAJOR) + $(LN) -fs $^ $@ + +# .so.X ファイル生成 (シンボリックリンク) +$(TARGET).$(MAJOR): $(TARGET).$(VERSION) + $(LN) -fs $^ $@ + +# .so.X.X.X ファイル生成 +$(TARGET).$(VERSION): $(OBJS) + $(LINK) $(LDFLAGS) -shared -Wl,-soname,$(TARGET).$(MAJOR) -o $(TARGET).$(VERSION) $^ $(LIBS) + + +else +## +## バージョン番号無し so ファイル生成 +## + +# .so ファイル生成 +$(TARGET): $(OBJS) + $(LINK) $(LDFLAGS) -shared -Wl,-soname,$(TARGET) -o $(TARGET) $^ $(LIBS) + + +endif + +endif +endif +