Blob


1 # See LICENSE file for copyright and license details
2 # libgrapheme - unicode string library
3 .POSIX:
4 .SUFFIXES:
6 VERSION_MAJOR = 2
7 VERSION_MINOR = 0
8 VERSION_PATCH = 2
9 UNICODE_VERSION = 15.0.0
10 MAN_DATE = 2022-10-06
12 include config.mk
14 VERSION = $(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH)
16 BENCHMARK =\
17 benchmark/case\
18 benchmark/character\
19 benchmark/sentence\
20 benchmark/line\
21 benchmark/utf8-decode\
22 benchmark/word\
24 DATA =\
25 data/DerivedCoreProperties.txt\
26 data/EastAsianWidth.txt\
27 data/emoji-data.txt\
28 data/GraphemeBreakProperty.txt\
29 data/GraphemeBreakTest.txt\
30 data/LICENSE\
31 data/LineBreak.txt\
32 data/LineBreakTest.txt\
33 data/SentenceBreakProperty.txt\
34 data/SentenceBreakTest.txt\
35 data/SpecialCasing.txt\
36 data/UnicodeData.txt\
37 data/WordBreakProperty.txt\
38 data/WordBreakTest.txt\
40 GEN =\
41 gen/case\
42 gen/character\
43 gen/character-test\
44 gen/line\
45 gen/line-test\
46 gen/sentence\
47 gen/sentence-test\
48 gen/word\
49 gen/word-test\
51 SRC =\
52 src/case\
53 src/character\
54 src/line\
55 src/sentence\
56 src/utf8\
57 src/util\
58 src/word\
60 TEST =\
61 test/case\
62 test/character\
63 test/line\
64 test/sentence\
65 test/utf8-decode\
66 test/utf8-encode\
67 test/word\
69 MAN_TEMPLATE =\
70 man/template/is_case.sh\
71 man/template/next_break.sh\
72 man/template/to_case.sh\
74 MAN3 =\
75 man/grapheme_decode_utf8\
76 man/grapheme_encode_utf8\
77 man/grapheme_is_character_break\
78 man/grapheme_is_uppercase\
79 man/grapheme_is_uppercase_utf8\
80 man/grapheme_is_lowercase\
81 man/grapheme_is_lowercase_utf8\
82 man/grapheme_is_titlecase\
83 man/grapheme_is_titlecase_utf8\
84 man/grapheme_next_character_break\
85 man/grapheme_next_line_break\
86 man/grapheme_next_sentence_break\
87 man/grapheme_next_word_break\
88 man/grapheme_next_character_break_utf8\
89 man/grapheme_next_line_break_utf8\
90 man/grapheme_next_sentence_break_utf8\
91 man/grapheme_next_word_break_utf8\
92 man/grapheme_to_uppercase\
93 man/grapheme_to_uppercase_utf8\
94 man/grapheme_to_lowercase\
95 man/grapheme_to_lowercase_utf8\
96 man/grapheme_to_titlecase\
97 man/grapheme_to_titlecase_utf8\
99 MAN7 =\
100 man/libgrapheme\
102 all: data/LICENSE $(MAN3:=.3) $(MAN7:=.7) libgrapheme.a $(SONAME)
104 data/DerivedCoreProperties.txt:
105 wget -O $@ https://www.unicode.org/Public/$(UNICODE_VERSION)/ucd/DerivedCoreProperties.txt
107 data/EastAsianWidth.txt:
108 wget -O $@ https://www.unicode.org/Public/$(UNICODE_VERSION)/ucd/EastAsianWidth.txt
110 data/emoji-data.txt:
111 wget -O $@ https://www.unicode.org/Public/$(UNICODE_VERSION)/ucd/emoji/emoji-data.txt
113 data/GraphemeBreakProperty.txt:
114 wget -O $@ https://www.unicode.org/Public/$(UNICODE_VERSION)/ucd/auxiliary/GraphemeBreakProperty.txt
116 data/GraphemeBreakTest.txt:
117 wget -O $@ https://www.unicode.org/Public/$(UNICODE_VERSION)/ucd/auxiliary/GraphemeBreakTest.txt
119 data/LICENSE:
120 wget -O $@ https://www.unicode.org/license.txt
122 data/LineBreak.txt:
123 wget -O $@ https://www.unicode.org/Public/$(UNICODE_VERSION)/ucd/LineBreak.txt
125 data/LineBreakTest.txt:
126 wget -O $@ https://www.unicode.org/Public/$(UNICODE_VERSION)/ucd/auxiliary/LineBreakTest.txt
128 data/SentenceBreakProperty.txt:
129 wget -O $@ https://www.unicode.org/Public/$(UNICODE_VERSION)/ucd/auxiliary/SentenceBreakProperty.txt
131 data/SentenceBreakTest.txt:
132 wget -O $@ https://www.unicode.org/Public/$(UNICODE_VERSION)/ucd/auxiliary/SentenceBreakTest.txt
134 data/SpecialCasing.txt:
135 wget -O $@ https://www.unicode.org/Public/$(UNICODE_VERSION)/ucd/SpecialCasing.txt
137 data/UnicodeData.txt:
138 wget -O $@ https://www.unicode.org/Public/$(UNICODE_VERSION)/ucd/UnicodeData.txt
140 data/WordBreakProperty.txt:
141 wget -O $@ https://www.unicode.org/Public/$(UNICODE_VERSION)/ucd/auxiliary/WordBreakProperty.txt
143 data/WordBreakTest.txt:
144 wget -O $@ https://www.unicode.org/Public/$(UNICODE_VERSION)/ucd/auxiliary/WordBreakTest.txt
146 benchmark/case.o: benchmark/case.c Makefile config.mk gen/word-test.h grapheme.h benchmark/util.h
147 benchmark/character.o: benchmark/character.c Makefile config.mk gen/character-test.h grapheme.h benchmark/util.h
148 benchmark/line.o: benchmark/line.c Makefile config.mk gen/line-test.h grapheme.h benchmark/util.h
149 benchmark/utf8-decode.o: benchmark/utf8-decode.c Makefile config.mk gen/character-test.h grapheme.h benchmark/util.h
150 benchmark/sentence.o: benchmark/sentence.c Makefile config.mk gen/sentence-test.h grapheme.h benchmark/util.h
151 benchmark/util.o: benchmark/util.c Makefile config.mk benchmark/util.h
152 benchmark/word.o: benchmark/word.c Makefile config.mk gen/word-test.h grapheme.h benchmark/util.h
153 gen/case.o: gen/case.c Makefile config.mk gen/util.h
154 gen/character.o: gen/character.c Makefile config.mk gen/util.h
155 gen/character-test.o: gen/character-test.c Makefile config.mk gen/util.h
156 gen/line.o: gen/line.c Makefile config.mk gen/util.h
157 gen/line-test.o: gen/line-test.c Makefile config.mk gen/util.h
158 gen/sentence.o: gen/sentence.c Makefile config.mk gen/util.h
159 gen/sentence-test.o: gen/sentence-test.c Makefile config.mk gen/util.h
160 gen/word.o: gen/word.c Makefile config.mk gen/util.h
161 gen/word-test.o: gen/word-test.c Makefile config.mk gen/util.h
162 gen/util.o: gen/util.c Makefile config.mk gen/util.h
163 src/case.o: src/case.c Makefile config.mk gen/case.h grapheme.h src/util.h
164 src/character.o: src/character.c Makefile config.mk gen/character.h grapheme.h src/util.h
165 src/line.o: src/line.c Makefile config.mk gen/line.h grapheme.h src/util.h
166 src/sentence.o: src/sentence.c Makefile config.mk gen/sentence.h grapheme.h src/util.h
167 src/utf8.o: src/utf8.c Makefile config.mk grapheme.h
168 src/util.o: src/util.c Makefile config.mk gen/types.h grapheme.h src/util.h
169 src/word.o: src/word.c Makefile config.mk gen/word.h grapheme.h src/util.h
170 test/case.o: test/case.c Makefile config.mk grapheme.h test/util.h
171 test/character.o: test/character.c Makefile config.mk gen/character-test.h grapheme.h test/util.h
172 test/line.o: test/line.c Makefile config.mk gen/line-test.h grapheme.h test/util.h
173 test/sentence.o: test/sentence.c Makefile config.mk gen/sentence-test.h grapheme.h test/util.h
174 test/utf8-encode.o: test/utf8-encode.c Makefile config.mk grapheme.h test/util.h
175 test/utf8-decode.o: test/utf8-decode.c Makefile config.mk grapheme.h test/util.h
176 test/util.o: test/util.c Makefile config.mk test/util.h
177 test/word.o: test/word.c Makefile config.mk gen/word-test.h grapheme.h test/util.h
179 benchmark/case: benchmark/case.o benchmark/util.o libgrapheme.a
180 benchmark/character: benchmark/character.o benchmark/util.o libgrapheme.a
181 benchmark/line: benchmark/line.o benchmark/util.o libgrapheme.a
182 benchmark/sentence: benchmark/sentence.o benchmark/util.o libgrapheme.a
183 benchmark/utf8-decode: benchmark/utf8-decode.o benchmark/util.o libgrapheme.a
184 benchmark/word: benchmark/word.o benchmark/util.o libgrapheme.a
185 gen/case: gen/case.o gen/util.o
186 gen/character: gen/character.o gen/util.o
187 gen/character-test: gen/character-test.o gen/util.o
188 gen/line: gen/line.o gen/util.o
189 gen/line-test: gen/line-test.o gen/util.o
190 gen/sentence: gen/sentence.o gen/util.o
191 gen/sentence-test: gen/sentence-test.o gen/util.o
192 gen/word: gen/word.o gen/util.o
193 gen/word-test: gen/word-test.o gen/util.o
194 test/case: test/case.o test/util.o libgrapheme.a
195 test/character: test/character.o test/util.o libgrapheme.a
196 test/line: test/line.o test/util.o libgrapheme.a
197 test/sentence: test/sentence.o test/util.o libgrapheme.a
198 test/utf8-encode: test/utf8-encode.o test/util.o libgrapheme.a
199 test/utf8-decode: test/utf8-decode.o test/util.o libgrapheme.a
200 test/word: test/word.o test/util.o libgrapheme.a
202 gen/case.h: data/DerivedCoreProperties.txt data/UnicodeData.txt data/SpecialCasing.txt gen/case
203 gen/character.h: data/emoji-data.txt data/GraphemeBreakProperty.txt gen/character
204 gen/character-test.h: data/GraphemeBreakTest.txt gen/character-test
205 gen/line.h: data/emoji-data.txt data/EastAsianWidth.txt data/LineBreak.txt gen/line
206 gen/line-test.h: data/LineBreakTest.txt gen/line-test
207 gen/sentence.h: data/SentenceBreakProperty.txt gen/sentence
208 gen/sentence-test.h: data/SentenceBreakTest.txt gen/sentence-test
209 gen/word.h: data/WordBreakProperty.txt gen/word
210 gen/word-test.h: data/WordBreakTest.txt gen/word-test
212 man/grapheme_is_character_break.3: man/grapheme_is_character_break.sh Makefile config.mk
213 man/grapheme_is_uppercase.3: man/grapheme_is_uppercase.sh man/template/is_case.sh Makefile config.mk
214 man/grapheme_is_uppercase_utf8.3: man/grapheme_is_uppercase_utf8.sh man/template/is_case.sh Makefile config.mk
215 man/grapheme_is_lowercase.3: man/grapheme_is_lowercase.sh man/template/is_case.sh Makefile config.mk
216 man/grapheme_is_lowercase_utf8.3: man/grapheme_is_lowercase_utf8.sh man/template/is_case.sh Makefile config.mk
217 man/grapheme_is_titlecase.3: man/grapheme_is_titlecase.sh man/template/is_case.sh Makefile config.mk
218 man/grapheme_is_titlecase_utf8.3: man/grapheme_is_titlecase_utf8.sh man/template/is_case.sh Makefile config.mk
219 man/grapheme_next_character_break.3: man/grapheme_next_character_break.sh man/template/next_break.sh Makefile config.mk
220 man/grapheme_next_line_break.3: man/grapheme_next_line_break.sh man/template/next_break.sh Makefile config.mk
221 man/grapheme_next_sentence_break.3: man/grapheme_next_sentence_break.sh man/template/next_break.sh Makefile config.mk
222 man/grapheme_next_word_break.3: man/grapheme_next_word_break.sh man/template/next_break.sh Makefile config.mk
223 man/grapheme_next_character_break_utf8.3: man/grapheme_next_character_break_utf8.sh man/template/next_break.sh Makefile config.mk
224 man/grapheme_next_line_break_utf8.3: man/grapheme_next_line_break_utf8.sh man/template/next_break.sh Makefile config.mk
225 man/grapheme_next_sentence_break_utf8.3: man/grapheme_next_sentence_break_utf8.sh man/template/next_break.sh Makefile config.mk
226 man/grapheme_next_word_break_utf8.3: man/grapheme_next_word_break_utf8.sh man/template/next_break.sh Makefile config.mk
227 man/grapheme_to_uppercase.3: man/grapheme_to_uppercase.sh man/template/to_case.sh Makefile config.mk
228 man/grapheme_to_lowercase.3: man/grapheme_to_lowercase.sh man/template/to_case.sh Makefile config.mk
229 man/grapheme_to_titlecase.3: man/grapheme_to_titlecase.sh man/template/to_case.sh Makefile config.mk
230 man/grapheme_to_uppercase_utf8.3: man/grapheme_to_uppercase_utf8.sh man/template/to_case.sh Makefile config.mk
231 man/grapheme_to_lowercase_utf8.3: man/grapheme_to_lowercase_utf8.sh man/template/to_case.sh Makefile config.mk
232 man/grapheme_to_titlecase_utf8.3: man/grapheme_to_titlecase_utf8.sh man/template/to_case.sh Makefile config.mk
233 man/grapheme_decode_utf8.3: man/grapheme_decode_utf8.sh Makefile config.mk
234 man/grapheme_encode_utf8.3: man/grapheme_encode_utf8.sh Makefile config.mk
236 man/libgrapheme.7: man/libgrapheme.sh Makefile config.mk
238 $(GEN:=.o) gen/util.o:
239 $(BUILD_CC) -c -o $@ $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) $(@:.o=.c)
241 $(BENCHMARK:=.o) benchmark/util.o $(TEST:=.o) test/util.o:
242 $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(@:.o=.c)
244 $(SRC:=.o):
245 $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(SHFLAGS) $(@:.o=.c)
247 $(BENCHMARK):
248 $(CC) -o $@ $(LDFLAGS) $@.o benchmark/util.o libgrapheme.a -lutf8proc
250 $(GEN):
251 $(BUILD_CC) -o $@ $(BUILD_LDFLAGS) $@.o gen/util.o
253 $(TEST):
254 $(CC) -o $@ $(LDFLAGS) $@.o test/util.o libgrapheme.a
256 $(GEN:=.h):
257 $(@:.h=) > $@
259 libgrapheme.a: $(SRC:=.o)
260 $(AR) -rc $@ $?
261 $(RANLIB) $@
263 $(SONAME): $(SRC:=.o)
264 $(CC) -o $@ $(SOFLAGS) $(LDFLAGS) $(SRC:=.o)
266 $(MAN3:=.3):
267 SH="$(SH)" MAN_DATE="$(MAN_DATE)" UNICODE_VERSION="$(UNICODE_VERSION)" $(SH) $(@:.3=.sh) > $@
269 $(MAN7:=.7):
270 SH="$(SH)" MAN_DATE="$(MAN_DATE)" UNICODE_VERSION="$(UNICODE_VERSION)" $(SH) $(@:.7=.sh) > $@
272 benchmark: $(BENCHMARK)
273 for m in $(BENCHMARK); do ./$$m; done
275 test: $(TEST)
276 for m in $(TEST); do ./$$m; done
278 install: all
279 mkdir -p "$(DESTDIR)$(LIBPREFIX)"
280 mkdir -p "$(DESTDIR)$(INCPREFIX)"
281 mkdir -p "$(DESTDIR)$(MANPREFIX)/man3"
282 mkdir -p "$(DESTDIR)$(MANPREFIX)/man7"
283 cp -f $(MAN3:=.3) "$(DESTDIR)$(MANPREFIX)/man3"
284 cp -f $(MAN7:=.7) "$(DESTDIR)$(MANPREFIX)/man7"
285 cp -f libgrapheme.a "$(DESTDIR)$(LIBPREFIX)"
286 cp -f $(SONAME) "$(DESTDIR)$(LIBPREFIX)/$(SONAME)"
287 if [ "$(SOSYMLINK)" = "true" ]; then i=0; while [ "$$i" -le $(VERSION_MINOR) ]; do ln -sf "$(SONAME)" "$(DESTDIR)$(LIBPREFIX)/libgrapheme.so.$(VERSION_MAJOR).$$i"; i=$$((i+1)); done; fi
288 if [ "$(SOSYMLINK)" = "true" ]; then ln -sf "$(SONAME)" "$(DESTDIR)$(LIBPREFIX)/libgrapheme.so.$(VERSION_MAJOR)"; fi
289 if [ "$(SOSYMLINK)" = "true" ]; then ln -sf "$(SONAME)" "$(DESTDIR)$(LIBPREFIX)/libgrapheme.so"; fi
290 cp -f grapheme.h "$(DESTDIR)$(INCPREFIX)"
291 if ! [ -z "$(LDCONFIG)" ]; then $(SHELL) -c "$(LDCONFIG)"; fi
292 if ! [ -z "$(PCPREFIX)" ]; then mkdir -p "$(DESTDIR)$(PCPREFIX)"; printf "Name: libgrapheme\nDescription: Unicode string library\nURL: https://libs.suckless.org/libgrapheme/\nVersion: $(VERSION)\nCflags: -I$(INCPREFIX)\nLibs: -L$(LIBPREFIX) -lgrapheme\n" > "$(DESTDIR)$(PCPREFIX)/libgrapheme.pc"; fi
294 uninstall:
295 for m in $(MAN3:=.3); do rm -f "$(DESTDIR)$(MANPREFIX)/man3/`basename $$m`"; done
296 for m in $(MAN7:=.7); do rm -f "$(DESTDIR)$(MANPREFIX)/man7/`basename $$m`"; done
297 rm -f "$(DESTDIR)$(LIBPREFIX)/libgrapheme.a"
298 rm -f "$(DESTDIR)$(LIBPREFIX)/$(SONAME)"
299 if [ "$(SOSYMLINK)" = "true" ]; then i=0; while [ "$$i" -le $(VERSION_MINOR) ]; do rm -f "$(DESTDIR)$(LIBPREFIX)/libgrapheme.so.$(VERSION_MAJOR).$$i"; i=$$((i+1)); done; fi
300 if [ "$(SOSYMLINK)" = "true" ]; then rm -f "$(DESTDIR)$(LIBPREFIX)/libgrapheme.so.$(VERSION_MAJOR)"; fi
301 if [ "$(SOSYMLINK)" = "true" ]; then rm -f "$(DESTDIR)$(LIBPREFIX)/libgrapheme.so"; fi
302 rm -f "$(DESTDIR)$(INCPREFIX)/grapheme.h"
303 if ! [ -z "$(LDCONFIG)" ]; then $(SHELL) -c "$(LDCONFIG)"; fi
304 if ! [ -z "$(PCPREFIX)" ]; then rm -f "$(DESTDIR)$(PCPREFIX)/libgrapheme.pc"; fi
306 clean:
307 rm -f $(BENCHMARK:=.o) benchmark/util.o $(BENCHMARK) $(GEN:=.h) $(GEN:=.o) gen/util.o $(GEN) $(SRC:=.o) src/util.o $(TEST:=.o) test/util.o $(TEST) libgrapheme.a $(SONAME) $(MAN3:=.3) $(MAN7:=.7)
309 clean-data:
310 rm -f $(DATA)
312 dist:
313 rm -rf "libgrapheme-$(VERSION)"
314 mkdir "libgrapheme-$(VERSION)"
315 for m in benchmark data gen man man/template src test; do mkdir "libgrapheme-$(VERSION)/$$m"; done
316 cp config.mk configure grapheme.h LICENSE Makefile README "libgrapheme-$(VERSION)"
317 cp $(BENCHMARK:=.c) benchmark/util.c benchmark/util.h "libgrapheme-$(VERSION)/benchmark"
318 cp $(DATA) "libgrapheme-$(VERSION)/data"
319 cp $(GEN:=.c) gen/util.c gen/types.h gen/util.h "libgrapheme-$(VERSION)/gen"
320 cp $(MAN3:=.sh) $(MAN7:=.sh) "libgrapheme-$(VERSION)/man"
321 cp $(MAN_TEMPLATE) "libgrapheme-$(VERSION)/man/template"
322 cp $(SRC:=.c) src/util.h "libgrapheme-$(VERSION)/src"
323 cp $(TEST:=.c) test/util.c test/util.h "libgrapheme-$(VERSION)/test"
324 tar -cf - "libgrapheme-$(VERSION)" | gzip -c > "libgrapheme-$(VERSION).tar.gz"
325 rm -rf "libgrapheme-$(VERSION)"
327 .PHONY: all benchmark test install uninstall clean clean-data dist