OSDN Git Service

55cdd31b709ee3c3000f0d6786a85c188c4971cb
[mhash384/mhash384.git] / Makefile
1 SHELL = /bin/bash
2
3 #############################################################################
4 # BUILD OPTIONS
5 #############################################################################
6
7 CPLUSPLUS ?= 0
8 CPU_TYPE  ?= native
9 NO_JAVA   ?= 0
10 NO_PYTHON ?= 0
11
12
13 #############################################################################
14 # CONFIGURATION
15 #############################################################################
16
17 ifdef ARCH
18   CM_FLAGS += $(if $(filter x64,$(ARCH)),-m64,-m32)
19 else
20   ARCH := $(if $(findstring x86_64,$(shell $(CXX) -v 2>&1 | grep "Target:")),x64,x86)
21 endif
22
23 ifeq ($(OS),Windows_NT)
24   OSTYPE := mingw
25   JNIDIR := win32
26   BINEXT := .exe
27   DLLEXT := .dll
28   PYDEXT := .pyd
29   DLLOPT :=
30 else
31   OSTYPE := linux
32   JNIDIR := linux
33   BINEXT :=
34   DLLEXT := .so
35   PYDEXT := .so
36   DLLOPT += -fPIC
37 endif
38
39 ROOT_DIR := $(dir $(realpath $(lastword $(MAKEFILE_LIST))))
40 ISO_DATE := $(shell date "+%Y-%m-%d")
41 CM_FLAGS := -I$(ROOT_DIR)/include
42 RL_FLAGS := -DNDEBUG -O3 -march=$(CPU_TYPE)
43 DB_FLAGS := -g
44 EX_FLAGS := -static
45 SO_FLAGS := -shared $(DLLOPT) -static-libgcc -static-libstdc++
46 PD_FLAGS := --from markdown --to html5 --toc -N --standalone
47
48
49 #############################################################################
50 # CHECKS
51 #############################################################################
52
53 ifneq ($(NO_JAVA),1)
54   ifneq ($(notdir $(realpath $(JAVA_HOME)/include/jni.h)),jni.h)
55     $(error $$(JAVA_HOME)/include/jni.h not found! Please make sure JAVA_HOME is set correctly)
56   endif
57 endif
58
59 ifneq ($(NO_PYTHON),1)
60   ifneq ($(notdir $(realpath $(PYTHON_INC)/Python.h)),Python.h)
61     $(error $$(PYTHON_INC)/Python.h not found! Please make sure PYTHON_INC is set correctly)
62   endif
63 endif
64
65
66 #############################################################################
67 # FILE NAMES
68 #############################################################################
69
70 TXT := $(ROOT_DIR)COPYING.txt
71 DOC := $(ROOT_DIR)README.html 
72
73 ifeq ($(CPLUSPLUS),1)
74   CLI_CXX := g++
75   CLI_SRC := $(wildcard $(ROOT_DIR)/src/*.cpp)
76 else
77   CLI_CXX := gcc
78   CLI_SRC := $(wildcard $(ROOT_DIR)/src/*.c)
79 endif
80
81 CLI_BIN := $(ROOT_DIR)bin/mhash_384.$(ARCH)$(BINEXT)
82 CLI_DBG := $(BIN).dbg
83 CLI_OUT := $(ROOT_DIR)out/mhash_384.$(ISO_DATE).bin-$(OSTYPE)-$(ARCH).tar.gz
84
85 JNI_SRC := $(wildcard $(ROOT_DIR)bindings/Java/native/src/*.cpp)
86 JNI_INC := $(ROOT_DIR)bindings/Java/native/include
87 JNI_BIN := $(ROOT_DIR)bindings/Java/native/bin/MHashJava384.$(ARCH)$(DLLEXT)
88 JNI_JAR := $(ROOT_DIR)bindings/Java/wrapper/out/MHashJava384-Wrapper.jar
89 JNI_GUI := $(ROOT_DIR)bindings/Java/example/out/MHashJava384-Example.jar
90 JNI_OUT := $(ROOT_DIR)out/mhash_384.$(ISO_DATE).java-$(OSTYPE)-$(ARCH).tar.gz
91
92 PYC_SRC := $(wildcard $(ROOT_DIR)bindings/Python/native/src/*.cpp)
93 PYC_LIB := $(ROOT_DIR)bindings/Python/wrapper/MHashPy384_Wrapper.py
94 PYC_PTH := $(ROOT_DIR)bindings/Python/wrapper/mhash.pth
95 PYC_GUI := $(ROOT_DIR)bindings/Python/example/Example.py
96 PYC_BIN := $(ROOT_DIR)bindings/Python/native/bin/MHashPy384_Native.$(ARCH)$(PYDEXT)
97 PYC_OUT := $(ROOT_DIR)out/mhash_384.$(ISO_DATE).python-$(OSTYPE)-$(ARCH).tar.gz
98
99
100 #############################################################################
101 # TARGETS
102 #############################################################################
103
104 TARGETS = $(CLI_OUT)
105
106 ifneq ($(NO_JAVA),1)
107   TARGETS += $(JNI_OUT)
108 endif
109
110 ifneq ($(NO_PYTHON),1)
111   TARGETS += $(PYC_OUT)
112 endif
113
114
115 #############################################################################
116 # MAKE RULES
117 #############################################################################
118
119 .PHONY: all clean
120
121 all: $(TARGETS)
122
123 # -----------------------------------------------
124 # PACKAGE
125 # -----------------------------------------------
126
127 $(CLI_OUT): $(CLI_BIN) $(CLI_DBG) $(DOC) $(TXT)
128         mkdir -p $(dir $@)
129         rm -fv $@
130         tar -czf $@ -C $(dir $(DOC)) $(notdir $(DOC)) -C $(dir $(TXT)) $(notdir $(TXT)) -C $(dir $(CLI_BIN)) $(notdir $(CLI_BIN))
131
132 $(JNI_OUT): $(JNI_BIN) $(JNI_JAR) $(JNI_GUI) $(DOC) $(TXT)
133         mkdir -p $(dir $@)
134         rm -fv $@
135         tar -czf $@ -C $(dir $(DOC)) $(notdir $(DOC)) -C $(dir $(TXT)) $(notdir $(TXT)) -C $(dir $(JNI_BIN)) $(notdir $(JNI_BIN)) -C $(dir $(JNI_JAR)) $(notdir $(JNI_JAR)) -C $(dir $(JNI_GUI)) $(notdir $(JNI_GUI))
136
137 $(PYC_OUT): $(PYC_BIN) $(PYC_LIB) $(PYC_PTH) $(PYC_GUI) $(DOC) $(TXT)
138         mkdir -p $(dir $@)
139         rm -fv $@
140         tar -czf $@ -C $(dir $(DOC)) $(notdir $(DOC)) -C $(dir $(TXT)) $(notdir $(TXT)) -C $(dir $(PYC_BIN)) $(notdir $(PYC_BIN)) -C $(dir $(PYC_LIB)) $(notdir $(PYC_LIB)) -C $(dir $(PYC_PTH)) $(notdir $(PYC_PTH)) -C $(dir $(PYC_GUI)) $(notdir $(PYC_GUI))
141
142 # -----------------------------------------------
143 # COMPILE
144 # -----------------------------------------------
145
146 $(CLI_BIN): $(CLI_SRC)
147         mkdir -p $(dir $@)
148         $(CLI_CXX) $(CM_FLAGS) $(EX_FLAGS) $(RL_FLAGS) -o $@ $^
149         strip -s $@
150
151 $(CLI_DBG): $(CLI_SRC)
152         mkdir -p $(dir $@)
153         $(CLI_CXX) $(CM_FLAGS) $(EX_FLAGS) $(DB_FLAGS) -o $@ $^
154
155 $(JNI_BIN): $(JNI_SRC)
156         mkdir -p $(dir $@)
157         g++ $(CM_FLAGS) $(SO_FLAGS) $(RL_FLAGS) -I$(JNI_INC) -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/$(JNIDIR) -o $@ $^
158         strip -s $@
159
160 $(PYC_BIN): $(PYC_SRC)
161         mkdir -p $(dir $@)
162         g++ $(CM_FLAGS) $(SO_FLAGS) $(RL_FLAGS) -I$(PYTHON_INC) -o $@ $^
163         strip -s $@
164
165 $(JNI_JAR): $(abspath $(dir $(JNI_JAR))/../build.xml)
166         mkdir -p $(dir $@)
167         pushd $(dir $^) && ant clean jar
168
169 $(JNI_GUI): $(abspath $(dir $(JNI_GUI))/../build.xml)
170         mkdir -p $(dir $@)
171         pushd $(dir $^) && ant clean jar
172
173 # -----------------------------------------------
174 # DOCUMENTS
175 # -----------------------------------------------
176
177 %.html: %.md
178         pandoc $(PD_FLAGS) --output $@ $^
179
180 # -----------------------------------------------
181 # CLEAN UP
182 # -----------------------------------------------
183
184 clean:
185         rm -fv $(CLI_BIN) $(CLI_DBG) $(CLI_OUT)
186         rm -fv $(JNI_BIN) $(JNI_JAR) $(JNI_GUI) $(JNI_OUT)
187         rm -fv $(PYC_BIN) $(PYC_OUT)
188         rm -fv $(DOC)
189