1
2	# check CPU and supported optimization flags
3	ifeq ($(UNAME), Linux)
4		ifneq ($(shell cat /proc/cpuinfo | grep sse3 ) , )
5			SSE_CFLAGS = -msse3 -mfpmath=sse
6		else ifneq ($(shell cat /proc/cpuinfo | grep sse2 ) , )
7			SSE_CFLAGS = -msse2 -mfpmath=sse
8		else ifneq ($(shell cat /proc/cpuinfo | grep sse ) , )
9			SSE_CFLAGS = -msse -mfpmath=sse
10			else ifneq ($(shell cat /proc/cpuinfo | grep ARM ) , )
11			ifneq ($(shell cat /proc/cpuinfo | grep ARMv7 ) , )
12				ifneq ($(shell cat /proc/cpuinfo | grep vfpd32 ) , )
13					SSE_CFLAGS = -march=armv7-a -mfpu=vfpv3
14				else ifneq ($(shell cat /proc/cpuinfo | grep vfpv3 ) , )
15					SSE_CFLAGS = -march=armv7-a -mfpu=vfpv3
16				endif
17			else
18				ARMCPU = "YES"
19			endif
20		else
21			SSE_CFLAGS =
22		endif
23	endif
24
25	# set bundle name
26	OLDNAME = MidiKeyBoard
27	OLDEXEC_NAME  = $(shell echo $(OLDNAME) | tr A-Z a-z)
28	NAME = Mamba
29	EXEC_NAME  = $(shell echo $(NAME) | tr A-Z a-z)
30	BUILD_DIR = build
31	VER = 2.2
32
33	LIB_DIR := ../libxputty/libxputty/
34	HEADER_DIR := $(LIB_DIR)include/
35	LOCALIZE_DIR := ../libxputty/xputty/dialogs/
36	PREFIX ?= /usr
37	BIN_DIR ?= $(PREFIX)/bin
38	SHARE_DIR ?= $(PREFIX)/share
39	DESKAPPS_DIR ?= $(SHARE_DIR)/applications
40	PIXMAPS_DIR ?= $(SHARE_DIR)/pixmaps
41	MAN_DIR ?= $(SHARE_DIR)/man/man1
42	LOCAL_DIR ?= $(SHARE_DIR)/locale
43
44	# set compile flags
45	CXXFLAGS += -std=gnu++14 -O2 -D_FORTIFY_SOURCE=2 -Wall -fstack-protector -funroll-loops -ffast-math -fomit-frame-pointer \
46	-fstrength-reduce -fschedule-insns $(SSE_CFLAGS)
47	DEBUG_CXXFLAGS += -g -D DEBUG
48	LDFLAGS += -Wl,-z,noexecstack -Wl,--no-undefined -I./ -I../libxputty/libxputty/include/ \
49	`pkg-config --cflags --libs jack cairo x11 sigc++-2.0 liblo smf fluidsynth` -lm -pthread -lasound \
50	-DVERSION=\"$(VER)\"
51	# invoke build files
52	OBJECTS = $(OLDNAME).cpp $(NAME).cpp XAlsa.cpp XJack.cpp NsmHandler.cpp xkeyboard.c xcustommap.c XSynth.cpp
53	LOCALIZE = $(LOCALIZE_DIR)xfile-dialog.c $(LOCALIZE_DIR)xmessage-dialog.c $(LOCALIZE_DIR)xsavefile-dialoge.c
54	## output style (bash colours)
55	BLUE = "\033[1;34m"
56	RED =  "\033[1;31m"
57	NONE = "\033[0m"
58
59.PHONY : $(HEADER_DIR)*.h all debug nls gettext updatepot po clean install uninstall
60
61all : check $(NAME)
62	@mkdir -p ./$(BUILD_DIR)
63	@mv ./$(EXEC_NAME) ./$(BUILD_DIR)
64	@if [ -f ./$(BUILD_DIR)/$(EXEC_NAME) ]; then echo $(BLUE)"build finish, now run make install"; \
65	else echo $(RED)"sorry, build failed"; fi
66	@echo $(NONE)
67
68debug: CXXFLAGS = $(DEBUG_CXXFLAGS)
69debug: all
70
71nls: LDFLAGS += -DENABLE_NLS -DGETTEXT_PACKAGE=\"$(EXEC_NAME)\" -DLOCAL_DIR=\"$(LOCAL_DIR)\"
72nls: gettext all
73
74    #@localisation
75MSGLANGS=$(notdir $(wildcard po/*po))
76MSGOBJS=$(addprefix locale/,$(MSGLANGS:.po=/LC_MESSAGES/$(EXEC_NAME).mo))
77LANGS=$(addprefix locale/,$(MSGLANGS:.po=/LC_MESSAGES/))
78LANGW=$(words  $(MSGLANGS))
79
80gettext: $(MSGOBJS)
81
82locale/%/LC_MESSAGES/$(EXEC_NAME).mo: po/%.po
83	mkdir -p $(dir $@)
84	msgfmt -c -o $@ po/$*.po
85
86updatepot:
87	@mkdir -p ./po/
88	xgettext --keyword=_ --language=C++ --add-comments --sort-output --package-name=$(EXEC_NAME) --package-version=$(VER) -o po/$(EXEC_NAME).pot $(OBJECTS) $(LOCALIZE)
89	for POFILE in $(MSGLANGS) ; do msgmerge --update po/$$POFILE po/$(EXEC_NAME).pot ; done
90
91po:
92	msginit --input=po/$(EXEC_NAME).pot --locale=$(LANG) --output=po/$(basename $(LANG)).po
93	echo $(LANG)
94
95check :
96ifdef ARMCPU
97	@echo $(RED)ARM CPU DEDECTED, please check the optimization flags
98	@echo $(NONE)
99endif
100
101clean :
102	@rm -f ./$(BUILD_DIR)/$(EXEC_NAME)
103	@rm -rf ./$(BUILD_DIR)
104	@echo ". ." $(BLUE)", clean up"$(NONE)
105
106install :
107ifneq ("$(wildcard ./$(BUILD_DIR))","")
108	mkdir -p $(DESTDIR)$(BIN_DIR)
109	cp ./$(BUILD_DIR)/$(EXEC_NAME) $(DESTDIR)$(BIN_DIR)/$(EXEC_NAME)
110	mkdir -p $(DESTDIR)$(DESKAPPS_DIR)
111	cp $(NAME).desktop $(DESTDIR)$(DESKAPPS_DIR)
112	mkdir -p $(DESTDIR)$(PIXMAPS_DIR)
113	cp $(NAME).svg $(DESTDIR)$(PIXMAPS_DIR)
114	@if [ ${LANGW} -gt 1 ]; then \
115		for lang in $(LANGS) ; \
116		do \
117			if [ -f $$lang/$(EXEC_NAME).mo ]; then \
118				mkdir -p $(DESTDIR)$(SHARE_DIR)/$$lang; \
119				cp $$lang/$(EXEC_NAME).mo $(DESTDIR)$(SHARE_DIR)/$$lang; \
120			fi \
121		done \
122	elif [ ${LANGW} -gt 0 ]; then \
123			if [ -f $(LANGS)/$(EXEC_NAME).mo ]; then \
124				mkdir -p $(DESTDIR)$(SHARE_DIR)/$(LANGS); \
125				cp $(LANGS)/$(EXEC_NAME).mo $(DESTDIR)$(SHARE_DIR)/$(LANGS); \
126			fi \
127	fi
128	update-desktop-database || true
129	@echo ". ." $(BLUE)", done"$(NONE)
130else
131	@echo ". ." $(BLUE)", you must build first"$(NONE)
132endif
133
134uninstall :
135	@rm -rf $(DESTDIR)$(BIN_DIR)/$(EXEC_NAME)
136	@rm -rf $(DESTDIR)$(DESKAPPS_DIR)/$(NAME).desktop
137	@rm -rf $(DESTDIR)$(PIXMAPS_DIR)/$(NAME).svg
138	@rm -rf $(DESTDIR)$(PIXMAPS_DIR)/$(NAME).png
139	@rm -rf $(addprefix $(SHARE_DIR)/, $(MSGOBJS))
140	@echo ". ." $(BLUE)", done"$(NONE)
141
142$(NAME) :
143	$(CXX) $(CXXFLAGS) $(OBJECTS) -L. ../libxputty/libxputty/libxputty.a -o $(EXEC_NAME) $(LDFLAGS)
144
145doc:
146	#pass
147