cmake_minimum_required(VERSION 3.0 FATAL_ERROR)

cmake_policy(SET CMP0054 NEW)

set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
message(CMAKE_MODULE_PATH=${CMAKE_MODULE_PATH})

option(BUILD_STATIC_LIBS "Built static libraries" ON)
option(YOCTO_DEPENDENCIES "Use YOCTO depedencies system" OFF)
option(HUNTER_ENABLED "Enable hunter package pulling" OFF)

include("cmake/HunterGate.cmake")
HunterGate(URL
           "https://github.com/ruslo/hunter/archive/v0.18.64.tar.gz"
           SHA1
           "baf9c8cc4f65306f0e442b5419967b4c4c04589a")

project(bmc-webserver CXX C)

include(CTest)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -Wall")

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-rtti")

# general
option(BMCWEB_BUILD_UT "Enable Unit test" ON)

# security flags
SET(
  SECURITY_FLAGS
  "\
    -fstack-protector-strong \
    -fPIE \
    -fPIC \
    -D_FORTIFY_SOURCE=2 \
    -Wformat \
    -Wformat-security"
  )
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${SECURITY_FLAGS}")
SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO
    "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ${SECURITY_FLAGS}")
SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} ${SECURITY_FLAGS}")

# Enable link time optimization This is a temporary workaround because
# INTERPROCEDURAL_OPTIMIZATION isn't available until cmake 3.9. gcc-ar and gcc-
# ranlib are wrappers around ar and ranlib which add the lto plugin to the
# command line.
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
  if(NOT CMAKE_BUILD_TYPE MATCHES Debug)
    STRING(REGEX REPLACE "ar$" "gcc-ar" CMAKE_AR ${CMAKE_AR})
    STRING(REGEX REPLACE "ranlib$" "gcc-ranlib" CMAKE_RANLIB ${CMAKE_RANLIB})
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto -fno-fat-lto-objects")

    # Reduce the binary size by removing unnecessary dynamic symbol table
    # entries
    SET(
      CMAKE_CXX_FLAGS
      "${CMAKE_CXX_FLAGS} \
        -fvisibility=hidden \
        -fvisibility-inlines-hidden \
        -Wl,--exclude-libs,ALL"
      )
  endif(NOT CMAKE_BUILD_TYPE MATCHES Debug)
endif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")

# add_definitions(-DBOOST_ASIO_ENABLE_HANDLER_TRACKING)
add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
add_definitions(-DBOOST_SYSTEM_NO_DEPRECATED)
add_definitions(-DBOOST_ALL_NO_LIB)
add_definitions(-DBOOST_NO_RTTI)
add_definitions(-DBOOST_NO_TYPEID)
# set(Boost_USE_STATIC_LIBS ON)
hunter_add_package(Boost)
find_package(Boost)
include_directories(${Boost_INCLUDE_DIRS})

# Openssl
hunter_add_package(OpenSSL)
find_package(OpenSSL REQUIRED)
include_directories(${OPENSSL_INCLUDE_DIR})
message("OPENSSL_INCLUDE_DIR ${OPENSSL_INCLUDE_DIR}")

# Crow
message("CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}")
if(CMAKE_BUILD_TYPE MATCHES Debug)
  message("Logging disabled")
  add_definitions(-DCROW_ENABLE_LOGGING)
  add_definitions(-DCROW_ENABLE_DEBUG)
endif(CMAKE_BUILD_TYPE MATCHES Debug)

add_definitions(-DCROW_ENABLE_SSL)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/crow/include)

# Zlib
hunter_add_package(ZLIB)
find_package(ZLIB REQUIRED)
include_directories(${ZLIB_INCLUDE_DIRS})

# tinyxml2
if(NOT ${YOCTO_DEPENDENCIES})
  add_subdirectory(tinyxml2)
else()
  find_package(tinyxml2 REQUIRED)
endif()
# PAM
option(WEBSERVER_ENABLE_PAM "enable pam authentication" ON)
if("${WEBSERVER_ENABLE_PAM}")
  find_package(PAM REQUIRED)
else()
  add_definitions("-DWEBSERVER_DISABLE_PAM")
endif()

