1# Copyright 2015 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
5# Old enough to support Ubuntu Xenial.
6cmake_minimum_required(VERSION 3.5.1)
7
8project(RE2 CXX)
9include(CMakePackageConfigHelpers)
10include(CTest)
11include(GNUInstallDirs)
12
13# Unlike GCC and upstream Clang, AppleClang still defaults to `-std=c++98`
14# for some reason. Set CMAKE_CXX_STANDARD if we seem to need to set it. :/
15if(APPLE AND NOT CMAKE_CXX_FLAGS MATCHES "-std=" AND NOT CMAKE_CXX_STANDARD)
16  set(CMAKE_CXX_STANDARD 11)
17endif()
18
19option(BUILD_SHARED_LIBS "build shared libraries" OFF)
20option(USEPCRE "use PCRE in tests and benchmarks" OFF)
21
22# CMake seems to have no way to enable/disable testing per subproject,
23# so we provide an option similar to BUILD_TESTING, but just for RE2.
24option(RE2_BUILD_TESTING "enable testing for RE2" ON)
25
26# ABI version
27# http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
28set(SONAME 9)
29
30set(EXTRA_TARGET_LINK_LIBRARIES)
31
32if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
33  if(MSVC_VERSION LESS 1900)
34    message(FATAL_ERROR "you need Visual Studio 2015 or later")
35  endif()
36  if(BUILD_SHARED_LIBS)
37    # See http://www.kitware.com/blog/home/post/939 for details.
38    set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
39  endif()
40  # CMake defaults to /W3, but some users like /W4 (or /Wall) and /WX,
41  # so we disable various warnings that aren't particularly helpful.
42  add_compile_options(/wd4100 /wd4201 /wd4456 /wd4457 /wd4702 /wd4815)
43  # Without a byte order mark (BOM), Visual Studio assumes that the source
44  # file is encoded using the current user code page, so we specify UTF-8.
45  add_compile_options(/utf-8)
46endif()
47
48if(WIN32)
49  add_definitions(-DUNICODE -D_UNICODE -DSTRICT -DNOMINMAX)
50  add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS)
51elseif(UNIX)
52  set(THREADS_PREFER_PTHREAD_FLAG ON)
53  find_package(Threads REQUIRED)
54endif()
55
56if(USEPCRE)
57  add_definitions(-DUSEPCRE)
58  list(APPEND EXTRA_TARGET_LINK_LIBRARIES pcre)
59endif()
60
61set(RE2_SOURCES
62    re2/bitstate.cc
63    re2/compile.cc
64    re2/dfa.cc
65    re2/filtered_re2.cc
66    re2/mimics_pcre.cc
67    re2/nfa.cc
68    re2/onepass.cc
69    re2/parse.cc
70    re2/perl_groups.cc
71    re2/prefilter.cc
72    re2/prefilter_tree.cc
73    re2/prog.cc
74    re2/re2.cc
75    re2/regexp.cc
76    re2/set.cc
77    re2/simplify.cc
78    re2/stringpiece.cc
79    re2/tostring.cc
80    re2/unicode_casefold.cc
81    re2/unicode_groups.cc
82    util/rune.cc
83    util/strutil.cc
84    )
85
86add_library(re2 ${RE2_SOURCES})
87target_include_directories(re2 PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)
88set_target_properties(re2 PROPERTIES SOVERSION ${SONAME} VERSION ${SONAME}.0.0)
89add_library(re2::re2 ALIAS re2)
90
91if(UNIX)
92  target_link_libraries(re2 PUBLIC Threads::Threads)
93endif()
94
95if(RE2_BUILD_TESTING)
96  set(TESTING_SOURCES
97      re2/testing/backtrack.cc
98      re2/testing/dump.cc
99      re2/testing/exhaustive_tester.cc
100      re2/testing/null_walker.cc
101      re2/testing/regexp_generator.cc
102      re2/testing/string_generator.cc
103      re2/testing/tester.cc
104      util/pcre.cc
105      )
106
107  add_library(testing STATIC ${TESTING_SOURCES})
108  target_link_libraries(testing PUBLIC re2)
109
110  set(TEST_TARGETS
111      charclass_test
112      compile_test
113      filtered_re2_test
114      mimics_pcre_test
115      parse_test
116      possible_match_test
117      re2_test
118      re2_arg_test
119      regexp_test
120      required_prefix_test
121      search_test
122      set_test
123      simplify_test
124      string_generator_test
125
126      dfa_test
127      exhaustive1_test
128      exhaustive2_test
129      exhaustive3_test
130      exhaustive_test
131      random_test
132      )
133
134  set(BENCHMARK_TARGETS
135      regexp_benchmark
136      )
137
138  foreach(target ${TEST_TARGETS})
139    add_executable(${target} re2/testing/${target}.cc util/test.cc)
140    target_link_libraries(${target} testing ${EXTRA_TARGET_LINK_LIBRARIES})
141    add_test(NAME ${target} COMMAND ${target})
142  endforeach()
143
144  foreach(target ${BENCHMARK_TARGETS})
145    add_executable(${target} re2/testing/${target}.cc util/benchmark.cc)
146    target_link_libraries(${target} testing ${EXTRA_TARGET_LINK_LIBRARIES})
147  endforeach()
148endif()
149
150set(RE2_HEADERS
151    re2/filtered_re2.h
152    re2/re2.h
153    re2/set.h
154    re2/stringpiece.h
155    )
156
157install(FILES ${RE2_HEADERS}
158        DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/re2)
159install(TARGETS re2 EXPORT re2Targets
160        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
161        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
162        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
163        INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
164install(EXPORT re2Targets
165        DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/re2 NAMESPACE re2::)
166
167configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/re2Config.cmake.in
168                              ${CMAKE_CURRENT_BINARY_DIR}/re2Config.cmake
169                              INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/re2
170                              )
171write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/re2ConfigVersion.cmake
172                                 VERSION ${SONAME}.0.0
173                                 COMPATIBILITY SameMajorVersion
174                                 )
175
176install(FILES ${CMAKE_CURRENT_BINARY_DIR}/re2Config.cmake
177              ${CMAKE_CURRENT_BINARY_DIR}/re2ConfigVersion.cmake
178        DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/re2)
179