diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..1945456 --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,81 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +S_SRCS = $(wildcard $(addsuffix /*.s,$(SRCDIR))) +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) $(S_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST -DDEBUG を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += -I../include +DEFINE += -DUNITTEST -DDEBUG +endif + + +ifeq ($(strip $(DEBUG)),) +# ------------------------------------------------------------------------------ +# DEBUG が無効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の OPTIMIZATION を有効にする +# ------------------------------------------------------------------------------ +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# ------------------------------------------------------------------------------ +# DEBUG が有効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の DEBUG_OPTIONS を有効にする +# ------------------------------------------------------------------------------ +DEFINE += -DENABLED_MEMORY_MANAGE +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +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) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..1945456 --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,81 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +S_SRCS = $(wildcard $(addsuffix /*.s,$(SRCDIR))) +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) $(S_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST -DDEBUG を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += -I../include +DEFINE += -DUNITTEST -DDEBUG +endif + + +ifeq ($(strip $(DEBUG)),) +# ------------------------------------------------------------------------------ +# DEBUG が無効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の OPTIMIZATION を有効にする +# ------------------------------------------------------------------------------ +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# ------------------------------------------------------------------------------ +# DEBUG が有効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の DEBUG_OPTIONS を有効にする +# ------------------------------------------------------------------------------ +DEFINE += -DENABLED_MEMORY_MANAGE +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +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) diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..edde6de --- /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/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..1945456 --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,81 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +S_SRCS = $(wildcard $(addsuffix /*.s,$(SRCDIR))) +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) $(S_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST -DDEBUG を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += -I../include +DEFINE += -DUNITTEST -DDEBUG +endif + + +ifeq ($(strip $(DEBUG)),) +# ------------------------------------------------------------------------------ +# DEBUG が無効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の OPTIMIZATION を有効にする +# ------------------------------------------------------------------------------ +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# ------------------------------------------------------------------------------ +# DEBUG が有効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の DEBUG_OPTIONS を有効にする +# ------------------------------------------------------------------------------ +DEFINE += -DENABLED_MEMORY_MANAGE +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +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) diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..edde6de --- /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..eebded1 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,80 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= +RELEASEDIR ?= release + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -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/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..1945456 --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,81 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +S_SRCS = $(wildcard $(addsuffix /*.s,$(SRCDIR))) +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) $(S_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST -DDEBUG を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += -I../include +DEFINE += -DUNITTEST -DDEBUG +endif + + +ifeq ($(strip $(DEBUG)),) +# ------------------------------------------------------------------------------ +# DEBUG が無効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の OPTIMIZATION を有効にする +# ------------------------------------------------------------------------------ +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# ------------------------------------------------------------------------------ +# DEBUG が有効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の DEBUG_OPTIONS を有効にする +# ------------------------------------------------------------------------------ +DEFINE += -DENABLED_MEMORY_MANAGE +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +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) diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..edde6de --- /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..eebded1 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,80 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= +RELEASEDIR ?= release + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -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..7a1797d --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPCHECK_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/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..1945456 --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,81 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +S_SRCS = $(wildcard $(addsuffix /*.s,$(SRCDIR))) +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) $(S_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST -DDEBUG を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += -I../include +DEFINE += -DUNITTEST -DDEBUG +endif + + +ifeq ($(strip $(DEBUG)),) +# ------------------------------------------------------------------------------ +# DEBUG が無効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の OPTIMIZATION を有効にする +# ------------------------------------------------------------------------------ +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# ------------------------------------------------------------------------------ +# DEBUG が有効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の DEBUG_OPTIONS を有効にする +# ------------------------------------------------------------------------------ +DEFINE += -DENABLED_MEMORY_MANAGE +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +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) diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..edde6de --- /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..eebded1 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,80 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= +RELEASEDIR ?= release + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -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..7a1797d --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPCHECK_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..ffe1c0c --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(CPPCHECK_REPORT_DIR) + $(CPPCHECK) $(CPPCHECK_FLAGS) $(CPPCHECK_SUPPRESS) $(INCLUDES) $(SRCDIR) 2> $(CPPCHECK_LOG) +endif +endif diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..1945456 --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,81 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +S_SRCS = $(wildcard $(addsuffix /*.s,$(SRCDIR))) +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) $(S_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST -DDEBUG を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += -I../include +DEFINE += -DUNITTEST -DDEBUG +endif + + +ifeq ($(strip $(DEBUG)),) +# ------------------------------------------------------------------------------ +# DEBUG が無効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の OPTIMIZATION を有効にする +# ------------------------------------------------------------------------------ +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# ------------------------------------------------------------------------------ +# DEBUG が有効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の DEBUG_OPTIONS を有効にする +# ------------------------------------------------------------------------------ +DEFINE += -DENABLED_MEMORY_MANAGE +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +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) diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..edde6de --- /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..eebded1 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,80 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= +RELEASEDIR ?= release + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -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..7a1797d --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPCHECK_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..ffe1c0c --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(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..1a9a6e8 --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,10 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura +LCOV_COBERTURA_REPORT_DIR = report/lcov +LCOV_COBERTURA_INFO = $(LCOV_COBERTURA_REPORT_DIR)/lcov.info diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..1945456 --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,81 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +S_SRCS = $(wildcard $(addsuffix /*.s,$(SRCDIR))) +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) $(S_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST -DDEBUG を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += -I../include +DEFINE += -DUNITTEST -DDEBUG +endif + + +ifeq ($(strip $(DEBUG)),) +# ------------------------------------------------------------------------------ +# DEBUG が無効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の OPTIMIZATION を有効にする +# ------------------------------------------------------------------------------ +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# ------------------------------------------------------------------------------ +# DEBUG が有効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の DEBUG_OPTIONS を有効にする +# ------------------------------------------------------------------------------ +DEFINE += -DENABLED_MEMORY_MANAGE +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +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) diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..edde6de --- /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..eebded1 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,80 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= +RELEASEDIR ?= release + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -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..7a1797d --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPCHECK_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..ffe1c0c --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(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..1a9a6e8 --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,10 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura +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..1e95c5a --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------------ +# 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/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..1945456 --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,81 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +S_SRCS = $(wildcard $(addsuffix /*.s,$(SRCDIR))) +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) $(S_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST -DDEBUG を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += -I../include +DEFINE += -DUNITTEST -DDEBUG +endif + + +ifeq ($(strip $(DEBUG)),) +# ------------------------------------------------------------------------------ +# DEBUG が無効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の OPTIMIZATION を有効にする +# ------------------------------------------------------------------------------ +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# ------------------------------------------------------------------------------ +# DEBUG が有効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の DEBUG_OPTIONS を有効にする +# ------------------------------------------------------------------------------ +DEFINE += -DENABLED_MEMORY_MANAGE +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +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) diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..edde6de --- /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..eebded1 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,80 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= +RELEASEDIR ?= release + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -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..7a1797d --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPCHECK_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..ffe1c0c --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(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..1a9a6e8 --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,10 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura +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..1e95c5a --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------------ +# 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..ad876ef --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# 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 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +CLEAN_DIRS += $(LCOV_REPORT_DIR) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..1945456 --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,81 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +S_SRCS = $(wildcard $(addsuffix /*.s,$(SRCDIR))) +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) $(S_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST -DDEBUG を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += -I../include +DEFINE += -DUNITTEST -DDEBUG +endif + + +ifeq ($(strip $(DEBUG)),) +# ------------------------------------------------------------------------------ +# DEBUG が無効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の OPTIMIZATION を有効にする +# ------------------------------------------------------------------------------ +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# ------------------------------------------------------------------------------ +# DEBUG が有効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の DEBUG_OPTIONS を有効にする +# ------------------------------------------------------------------------------ +DEFINE += -DENABLED_MEMORY_MANAGE +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +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) diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..edde6de --- /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..eebded1 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,80 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= +RELEASEDIR ?= release + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -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..7a1797d --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPCHECK_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..ffe1c0c --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(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..1a9a6e8 --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,10 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura +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..1e95c5a --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------------ +# 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..ad876ef --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# 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 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +CLEAN_DIRS += $(LCOV_REPORT_DIR) 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/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..1945456 --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,81 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +S_SRCS = $(wildcard $(addsuffix /*.s,$(SRCDIR))) +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) $(S_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST -DDEBUG を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += -I../include +DEFINE += -DUNITTEST -DDEBUG +endif + + +ifeq ($(strip $(DEBUG)),) +# ------------------------------------------------------------------------------ +# DEBUG が無効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の OPTIMIZATION を有効にする +# ------------------------------------------------------------------------------ +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# ------------------------------------------------------------------------------ +# DEBUG が有効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の DEBUG_OPTIONS を有効にする +# ------------------------------------------------------------------------------ +DEFINE += -DENABLED_MEMORY_MANAGE +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +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) diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..edde6de --- /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..eebded1 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,80 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= +RELEASEDIR ?= release + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -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..7a1797d --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPCHECK_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..ffe1c0c --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(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..1a9a6e8 --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,10 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura +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..1e95c5a --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------------ +# 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..ad876ef --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# 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 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +CLEAN_DIRS += $(LCOV_REPORT_DIR) 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/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..c0ceed7 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 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/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..1945456 --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,81 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +S_SRCS = $(wildcard $(addsuffix /*.s,$(SRCDIR))) +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) $(S_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST -DDEBUG を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += -I../include +DEFINE += -DUNITTEST -DDEBUG +endif + + +ifeq ($(strip $(DEBUG)),) +# ------------------------------------------------------------------------------ +# DEBUG が無効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の OPTIMIZATION を有効にする +# ------------------------------------------------------------------------------ +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# ------------------------------------------------------------------------------ +# DEBUG が有効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の DEBUG_OPTIONS を有効にする +# ------------------------------------------------------------------------------ +DEFINE += -DENABLED_MEMORY_MANAGE +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +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) diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..edde6de --- /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..eebded1 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,80 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= +RELEASEDIR ?= release + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -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..7a1797d --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPCHECK_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..ffe1c0c --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(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..1a9a6e8 --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,10 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura +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..1e95c5a --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------------ +# 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..ad876ef --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# 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 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +CLEAN_DIRS += $(LCOV_REPORT_DIR) 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/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..c0ceed7 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 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..ce2617c --- /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) -rf $(addprefix ./,$(CLEAN_DIRS)) +endif + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..1945456 --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,81 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +S_SRCS = $(wildcard $(addsuffix /*.s,$(SRCDIR))) +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) $(S_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST -DDEBUG を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += -I../include +DEFINE += -DUNITTEST -DDEBUG +endif + + +ifeq ($(strip $(DEBUG)),) +# ------------------------------------------------------------------------------ +# DEBUG が無効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の OPTIMIZATION を有効にする +# ------------------------------------------------------------------------------ +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# ------------------------------------------------------------------------------ +# DEBUG が有効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の DEBUG_OPTIONS を有効にする +# ------------------------------------------------------------------------------ +DEFINE += -DENABLED_MEMORY_MANAGE +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +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) diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..edde6de --- /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..eebded1 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,80 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= +RELEASEDIR ?= release + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -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..7a1797d --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPCHECK_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..ffe1c0c --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(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..1a9a6e8 --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,10 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura +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..1e95c5a --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------------ +# 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..ad876ef --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# 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 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +CLEAN_DIRS += $(LCOV_REPORT_DIR) 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/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..c0ceed7 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 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..ce2617c --- /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) -rf $(addprefix ./,$(CLEAN_DIRS)) +endif + diff --git a/mk/compile-c-rule.mk b/mk/compile-c-rule.mk new file mode 100644 index 0000000..afc8b00 --- /dev/null +++ b/mk/compile-c-rule.mk @@ -0,0 +1,10 @@ +# ------------------------------------------------------------------------------ +# C言語 コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.c + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + +$(TESTOBJDIR)/%.o: %.c + -@$(MKDIR) -p $(TESTOBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..1945456 --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,81 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +S_SRCS = $(wildcard $(addsuffix /*.s,$(SRCDIR))) +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) $(S_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST -DDEBUG を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += -I../include +DEFINE += -DUNITTEST -DDEBUG +endif + + +ifeq ($(strip $(DEBUG)),) +# ------------------------------------------------------------------------------ +# DEBUG が無効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の OPTIMIZATION を有効にする +# ------------------------------------------------------------------------------ +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# ------------------------------------------------------------------------------ +# DEBUG が有効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の DEBUG_OPTIONS を有効にする +# ------------------------------------------------------------------------------ +DEFINE += -DENABLED_MEMORY_MANAGE +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +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) diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..edde6de --- /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..eebded1 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,80 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= +RELEASEDIR ?= release + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -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..7a1797d --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPCHECK_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..ffe1c0c --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(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..1a9a6e8 --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,10 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura +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..1e95c5a --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------------ +# 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..ad876ef --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# 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 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +CLEAN_DIRS += $(LCOV_REPORT_DIR) 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/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..c0ceed7 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 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..ce2617c --- /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) -rf $(addprefix ./,$(CLEAN_DIRS)) +endif + diff --git a/mk/compile-c-rule.mk b/mk/compile-c-rule.mk new file mode 100644 index 0000000..afc8b00 --- /dev/null +++ b/mk/compile-c-rule.mk @@ -0,0 +1,10 @@ +# ------------------------------------------------------------------------------ +# C言語 コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.c + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + +$(TESTOBJDIR)/%.o: %.c + -@$(MKDIR) -p $(TESTOBJDIR) + $(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/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..1945456 --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,81 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +S_SRCS = $(wildcard $(addsuffix /*.s,$(SRCDIR))) +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) $(S_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST -DDEBUG を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += -I../include +DEFINE += -DUNITTEST -DDEBUG +endif + + +ifeq ($(strip $(DEBUG)),) +# ------------------------------------------------------------------------------ +# DEBUG が無効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の OPTIMIZATION を有効にする +# ------------------------------------------------------------------------------ +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# ------------------------------------------------------------------------------ +# DEBUG が有効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の DEBUG_OPTIONS を有効にする +# ------------------------------------------------------------------------------ +DEFINE += -DENABLED_MEMORY_MANAGE +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +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) diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..edde6de --- /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..eebded1 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,80 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= +RELEASEDIR ?= release + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -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..7a1797d --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPCHECK_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..ffe1c0c --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(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..1a9a6e8 --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,10 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura +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..1e95c5a --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------------ +# 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..ad876ef --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# 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 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +CLEAN_DIRS += $(LCOV_REPORT_DIR) 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/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..c0ceed7 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 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..ce2617c --- /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) -rf $(addprefix ./,$(CLEAN_DIRS)) +endif + diff --git a/mk/compile-c-rule.mk b/mk/compile-c-rule.mk new file mode 100644 index 0000000..afc8b00 --- /dev/null +++ b/mk/compile-c-rule.mk @@ -0,0 +1,10 @@ +# ------------------------------------------------------------------------------ +# C言語 コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.c + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + +$(TESTOBJDIR)/%.o: %.c + -@$(MKDIR) -p $(TESTOBJDIR) + $(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/compile-s-rule.mk b/mk/compile-s-rule.mk new file mode 100644 index 0000000..c4a27a1 --- /dev/null +++ b/mk/compile-s-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# アセンブラ コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.s + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..1945456 --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,81 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +S_SRCS = $(wildcard $(addsuffix /*.s,$(SRCDIR))) +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) $(S_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST -DDEBUG を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += -I../include +DEFINE += -DUNITTEST -DDEBUG +endif + + +ifeq ($(strip $(DEBUG)),) +# ------------------------------------------------------------------------------ +# DEBUG が無効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の OPTIMIZATION を有効にする +# ------------------------------------------------------------------------------ +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# ------------------------------------------------------------------------------ +# DEBUG が有効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の DEBUG_OPTIONS を有効にする +# ------------------------------------------------------------------------------ +DEFINE += -DENABLED_MEMORY_MANAGE +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +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) diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..edde6de --- /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..eebded1 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,80 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= +RELEASEDIR ?= release + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -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..7a1797d --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPCHECK_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..ffe1c0c --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(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..1a9a6e8 --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,10 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura +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..1e95c5a --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------------ +# 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..ad876ef --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# 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 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +CLEAN_DIRS += $(LCOV_REPORT_DIR) 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/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..c0ceed7 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 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..ce2617c --- /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) -rf $(addprefix ./,$(CLEAN_DIRS)) +endif + diff --git a/mk/compile-c-rule.mk b/mk/compile-c-rule.mk new file mode 100644 index 0000000..afc8b00 --- /dev/null +++ b/mk/compile-c-rule.mk @@ -0,0 +1,10 @@ +# ------------------------------------------------------------------------------ +# C言語 コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.c + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + +$(TESTOBJDIR)/%.o: %.c + -@$(MKDIR) -p $(TESTOBJDIR) + $(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/compile-s-rule.mk b/mk/compile-s-rule.mk new file mode 100644 index 0000000..c4a27a1 --- /dev/null +++ b/mk/compile-s-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# アセンブラ コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.s + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + diff --git a/mk/git-info-conf.mk b/mk/git-info-conf.mk new file mode 100644 index 0000000..8937148 --- /dev/null +++ b/mk/git-info-conf.mk @@ -0,0 +1,31 @@ +# ============================================================================== +# 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 := v0.0.1 +REVISION := 0 +endif + +MAJOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\1/') +MINOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\2/') +RELEASE := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([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/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..1945456 --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,81 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +S_SRCS = $(wildcard $(addsuffix /*.s,$(SRCDIR))) +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) $(S_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST -DDEBUG を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += -I../include +DEFINE += -DUNITTEST -DDEBUG +endif + + +ifeq ($(strip $(DEBUG)),) +# ------------------------------------------------------------------------------ +# DEBUG が無効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の OPTIMIZATION を有効にする +# ------------------------------------------------------------------------------ +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# ------------------------------------------------------------------------------ +# DEBUG が有効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の DEBUG_OPTIONS を有効にする +# ------------------------------------------------------------------------------ +DEFINE += -DENABLED_MEMORY_MANAGE +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +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) diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..edde6de --- /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..eebded1 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,80 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= +RELEASEDIR ?= release + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -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..7a1797d --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPCHECK_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..ffe1c0c --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(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..1a9a6e8 --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,10 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura +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..1e95c5a --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------------ +# 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..ad876ef --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# 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 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +CLEAN_DIRS += $(LCOV_REPORT_DIR) 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/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..c0ceed7 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 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..ce2617c --- /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) -rf $(addprefix ./,$(CLEAN_DIRS)) +endif + diff --git a/mk/compile-c-rule.mk b/mk/compile-c-rule.mk new file mode 100644 index 0000000..afc8b00 --- /dev/null +++ b/mk/compile-c-rule.mk @@ -0,0 +1,10 @@ +# ------------------------------------------------------------------------------ +# C言語 コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.c + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + +$(TESTOBJDIR)/%.o: %.c + -@$(MKDIR) -p $(TESTOBJDIR) + $(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/compile-s-rule.mk b/mk/compile-s-rule.mk new file mode 100644 index 0000000..c4a27a1 --- /dev/null +++ b/mk/compile-s-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# アセンブラ コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.s + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + diff --git a/mk/git-info-conf.mk b/mk/git-info-conf.mk new file mode 100644 index 0000000..8937148 --- /dev/null +++ b/mk/git-info-conf.mk @@ -0,0 +1,31 @@ +# ============================================================================== +# 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 := v0.0.1 +REVISION := 0 +endif + +MAJOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\1/') +MINOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\2/') +RELEASE := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([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/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..1945456 --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,81 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +S_SRCS = $(wildcard $(addsuffix /*.s,$(SRCDIR))) +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) $(S_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST -DDEBUG を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += -I../include +DEFINE += -DUNITTEST -DDEBUG +endif + + +ifeq ($(strip $(DEBUG)),) +# ------------------------------------------------------------------------------ +# DEBUG が無効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の OPTIMIZATION を有効にする +# ------------------------------------------------------------------------------ +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# ------------------------------------------------------------------------------ +# DEBUG が有効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の DEBUG_OPTIONS を有効にする +# ------------------------------------------------------------------------------ +DEFINE += -DENABLED_MEMORY_MANAGE +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +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) diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..edde6de --- /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..eebded1 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,80 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= +RELEASEDIR ?= release + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -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..7a1797d --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPCHECK_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..ffe1c0c --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(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..1a9a6e8 --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,10 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura +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..1e95c5a --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------------ +# 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..ad876ef --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# 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 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +CLEAN_DIRS += $(LCOV_REPORT_DIR) 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/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..c0ceed7 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 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..ce2617c --- /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) -rf $(addprefix ./,$(CLEAN_DIRS)) +endif + diff --git a/mk/compile-c-rule.mk b/mk/compile-c-rule.mk new file mode 100644 index 0000000..afc8b00 --- /dev/null +++ b/mk/compile-c-rule.mk @@ -0,0 +1,10 @@ +# ------------------------------------------------------------------------------ +# C言語 コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.c + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + +$(TESTOBJDIR)/%.o: %.c + -@$(MKDIR) -p $(TESTOBJDIR) + $(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/compile-s-rule.mk b/mk/compile-s-rule.mk new file mode 100644 index 0000000..c4a27a1 --- /dev/null +++ b/mk/compile-s-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# アセンブラ コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.s + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + diff --git a/mk/git-info-conf.mk b/mk/git-info-conf.mk new file mode 100644 index 0000000..8937148 --- /dev/null +++ b/mk/git-info-conf.mk @@ -0,0 +1,31 @@ +# ============================================================================== +# 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 := v0.0.1 +REVISION := 0 +endif + +MAJOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\1/') +MINOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\2/') +RELEASE := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([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..631e6d5 --- /dev/null +++ b/mk/link-a-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 静的ライブラリ 生成に関する設定 +# ============================================================================== + +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).a),$(strip $(TARGET))) + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) $(wildcard include/*.hpp) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +HEADER_FILES_WIN = $(wildcard include/win/*.h) $(wildcard include/win/*.hpp) +TOP_HEADER_FILES_WIN = $(addprefix $(TOPDIR)/include/win/,$(notdir $(HEADER_FILES_WIN))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) $(TOP_HEADER_FILES_WIN) + +endif +endif + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..1945456 --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,81 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +S_SRCS = $(wildcard $(addsuffix /*.s,$(SRCDIR))) +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) $(S_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST -DDEBUG を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += -I../include +DEFINE += -DUNITTEST -DDEBUG +endif + + +ifeq ($(strip $(DEBUG)),) +# ------------------------------------------------------------------------------ +# DEBUG が無効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の OPTIMIZATION を有効にする +# ------------------------------------------------------------------------------ +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# ------------------------------------------------------------------------------ +# DEBUG が有効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の DEBUG_OPTIONS を有効にする +# ------------------------------------------------------------------------------ +DEFINE += -DENABLED_MEMORY_MANAGE +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +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) diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..edde6de --- /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..eebded1 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,80 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= +RELEASEDIR ?= release + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -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..7a1797d --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPCHECK_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..ffe1c0c --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(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..1a9a6e8 --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,10 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura +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..1e95c5a --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------------ +# 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..ad876ef --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# 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 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +CLEAN_DIRS += $(LCOV_REPORT_DIR) 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/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..c0ceed7 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 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..ce2617c --- /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) -rf $(addprefix ./,$(CLEAN_DIRS)) +endif + diff --git a/mk/compile-c-rule.mk b/mk/compile-c-rule.mk new file mode 100644 index 0000000..afc8b00 --- /dev/null +++ b/mk/compile-c-rule.mk @@ -0,0 +1,10 @@ +# ------------------------------------------------------------------------------ +# C言語 コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.c + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + +$(TESTOBJDIR)/%.o: %.c + -@$(MKDIR) -p $(TESTOBJDIR) + $(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/compile-s-rule.mk b/mk/compile-s-rule.mk new file mode 100644 index 0000000..c4a27a1 --- /dev/null +++ b/mk/compile-s-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# アセンブラ コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.s + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + diff --git a/mk/git-info-conf.mk b/mk/git-info-conf.mk new file mode 100644 index 0000000..8937148 --- /dev/null +++ b/mk/git-info-conf.mk @@ -0,0 +1,31 @@ +# ============================================================================== +# 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 := v0.0.1 +REVISION := 0 +endif + +MAJOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\1/') +MINOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\2/') +RELEASE := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([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..631e6d5 --- /dev/null +++ b/mk/link-a-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 静的ライブラリ 生成に関する設定 +# ============================================================================== + +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).a),$(strip $(TARGET))) + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) $(wildcard include/*.hpp) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +HEADER_FILES_WIN = $(wildcard include/win/*.h) $(wildcard include/win/*.hpp) +TOP_HEADER_FILES_WIN = $(addprefix $(TOPDIR)/include/win/,$(notdir $(HEADER_FILES_WIN))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) $(TOP_HEADER_FILES_WIN) + +endif +endif + diff --git a/mk/link-a-rule.mk b/mk/link-a-rule.mk new file mode 100644 index 0000000..657d858 --- /dev/null +++ b/mk/link-a-rule.mk @@ -0,0 +1,19 @@ +# ------------------------------------------------------------------------------ +# 静的ライブラリ 生成ルール +# ------------------------------------------------------------------------------ +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/ + $(CP) -f $(HEADER_FILES_WIN) $(TOPDIR)/include/win/ +endif + $(CP) -f $(TARGET) $(TOPDIR)/lib/ + +endif +endif + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..1945456 --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,81 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +S_SRCS = $(wildcard $(addsuffix /*.s,$(SRCDIR))) +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) $(S_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST -DDEBUG を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += -I../include +DEFINE += -DUNITTEST -DDEBUG +endif + + +ifeq ($(strip $(DEBUG)),) +# ------------------------------------------------------------------------------ +# DEBUG が無効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の OPTIMIZATION を有効にする +# ------------------------------------------------------------------------------ +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# ------------------------------------------------------------------------------ +# DEBUG が有効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の DEBUG_OPTIONS を有効にする +# ------------------------------------------------------------------------------ +DEFINE += -DENABLED_MEMORY_MANAGE +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +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) diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..edde6de --- /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..eebded1 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,80 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= +RELEASEDIR ?= release + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -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..7a1797d --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPCHECK_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..ffe1c0c --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(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..1a9a6e8 --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,10 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura +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..1e95c5a --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------------ +# 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..ad876ef --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# 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 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +CLEAN_DIRS += $(LCOV_REPORT_DIR) 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/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..c0ceed7 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 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..ce2617c --- /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) -rf $(addprefix ./,$(CLEAN_DIRS)) +endif + diff --git a/mk/compile-c-rule.mk b/mk/compile-c-rule.mk new file mode 100644 index 0000000..afc8b00 --- /dev/null +++ b/mk/compile-c-rule.mk @@ -0,0 +1,10 @@ +# ------------------------------------------------------------------------------ +# C言語 コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.c + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + +$(TESTOBJDIR)/%.o: %.c + -@$(MKDIR) -p $(TESTOBJDIR) + $(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/compile-s-rule.mk b/mk/compile-s-rule.mk new file mode 100644 index 0000000..c4a27a1 --- /dev/null +++ b/mk/compile-s-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# アセンブラ コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.s + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + diff --git a/mk/git-info-conf.mk b/mk/git-info-conf.mk new file mode 100644 index 0000000..8937148 --- /dev/null +++ b/mk/git-info-conf.mk @@ -0,0 +1,31 @@ +# ============================================================================== +# 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 := v0.0.1 +REVISION := 0 +endif + +MAJOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\1/') +MINOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\2/') +RELEASE := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([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..631e6d5 --- /dev/null +++ b/mk/link-a-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 静的ライブラリ 生成に関する設定 +# ============================================================================== + +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).a),$(strip $(TARGET))) + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) $(wildcard include/*.hpp) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +HEADER_FILES_WIN = $(wildcard include/win/*.h) $(wildcard include/win/*.hpp) +TOP_HEADER_FILES_WIN = $(addprefix $(TOPDIR)/include/win/,$(notdir $(HEADER_FILES_WIN))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) $(TOP_HEADER_FILES_WIN) + +endif +endif + diff --git a/mk/link-a-rule.mk b/mk/link-a-rule.mk new file mode 100644 index 0000000..657d858 --- /dev/null +++ b/mk/link-a-rule.mk @@ -0,0 +1,19 @@ +# ------------------------------------------------------------------------------ +# 静的ライブラリ 生成ルール +# ------------------------------------------------------------------------------ +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/ + $(CP) -f $(HEADER_FILES_WIN) $(TOPDIR)/include/win/ +endif + $(CP) -f $(TARGET) $(TOPDIR)/lib/ + +endif +endif + diff --git a/mk/link-dll-conf.mk b/mk/link-dll-conf.mk new file mode 100644 index 0000000..d47c5dc --- /dev/null +++ b/mk/link-dll-conf.mk @@ -0,0 +1,23 @@ +# ============================================================================== +# 動的ライブラリ 生成に関する設定 +# ============================================================================== +# +# -fPIC オプションを付与する。 +# +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).dll),$(strip $(TARGET))) +CFLAGS += -fPIC +CXXFLAGS += -fPIC + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) $(wildcard include/*.hpp) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) +CLEAN_FILES += $(NAME).lib + +endif +endif + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..1945456 --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,81 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +S_SRCS = $(wildcard $(addsuffix /*.s,$(SRCDIR))) +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) $(S_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST -DDEBUG を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += -I../include +DEFINE += -DUNITTEST -DDEBUG +endif + + +ifeq ($(strip $(DEBUG)),) +# ------------------------------------------------------------------------------ +# DEBUG が無効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の OPTIMIZATION を有効にする +# ------------------------------------------------------------------------------ +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# ------------------------------------------------------------------------------ +# DEBUG が有効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の DEBUG_OPTIONS を有効にする +# ------------------------------------------------------------------------------ +DEFINE += -DENABLED_MEMORY_MANAGE +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +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) diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..edde6de --- /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..eebded1 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,80 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= +RELEASEDIR ?= release + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -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..7a1797d --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPCHECK_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..ffe1c0c --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(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..1a9a6e8 --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,10 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura +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..1e95c5a --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------------ +# 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..ad876ef --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# 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 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +CLEAN_DIRS += $(LCOV_REPORT_DIR) 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/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..c0ceed7 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 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..ce2617c --- /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) -rf $(addprefix ./,$(CLEAN_DIRS)) +endif + diff --git a/mk/compile-c-rule.mk b/mk/compile-c-rule.mk new file mode 100644 index 0000000..afc8b00 --- /dev/null +++ b/mk/compile-c-rule.mk @@ -0,0 +1,10 @@ +# ------------------------------------------------------------------------------ +# C言語 コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.c + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + +$(TESTOBJDIR)/%.o: %.c + -@$(MKDIR) -p $(TESTOBJDIR) + $(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/compile-s-rule.mk b/mk/compile-s-rule.mk new file mode 100644 index 0000000..c4a27a1 --- /dev/null +++ b/mk/compile-s-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# アセンブラ コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.s + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + diff --git a/mk/git-info-conf.mk b/mk/git-info-conf.mk new file mode 100644 index 0000000..8937148 --- /dev/null +++ b/mk/git-info-conf.mk @@ -0,0 +1,31 @@ +# ============================================================================== +# 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 := v0.0.1 +REVISION := 0 +endif + +MAJOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\1/') +MINOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\2/') +RELEASE := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([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..631e6d5 --- /dev/null +++ b/mk/link-a-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 静的ライブラリ 生成に関する設定 +# ============================================================================== + +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).a),$(strip $(TARGET))) + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) $(wildcard include/*.hpp) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +HEADER_FILES_WIN = $(wildcard include/win/*.h) $(wildcard include/win/*.hpp) +TOP_HEADER_FILES_WIN = $(addprefix $(TOPDIR)/include/win/,$(notdir $(HEADER_FILES_WIN))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) $(TOP_HEADER_FILES_WIN) + +endif +endif + diff --git a/mk/link-a-rule.mk b/mk/link-a-rule.mk new file mode 100644 index 0000000..657d858 --- /dev/null +++ b/mk/link-a-rule.mk @@ -0,0 +1,19 @@ +# ------------------------------------------------------------------------------ +# 静的ライブラリ 生成ルール +# ------------------------------------------------------------------------------ +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/ + $(CP) -f $(HEADER_FILES_WIN) $(TOPDIR)/include/win/ +endif + $(CP) -f $(TARGET) $(TOPDIR)/lib/ + +endif +endif + diff --git a/mk/link-dll-conf.mk b/mk/link-dll-conf.mk new file mode 100644 index 0000000..d47c5dc --- /dev/null +++ b/mk/link-dll-conf.mk @@ -0,0 +1,23 @@ +# ============================================================================== +# 動的ライブラリ 生成に関する設定 +# ============================================================================== +# +# -fPIC オプションを付与する。 +# +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).dll),$(strip $(TARGET))) +CFLAGS += -fPIC +CXXFLAGS += -fPIC + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) $(wildcard include/*.hpp) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) +CLEAN_FILES += $(NAME).lib + +endif +endif + diff --git a/mk/link-dll-rule.mk b/mk/link-dll-rule.mk new file mode 100644 index 0000000..0084d31 --- /dev/null +++ b/mk/link-dll-rule.mk @@ -0,0 +1,27 @@ +# ------------------------------------------------------------------------------ +# 動的ライブラリ 生成ルール +# ------------------------------------------------------------------------------ +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).dll),$(strip $(TARGET))) + +## ----------------------------------------------------------------------------- +## TOPディレクトリへのコピー +## ----------------------------------------------------------------------------- +$(TOP_TARGET): $(TARGET) +ifneq ($(strip $(HEADER_FILES)),) + $(CP) -f $(HEADER_FILES) $(TOPDIR)/include/ +endif + $(CP) -f -d $(TARGET)* $(TOPDIR)/lib/ + + +## ----------------------------------------------------------------------------- +## バージョン番号無し so ファイル生成 +## ----------------------------------------------------------------------------- +# .dllファイル生成 +$(TARGET): $(OBJS) + $(LINK) $(LDFLAGS) -shared -Wl,--out-implib,$(TARGET:.dll=).lib -o $(TARGET) $^ $(LIBS) + + +endif +endif + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..1945456 --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,81 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +S_SRCS = $(wildcard $(addsuffix /*.s,$(SRCDIR))) +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) $(S_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST -DDEBUG を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += -I../include +DEFINE += -DUNITTEST -DDEBUG +endif + + +ifeq ($(strip $(DEBUG)),) +# ------------------------------------------------------------------------------ +# DEBUG が無効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の OPTIMIZATION を有効にする +# ------------------------------------------------------------------------------ +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# ------------------------------------------------------------------------------ +# DEBUG が有効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の DEBUG_OPTIONS を有効にする +# ------------------------------------------------------------------------------ +DEFINE += -DENABLED_MEMORY_MANAGE +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +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) diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..edde6de --- /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..eebded1 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,80 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= +RELEASEDIR ?= release + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -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..7a1797d --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPCHECK_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..ffe1c0c --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(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..1a9a6e8 --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,10 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura +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..1e95c5a --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------------ +# 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..ad876ef --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# 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 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +CLEAN_DIRS += $(LCOV_REPORT_DIR) 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/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..c0ceed7 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 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..ce2617c --- /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) -rf $(addprefix ./,$(CLEAN_DIRS)) +endif + diff --git a/mk/compile-c-rule.mk b/mk/compile-c-rule.mk new file mode 100644 index 0000000..afc8b00 --- /dev/null +++ b/mk/compile-c-rule.mk @@ -0,0 +1,10 @@ +# ------------------------------------------------------------------------------ +# C言語 コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.c + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + +$(TESTOBJDIR)/%.o: %.c + -@$(MKDIR) -p $(TESTOBJDIR) + $(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/compile-s-rule.mk b/mk/compile-s-rule.mk new file mode 100644 index 0000000..c4a27a1 --- /dev/null +++ b/mk/compile-s-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# アセンブラ コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.s + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + diff --git a/mk/git-info-conf.mk b/mk/git-info-conf.mk new file mode 100644 index 0000000..8937148 --- /dev/null +++ b/mk/git-info-conf.mk @@ -0,0 +1,31 @@ +# ============================================================================== +# 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 := v0.0.1 +REVISION := 0 +endif + +MAJOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\1/') +MINOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\2/') +RELEASE := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([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..631e6d5 --- /dev/null +++ b/mk/link-a-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 静的ライブラリ 生成に関する設定 +# ============================================================================== + +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).a),$(strip $(TARGET))) + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) $(wildcard include/*.hpp) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +HEADER_FILES_WIN = $(wildcard include/win/*.h) $(wildcard include/win/*.hpp) +TOP_HEADER_FILES_WIN = $(addprefix $(TOPDIR)/include/win/,$(notdir $(HEADER_FILES_WIN))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) $(TOP_HEADER_FILES_WIN) + +endif +endif + diff --git a/mk/link-a-rule.mk b/mk/link-a-rule.mk new file mode 100644 index 0000000..657d858 --- /dev/null +++ b/mk/link-a-rule.mk @@ -0,0 +1,19 @@ +# ------------------------------------------------------------------------------ +# 静的ライブラリ 生成ルール +# ------------------------------------------------------------------------------ +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/ + $(CP) -f $(HEADER_FILES_WIN) $(TOPDIR)/include/win/ +endif + $(CP) -f $(TARGET) $(TOPDIR)/lib/ + +endif +endif + diff --git a/mk/link-dll-conf.mk b/mk/link-dll-conf.mk new file mode 100644 index 0000000..d47c5dc --- /dev/null +++ b/mk/link-dll-conf.mk @@ -0,0 +1,23 @@ +# ============================================================================== +# 動的ライブラリ 生成に関する設定 +# ============================================================================== +# +# -fPIC オプションを付与する。 +# +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).dll),$(strip $(TARGET))) +CFLAGS += -fPIC +CXXFLAGS += -fPIC + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) $(wildcard include/*.hpp) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) +CLEAN_FILES += $(NAME).lib + +endif +endif + diff --git a/mk/link-dll-rule.mk b/mk/link-dll-rule.mk new file mode 100644 index 0000000..0084d31 --- /dev/null +++ b/mk/link-dll-rule.mk @@ -0,0 +1,27 @@ +# ------------------------------------------------------------------------------ +# 動的ライブラリ 生成ルール +# ------------------------------------------------------------------------------ +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).dll),$(strip $(TARGET))) + +## ----------------------------------------------------------------------------- +## TOPディレクトリへのコピー +## ----------------------------------------------------------------------------- +$(TOP_TARGET): $(TARGET) +ifneq ($(strip $(HEADER_FILES)),) + $(CP) -f $(HEADER_FILES) $(TOPDIR)/include/ +endif + $(CP) -f -d $(TARGET)* $(TOPDIR)/lib/ + + +## ----------------------------------------------------------------------------- +## バージョン番号無し so ファイル生成 +## ----------------------------------------------------------------------------- +# .dllファイル生成 +$(TARGET): $(OBJS) + $(LINK) $(LDFLAGS) -shared -Wl,--out-implib,$(TARGET:.dll=).lib -o $(TARGET) $^ $(LIBS) + + +endif +endif + diff --git a/mk/link-exe-rule.mk b/mk/link-exe-rule.mk new file mode 100644 index 0000000..322c4a3 --- /dev/null +++ b/mk/link-exe-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# 実行ファイル 生成ルール +# ------------------------------------------------------------------------------ +ifneq ($(strip $(NAME)),) + +# For Linux +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +$(TARGET): $(OBJS) + $(LINK) $(LDFLAGS) -o $@ $^ $(LIBS) + +endif + +# For Windows (or ut.exe) +ifeq ($(strip $(NAME).exe),$(strip $(TARGET))) +$(TARGET): $(OBJS) + $(LINK) $(LDFLAGS) -o $@ $^ $(LIBS) + +endif + +endif + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..1945456 --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,81 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +S_SRCS = $(wildcard $(addsuffix /*.s,$(SRCDIR))) +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) $(S_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST -DDEBUG を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += -I../include +DEFINE += -DUNITTEST -DDEBUG +endif + + +ifeq ($(strip $(DEBUG)),) +# ------------------------------------------------------------------------------ +# DEBUG が無効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の OPTIMIZATION を有効にする +# ------------------------------------------------------------------------------ +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# ------------------------------------------------------------------------------ +# DEBUG が有効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の DEBUG_OPTIONS を有効にする +# ------------------------------------------------------------------------------ +DEFINE += -DENABLED_MEMORY_MANAGE +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +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) diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..edde6de --- /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..eebded1 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,80 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= +RELEASEDIR ?= release + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -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..7a1797d --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPCHECK_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..ffe1c0c --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(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..1a9a6e8 --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,10 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura +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..1e95c5a --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------------ +# 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..ad876ef --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# 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 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +CLEAN_DIRS += $(LCOV_REPORT_DIR) 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/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..c0ceed7 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 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..ce2617c --- /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) -rf $(addprefix ./,$(CLEAN_DIRS)) +endif + diff --git a/mk/compile-c-rule.mk b/mk/compile-c-rule.mk new file mode 100644 index 0000000..afc8b00 --- /dev/null +++ b/mk/compile-c-rule.mk @@ -0,0 +1,10 @@ +# ------------------------------------------------------------------------------ +# C言語 コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.c + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + +$(TESTOBJDIR)/%.o: %.c + -@$(MKDIR) -p $(TESTOBJDIR) + $(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/compile-s-rule.mk b/mk/compile-s-rule.mk new file mode 100644 index 0000000..c4a27a1 --- /dev/null +++ b/mk/compile-s-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# アセンブラ コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.s + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + diff --git a/mk/git-info-conf.mk b/mk/git-info-conf.mk new file mode 100644 index 0000000..8937148 --- /dev/null +++ b/mk/git-info-conf.mk @@ -0,0 +1,31 @@ +# ============================================================================== +# 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 := v0.0.1 +REVISION := 0 +endif + +MAJOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\1/') +MINOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\2/') +RELEASE := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([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..631e6d5 --- /dev/null +++ b/mk/link-a-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 静的ライブラリ 生成に関する設定 +# ============================================================================== + +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).a),$(strip $(TARGET))) + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) $(wildcard include/*.hpp) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +HEADER_FILES_WIN = $(wildcard include/win/*.h) $(wildcard include/win/*.hpp) +TOP_HEADER_FILES_WIN = $(addprefix $(TOPDIR)/include/win/,$(notdir $(HEADER_FILES_WIN))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) $(TOP_HEADER_FILES_WIN) + +endif +endif + diff --git a/mk/link-a-rule.mk b/mk/link-a-rule.mk new file mode 100644 index 0000000..657d858 --- /dev/null +++ b/mk/link-a-rule.mk @@ -0,0 +1,19 @@ +# ------------------------------------------------------------------------------ +# 静的ライブラリ 生成ルール +# ------------------------------------------------------------------------------ +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/ + $(CP) -f $(HEADER_FILES_WIN) $(TOPDIR)/include/win/ +endif + $(CP) -f $(TARGET) $(TOPDIR)/lib/ + +endif +endif + diff --git a/mk/link-dll-conf.mk b/mk/link-dll-conf.mk new file mode 100644 index 0000000..d47c5dc --- /dev/null +++ b/mk/link-dll-conf.mk @@ -0,0 +1,23 @@ +# ============================================================================== +# 動的ライブラリ 生成に関する設定 +# ============================================================================== +# +# -fPIC オプションを付与する。 +# +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).dll),$(strip $(TARGET))) +CFLAGS += -fPIC +CXXFLAGS += -fPIC + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) $(wildcard include/*.hpp) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) +CLEAN_FILES += $(NAME).lib + +endif +endif + diff --git a/mk/link-dll-rule.mk b/mk/link-dll-rule.mk new file mode 100644 index 0000000..0084d31 --- /dev/null +++ b/mk/link-dll-rule.mk @@ -0,0 +1,27 @@ +# ------------------------------------------------------------------------------ +# 動的ライブラリ 生成ルール +# ------------------------------------------------------------------------------ +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).dll),$(strip $(TARGET))) + +## ----------------------------------------------------------------------------- +## TOPディレクトリへのコピー +## ----------------------------------------------------------------------------- +$(TOP_TARGET): $(TARGET) +ifneq ($(strip $(HEADER_FILES)),) + $(CP) -f $(HEADER_FILES) $(TOPDIR)/include/ +endif + $(CP) -f -d $(TARGET)* $(TOPDIR)/lib/ + + +## ----------------------------------------------------------------------------- +## バージョン番号無し so ファイル生成 +## ----------------------------------------------------------------------------- +# .dllファイル生成 +$(TARGET): $(OBJS) + $(LINK) $(LDFLAGS) -shared -Wl,--out-implib,$(TARGET:.dll=).lib -o $(TARGET) $^ $(LIBS) + + +endif +endif + diff --git a/mk/link-exe-rule.mk b/mk/link-exe-rule.mk new file mode 100644 index 0000000..322c4a3 --- /dev/null +++ b/mk/link-exe-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# 実行ファイル 生成ルール +# ------------------------------------------------------------------------------ +ifneq ($(strip $(NAME)),) + +# For Linux +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +$(TARGET): $(OBJS) + $(LINK) $(LDFLAGS) -o $@ $^ $(LIBS) + +endif + +# For Windows (or ut.exe) +ifeq ($(strip $(NAME).exe),$(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..6eb9a6e --- /dev/null +++ b/mk/link-so-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# 動的ライブラリ 生成に関する設定 +# ============================================================================== +# +# -fPIC オプションを付与する。 +# +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).so),$(strip $(TARGET))) +CFLAGS += -fPIC +CXXFLAGS += -fPIC + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) $(wildcard include/*.hpp) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) + +ifneq ($(strip $(USE_SO_VERSION)),) +# +# バージョン番号付きの so ファイルを削除対象に追加する。 +# +CLEAN_FILES += $(TARGET).* $(TOP_TARGET).* +endif + + +endif +endif + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..1945456 --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,81 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +S_SRCS = $(wildcard $(addsuffix /*.s,$(SRCDIR))) +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) $(S_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST -DDEBUG を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += -I../include +DEFINE += -DUNITTEST -DDEBUG +endif + + +ifeq ($(strip $(DEBUG)),) +# ------------------------------------------------------------------------------ +# DEBUG が無効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の OPTIMIZATION を有効にする +# ------------------------------------------------------------------------------ +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# ------------------------------------------------------------------------------ +# DEBUG が有効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の DEBUG_OPTIONS を有効にする +# ------------------------------------------------------------------------------ +DEFINE += -DENABLED_MEMORY_MANAGE +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +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) diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..edde6de --- /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..eebded1 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,80 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= +RELEASEDIR ?= release + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -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..7a1797d --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPCHECK_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..ffe1c0c --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(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..1a9a6e8 --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,10 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura +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..1e95c5a --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------------ +# 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..ad876ef --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# 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 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +CLEAN_DIRS += $(LCOV_REPORT_DIR) 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/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..c0ceed7 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 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..ce2617c --- /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) -rf $(addprefix ./,$(CLEAN_DIRS)) +endif + diff --git a/mk/compile-c-rule.mk b/mk/compile-c-rule.mk new file mode 100644 index 0000000..afc8b00 --- /dev/null +++ b/mk/compile-c-rule.mk @@ -0,0 +1,10 @@ +# ------------------------------------------------------------------------------ +# C言語 コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.c + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + +$(TESTOBJDIR)/%.o: %.c + -@$(MKDIR) -p $(TESTOBJDIR) + $(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/compile-s-rule.mk b/mk/compile-s-rule.mk new file mode 100644 index 0000000..c4a27a1 --- /dev/null +++ b/mk/compile-s-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# アセンブラ コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.s + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + diff --git a/mk/git-info-conf.mk b/mk/git-info-conf.mk new file mode 100644 index 0000000..8937148 --- /dev/null +++ b/mk/git-info-conf.mk @@ -0,0 +1,31 @@ +# ============================================================================== +# 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 := v0.0.1 +REVISION := 0 +endif + +MAJOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\1/') +MINOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\2/') +RELEASE := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([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..631e6d5 --- /dev/null +++ b/mk/link-a-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 静的ライブラリ 生成に関する設定 +# ============================================================================== + +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).a),$(strip $(TARGET))) + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) $(wildcard include/*.hpp) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +HEADER_FILES_WIN = $(wildcard include/win/*.h) $(wildcard include/win/*.hpp) +TOP_HEADER_FILES_WIN = $(addprefix $(TOPDIR)/include/win/,$(notdir $(HEADER_FILES_WIN))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) $(TOP_HEADER_FILES_WIN) + +endif +endif + diff --git a/mk/link-a-rule.mk b/mk/link-a-rule.mk new file mode 100644 index 0000000..657d858 --- /dev/null +++ b/mk/link-a-rule.mk @@ -0,0 +1,19 @@ +# ------------------------------------------------------------------------------ +# 静的ライブラリ 生成ルール +# ------------------------------------------------------------------------------ +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/ + $(CP) -f $(HEADER_FILES_WIN) $(TOPDIR)/include/win/ +endif + $(CP) -f $(TARGET) $(TOPDIR)/lib/ + +endif +endif + diff --git a/mk/link-dll-conf.mk b/mk/link-dll-conf.mk new file mode 100644 index 0000000..d47c5dc --- /dev/null +++ b/mk/link-dll-conf.mk @@ -0,0 +1,23 @@ +# ============================================================================== +# 動的ライブラリ 生成に関する設定 +# ============================================================================== +# +# -fPIC オプションを付与する。 +# +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).dll),$(strip $(TARGET))) +CFLAGS += -fPIC +CXXFLAGS += -fPIC + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) $(wildcard include/*.hpp) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) +CLEAN_FILES += $(NAME).lib + +endif +endif + diff --git a/mk/link-dll-rule.mk b/mk/link-dll-rule.mk new file mode 100644 index 0000000..0084d31 --- /dev/null +++ b/mk/link-dll-rule.mk @@ -0,0 +1,27 @@ +# ------------------------------------------------------------------------------ +# 動的ライブラリ 生成ルール +# ------------------------------------------------------------------------------ +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).dll),$(strip $(TARGET))) + +## ----------------------------------------------------------------------------- +## TOPディレクトリへのコピー +## ----------------------------------------------------------------------------- +$(TOP_TARGET): $(TARGET) +ifneq ($(strip $(HEADER_FILES)),) + $(CP) -f $(HEADER_FILES) $(TOPDIR)/include/ +endif + $(CP) -f -d $(TARGET)* $(TOPDIR)/lib/ + + +## ----------------------------------------------------------------------------- +## バージョン番号無し so ファイル生成 +## ----------------------------------------------------------------------------- +# .dllファイル生成 +$(TARGET): $(OBJS) + $(LINK) $(LDFLAGS) -shared -Wl,--out-implib,$(TARGET:.dll=).lib -o $(TARGET) $^ $(LIBS) + + +endif +endif + diff --git a/mk/link-exe-rule.mk b/mk/link-exe-rule.mk new file mode 100644 index 0000000..322c4a3 --- /dev/null +++ b/mk/link-exe-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# 実行ファイル 生成ルール +# ------------------------------------------------------------------------------ +ifneq ($(strip $(NAME)),) + +# For Linux +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +$(TARGET): $(OBJS) + $(LINK) $(LDFLAGS) -o $@ $^ $(LIBS) + +endif + +# For Windows (or ut.exe) +ifeq ($(strip $(NAME).exe),$(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..6eb9a6e --- /dev/null +++ b/mk/link-so-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# 動的ライブラリ 生成に関する設定 +# ============================================================================== +# +# -fPIC オプションを付与する。 +# +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).so),$(strip $(TARGET))) +CFLAGS += -fPIC +CXXFLAGS += -fPIC + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) $(wildcard include/*.hpp) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) + +ifneq ($(strip $(USE_SO_VERSION)),) +# +# バージョン番号付きの so ファイルを削除対象に追加する。 +# +CLEAN_FILES += $(TARGET).* $(TOP_TARGET).* +endif + + +endif +endif + diff --git a/mk/link-so-rule.mk b/mk/link-so-rule.mk new file mode 100644 index 0000000..1369c43 --- /dev/null +++ b/mk/link-so-rule.mk @@ -0,0 +1,44 @@ +# ------------------------------------------------------------------------------ +# 動的ライブラリ 生成ルール +# ------------------------------------------------------------------------------ +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).so),$(strip $(TARGET))) + +## ----------------------------------------------------------------------------- +## TOPディレクトリへのコピー +## ----------------------------------------------------------------------------- +$(TOP_TARGET): $(TARGET) +ifneq ($(strip $(HEADER_FILES)),) + $(CP) -f $(HEADER_FILES) $(TOPDIR)/include/ +endif + $(CP) -f -d $(TARGET)* $(TOPDIR)/lib/ + + +ifneq ($(strip $(USE_SO_VERSION)),) +## ----------------------------------------------------------------------------- +## バージョン番号付き so ファイル生成 +## ----------------------------------------------------------------------------- +# .so ファイル生成 (シンボリックリンク) +$(TARGET): $(TARGET).$(MAJOR) + $(LN) -fs $^ $@ +# .so.X ファイル生成 (シンボリックリンク) +$(TARGET).$(MAJOR): $(TARGET).$(MAJOR).$(MINOR).$(RELEASE) + $(LN) -fs $^ $@ +# .so.X.X.X ファイル生成 +$(TARGET).$(MAJOR).$(MINOR).$(RELEASE): $(OBJS) + $(LINK) $(LDFLAGS) -shared -Wl,-soname,$(TARGET).$(MAJOR) -o $(TARGET).$(MAJOR).$(MINOR).$(RELEASE) $^ $(LIBS) + +else +## ----------------------------------------------------------------------------- +## バージョン番号無し so ファイル生成 +## ----------------------------------------------------------------------------- +# .so ファイル生成 +$(TARGET): $(OBJS) + $(LINK) $(LDFLAGS) -shared -Wl,-soname,$(TARGET) -o $(TARGET) $^ $(LIBS) + +endif + + +endif +endif + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..1945456 --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,81 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +S_SRCS = $(wildcard $(addsuffix /*.s,$(SRCDIR))) +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) $(S_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST -DDEBUG を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += -I../include +DEFINE += -DUNITTEST -DDEBUG +endif + + +ifeq ($(strip $(DEBUG)),) +# ------------------------------------------------------------------------------ +# DEBUG が無効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の OPTIMIZATION を有効にする +# ------------------------------------------------------------------------------ +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# ------------------------------------------------------------------------------ +# DEBUG が有効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の DEBUG_OPTIONS を有効にする +# ------------------------------------------------------------------------------ +DEFINE += -DENABLED_MEMORY_MANAGE +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +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) diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..edde6de --- /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..eebded1 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,80 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= +RELEASEDIR ?= release + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -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..7a1797d --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPCHECK_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..ffe1c0c --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(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..1a9a6e8 --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,10 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura +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..1e95c5a --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------------ +# 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..ad876ef --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# 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 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +CLEAN_DIRS += $(LCOV_REPORT_DIR) 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/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..c0ceed7 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 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..ce2617c --- /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) -rf $(addprefix ./,$(CLEAN_DIRS)) +endif + diff --git a/mk/compile-c-rule.mk b/mk/compile-c-rule.mk new file mode 100644 index 0000000..afc8b00 --- /dev/null +++ b/mk/compile-c-rule.mk @@ -0,0 +1,10 @@ +# ------------------------------------------------------------------------------ +# C言語 コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.c + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + +$(TESTOBJDIR)/%.o: %.c + -@$(MKDIR) -p $(TESTOBJDIR) + $(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/compile-s-rule.mk b/mk/compile-s-rule.mk new file mode 100644 index 0000000..c4a27a1 --- /dev/null +++ b/mk/compile-s-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# アセンブラ コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.s + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + diff --git a/mk/git-info-conf.mk b/mk/git-info-conf.mk new file mode 100644 index 0000000..8937148 --- /dev/null +++ b/mk/git-info-conf.mk @@ -0,0 +1,31 @@ +# ============================================================================== +# 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 := v0.0.1 +REVISION := 0 +endif + +MAJOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\1/') +MINOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\2/') +RELEASE := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([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..631e6d5 --- /dev/null +++ b/mk/link-a-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 静的ライブラリ 生成に関する設定 +# ============================================================================== + +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).a),$(strip $(TARGET))) + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) $(wildcard include/*.hpp) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +HEADER_FILES_WIN = $(wildcard include/win/*.h) $(wildcard include/win/*.hpp) +TOP_HEADER_FILES_WIN = $(addprefix $(TOPDIR)/include/win/,$(notdir $(HEADER_FILES_WIN))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) $(TOP_HEADER_FILES_WIN) + +endif +endif + diff --git a/mk/link-a-rule.mk b/mk/link-a-rule.mk new file mode 100644 index 0000000..657d858 --- /dev/null +++ b/mk/link-a-rule.mk @@ -0,0 +1,19 @@ +# ------------------------------------------------------------------------------ +# 静的ライブラリ 生成ルール +# ------------------------------------------------------------------------------ +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/ + $(CP) -f $(HEADER_FILES_WIN) $(TOPDIR)/include/win/ +endif + $(CP) -f $(TARGET) $(TOPDIR)/lib/ + +endif +endif + diff --git a/mk/link-dll-conf.mk b/mk/link-dll-conf.mk new file mode 100644 index 0000000..d47c5dc --- /dev/null +++ b/mk/link-dll-conf.mk @@ -0,0 +1,23 @@ +# ============================================================================== +# 動的ライブラリ 生成に関する設定 +# ============================================================================== +# +# -fPIC オプションを付与する。 +# +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).dll),$(strip $(TARGET))) +CFLAGS += -fPIC +CXXFLAGS += -fPIC + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) $(wildcard include/*.hpp) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) +CLEAN_FILES += $(NAME).lib + +endif +endif + diff --git a/mk/link-dll-rule.mk b/mk/link-dll-rule.mk new file mode 100644 index 0000000..0084d31 --- /dev/null +++ b/mk/link-dll-rule.mk @@ -0,0 +1,27 @@ +# ------------------------------------------------------------------------------ +# 動的ライブラリ 生成ルール +# ------------------------------------------------------------------------------ +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).dll),$(strip $(TARGET))) + +## ----------------------------------------------------------------------------- +## TOPディレクトリへのコピー +## ----------------------------------------------------------------------------- +$(TOP_TARGET): $(TARGET) +ifneq ($(strip $(HEADER_FILES)),) + $(CP) -f $(HEADER_FILES) $(TOPDIR)/include/ +endif + $(CP) -f -d $(TARGET)* $(TOPDIR)/lib/ + + +## ----------------------------------------------------------------------------- +## バージョン番号無し so ファイル生成 +## ----------------------------------------------------------------------------- +# .dllファイル生成 +$(TARGET): $(OBJS) + $(LINK) $(LDFLAGS) -shared -Wl,--out-implib,$(TARGET:.dll=).lib -o $(TARGET) $^ $(LIBS) + + +endif +endif + diff --git a/mk/link-exe-rule.mk b/mk/link-exe-rule.mk new file mode 100644 index 0000000..322c4a3 --- /dev/null +++ b/mk/link-exe-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# 実行ファイル 生成ルール +# ------------------------------------------------------------------------------ +ifneq ($(strip $(NAME)),) + +# For Linux +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +$(TARGET): $(OBJS) + $(LINK) $(LDFLAGS) -o $@ $^ $(LIBS) + +endif + +# For Windows (or ut.exe) +ifeq ($(strip $(NAME).exe),$(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..6eb9a6e --- /dev/null +++ b/mk/link-so-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# 動的ライブラリ 生成に関する設定 +# ============================================================================== +# +# -fPIC オプションを付与する。 +# +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).so),$(strip $(TARGET))) +CFLAGS += -fPIC +CXXFLAGS += -fPIC + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) $(wildcard include/*.hpp) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) + +ifneq ($(strip $(USE_SO_VERSION)),) +# +# バージョン番号付きの so ファイルを削除対象に追加する。 +# +CLEAN_FILES += $(TARGET).* $(TOP_TARGET).* +endif + + +endif +endif + diff --git a/mk/link-so-rule.mk b/mk/link-so-rule.mk new file mode 100644 index 0000000..1369c43 --- /dev/null +++ b/mk/link-so-rule.mk @@ -0,0 +1,44 @@ +# ------------------------------------------------------------------------------ +# 動的ライブラリ 生成ルール +# ------------------------------------------------------------------------------ +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).so),$(strip $(TARGET))) + +## ----------------------------------------------------------------------------- +## TOPディレクトリへのコピー +## ----------------------------------------------------------------------------- +$(TOP_TARGET): $(TARGET) +ifneq ($(strip $(HEADER_FILES)),) + $(CP) -f $(HEADER_FILES) $(TOPDIR)/include/ +endif + $(CP) -f -d $(TARGET)* $(TOPDIR)/lib/ + + +ifneq ($(strip $(USE_SO_VERSION)),) +## ----------------------------------------------------------------------------- +## バージョン番号付き so ファイル生成 +## ----------------------------------------------------------------------------- +# .so ファイル生成 (シンボリックリンク) +$(TARGET): $(TARGET).$(MAJOR) + $(LN) -fs $^ $@ +# .so.X ファイル生成 (シンボリックリンク) +$(TARGET).$(MAJOR): $(TARGET).$(MAJOR).$(MINOR).$(RELEASE) + $(LN) -fs $^ $@ +# .so.X.X.X ファイル生成 +$(TARGET).$(MAJOR).$(MINOR).$(RELEASE): $(OBJS) + $(LINK) $(LDFLAGS) -shared -Wl,-soname,$(TARGET).$(MAJOR) -o $(TARGET).$(MAJOR).$(MINOR).$(RELEASE) $^ $(LIBS) + +else +## ----------------------------------------------------------------------------- +## バージョン番号無し so ファイル生成 +## ----------------------------------------------------------------------------- +# .so ファイル生成 +$(TARGET): $(OBJS) + $(LINK) $(LDFLAGS) -shared -Wl,-soname,$(TARGET) -o $(TARGET) $^ $(LIBS) + +endif + + +endif +endif + diff --git a/mk/release-conf.mk b/mk/release-conf.mk new file mode 100644 index 0000000..a9bf6d9 --- /dev/null +++ b/mk/release-conf.mk @@ -0,0 +1,6 @@ +# ============================================================================== +# release 設定 +# ============================================================================== +ifeq ($(strip $(TOPDIR)),.) +CLEAN_DIRS += $(TOPDIR)/$(RELEASEDIR) +endif diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..1945456 --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,81 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +S_SRCS = $(wildcard $(addsuffix /*.s,$(SRCDIR))) +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) $(S_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST -DDEBUG を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += -I../include +DEFINE += -DUNITTEST -DDEBUG +endif + + +ifeq ($(strip $(DEBUG)),) +# ------------------------------------------------------------------------------ +# DEBUG が無効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の OPTIMIZATION を有効にする +# ------------------------------------------------------------------------------ +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# ------------------------------------------------------------------------------ +# DEBUG が有効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の DEBUG_OPTIONS を有効にする +# ------------------------------------------------------------------------------ +DEFINE += -DENABLED_MEMORY_MANAGE +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +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) diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..edde6de --- /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..eebded1 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,80 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= +RELEASEDIR ?= release + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -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..7a1797d --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPCHECK_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..ffe1c0c --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(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..1a9a6e8 --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,10 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura +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..1e95c5a --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------------ +# 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..ad876ef --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# 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 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +CLEAN_DIRS += $(LCOV_REPORT_DIR) 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/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..c0ceed7 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 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..ce2617c --- /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) -rf $(addprefix ./,$(CLEAN_DIRS)) +endif + diff --git a/mk/compile-c-rule.mk b/mk/compile-c-rule.mk new file mode 100644 index 0000000..afc8b00 --- /dev/null +++ b/mk/compile-c-rule.mk @@ -0,0 +1,10 @@ +# ------------------------------------------------------------------------------ +# C言語 コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.c + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + +$(TESTOBJDIR)/%.o: %.c + -@$(MKDIR) -p $(TESTOBJDIR) + $(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/compile-s-rule.mk b/mk/compile-s-rule.mk new file mode 100644 index 0000000..c4a27a1 --- /dev/null +++ b/mk/compile-s-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# アセンブラ コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.s + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + diff --git a/mk/git-info-conf.mk b/mk/git-info-conf.mk new file mode 100644 index 0000000..8937148 --- /dev/null +++ b/mk/git-info-conf.mk @@ -0,0 +1,31 @@ +# ============================================================================== +# 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 := v0.0.1 +REVISION := 0 +endif + +MAJOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\1/') +MINOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\2/') +RELEASE := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([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..631e6d5 --- /dev/null +++ b/mk/link-a-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 静的ライブラリ 生成に関する設定 +# ============================================================================== + +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).a),$(strip $(TARGET))) + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) $(wildcard include/*.hpp) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +HEADER_FILES_WIN = $(wildcard include/win/*.h) $(wildcard include/win/*.hpp) +TOP_HEADER_FILES_WIN = $(addprefix $(TOPDIR)/include/win/,$(notdir $(HEADER_FILES_WIN))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) $(TOP_HEADER_FILES_WIN) + +endif +endif + diff --git a/mk/link-a-rule.mk b/mk/link-a-rule.mk new file mode 100644 index 0000000..657d858 --- /dev/null +++ b/mk/link-a-rule.mk @@ -0,0 +1,19 @@ +# ------------------------------------------------------------------------------ +# 静的ライブラリ 生成ルール +# ------------------------------------------------------------------------------ +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/ + $(CP) -f $(HEADER_FILES_WIN) $(TOPDIR)/include/win/ +endif + $(CP) -f $(TARGET) $(TOPDIR)/lib/ + +endif +endif + diff --git a/mk/link-dll-conf.mk b/mk/link-dll-conf.mk new file mode 100644 index 0000000..d47c5dc --- /dev/null +++ b/mk/link-dll-conf.mk @@ -0,0 +1,23 @@ +# ============================================================================== +# 動的ライブラリ 生成に関する設定 +# ============================================================================== +# +# -fPIC オプションを付与する。 +# +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).dll),$(strip $(TARGET))) +CFLAGS += -fPIC +CXXFLAGS += -fPIC + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) $(wildcard include/*.hpp) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) +CLEAN_FILES += $(NAME).lib + +endif +endif + diff --git a/mk/link-dll-rule.mk b/mk/link-dll-rule.mk new file mode 100644 index 0000000..0084d31 --- /dev/null +++ b/mk/link-dll-rule.mk @@ -0,0 +1,27 @@ +# ------------------------------------------------------------------------------ +# 動的ライブラリ 生成ルール +# ------------------------------------------------------------------------------ +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).dll),$(strip $(TARGET))) + +## ----------------------------------------------------------------------------- +## TOPディレクトリへのコピー +## ----------------------------------------------------------------------------- +$(TOP_TARGET): $(TARGET) +ifneq ($(strip $(HEADER_FILES)),) + $(CP) -f $(HEADER_FILES) $(TOPDIR)/include/ +endif + $(CP) -f -d $(TARGET)* $(TOPDIR)/lib/ + + +## ----------------------------------------------------------------------------- +## バージョン番号無し so ファイル生成 +## ----------------------------------------------------------------------------- +# .dllファイル生成 +$(TARGET): $(OBJS) + $(LINK) $(LDFLAGS) -shared -Wl,--out-implib,$(TARGET:.dll=).lib -o $(TARGET) $^ $(LIBS) + + +endif +endif + diff --git a/mk/link-exe-rule.mk b/mk/link-exe-rule.mk new file mode 100644 index 0000000..322c4a3 --- /dev/null +++ b/mk/link-exe-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# 実行ファイル 生成ルール +# ------------------------------------------------------------------------------ +ifneq ($(strip $(NAME)),) + +# For Linux +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +$(TARGET): $(OBJS) + $(LINK) $(LDFLAGS) -o $@ $^ $(LIBS) + +endif + +# For Windows (or ut.exe) +ifeq ($(strip $(NAME).exe),$(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..6eb9a6e --- /dev/null +++ b/mk/link-so-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# 動的ライブラリ 生成に関する設定 +# ============================================================================== +# +# -fPIC オプションを付与する。 +# +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).so),$(strip $(TARGET))) +CFLAGS += -fPIC +CXXFLAGS += -fPIC + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) $(wildcard include/*.hpp) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) + +ifneq ($(strip $(USE_SO_VERSION)),) +# +# バージョン番号付きの so ファイルを削除対象に追加する。 +# +CLEAN_FILES += $(TARGET).* $(TOP_TARGET).* +endif + + +endif +endif + diff --git a/mk/link-so-rule.mk b/mk/link-so-rule.mk new file mode 100644 index 0000000..1369c43 --- /dev/null +++ b/mk/link-so-rule.mk @@ -0,0 +1,44 @@ +# ------------------------------------------------------------------------------ +# 動的ライブラリ 生成ルール +# ------------------------------------------------------------------------------ +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).so),$(strip $(TARGET))) + +## ----------------------------------------------------------------------------- +## TOPディレクトリへのコピー +## ----------------------------------------------------------------------------- +$(TOP_TARGET): $(TARGET) +ifneq ($(strip $(HEADER_FILES)),) + $(CP) -f $(HEADER_FILES) $(TOPDIR)/include/ +endif + $(CP) -f -d $(TARGET)* $(TOPDIR)/lib/ + + +ifneq ($(strip $(USE_SO_VERSION)),) +## ----------------------------------------------------------------------------- +## バージョン番号付き so ファイル生成 +## ----------------------------------------------------------------------------- +# .so ファイル生成 (シンボリックリンク) +$(TARGET): $(TARGET).$(MAJOR) + $(LN) -fs $^ $@ +# .so.X ファイル生成 (シンボリックリンク) +$(TARGET).$(MAJOR): $(TARGET).$(MAJOR).$(MINOR).$(RELEASE) + $(LN) -fs $^ $@ +# .so.X.X.X ファイル生成 +$(TARGET).$(MAJOR).$(MINOR).$(RELEASE): $(OBJS) + $(LINK) $(LDFLAGS) -shared -Wl,-soname,$(TARGET).$(MAJOR) -o $(TARGET).$(MAJOR).$(MINOR).$(RELEASE) $^ $(LIBS) + +else +## ----------------------------------------------------------------------------- +## バージョン番号無し so ファイル生成 +## ----------------------------------------------------------------------------- +# .so ファイル生成 +$(TARGET): $(OBJS) + $(LINK) $(LDFLAGS) -shared -Wl,-soname,$(TARGET) -o $(TARGET) $^ $(LIBS) + +endif + + +endif +endif + diff --git a/mk/release-conf.mk b/mk/release-conf.mk new file mode 100644 index 0000000..a9bf6d9 --- /dev/null +++ b/mk/release-conf.mk @@ -0,0 +1,6 @@ +# ============================================================================== +# release 設定 +# ============================================================================== +ifeq ($(strip $(TOPDIR)),.) +CLEAN_DIRS += $(TOPDIR)/$(RELEASEDIR) +endif diff --git a/mk/release-rule.mk b/mk/release-rule.mk new file mode 100644 index 0000000..8862c62 --- /dev/null +++ b/mk/release-rule.mk @@ -0,0 +1,25 @@ +# ------------------------------------------------------------------------------ +# release ルール +# ------------------------------------------------------------------------------ +.PHONY: release +release: +ifeq ($(strip $(TOPDIR)),.) + $(MAKE) clean + $(MAKE) all + $(MKDIR) -p $(TOPDIR)/$(RELEASEDIR)/bin + $(MKDIR) -p $(TOPDIR)/$(RELEASEDIR)/lib +endif + @for subdir in $(SUBDIRS); do \ + $(MAKE) release -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifeq ($(strip $(NAME).so),$(strip $(TARGET))) +# .so ファイル + $(CP) -d $(TARGET)* $(TOPDIR)/$(RELEASEDIR)/lib/ +endif +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +# 実行ファイル + $(CP) $(TARGET) $(TOPDIR)/$(RELEASEDIR)/bin/ +endif +endif + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f3dbf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.d +*.o +*.ko +*.gch +*.pch +*.lib +*.a +*.la +*.lo +*.dll +*.so +*.so.* +*.exe +*.out +*.idb +*.pdb +report +obj + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..63b170d --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# ============================================================================== +# Makefile +# ============================================================================== +# +# TOPDIR : トップディレクトリ +# RULEDIR : Meke のルール一式が格納されているディレクトリ +# NAME : モジュール名 (拡張子を含めないこと) +# TARGET : モジュールファイル名 (拡張子を含めること) +# SUBDIR : サブディレクトリ (処理したい順に空白区切りで記述すること) +# +TOPDIR ?= . +RULEDIR ?= $(TOPDIR)/mk +NAME = +TARGET = $(NAME) +SUBDIRS = modules +USE_SO_VERSION = + +# ------------------------------------------------------------------------------ +# *-cmd.mk : コマンド +# *-conf.mk : 設定 +# *-auto.mk : 自動設定 +# ------------------------------------------------------------------------------ +include $(TOPDIR)/config.mk +include $(RULEDIR)/*-cmd.mk +include $(RULEDIR)/*-conf.mk +include $(RULEDIR)/*-auto.mk +# ------------------------------------------------------------------------------ +# +# 以下、オプションを適宜変更してください。 +# + +INCLUDES += -I$(TOPDIR)/include +CFLAGS += +CXXFLAGS += +LDFLAGS += +LIBS += -L$(TOPDIR)/lib + +CLEAN_FILES += +CLEAN_DIRS += + +.DEFAULT_GOAL := all + +# ------------------------------------------------------------------------------ +# *-rule : ルール +# ------------------------------------------------------------------------------ +include $(RULEDIR)/*-rule.mk +# ------------------------------------------------------------------------------ + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..91965b5 --- /dev/null +++ b/config.mk @@ -0,0 +1,98 @@ +# vim: ts=4 sw=4 sts=4 +################################################################################ +## +## コンパイル設定 +## + +# +# DEBUG モード +# +# make DEBUG=1 にてコンパイルすることで、DEBUG モードでコンパイルします。 +# TARGET=ut.exe の場合は、常に DEBUG モードでコンパイルします。 +# + +# +# OS指定 +# +#OS = linux +OS = windows + +# +# アーキテクチャ指定 +# +ARCH ?= +#ARCH ?= aarch64 +#ARCH ?= i686-w64-mingw32 + +# +# クロスコンパイラ指定 +# +CROSS_COMPILE=$(ARCH)- + +# +# コンパイラ +# +# +#CC = $(CROSS_COMPILE)gcc +#CXX = $(CROSS_COMPILE)g++ +CC = $(CROSS_COMPILE)clang +CXX = $(CROSS_COMPILE)clang++ +#CC = $(CROSS_COMPILE)clang-16 +#CXX = $(CROSS_COMPILE)clang++16 + +# +# オプション設定 +# +ifeq ($(strip $(OS)),windows) +LIBS ?= -liphlpapi -lws2_32 +DEBUG_OPTIONS ?= +else +LIBS ?= -lpthread -lrt +DEBUG_OPTIONS ?= -fstack-protector +endif + +# +# C/C++ 言語規格指定 +# +# 指定された言語規格に従ってコンパイルします。 +# C_VERSION [-std=cXX|-std=gnuXX] (XX=89,90,99,11) +# CXX_VERSION [-std=c++XX|-std=gnu++XX] (XX=03,11,14,17) +# +C_VERSION = -std=gnu11 +CXX_VERSION = -std=gnu++17 + +# +# 共通のインクルードパスを指定します。 +# +INCLUDES += -Iinclude +INCLUDES += -I$(TOPDIR)/include + +# +# 共通のライブラリパスを指定します。 +# +LDFLAGS += -Llib +LDFLAGS += -L$(TOPDIR)/lib + +# +# 共通でリンクするライブラリを指定します。 +# +LIBS += + + +CFLAGS += -DKC_MEMORY_ENABLED=1 +CXXFLAGS += -DKCPP_MEMORY_ENABLED=1 + + +# ------------------------------------------------------------------------------ +# TARGET 調整 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(OS)),windows) +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +TARGET = $(NAME).exe +else +ifeq ($(strip $(NAME)).so,$(strip $(TARGET))) +TARGET = $(NAME).dll +endif +endif +endif + diff --git a/mk/README.md b/mk/README.md new file mode 100644 index 0000000..c4474d3 --- /dev/null +++ b/mk/README.md @@ -0,0 +1,18 @@ +# Makefile 用 設定、ルール + +Makefile 用の設定、ルールを格納しているディレクトリ。 + +## 使い方 + +Makefile.tmpl を元に、Makefile を作成することで、 +本配下にあるルールを make に組み込むことができます。 + + +## ファイル命名規則 +新たなルールを追加する場合、下記ファイルの命名規則に従ってください。 +* *-cmd.mk コマンドを記載したファイル +* *-conf.mk 設定を記載したファイル +* *-rule.mk ルールを記載したファイル +* *-auto.mk 自動設定を記載したファイル + + diff --git a/mk/all-rule.mk b/mk/all-rule.mk new file mode 100644 index 0000000..f45e02f --- /dev/null +++ b/mk/all-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# all ルール +# ------------------------------------------------------------------------------ +# 次を実行します。 +# (1) 全サブディレクトリに対して make all 実行 +# (2) make $(TARGET) 実行 +# (3) make $(TOP_TARGET) 実行 +# +.PHONY: all +all: + @for subdir in $(SUBDIRS); do \ + $(MAKE) all -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + $(MAKE) $(TARGET) +ifneq ($(strip $(TOP_TARGET)),) + $(MAKE) $(TOP_TARGET) +endif +endif +endif diff --git a/mk/base-auto.mk b/mk/base-auto.mk new file mode 100644 index 0000000..1945456 --- /dev/null +++ b/mk/base-auto.mk @@ -0,0 +1,81 @@ +# ============================================================================== +# 基本自動設定 +# ============================================================================== +# 以下、基本設定に基づき自動的に設定されます。 +# (本ファイルは、基本的に変更不要です。) + + +# ------------------------------------------------------------------------------ +# SRCS, OBJS, DEPS ファイル群の自動設定 +# ------------------------------------------------------------------------------ +S_SRCS = $(wildcard $(addsuffix /*.s,$(SRCDIR))) +C_SRCS = $(wildcard $(addsuffix /*.c,$(SRCDIR))) +CXX_SRCS = $(wildcard $(addsuffix /*.cpp,$(SRCDIR))) +TMP_SRCS = $(C_SRCS) $(CXX_SRCS) $(S_SRCS) +VPATH = $(SRCDIR) +SRCS = $(filter-out $(EXCLUDES),$(TMP_SRCS)) +OBJS = $(addprefix $(OBJDIR)/, $(notdir $(addsuffix .o, $(basename $(SRCS))))) +DEPS = $(OBJS:$(OBJDIR)/%.o=$(OBJDIR)/%.d) + + +# ------------------------------------------------------------------------------ +# LINK : リンカー設定 +# C++ が含まれる場合、$(CXX) を使用する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(CXX_SRCS)),) + LINK = $(CC) +else + LINK = $(CXX) +endif + + +# ------------------------------------------------------------------------------ +# ターゲットが ut.exe の場合の設定 +# +# 1. DEBUG を常に有効に設定する。 +# 2. SRCDIR に、../src を追加する。 +# 3. INCLUDES に、../include を追加する。 +# 4. DEFINE に -DUNITTEST -DDEBUG を追加する。 +# ------------------------------------------------------------------------------ +ifeq ($(strip $(TARGET)),ut.exe) +DEBUG = 1 +SRCDIR += ../src +INCLUDES += -I../include +DEFINE += -DUNITTEST -DDEBUG +endif + + +ifeq ($(strip $(DEBUG)),) +# ------------------------------------------------------------------------------ +# DEBUG が無効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の OPTIMIZATION を有効にする +# ------------------------------------------------------------------------------ +CFLAGS += $(OPTIMIZATION) +CXXFLAGS += $(OPTIMIZATION) + +else +# ------------------------------------------------------------------------------ +# DEBUG が有効な場合の設定 +# CFLAGS, CXXFLAGS, LDFLAGS の DEBUG_OPTIONS を有効にする +# ------------------------------------------------------------------------------ +DEFINE += -DENABLED_MEMORY_MANAGE +CFLAGS += $(DEBUG_OPTIONS) +CXXFLAGS += $(DEBUG_OPTIONS) +LDFLAGS += $(DEBUG_LDFLAGS) + +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) diff --git a/mk/base-cmd.mk b/mk/base-cmd.mk new file mode 100644 index 0000000..edde6de --- /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..eebded1 --- /dev/null +++ b/mk/base-conf.mk @@ -0,0 +1,80 @@ +# ============================================================================== +# 基本設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# デフォルトディレクトリ/ファイル設定 +# ------------------------------------------------------------------------------ +SRCDIR ?= src +OBJDIR ?= obj +EXCLUDES ?= +RELEASEDIR ?= release + +# ------------------------------------------------------------------------------ +# 最適化オプション +# -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..7a1797d --- /dev/null +++ b/mk/check-cppcheck-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# cppcheck 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +CPPCHECK = cppcheck +CPPCHECK_FLAGS = --inconclusive --xml --xml-version=2 --enable=all +CPPCHECK_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..ffe1c0c --- /dev/null +++ b/mk/check-cppcheck-rule.mk @@ -0,0 +1,14 @@ +# ------------------------------------------------------------------------------ +# cppcheck ルール +# ------------------------------------------------------------------------------ +.PHONY: cppcheck +cppcheck: + @for subdir in $(SUBDIRS); do \ + $(MAKE) cppcheck -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifneq ($(strip $(TARGET)),ut.exe) + -@$(MKDIR) -p $(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..1a9a6e8 --- /dev/null +++ b/mk/check-lcov-cobertura-conf.mk @@ -0,0 +1,10 @@ +# ============================================================================== +# lcov cobertura 設定 +# ============================================================================== + +# ------------------------------------------------------------------------------ +# 基本設定 +# ------------------------------------------------------------------------------ +LCOV_COBERTURA = lcov_cobertura +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..1e95c5a --- /dev/null +++ b/mk/check-lcov-cobertura-rule.mk @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------------ +# 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..ad876ef --- /dev/null +++ b/mk/check-lcov-conf.mk @@ -0,0 +1,25 @@ +# ============================================================================== +# 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 時の削除ファイル追加 +# ------------------------------------------------------------------------------ +CLEAN_DIRS += $(LCOV_REPORT_DIR) 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/clean-conf.mk b/mk/clean-conf.mk new file mode 100644 index 0000000..c0ceed7 --- /dev/null +++ b/mk/clean-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 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..ce2617c --- /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) -rf $(addprefix ./,$(CLEAN_DIRS)) +endif + diff --git a/mk/compile-c-rule.mk b/mk/compile-c-rule.mk new file mode 100644 index 0000000..afc8b00 --- /dev/null +++ b/mk/compile-c-rule.mk @@ -0,0 +1,10 @@ +# ------------------------------------------------------------------------------ +# C言語 コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.c + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + +$(TESTOBJDIR)/%.o: %.c + -@$(MKDIR) -p $(TESTOBJDIR) + $(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/compile-s-rule.mk b/mk/compile-s-rule.mk new file mode 100644 index 0000000..c4a27a1 --- /dev/null +++ b/mk/compile-s-rule.mk @@ -0,0 +1,7 @@ +# ------------------------------------------------------------------------------ +# アセンブラ コンパイル ルール +# ------------------------------------------------------------------------------ +$(OBJDIR)/%.o: %.s + -@$(MKDIR) -p $(OBJDIR) + $(CC) $(CFLAGS) -c -o $@ $< + diff --git a/mk/git-info-conf.mk b/mk/git-info-conf.mk new file mode 100644 index 0000000..8937148 --- /dev/null +++ b/mk/git-info-conf.mk @@ -0,0 +1,31 @@ +# ============================================================================== +# 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 := v0.0.1 +REVISION := 0 +endif + +MAJOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\1/') +MINOR := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)$$/\2/') +RELEASE := $(shell $(ECHO) $(VERSION) | $(SED) -e 's/^[a-zA-Z]*\([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..631e6d5 --- /dev/null +++ b/mk/link-a-conf.mk @@ -0,0 +1,21 @@ +# ============================================================================== +# 静的ライブラリ 生成に関する設定 +# ============================================================================== + +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).a),$(strip $(TARGET))) + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) $(wildcard include/*.hpp) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +HEADER_FILES_WIN = $(wildcard include/win/*.h) $(wildcard include/win/*.hpp) +TOP_HEADER_FILES_WIN = $(addprefix $(TOPDIR)/include/win/,$(notdir $(HEADER_FILES_WIN))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) $(TOP_HEADER_FILES_WIN) + +endif +endif + diff --git a/mk/link-a-rule.mk b/mk/link-a-rule.mk new file mode 100644 index 0000000..657d858 --- /dev/null +++ b/mk/link-a-rule.mk @@ -0,0 +1,19 @@ +# ------------------------------------------------------------------------------ +# 静的ライブラリ 生成ルール +# ------------------------------------------------------------------------------ +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/ + $(CP) -f $(HEADER_FILES_WIN) $(TOPDIR)/include/win/ +endif + $(CP) -f $(TARGET) $(TOPDIR)/lib/ + +endif +endif + diff --git a/mk/link-dll-conf.mk b/mk/link-dll-conf.mk new file mode 100644 index 0000000..d47c5dc --- /dev/null +++ b/mk/link-dll-conf.mk @@ -0,0 +1,23 @@ +# ============================================================================== +# 動的ライブラリ 生成に関する設定 +# ============================================================================== +# +# -fPIC オプションを付与する。 +# +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).dll),$(strip $(TARGET))) +CFLAGS += -fPIC +CXXFLAGS += -fPIC + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) $(wildcard include/*.hpp) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) +CLEAN_FILES += $(NAME).lib + +endif +endif + diff --git a/mk/link-dll-rule.mk b/mk/link-dll-rule.mk new file mode 100644 index 0000000..0084d31 --- /dev/null +++ b/mk/link-dll-rule.mk @@ -0,0 +1,27 @@ +# ------------------------------------------------------------------------------ +# 動的ライブラリ 生成ルール +# ------------------------------------------------------------------------------ +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).dll),$(strip $(TARGET))) + +## ----------------------------------------------------------------------------- +## TOPディレクトリへのコピー +## ----------------------------------------------------------------------------- +$(TOP_TARGET): $(TARGET) +ifneq ($(strip $(HEADER_FILES)),) + $(CP) -f $(HEADER_FILES) $(TOPDIR)/include/ +endif + $(CP) -f -d $(TARGET)* $(TOPDIR)/lib/ + + +## ----------------------------------------------------------------------------- +## バージョン番号無し so ファイル生成 +## ----------------------------------------------------------------------------- +# .dllファイル生成 +$(TARGET): $(OBJS) + $(LINK) $(LDFLAGS) -shared -Wl,--out-implib,$(TARGET:.dll=).lib -o $(TARGET) $^ $(LIBS) + + +endif +endif + diff --git a/mk/link-exe-rule.mk b/mk/link-exe-rule.mk new file mode 100644 index 0000000..322c4a3 --- /dev/null +++ b/mk/link-exe-rule.mk @@ -0,0 +1,21 @@ +# ------------------------------------------------------------------------------ +# 実行ファイル 生成ルール +# ------------------------------------------------------------------------------ +ifneq ($(strip $(NAME)),) + +# For Linux +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +$(TARGET): $(OBJS) + $(LINK) $(LDFLAGS) -o $@ $^ $(LIBS) + +endif + +# For Windows (or ut.exe) +ifeq ($(strip $(NAME).exe),$(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..6eb9a6e --- /dev/null +++ b/mk/link-so-conf.mk @@ -0,0 +1,30 @@ +# ============================================================================== +# 動的ライブラリ 生成に関する設定 +# ============================================================================== +# +# -fPIC オプションを付与する。 +# +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).so),$(strip $(TARGET))) +CFLAGS += -fPIC +CXXFLAGS += -fPIC + +TOP_TARGET = $(addprefix $(TOPDIR)/lib/,$(TARGET)) + +HEADER_FILES = $(wildcard include/*.h) $(wildcard include/*.hpp) +TOP_HEADER_FILES = $(addprefix $(TOPDIR)/include/,$(notdir $(HEADER_FILES))) + +CLEAN_FILES += $(TOP_TARGET) +CLEAN_FILES += $(TOP_HEADER_FILES) + +ifneq ($(strip $(USE_SO_VERSION)),) +# +# バージョン番号付きの so ファイルを削除対象に追加する。 +# +CLEAN_FILES += $(TARGET).* $(TOP_TARGET).* +endif + + +endif +endif + diff --git a/mk/link-so-rule.mk b/mk/link-so-rule.mk new file mode 100644 index 0000000..1369c43 --- /dev/null +++ b/mk/link-so-rule.mk @@ -0,0 +1,44 @@ +# ------------------------------------------------------------------------------ +# 動的ライブラリ 生成ルール +# ------------------------------------------------------------------------------ +ifneq ($(strip $(NAME)),) +ifeq ($(strip $(NAME).so),$(strip $(TARGET))) + +## ----------------------------------------------------------------------------- +## TOPディレクトリへのコピー +## ----------------------------------------------------------------------------- +$(TOP_TARGET): $(TARGET) +ifneq ($(strip $(HEADER_FILES)),) + $(CP) -f $(HEADER_FILES) $(TOPDIR)/include/ +endif + $(CP) -f -d $(TARGET)* $(TOPDIR)/lib/ + + +ifneq ($(strip $(USE_SO_VERSION)),) +## ----------------------------------------------------------------------------- +## バージョン番号付き so ファイル生成 +## ----------------------------------------------------------------------------- +# .so ファイル生成 (シンボリックリンク) +$(TARGET): $(TARGET).$(MAJOR) + $(LN) -fs $^ $@ +# .so.X ファイル生成 (シンボリックリンク) +$(TARGET).$(MAJOR): $(TARGET).$(MAJOR).$(MINOR).$(RELEASE) + $(LN) -fs $^ $@ +# .so.X.X.X ファイル生成 +$(TARGET).$(MAJOR).$(MINOR).$(RELEASE): $(OBJS) + $(LINK) $(LDFLAGS) -shared -Wl,-soname,$(TARGET).$(MAJOR) -o $(TARGET).$(MAJOR).$(MINOR).$(RELEASE) $^ $(LIBS) + +else +## ----------------------------------------------------------------------------- +## バージョン番号無し so ファイル生成 +## ----------------------------------------------------------------------------- +# .so ファイル生成 +$(TARGET): $(OBJS) + $(LINK) $(LDFLAGS) -shared -Wl,-soname,$(TARGET) -o $(TARGET) $^ $(LIBS) + +endif + + +endif +endif + diff --git a/mk/release-conf.mk b/mk/release-conf.mk new file mode 100644 index 0000000..a9bf6d9 --- /dev/null +++ b/mk/release-conf.mk @@ -0,0 +1,6 @@ +# ============================================================================== +# release 設定 +# ============================================================================== +ifeq ($(strip $(TOPDIR)),.) +CLEAN_DIRS += $(TOPDIR)/$(RELEASEDIR) +endif diff --git a/mk/release-rule.mk b/mk/release-rule.mk new file mode 100644 index 0000000..8862c62 --- /dev/null +++ b/mk/release-rule.mk @@ -0,0 +1,25 @@ +# ------------------------------------------------------------------------------ +# release ルール +# ------------------------------------------------------------------------------ +.PHONY: release +release: +ifeq ($(strip $(TOPDIR)),.) + $(MAKE) clean + $(MAKE) all + $(MKDIR) -p $(TOPDIR)/$(RELEASEDIR)/bin + $(MKDIR) -p $(TOPDIR)/$(RELEASEDIR)/lib +endif + @for subdir in $(SUBDIRS); do \ + $(MAKE) release -C $$subdir; \ + done +ifneq ($(strip $(TARGET)),) +ifeq ($(strip $(NAME).so),$(strip $(TARGET))) +# .so ファイル + $(CP) -d $(TARGET)* $(TOPDIR)/$(RELEASEDIR)/lib/ +endif +ifeq ($(strip $(NAME)),$(strip $(TARGET))) +# 実行ファイル + $(CP) $(TARGET) $(TOPDIR)/$(RELEASEDIR)/bin/ +endif +endif + diff --git a/mk/test-rule.mk b/mk/test-rule.mk new file mode 100644 index 0000000..4bd8655 --- /dev/null +++ b/mk/test-rule.mk @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------------------ +# test ルール +# ------------------------------------------------------------------------------ +.PHONY: test +test: + @for subdir in $(SUBDIRS); do \ + $(MAKE) test -C $$subdir; \ + done +ifeq ($(strip $(TARGET)),ut.exe) + $(MAKE) ut.exe + ./ut.exe +endif