# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

include(CheckCXXSymbolExists)

# strnlen, gmtime_r, and localtime_r are POSIX extensions, not strictly ANSI C.
# timegm is a nonstandard extension present on Linux and the BSDs, but missing
# on other systems.
CHECK_CXX_SYMBOL_EXISTS(strnlen "cstring" QUICKSTEP_HAVE_STRNLEN)
CHECK_CXX_SYMBOL_EXISTS(gmtime_r "ctime" QUICKSTEP_HAVE_GMTIME_R)
CHECK_CXX_SYMBOL_EXISTS(localtime_r "ctime" QUICKSTEP_HAVE_LOCALTIME_R)
CHECK_CXX_SYMBOL_EXISTS(timegm "ctime" QUICKSTEP_HAVE_TIMEGM)

if (NOT QUICKSTEP_HAVE_GMTIME_R)
  # Try Windows gmtime_s
  CHECK_CXX_SYMBOL_EXISTS(gmtime_s "ctime" QUICKSTEP_HAVE_GMTIME_S)
endif()

if (NOT (QUICKSTEP_HAVE_GMTIME_R OR QUICKSTEP_HAVE_GMTIME_S))
  message(FATAL_ERROR "Unable to find a reentrant (threadsafe) version of "
                      "gmtime (tried POSIX gmtime_r and Windows gmtime_s).")
endif()

if (NOT QUICKSTEP_HAVE_LOCALTIME_R)
  # Try Windows localtime_s
  CHECK_CXX_SYMBOL_EXISTS(localtime_s "ctime" QUICKSTEP_HAVE_LOCALTIME_S)
endif()

if (NOT (QUICKSTEP_HAVE_LOCALTIME_R OR QUICKSTEP_HAVE_LOCALTIME_S))
  message(FATAL_ERROR "Unable to find a reentrant (threadsafe) version of "
                      "localtime (tried POSIX localtime_r and Windows localtime_s).")
endif()

CHECK_CXX_SYMBOL_EXISTS(setenv "stdlib.h" QUICKSTEP_HAVE_SETENV)
CHECK_CXX_SYMBOL_EXISTS(tzset "time.h" QUICKSTEP_HAVE_TZSET)

configure_file (
  "${CMAKE_CURRENT_SOURCE_DIR}/TypesPortConfig.h.in"
  "${CMAKE_CURRENT_BINARY_DIR}/TypesPortConfig.h"
)

# Declare micro-libs:
add_library(quickstep_types_port_gmtime_r ../../empty_src.cpp gmtime_r.hpp)
add_library(quickstep_types_port_localtime_r ../../empty_src.cpp localtime_r.hpp)
add_library(quickstep_types_port_strnlen ../../empty_src.cpp strnlen.hpp)
add_library(quickstep_types_port_timegm timegm.cpp timegm.hpp)

# Link dependencies:
target_link_libraries(quickstep_types_port_gmtime_r
                      quickstep_utility_Macros)
target_link_libraries(quickstep_types_port_localtime_r
                      quickstep_utility_Macros)
target_link_libraries(quickstep_types_port_timegm
                      quickstep_types_port_gmtime_r
                      quickstep_utility_Macros)

# Module all-in-one library:
add_library(quickstep_types_port ../../empty_src.cpp)
target_link_libraries(quickstep_types_port
                      quickstep_types_port_gmtime_r
                      quickstep_types_port_localtime_r
                      quickstep_types_port_strnlen
                      quickstep_types_port_timegm)

# Tests
add_executable(timegm_unittest "${CMAKE_CURRENT_SOURCE_DIR}/tests/timegm_unittest.cpp")
target_link_libraries(timegm_unittest
                      glog
                      gtest
                      gtest_main
                      quickstep_types_port_timegm)
add_test(timegm_unittest timegm_unittest)

# Benchmarks
if (UNIX)
  add_executable(timegm_benchmark "${CMAKE_CURRENT_SOURCE_DIR}/tests/timegm_benchmark.cpp")
  target_link_libraries(timegm_benchmark
                        ${LIBS}
                        benchmark
                        quickstep_types_port_timegm)
endif()
