# Licensed 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.
#
# Originally import from the Snappy repository with the following license:
#
# Copyright 2008 Google Inc. All Rights Reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
#     * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
#     * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(snappy)

INCLUDE(CheckIncludeFiles)
INCLUDE(CMakePackageConfigHelpers)

CHECK_INCLUDE_FILES("stdint.h" HAVE_STDINT_H)
CHECK_INCLUDE_FILES("stddef.h" HAVE_STDDEF_H)
CHECK_INCLUDE_FILES("sys/uio.h" HAVE_SYS_UIO_H)

if (NOT HAVE_SYS_UIO_H)
  set(HAVE_SYS_UIO_H 0)
endif()

if (NOT HAVE_STDINT_H)
  set(HAVE_STDINT_H 0)
endif()

if (NOT HAVE_STDDEF_H)
  set(HAVE_STDDEF_H 0)
endif()

set(ac_cv_have_stdint_h ${HAVE_STDINT_H})
set(ac_cv_have_stddef_h ${HAVE_STDDEF_H})
set(ac_cv_have_sys_uio_h ${HAVE_SYS_UIO_H})
CONFIGURE_FILE(${snappy_SOURCE_DIR}/snappy-stubs-public.h.in
               snappy-stubs-public.h)

if (WIN32)
  ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
endif()

set(SNAPPY_SRCS snappy.cc
  snappy-c.cc
  snappy-stubs-internal.cc
  snappy-sinksource.cc
  snappy.h
  snappy-c.h
  snappy-sinksource.h
  snappy-stubs-public.h)

add_library(snappy SHARED ${SNAPPY_SRCS})
add_library(snappystatic STATIC ${SNAPPY_SRCS})

TARGET_COMPILE_DEFINITIONS(snappy PRIVATE -DHAVE_CONFIG_H)
TARGET_COMPILE_DEFINITIONS(snappystatic PRIVATE -DHAVE_CONFIG_H)

install(FILES snappy.h
  snappy-c.h
  snappy-sinksource.h
  ${snappy_BINARY_DIR}/snappy-stubs-public.h
  DESTINATION include)

install(TARGETS snappy snappystatic
  RUNTIME DESTINATION bin
  LIBRARY DESTINATION lib
  ARCHIVE DESTINATION lib)
