Makefile 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. # Copyright 2009 The RE2 Authors. All Rights Reserved.
  2. # Use of this source code is governed by a BSD-style
  3. # license that can be found in the LICENSE file.
  4. # To build against ICU for full Unicode properties support,
  5. # uncomment the next two lines:
  6. # CCICU=$(shell pkg-config icu-uc --cflags) -DRE2_USE_ICU
  7. # LDICU=$(shell pkg-config icu-uc --libs)
  8. # To build against PCRE for testing or benchmarking,
  9. # uncomment the next two lines:
  10. # CCPCRE=-I/usr/local/include -DUSEPCRE
  11. # LDPCRE=-L/usr/local/lib -lpcre
  12. CXX?=g++
  13. # can override
  14. CXXFLAGS?=-O3 -g
  15. LDFLAGS?=
  16. # required
  17. RE2_CXXFLAGS?=-std=c++11 -pthread -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -I. $(CCICU) $(CCPCRE)
  18. RE2_LDFLAGS?=-pthread $(LDICU) $(LDPCRE)
  19. AR?=ar
  20. ARFLAGS?=rsc
  21. NM?=nm
  22. NMFLAGS?=-p
  23. # Variables mandated by GNU, the arbiter of all good taste on the internet.
  24. # http://www.gnu.org/prep/standards/standards.html
  25. prefix=/usr/local
  26. exec_prefix=$(prefix)
  27. includedir=$(prefix)/include
  28. libdir=$(exec_prefix)/lib
  29. INSTALL=install
  30. INSTALL_DATA=$(INSTALL) -m 644
  31. # Work around the weirdness of sed(1) on Darwin. :/
  32. ifeq ($(shell uname),Darwin)
  33. SED_INPLACE=sed -i ''
  34. else ifeq ($(shell uname),SunOS)
  35. SED_INPLACE=sed -i
  36. else
  37. SED_INPLACE=sed -i
  38. endif
  39. # ABI version
  40. # http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
  41. SONAME=9
  42. # To rebuild the Tables generated by Perl and Python scripts (requires Internet
  43. # access for Unicode data), uncomment the following line:
  44. # REBUILD_TABLES=1
  45. # The SunOS linker does not support wildcards. :(
  46. ifeq ($(shell uname),Darwin)
  47. SOEXT=dylib
  48. SOEXTVER=$(SONAME).$(SOEXT)
  49. SOEXTVER00=$(SONAME).0.0.$(SOEXT)
  50. MAKE_SHARED_LIBRARY=$(CXX) -dynamiclib -Wl,-compatibility_version,$(SONAME),-current_version,$(SONAME).0.0,-install_name,$(libdir)/libre2.$(SOEXTVER),-exported_symbols_list,libre2.symbols.darwin $(RE2_LDFLAGS) $(LDFLAGS)
  51. else ifeq ($(shell uname),SunOS)
  52. SOEXT=so
  53. SOEXTVER=$(SOEXT).$(SONAME)
  54. SOEXTVER00=$(SOEXT).$(SONAME).0.0
  55. MAKE_SHARED_LIBRARY=$(CXX) -shared -Wl,-soname,libre2.$(SOEXTVER) $(RE2_LDFLAGS) $(LDFLAGS)
  56. else
  57. SOEXT=so
  58. SOEXTVER=$(SOEXT).$(SONAME)
  59. SOEXTVER00=$(SOEXT).$(SONAME).0.0
  60. MAKE_SHARED_LIBRARY=$(CXX) -shared -Wl,-soname,libre2.$(SOEXTVER),--version-script,libre2.symbols $(RE2_LDFLAGS) $(LDFLAGS)
  61. endif
  62. .PHONY: all
  63. all: obj/libre2.a obj/so/libre2.$(SOEXT)
  64. INSTALL_HFILES=\
  65. re2/filtered_re2.h\
  66. re2/re2.h\
  67. re2/set.h\
  68. re2/stringpiece.h\
  69. HFILES=\
  70. util/benchmark.h\
  71. util/flags.h\
  72. util/logging.h\
  73. util/malloc_counter.h\
  74. util/mix.h\
  75. util/mutex.h\
  76. util/pcre.h\
  77. util/strutil.h\
  78. util/test.h\
  79. util/utf.h\
  80. util/util.h\
  81. re2/bitmap256.h\
  82. re2/filtered_re2.h\
  83. re2/pod_array.h\
  84. re2/prefilter.h\
  85. re2/prefilter_tree.h\
  86. re2/prog.h\
  87. re2/re2.h\
  88. re2/regexp.h\
  89. re2/set.h\
  90. re2/sparse_array.h\
  91. re2/sparse_set.h\
  92. re2/stringpiece.h\
  93. re2/testing/exhaustive_tester.h\
  94. re2/testing/regexp_generator.h\
  95. re2/testing/string_generator.h\
  96. re2/testing/tester.h\
  97. re2/unicode_casefold.h\
  98. re2/unicode_groups.h\
  99. re2/walker-inl.h\
  100. OFILES=\
  101. obj/util/rune.o\
  102. obj/util/strutil.o\
  103. obj/re2/bitstate.o\
  104. obj/re2/compile.o\
  105. obj/re2/dfa.o\
  106. obj/re2/filtered_re2.o\
  107. obj/re2/mimics_pcre.o\
  108. obj/re2/nfa.o\
  109. obj/re2/onepass.o\
  110. obj/re2/parse.o\
  111. obj/re2/perl_groups.o\
  112. obj/re2/prefilter.o\
  113. obj/re2/prefilter_tree.o\
  114. obj/re2/prog.o\
  115. obj/re2/re2.o\
  116. obj/re2/regexp.o\
  117. obj/re2/set.o\
  118. obj/re2/simplify.o\
  119. obj/re2/stringpiece.o\
  120. obj/re2/tostring.o\
  121. obj/re2/unicode_casefold.o\
  122. obj/re2/unicode_groups.o\
  123. TESTOFILES=\
  124. obj/util/pcre.o\
  125. obj/re2/testing/backtrack.o\
  126. obj/re2/testing/dump.o\
  127. obj/re2/testing/exhaustive_tester.o\
  128. obj/re2/testing/null_walker.o\
  129. obj/re2/testing/regexp_generator.o\
  130. obj/re2/testing/string_generator.o\
  131. obj/re2/testing/tester.o\
  132. TESTS=\
  133. obj/test/charclass_test\
  134. obj/test/compile_test\
  135. obj/test/filtered_re2_test\
  136. obj/test/mimics_pcre_test\
  137. obj/test/parse_test\
  138. obj/test/possible_match_test\
  139. obj/test/re2_test\
  140. obj/test/re2_arg_test\
  141. obj/test/regexp_test\
  142. obj/test/required_prefix_test\
  143. obj/test/search_test\
  144. obj/test/set_test\
  145. obj/test/simplify_test\
  146. obj/test/string_generator_test\
  147. BIGTESTS=\
  148. obj/test/dfa_test\
  149. obj/test/exhaustive1_test\
  150. obj/test/exhaustive2_test\
  151. obj/test/exhaustive3_test\
  152. obj/test/exhaustive_test\
  153. obj/test/random_test\
  154. SOFILES=$(patsubst obj/%,obj/so/%,$(OFILES))
  155. # We use TESTOFILES for testing the shared lib, only it is built differently.
  156. STESTS=$(patsubst obj/%,obj/so/%,$(TESTS))
  157. SBIGTESTS=$(patsubst obj/%,obj/so/%,$(BIGTESTS))
  158. DOFILES=$(patsubst obj/%,obj/dbg/%,$(OFILES))
  159. DTESTOFILES=$(patsubst obj/%,obj/dbg/%,$(TESTOFILES))
  160. DTESTS=$(patsubst obj/%,obj/dbg/%,$(TESTS))
  161. DBIGTESTS=$(patsubst obj/%,obj/dbg/%,$(BIGTESTS))
  162. .PRECIOUS: obj/%.o
  163. obj/%.o: %.cc $(HFILES)
  164. @mkdir -p $$(dirname $@)
  165. $(CXX) -c -o $@ $(CPPFLAGS) $(RE2_CXXFLAGS) $(CXXFLAGS) -DNDEBUG $*.cc
  166. .PRECIOUS: obj/dbg/%.o
  167. obj/dbg/%.o: %.cc $(HFILES)
  168. @mkdir -p $$(dirname $@)
  169. $(CXX) -c -o $@ $(CPPFLAGS) $(RE2_CXXFLAGS) $(CXXFLAGS) $*.cc
  170. .PRECIOUS: obj/so/%.o
  171. obj/so/%.o: %.cc $(HFILES)
  172. @mkdir -p $$(dirname $@)
  173. $(CXX) -c -o $@ -fPIC $(CPPFLAGS) $(RE2_CXXFLAGS) $(CXXFLAGS) -DNDEBUG $*.cc
  174. .PRECIOUS: obj/libre2.a
  175. obj/libre2.a: $(OFILES)
  176. @mkdir -p obj
  177. $(AR) $(ARFLAGS) obj/libre2.a $(OFILES)
  178. .PRECIOUS: obj/dbg/libre2.a
  179. obj/dbg/libre2.a: $(DOFILES)
  180. @mkdir -p obj/dbg
  181. $(AR) $(ARFLAGS) obj/dbg/libre2.a $(DOFILES)
  182. .PRECIOUS: obj/so/libre2.$(SOEXT)
  183. obj/so/libre2.$(SOEXT): $(SOFILES) libre2.symbols libre2.symbols.darwin
  184. @mkdir -p obj/so
  185. $(MAKE_SHARED_LIBRARY) -o obj/so/libre2.$(SOEXTVER) $(SOFILES)
  186. ln -sf libre2.$(SOEXTVER) $@
  187. .PRECIOUS: obj/dbg/test/%
  188. obj/dbg/test/%: obj/dbg/libre2.a obj/dbg/re2/testing/%.o $(DTESTOFILES) obj/dbg/util/test.o
  189. @mkdir -p obj/dbg/test
  190. $(CXX) -o $@ obj/dbg/re2/testing/$*.o $(DTESTOFILES) obj/dbg/util/test.o obj/dbg/libre2.a $(RE2_LDFLAGS) $(LDFLAGS)
  191. .PRECIOUS: obj/test/%
  192. obj/test/%: obj/libre2.a obj/re2/testing/%.o $(TESTOFILES) obj/util/test.o
  193. @mkdir -p obj/test
  194. $(CXX) -o $@ obj/re2/testing/$*.o $(TESTOFILES) obj/util/test.o obj/libre2.a $(RE2_LDFLAGS) $(LDFLAGS)
  195. # Test the shared lib, falling back to the static lib for private symbols
  196. .PRECIOUS: obj/so/test/%
  197. obj/so/test/%: obj/so/libre2.$(SOEXT) obj/libre2.a obj/re2/testing/%.o $(TESTOFILES) obj/util/test.o
  198. @mkdir -p obj/so/test
  199. $(CXX) -o $@ obj/re2/testing/$*.o $(TESTOFILES) obj/util/test.o -Lobj/so -lre2 obj/libre2.a $(RE2_LDFLAGS) $(LDFLAGS)
  200. # Filter out dump.o because testing::TempDir() isn't available for it.
  201. obj/test/regexp_benchmark: obj/libre2.a obj/re2/testing/regexp_benchmark.o $(TESTOFILES) obj/util/benchmark.o
  202. @mkdir -p obj/test
  203. $(CXX) -o $@ obj/re2/testing/regexp_benchmark.o $(filter-out obj/re2/testing/dump.o, $(TESTOFILES)) obj/util/benchmark.o obj/libre2.a $(RE2_LDFLAGS) $(LDFLAGS)
  204. # re2_fuzzer is a target for fuzzers like libFuzzer and AFL. This fake fuzzing
  205. # is simply a way to check that the target builds and then to run it against a
  206. # fixed set of inputs. To perform real fuzzing, refer to the documentation for
  207. # libFuzzer (llvm.org/docs/LibFuzzer.html) and AFL (lcamtuf.coredump.cx/afl/).
  208. obj/test/re2_fuzzer: CXXFLAGS:=-I./re2/fuzzing/compiler-rt/include $(CXXFLAGS)
  209. obj/test/re2_fuzzer: obj/libre2.a obj/re2/fuzzing/re2_fuzzer.o obj/util/fuzz.o
  210. @mkdir -p obj/test
  211. $(CXX) -o $@ obj/re2/fuzzing/re2_fuzzer.o obj/util/fuzz.o obj/libre2.a $(RE2_LDFLAGS) $(LDFLAGS)
  212. ifdef REBUILD_TABLES
  213. .PRECIOUS: re2/perl_groups.cc
  214. re2/perl_groups.cc: re2/make_perl_groups.pl
  215. perl $< > $@
  216. .PRECIOUS: re2/unicode_%.cc
  217. re2/unicode_%.cc: re2/make_unicode_%.py
  218. python $< > $@
  219. endif
  220. .PHONY: distclean
  221. distclean: clean
  222. rm -f re2/perl_groups.cc re2/unicode_casefold.cc re2/unicode_groups.cc
  223. .PHONY: clean
  224. clean:
  225. rm -rf obj
  226. rm -f re2/*.pyc
  227. .PHONY: testofiles
  228. testofiles: $(TESTOFILES)
  229. .PHONY: test
  230. test: $(DTESTS) $(TESTS) $(STESTS) debug-test static-test shared-test
  231. .PHONY: debug-test
  232. debug-test: $(DTESTS)
  233. @./runtests $(DTESTS)
  234. .PHONY: static-test
  235. static-test: $(TESTS)
  236. @./runtests $(TESTS)
  237. .PHONY: shared-test
  238. shared-test: $(STESTS)
  239. @./runtests -shared-library-path obj/so $(STESTS)
  240. .PHONY: debug-bigtest
  241. debug-bigtest: $(DTESTS) $(DBIGTESTS)
  242. @./runtests $(DTESTS) $(DBIGTESTS)
  243. .PHONY: static-bigtest
  244. static-bigtest: $(TESTS) $(BIGTESTS)
  245. @./runtests $(TESTS) $(BIGTESTS)
  246. .PHONY: shared-bigtest
  247. shared-bigtest: $(STESTS) $(SBIGTESTS)
  248. @./runtests -shared-library-path obj/so $(STESTS) $(SBIGTESTS)
  249. .PHONY: benchmark
  250. benchmark: obj/test/regexp_benchmark
  251. .PHONY: fuzz
  252. fuzz: obj/test/re2_fuzzer
  253. .PHONY: install
  254. install: static-install shared-install
  255. .PHONY: static
  256. static: obj/libre2.a
  257. .PHONY: static-install
  258. static-install: obj/libre2.a common-install
  259. $(INSTALL) obj/libre2.a $(DESTDIR)$(libdir)/libre2.a
  260. .PHONY: shared
  261. shared: obj/so/libre2.$(SOEXT)
  262. .PHONY: shared-install
  263. shared-install: obj/so/libre2.$(SOEXT) common-install
  264. $(INSTALL) obj/so/libre2.$(SOEXT) $(DESTDIR)$(libdir)/libre2.$(SOEXTVER00)
  265. ln -sf libre2.$(SOEXTVER00) $(DESTDIR)$(libdir)/libre2.$(SOEXTVER)
  266. ln -sf libre2.$(SOEXTVER00) $(DESTDIR)$(libdir)/libre2.$(SOEXT)
  267. .PHONY: common-install
  268. common-install:
  269. mkdir -p $(DESTDIR)$(includedir)/re2 $(DESTDIR)$(libdir)/pkgconfig
  270. $(INSTALL_DATA) $(INSTALL_HFILES) $(DESTDIR)$(includedir)/re2
  271. $(INSTALL_DATA) re2.pc $(DESTDIR)$(libdir)/pkgconfig/re2.pc
  272. $(SED_INPLACE) -e "s#@includedir@#$(includedir)#" $(DESTDIR)$(libdir)/pkgconfig/re2.pc
  273. $(SED_INPLACE) -e "s#@libdir@#$(libdir)#" $(DESTDIR)$(libdir)/pkgconfig/re2.pc
  274. .PHONY: testinstall
  275. testinstall: static-testinstall shared-testinstall
  276. @echo
  277. @echo Install tests passed.
  278. @echo
  279. .PHONY: static-testinstall
  280. static-testinstall: CXXFLAGS:=-std=c++11 -pthread -I$(DESTDIR)$(includedir) $(CXXFLAGS)
  281. static-testinstall: LDFLAGS:=-pthread -L$(DESTDIR)$(libdir) -l:libre2.a $(LDICU) $(LDFLAGS)
  282. static-testinstall:
  283. @mkdir -p obj
  284. @cp testinstall.cc obj
  285. ifeq ($(shell uname),Darwin)
  286. @echo Skipping test for libre2.a on Darwin.
  287. else ifeq ($(shell uname),SunOS)
  288. @echo Skipping test for libre2.a on SunOS.
  289. else
  290. (cd obj && $(CXX) testinstall.cc -o testinstall $(CXXFLAGS) $(LDFLAGS))
  291. obj/testinstall
  292. endif
  293. .PHONY: shared-testinstall
  294. shared-testinstall: CXXFLAGS:=-std=c++11 -pthread -I$(DESTDIR)$(includedir) $(CXXFLAGS)
  295. shared-testinstall: LDFLAGS:=-pthread -L$(DESTDIR)$(libdir) -lre2 $(LDICU) $(LDFLAGS)
  296. shared-testinstall:
  297. @mkdir -p obj
  298. @cp testinstall.cc obj
  299. (cd obj && $(CXX) testinstall.cc -o testinstall $(CXXFLAGS) $(LDFLAGS))
  300. ifeq ($(shell uname),Darwin)
  301. DYLD_LIBRARY_PATH="$(DESTDIR)$(libdir):$(DYLD_LIBRARY_PATH)" obj/testinstall
  302. else
  303. LD_LIBRARY_PATH="$(DESTDIR)$(libdir):$(LD_LIBRARY_PATH)" obj/testinstall
  304. endif
  305. .PHONY: benchlog
  306. benchlog: obj/test/regexp_benchmark
  307. (echo '==BENCHMARK==' `hostname` `date`; \
  308. (uname -a; $(CXX) --version; git rev-parse --short HEAD; file obj/test/regexp_benchmark) | sed 's/^/# /'; \
  309. echo; \
  310. ./obj/test/regexp_benchmark 'PCRE|RE2') | tee -a benchlog.$$(hostname | sed 's/\..*//')
  311. .PHONY: log
  312. log:
  313. $(MAKE) clean
  314. $(MAKE) CXXFLAGS="$(CXXFLAGS) -DLOGGING=1" \
  315. $(filter obj/test/exhaustive%_test,$(BIGTESTS))
  316. echo '#' RE2 exhaustive tests built by make log >re2-exhaustive.txt
  317. echo '#' $$(date) >>re2-exhaustive.txt
  318. obj/test/exhaustive_test |grep -v '^PASS$$' >>re2-exhaustive.txt
  319. obj/test/exhaustive1_test |grep -v '^PASS$$' >>re2-exhaustive.txt
  320. obj/test/exhaustive2_test |grep -v '^PASS$$' >>re2-exhaustive.txt
  321. obj/test/exhaustive3_test |grep -v '^PASS$$' >>re2-exhaustive.txt
  322. $(MAKE) CXXFLAGS="$(CXXFLAGS) -DLOGGING=1" obj/test/search_test
  323. echo '#' RE2 basic search tests built by make $@ >re2-search.txt
  324. echo '#' $$(date) >>re2-search.txt
  325. obj/test/search_test |grep -v '^PASS$$' >>re2-search.txt