#############################################################################
## src内のファイルの一括コンパイル
## Compile all the files in "src" 
##   *** Japanese encoding : UTF-8 ***
#############################################################################



#############################################################################
## コンパイラの指定
## Specify compilers
#############################################################################

# Cコンパイラで常に用いるオプションの設定
# Set C compiler options which are always used
ifeq ($(OS_MAC_DARWIN_FLAG),true)
  GCC_COMPILER_OPTIONS = -fgnu89-inline
  ICC_COMPILER_OPTIONS = -fgnu89-inline
else
  ifeq ($(UBUNTU_FLAG),true)
    GCC_COMPILER_OPTIONS = -Wl,--no-as-needed -fgnu89-inline -lm \
                           -Wno-unused-result -Wno-format-overflow
    ICC_COMPILER_OPTIONS = -Wl,--no-as-needed -fgnu89-inline
  else
    GCC_COMPILER_OPTIONS = -fgnu89-inline -lm
    ICC_COMPILER_OPTIONS = -fgnu89-inline
  endif
endif

# 使用するコンパイラ名の設定
# Set compiler name to use
ifeq ($(INTEL_COMPILER_AVAILABLE),new)
  C_COMPILER = icx ${ICC_COMPILER_OPTIONS}
  C_COMPILER_TEST = gcc ${GCC_COMPILER_OPTIONS}
else
  ifeq ($(INTEL_COMPILER_AVAILABLE),yes)
    C_COMPILER = icc ${ICC_COMPILER_OPTIONS}
    C_COMPILER_TEST = gcc ${GCC_COMPILER_OPTIONS}
  else
    C_COMPILER = gcc ${GCC_COMPILER_OPTIONS}
    C_COMPILER_TEST = gcc ${GCC_COMPILER_OPTIONS}
  endif
endif



#############################################################################
## コンパイルオプションの指定
## Specify compile options
#############################################################################

# -O0オプション / -O0 options
C_FRAGS_O0_BASE = -O0 -lz

# -O1オプション / -O1 options
C_FRAGS_O1_BASE = -O1 -lz

# -O2オプション / -O2 options
C_FRAGS_O2_BASE = -O2 -lz

# -O3オプション / -O3 options
C_FRAGS_O3_BASE = -O3 -lz

# テストコンパイル用 / For test compile
C_FRAGS_TEST_BASE = -O0 -lz -Wall -Wno-unknown-pragmas -W \
                    -Wsystem-headers -Wfloat-equal -Wundef -Wendif-labels \
                    -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align \
                    -Wsign-compare -Wformat -Wmissing-format-attribute \
                    -Wpacked -Wredundant-decls -Wunreachable-code -Winline \
                    -Wbad-function-cast -Wdeclaration-after-statement \
                    -Wstrict-prototypes -Wmissing-prototypes \
                    -Wmissing-declarations -Wnested-externs

# openmp並列化オプションの追加 / Add openmp parallelizing options
ifeq ($(USE_OPENMP),yes)
  C_FRAGS_O0 = $(C_FRAGS_O0_BASE) -qopenmp
  C_FRAGS_O1 = $(C_FRAGS_O1_BASE) -qopenmp
  C_FRAGS_O2 = $(C_FRAGS_O2_BASE) -qopenmp
  C_FRAGS_O3 = $(C_FRAGS_O3_BASE) -qopenmp
  C_FRAGS_TEST = $(C_FRAGS_TEST_BASE) -qopenmp
else
  C_FRAGS_O0 = $(C_FRAGS_O0_BASE)
  C_FRAGS_O1 = $(C_FRAGS_O1_BASE)
  C_FRAGS_O2 = $(C_FRAGS_O2_BASE)
  C_FRAGS_O3 = $(C_FRAGS_O3_BASE)
  C_FRAGS_TEST = $(C_FRAGS_TEST_BASE)
endif







#############################################################################
## ファイルリストとターゲットの設定 (自動処理部分なのでいじってはならない)
## Setting the file list and targets
## ( Don't edit; this is the automatical process )
#############################################################################