# Boost-dbus
set(BOOST_DBUS_BUILD_UT ${BMCWEB_BUILD_UT})
if(NOT ${YOCTO_DEPENDENCIES})
  add_subdirectory(boost-dbus)
else()
  find_package(boost-dbus REQUIRED)
endif()
set(WEBSERVER_MAIN src/webserver_main.cpp)

# the webassets file has a non-ideal beahvior, where it loads binary data into a
# std::string due to the way crow is constructed.  This causes GCC warnings.
# Filter them out.
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
  if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.9)
    set_source_files_properties(${CMAKE_BINARY_DIR}/generated/webassets.cpp
                                PROPERTIES
                                COMPILE_FLAGS
                                -Wno-narrowing)
  endif(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.9)
endif()

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/redfish-core/include)

set(SRC_FILES ${GENERATED_SRC_FILES})

file(COPY src/test_resources DESTINATION ${CMAKE_CURRENT_BINARY_DIR})

file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/generated)

# Unit Tests
if(${BMCWEB_BUILD_UT})
  set(UT_FILES
      redfish-core/ut/privileges_test.cpp
      src/crow_test.cpp
      src/gtest_main.cpp
      src/token_authorization_middleware_test.cpp
      src/security_headers_middleware_test.cpp
      src/webassets_test.cpp
      src/crow_getroutes_test.cpp
      src/ast_jpeg_decoder_test.cpp
      src/kvm_websocket_test.cpp
      src/msan_test.cpp
      src/ci_map_tests.cpp
      src/ast_video_puller_test.cpp
      ${CMAKE_BINARY_DIR}/generated/blns.hpp) # big list of naughty strings
  add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/generated/blns.hpp
                     COMMAND
                       xxd -i
                       ${CMAKE_CURRENT_SOURCE_DIR}/src/test_resources/blns
                       ${CMAKE_BINARY_DIR}/generated/blns.hpp)

  set_source_files_properties(${CMAKE_BINARY_DIR}/generated/blns.hpp
                              PROPERTIES
                              GENERATED
                              TRUE) # googletest
  enable_testing()

  hunter_add_package(GTest)
  find_package(GTest REQUIRED) # find_package(GMock CONFIG REQUIRED)

  add_executable(webtest ${SRC_FILES} ${UT_FILES})
  target_link_libraries(webtest gmock gtest)
  target_link_libraries(webtest pthread)
  target_link_libraries(webtest boost-dbus)
  target_link_libraries(webtest ${OPENSSL_LIBRARIES})
  target_link_libraries(webtest ${ZLIB_LIBRARIES})
  target_link_libraries(webtest pam)
  target_link_libraries(webtest tinyxml2)
  target_link_libraries(webtest -lstdc++fs)
  add_test(webtest webtest "--gtest_output=xml:webtest.xml")

endif(${BMCWEB_BUILD_UT})

install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/static/ DESTINATION share/www)

# bmcweb
add_executable(bmcweb ${WEBSERVER_MAIN} ${HDR_FILES} ${SRC_FILES})
target_link_libraries(bmcweb boost-dbus)
target_link_libraries(bmcweb pthread)
target_link_libraries(bmcweb ${OPENSSL_LIBRARIES})
target_link_libraries(bmcweb ${ZLIB_LIBRARIES})
target_link_libraries(bmcweb pam)
target_link_libraries(bmcweb -lsystemd)
target_link_libraries(bmcweb -lstdc++fs)
target_link_libraries(bmcweb tinyxml2)
install(TARGETS bmcweb DESTINATION bin)

add_executable(getvideo src/getvideo_main.cpp)
target_link_libraries(getvideo pthread)

# Visual Studio Code helper this needs to be at the end to make sure all
# includes are handled correctly
include(CMakeExtraGeneratorDetermineCompilerMacrosAndIncludeDirs)
get_property(C_INCLUDE_DIRS
             DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
             PROPERTY INCLUDE_DIRECTORIES)

execute_process(COMMAND
                  python3
                  ${CMAKE_CURRENT_SOURCE_DIR}/scripts/prime_vscode_compile_db.py
                  ${C_INCLUDE_DIRS}
                  ${CMAKE_EXTRA_GENERATOR_C_SYSTEM_INCLUDE_DIRS}
                  ${CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_INCLUDE_DIRS})
