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