# ソースファイルリストの設定 / Source file list
#   Makefileから見た各ソースファイルの相対パスを
#   半角スペースで区切ったリストを取得する。
C_SRCFILE = $(wildcard src/*.c)

# 実行ファイルリストの設定 / Executable file list
#   実行ファイル名(パス部分除く)を取得する。
C_EXEFILE = $(notdir $(C_SRCFILE:.c=))

# -O0オプション付きコンパイル時のターゲット名の設定 / Targets for O0 options
C_EXEFILE_O0 = $(notdir $(C_SRCFILE:.c=.o0))

# -O1オプション付きコンパイル時のターゲット名の設定 / Targets for O1 options
C_EXEFILE_O1 = $(notdir $(C_SRCFILE:.c=.o1))

# -O2オプション付きコンパイル時のターゲット名の設定 / Targets for O2 options
C_EXEFILE_O2 = $(notdir $(C_SRCFILE:.c=.o2))

# -O3オプション付きコンパイル時のターゲット名の設定 / Targets for O3 options
C_EXEFILE_O3 = $(notdir $(C_SRCFILE:.c=.o3))

# テスト用ターゲット名の設定 / Targets for test options
C_EXEFILE_TEST = $(notdir $(C_SRCFILE:.c=.test))






#############################################################################
## -O0オプションによるコンパイル
## Compile with "-O0" option
#############################################################################

# ターゲットO0からターゲットgccO0を呼び出して実行する
O0: gccO0

# ターゲットgccO0の実行
#   変数C_EXEFILEの半角スペースで区切られた個々の要素要素を
#   ターゲットとして順に実行する。
gccO0: $(C_EXEFILE_O0)
$(C_EXEFILE_O0) : $(C_SRCFILE)
	rm -f bin/$(@:.o0=)
	$(C_COMPILER) $(C_FRAGS_O0) src/$(@:.o0=.c) -o bin/$(@:.o0=)
	chmod 755 bin/$(@:.o0=)




#############################################################################
## -O1オプションによるコンパイル
## Compile with "-O1" option
#############################################################################

# ターゲットO1からターゲットgccO1を呼び出して実行する
O1: gccO1

# ターゲットgccO1の実行
#   変数C_EXEFILEの半角スペースで区切られた個々の要素要素を
#   ターゲットとして順に実行する。
gccO1: $(C_EXEFILE_O1)
$(C_EXEFILE_O1) : $(C_SRCFILE)
	rm -f bin/$(@:.o1=)
	$(C_COMPILER) $(C_FRAGS_O1) src/$(@:.o1=.c) -o bin/$(@:.o1=)
	chmod 755 bin/$(@:.o1=)






#############################################################################
## -O2オプションによるコンパイル
## Compile with "-O2" option
#############################################################################

# ターゲットO2からターゲットを呼び出して実行する
O2: gccO2

# ターゲットgccO2の実行
#   変数C_EXEFILEの半角スペースで区切られた個々の要素要素を
#   ターゲットとして順に実行する。
gccO2: $(C_EXEFILE_O2)
$(C_EXEFILE_O2) : $(C_SRCFILE)
	rm -f bin/$(@:.o2=)
	$(C_COMPILER) $(C_FRAGS_O2) src/$(@:.o2=.c) -o bin/$(@:.o2=)
	chmod 755 bin/$(@:.o2=)






#############################################################################
## -O2オプションによるコンパイル
## Compile with "-O2" option
#############################################################################

# ターゲットO3からターゲットgccO3を呼び出して実行する
O3: gccO3

# ターゲットgccO3の実行
#   変数C_EXEFILEの半角スペースで区切られた個々の要素要素を
#   ターゲットとして順に実行する。
gccO3: $(C_EXEFILE_O3)
$(C_EXEFILE_O3) : $(C_SRCFILE)
	rm -f bin/$(@:.o3=)
	$(C_COMPILER) $(C_FRAGS_O3) src/$(@:.o3=.c) -o bin/$(@:.o3=)
	chmod 755 bin/$(@:.o3=)





#############################################################################
## テストコンパイル
## Test compile
#############################################################################

# ターゲットtestからターゲットgcctestを呼び出して実行する
test: gcctest

# ターゲットgcctestの実行
#   変数C_EXEFILEの半角スペースで区切られた個々の要素要素を
#   ターゲットとして順に実行する。
gcctest: $(C_EXEFILE_TEST)
$(C_EXEFILE_TEST) : $(C_SRCFILE)
	rm -f bin/$(@:.test=)
	$(C_COMPILER_TEST) $(C_FRAGS_TEST) src/$(@:.test=.c) -o bin/$(@:.test=)
	chmod 755 bin/$(@:.test=)




#############################################################################
## bin内の全ファイルの削除
## Remove all the files in "bin".
#############################################################################

remove:
	rm -r -f bin
	mkdir bin
	chmod 755 bin

