# 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.

cmake_minimum_required(VERSION 3.5)

project(cpp-@ADD_EXAMPLE_NAME@ LANGUAGES CXX)

set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/../../cmake)
set(CMAKE_CXX_STANDARD 11)

find_package(@PRODUCT_NAME_NOSPACE@ REQUIRED COMPONENTS cpp)

add_executable(${PROJECT_NAME} @ADD_EXAMPLE_SOURCE@)

if(WIN32)
set(SCRIPT_EXTENSION ps1)
else()
set(SCRIPT_EXTENSION sh)
endif()

file(GLOB SERVER_SCRIPTS
  "${CMAKE_CURRENT_SOURCE_DIR}/*${SCRIPT_EXTENSION}"
)

file(INSTALL ${SERVER_SCRIPTS}
  DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
  FILE_PERMISSIONS OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
)

configure_file("README.md" ${CMAKE_CURRENT_BINARY_DIR} COPYONLY)

target_link_libraries(${PROJECT_NAME}
    PUBLIC
    @PRODUCT_NAME_NOSPACE@::cpp)

if(WIN32)
  add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy
      $<SHELL_PATH:$<TARGET_FILE_DIR:@PRODUCT_NAME_NOSPACE@::cpp>/../bin/@PRODUCT_LIB_NAME@.dll>
      $<SHELL_PATH:$<TARGET_FILE_DIR:${PROJECT_NAME}>>
  )
endif()
