# Copyright 2015 The RE2 Authors.  All Rights Reserved. Use of this source code
# is governed by a BSD-style license that can be found in the LICENSE file.

# Old enough to support Ubuntu Trusty.
cmake_minimum_required(VERSION 2.8.12)

if(POLICY CMP0048)
  cmake_policy(SET CMP0048 NEW)
endif()

project(RE2 CXX)
cmake_policy(SET CMP0063 NEW)
set(CMAKE_CXX_VISIBILITY_PRESET hidden)

include(CTest)

option(BUILD_SHARED_LIBS "build shared libraries" OFF)
option(USEPCRE "use PCRE in tests and benchmarks" OFF)

# CMake seems to have no way to enable/disable testing per subproject, so we
# provide an option similar to BUILD_TESTING, but just for RE2.
option(RE2_BUILD_TESTING "enable testing for RE2" OFF)

set(EXTRA_TARGET_LINK_LIBRARIES)

if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  if(MSVC_VERSION LESS 1900)
    message(FATAL_ERROR "you need Visual Studio 2015 or later")
  endif()
  if(BUILD_SHARED_LIBS)
    # See http://www.kitware.com/blog/home/post/939 for details.
    cmake_minimum_required(VERSION 3.4)
    set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
  endif()
  # CMake defaults to /W3, but some users like /W4 (or /Wall) and /WX, so we
  # disable various warnings that aren't particularly helpful.
  add_compile_options(/wd4100
                      /wd4201
                      /wd4456
                      /wd4457
                      /wd4702
                      /wd4815)
  # Without a byte order mark (BOM), Visual Studio assumes that the source file
  # is encoded using the current user code page, so we specify UTF-8.
  add_compile_options(/utf-8)
elseif(CYGWIN OR MINGW)
  # See https://stackoverflow.com/questions/38139631 for details.
  add_compile_options(-std=gnu++11)
elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
  add_compile_options(-std=c++11)
endif()

if(WIN32)
  add_definitions(-DUNICODE
                  -D_UNICODE
                  -DSTRICT
                  -DNOMINMAX)
  add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS)
elseif(UNIX)
  add_compile_options(-pthread)
  list(APPEND EXTRA_TARGET_LINK_LIBRARIES -pthread)
endif()

if(USEPCRE)
  add_definitions(-DUSEPCRE)
  list(APPEND EXTRA_TARGET_LINK_LIBRARIES pcre)
endif()

include_directories(${CMAKE_CURRENT_SOURCE_DIR})

set(RE2_SOURCES
    re2/bitstate.cc
    re2/compile.cc
    re2/dfa.cc
    re2/filtered_re2.cc
    re2/mimics_pcre.cc
    re2/nfa.cc
    re2/onepass.cc
    re2/parse.cc
    re2/perl_groups.cc
    re2/prefilter.cc
    re2/prefilter_tree.cc
    re2/prog.cc
    re2/re2.cc
    re2/regexp.cc
    re2/set.cc
    re2/simplify.cc
    re2/stringpiece.cc
    re2/tostring.cc
    re2/unicode_casefold.cc
    re2/unicode_groups.cc
    util/rune.cc
    util/strutil.cc)

add_library(re2 STATIC ${RE2_SOURCES})
add_library(re2::re2 ALIAS re2)

# if(RE2_BUILD_TESTING) set(TESTING_SOURCES re2/testing/backtrack.cc
# re2/testing/dump.cc re2/testing/exhaustive_tester.cc
# re2/testing/null_walker.cc re2/testing/regexp_generator.cc
# re2/testing/string_generator.cc re2/testing/tester.cc util/pcre.cc )
#
# add_library(testing STATIC ${TESTING_SOURCES})
#
# set(TEST_TARGETS charclass_test compile_test filtered_re2_test
# mimics_pcre_test parse_test possible_match_test re2_test re2_arg_test
# regexp_test required_prefix_test search_test set_test simplify_test
# string_generator_test
#
# dfa_test exhaustive1_test exhaustive2_test exhaustive3_test exhaustive_test
# random_test )
#
# set(BENCHMARK_TARGETS regexp_benchmark )
#
# foreach(target ${TEST_TARGETS}) add_executable(${target}
# re2/testing/${target}.cc util/test.cc) target_link_libraries(${target} testing
# re2 ${EXTRA_TARGET_LINK_LIBRARIES}) add_test(NAME ${target} COMMAND ${target})
# endforeach(target)
#
# foreach(target ${BENCHMARK_TARGETS}) add_executable(${target}
# re2/testing/${target}.cc util/benchmark.cc) target_link_libraries(${target}
# testing re2 ${EXTRA_TARGET_LINK_LIBRARIES}) endforeach(target) endif()
#
# set(RE2_HEADERS re2/filtered_re2.h re2/re2.h re2/set.h re2/stringpiece.h )
#
# install(FILES ${RE2_HEADERS} DESTINATION include/re2) install(TARGETS re2
# EXPORT re2Config ARCHIVE DESTINATION lib LIBRARY DESTINATION lib RUNTIME
# DESTINATION bin INCLUDES DESTINATION include) install(EXPORT re2Config
# DESTINATION lib/cmake/re2 NAMESPACE re2::)
