2
0

Makefile 12 KB

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