# Copyright (c) 2018 Cisco and/or its affiliates.
# 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.

##############################################################################
# Generate vpp/app/version.h
##############################################################################
add_custom_command(
  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/app/version.h
  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
  COMMAND mkdir
  ARGS -p ${CMAKE_CURRENT_BINARY_DIR}/app
  COMMAND scripts/generate_version_h
  ARGS ${CMAKE_CURRENT_BINARY_DIR}/app/version.h
  COMMENT "Generating VPP version.h"
)

add_custom_target(vpp_version_h
  DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/app/version.h
)

install(
  FILES ${CMAKE_CURRENT_BINARY_DIR}/app/version.h
  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/vpp/app
  COMPONENT vpp-dev
)

##############################################################################
# vpp binary
##############################################################################
option(VPP_API_TEST_BUILTIN "Use builtin VPP API test." ON)

configure_file(
  ${CMAKE_SOURCE_DIR}/vpp/vnet/config.h.in
  ${CMAKE_CURRENT_BINARY_DIR}/vnet/config.h
)

install(
  FILES ${CMAKE_CURRENT_BINARY_DIR}/vnet/config.h
  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/vpp/vnet
  COMPONENT vpp-dev
)

set(VPP_API_FILES
  api/vpe_types.api
  api/vpe.api
)

vpp_add_api_files(vpp core vpp ${VPP_API_FILES})

foreach(file ${VPP_API_FILES})
  get_filename_component(dir ${file} DIRECTORY)
  install(
    FILES ${CMAKE_CURRENT_BINARY_DIR}/${file}.h
    ${CMAKE_CURRENT_BINARY_DIR}/${file}_enum.h
    ${CMAKE_CURRENT_BINARY_DIR}/${file}_types.h
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/vpp/${dir}
    COMPONENT vpp-dev
  )
endforeach()

set(VPP_SOURCES
  vnet/main.c
  app/vpe_cli.c
  app/version.c
  api/api.c
  api/json_format.c
  api/types.c
)

if(VPP_API_TEST_BUILTIN)
  list(APPEND VPP_SOURCES
    api/api_format.c
    api/api_main.c
    api/plugin.c
    api/types.c
  )
  add_definitions(-DVPP_API_TEST_BUILTIN=1)
endif()

add_vpp_executable(vpp
  ENABLE_EXPORTS
  SOURCES ${VPP_SOURCES}
  LINK_LIBRARIES svm vlib vppinfra vlibmemory vnet Threads::Threads ${CMAKE_DL_LIBS} ${EPOLL_LIB}
  DEPENDS vpp_version_h api_headers
)

##############################################################################
# vppctl binary
##############################################################################
add_vpp_executable(vppctl
  SOURCES app/vppctl.c
  LINK_LIBRARIES vppinfra ${EPOLL_LIB}
)

##############################################################################
# vpp_get_metrics binary
##############################################################################
add_vpp_executable(vpp_get_metrics
  SOURCES api/vpp_get_metrics.c
  LINK_LIBRARIES vppinfra svm svmdb
  DEPENDS api_headers
)

##############################################################################
# stats binaries
##############################################################################
add_vpp_executable(vpp_get_stats
  SOURCES app/vpp_get_stats.c
  LINK_LIBRARIES vppapiclient vppinfra
  DEPENDS api_headers
)

add_vpp_executable(vpp_prometheus_export
  SOURCES app/vpp_prometheus_export.c
  LINK_LIBRARIES vppapiclient vppinfra svm vlibmemoryclient ${EPOLL_LIB}
  DEPENDS api_headers
)

##############################################################################
# vppmem_preload library
##############################################################################
add_vpp_library(vppmem_preload
  SOURCES mem/mem.c
  LINK_LIBRARIES vppinfra
)

install(FILES conf/startup.conf DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/vpp COMPONENT vpp)
install(FILES conf/80-vpp.conf DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/sysctl.d COMPONENT vpp)

##############################################################################
# VAT2 plugins
##############################################################################
add_vpp_test_library(vpp
  ${VPP_API_FILES}
)

add_vat_test_library(vpp
  api/api_test.c
)

##############################################################################
# minimal interactive startup.conf  - only if not present
##############################################################################
if(NOT EXISTS ${CMAKE_BINARY_DIR}/startup.conf)
  configure_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/conf/startup.conf.in
    ${CMAKE_BINARY_DIR}/startup.conf
  )
endif()
