forked from OlioEngr/jexer
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile.base
243 lines (216 loc) · 8.01 KB
/
Makefile.base
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
# Makefile base template
#
# Version:
# - 1.0.0: add a version comment
# - 1.1.0: add 'help', 'sjar'
# - 1.2.0: add 'apk'
# - 1.2.1: improve 'apk' and add 'android'
# - 1.3.0: add 'man' for man(ual) pages
# - 1.4.0: remove android stuff (not working anyway)
# - 1.5.0: include sources and readme/changelog in jar
# - 1.5.1: include binaries from libs/bin/ into the jar
# Required parameters (the commented out ones are supposed to be per project):
#MAIN = path to main java source to compile
#MORE = path to supplementary needed resources not linked from MAIN
#NAME = name of project (used for jar output file)
#PREFIX = usually /usr/local (where to install the program)
#TEST = path to main test source to compile
#JAR_FLAGS += a list of things to pack, each usually prefixed with "-C bin/"
#SJAR_FLAGS += a list of things to pack, each usually prefixed with "-C src/",
# for *-sources.jar files
#TEST_PARAMS = any parameter to pass to the test runnable when "test-run"
JAVAC = javac
JAVAC_FLAGS += -encoding UTF-8 -d ./bin/ -cp ./src/
JAVA = java
JAVA_FLAGS += -cp ./bin/
JAR = jar
RJAR = java
RJAR_FLAGS += -jar
all: build jar man
help:
@echo "Usual options:"
@echo "=============="
@echo " make : to build the jar file and man pages IF possible"
@echo " make help : to get this help screen"
@echo " make libs : to update the libraries into src/"
@echo " make build : to update the binaries (not the jar)"
@echo " make test : to update the test binaries"
@echo " make build jar : to update the binaries and jar file"
@echo " make sjar : to create the sources jar file"
@echo " make clean : to clean the directory of intermediate files"
@echo " make mrpropre : to clean the directory of all outputs"
@echo " make run : to run the program from the binaries"
@echo " make run-test : to run the test program from the binaries"
@echo " make jrun : to run the program from the jar file"
@echo " make install : to install the application into $$PREFIX"
@echo " make ifman : to make the manual pages (if pandoc is found)"
@echo " make man : to make the manual pages (requires pandoc)"
.PHONY: all clean mrproper mrpropre build run jrun jar sjar resources test-resources install libs ifman man love
bin:
@mkdir -p bin
jar: $(NAME).jar
sjar: $(NAME)-sources.jar
build: resources
@echo Compiling program...
@echo " src/$(MAIN)"
@$(JAVAC) $(JAVAC_FLAGS) "src/$(MAIN).java"
@[ "$(MORE)" = "" ] || for sup in $(MORE); do \
echo " src/$$sup" ;\
$(JAVAC) $(JAVAC_FLAGS) "src/$$sup.java" ; \
done
test: test-resources
@[ -e bin/$(MAIN).class ] || echo You need to build the sources
@[ -e bin/$(MAIN).class ]
@echo Compiling test program...
@[ "$(TEST)" != "" ] || echo No test sources defined.
@[ "$(TEST)" = "" ] || for sup in $(TEST); do \
echo " src/$$sup" ;\
$(JAVAC) $(JAVAC_FLAGS) "src/$$sup.java" ; \
done
clean:
rm -rf bin/
@echo Removing sources taken from libs...
@for lib in libs/*-sources.jar libs/*-sources.patch.jar; do \
if [ "$$lib" != 'libs/*-sources.jar' -a "$$lib" != 'libs/*-sources.patch.jar' ]; then \
basename "$$lib"; \
jar tf "$$lib" | while read -r ln; do \
[ -f "src/$$ln" ] && rm "src/$$ln"; \
done; \
jar tf "$$lib" | tac | while read -r ln; do \
[ -d "src/$$ln" ] && rmdir "src/$$ln" 2>/dev/null || true; \
done; \
fi \
done
mrproper: mrpropre
mrpropre: clean
rm -f $(NAME).jar
rm -f $(NAME)-sources.jar
rm -f $(NAME).apk
rm -f $(NAME)-debug.apk
[ ! -e VERSION ] || rm -f "$(NAME)-`cat VERSION`.jar"
[ ! -e VERSION ] || rm -f "$(NAME)-`cat VERSION`-sources.jar"
love:
@echo " ...not war."
resources: libs
@echo Copying resources into bin/...
@cd src && find . | grep -v '\.java$$' | grep -v '/test/' | while read -r ln; do \
if [ -f "$$ln" ]; then \
dir="`dirname "$$ln"`"; \
mkdir -p "../bin/$$dir" ; \
cp "$$ln" "../bin/$$ln" ; \
fi ; \
done
@cp VERSION bin/
test-resources: resources
@echo Copying test resources into bin/...
@cd src && find . | grep -v '\.java$$' | grep '/test/' | while read -r ln; do \
if [ -f "$$ln" ]; then \
dir="`dirname "$$ln"`"; \
mkdir -p "../bin/$$dir" ; \
cp "$$ln" "../bin/$$ln" ; \
fi ; \
done
libs: bin
@[ -e bin/libs -o ! -d libs ] || echo Extracting sources from libs...
@[ -e bin/libs -o ! -d libs ] || (cd src && for lib in ../libs/*-sources.jar ../libs/*-sources.patch.jar; do \
if [ "$$lib" != '../libs/*-sources.jar' -a "$$lib" != '../libs/*-sources.patch.jar' ]; then \
basename "$$lib"; \
jar xf "$$lib"; \
fi \
done )
@[ ! -d libs ] || touch bin/libs
$(NAME)-sources.jar: libs
@ls *.md >/dev/null || cp VERSION README.md
@echo Making sources JAR file...
@echo > bin/manifest
@[ "$(SJAR_FLAGS)" != "" ] || echo No sources JAR file defined, skipping
@[ "$(SJAR_FLAGS)" = "" ] || echo Creating $(NAME)-sources.jar...
@[ "$(SJAR_FLAGS)" = "" ] || $(JAR) cfm $(NAME)-sources.jar bin/manifest -C ./ *.md $(SJAR_FLAGS)
@[ "$(SJAR_FLAGS)" = "" ] || [ ! -e VERSION ] || echo Copying to "$(NAME)-`cat VERSION`-sources.jar"...
@[ "$(SJAR_FLAGS)" = "" ] || [ ! -e VERSION ] || cp $(NAME)-sources.jar "$(NAME)-`cat VERSION`-sources.jar"
$(NAME).jar: resources
@[ -e bin/$(MAIN).class ] || echo You need to build the sources
@[ -e bin/$(MAIN).class ]
@ls *.md >/dev/null || cp VERSION README.md
@echo "Copying documentation into bin/..."
@cp -r *.md bin/ || cp VERSION bin/no-documentation.md
@[ ! -d libs/bin/ ] || echo "Copying additional binaries from libs/bin/ into bin/..."
@[ ! -d libs/bin/ ] || cp -r libs/bin/* bin/
@echo "Copying sources into bin/..."
@cp -r src/* bin/
@echo "Making jar..."
@echo "Main-Class: `echo "$(MAIN)" | sed 's:/:.:g'`" > bin/manifest
@echo >> bin/manifest
$(JAR) cfm $(NAME).jar bin/manifest -C ./ *.md $(JAR_FLAGS)
@[ ! -e VERSION ] || echo Copying to "$(NAME)-`cat VERSION`.jar"...
@[ ! -e VERSION ] || cp $(NAME).jar "$(NAME)-`cat VERSION`.jar"
run:
@[ -e bin/$(MAIN).class ] || echo You need to build the sources
@[ -e bin/$(MAIN).class ]
@echo Running "$(NAME)"...
$(JAVA) $(JAVA_FLAGS) $(MAIN)
jrun:
@[ -e $(NAME).jar ] || echo You need to build the jar
@[ -e $(NAME).jar ]
@echo Running "$(NAME).jar"...
$(RJAR) $(RJAR_FLAGS) $(NAME).jar
run-test:
@[ "$(TEST)" = "" -o -e "bin/$(TEST).class" ] || echo You need to build the test sources
@[ "$(TEST)" = "" -o -e "bin/$(TEST).class" ]
@echo Running tests for "$(NAME)"...
@[ "$(TEST)" != "" ] || echo No test sources defined.
[ "$(TEST)" = "" ] || ( clear ; $(JAVA) $(JAVA_FLAGS) $(TEST) $(TEST_PARAMS) )
install:
@[ -e $(NAME).jar ] || echo You need to build the jar
@[ -e $(NAME).jar ]
mkdir -p "$(PREFIX)/lib" "$(PREFIX)/bin"
cp $(NAME).jar "$(PREFIX)/lib/"
echo "#!/bin/sh" > "$(PREFIX)/bin/$(NAME)"
echo "$(RJAR) $(RJAR_FLAGS) \"$(PREFIX)/lib/$(NAME).jar\" \"\$$@\"" >> "$(PREFIX)/bin/$(NAME)"
chmod a+rx "$(PREFIX)/bin/$(NAME)"
if [ -e "man/man1/$(NAME).1" ]; then \
cp -r man/ "$(PREFIX)"/share/; \
fi
ifman:
@if pandoc -v >/dev/null 2>&1; then \
make man; \
else \
echo "man pages not generated: "'`'"pandoc' required"; \
fi
man:
@echo Checking for possible manual pages...
@if [ -e README.md ]; then \
echo Sources found for man pages; \
if pandoc -v >/dev/null 2>&1; then \
ls README*.md 2>/dev/null \
| grep 'README\(-..\|\)\.md' \
| while read man; do \
echo " Processing page $$lang..."; \
lang="`echo "$$man" \
| sed 's:README\.md:en:' \
| sed 's:README-\(.*\)\.md:\1:'`"; \
mkdir -p man/"$$lang"/man1; \
( \
echo ".TH \"${NAME}\" 1 `\
date +%Y-%m-%d\
` \"version `cat VERSION`\""; \
echo; \
UNAME="`echo "${NAME}" \
| sed 's:\(.*\):\U\1:g'`"; \
( \
cat "$$man" | head -n1 \
| sed 's:.*(README\(-fr\|\)\.md).*::g'; \
cat "$$man" | tail -n+2; \
) | sed 's:^#\(#.*\):\1:g' \
| sed 's:^\(#.*\):\U\1:g;s:# *'"$$UNAME"':# NAME\n'"${NAME}"' \\- :g' \
| sed 's:--:——:g' \
| pandoc -f markdown -t man | sed 's:——:--:g' ; \
) > man/"$$lang"/man1/"${NAME}.1"; \
done; \
mkdir -p "man/man1"; \
cp man/en/man1/"${NAME}".1 man/man1/; \
else \
echo "man pages generation: pandoc required" >&2; \
false; \
fi; \
fi;