# Copyright (c) Intel Corporation, 2019-2024 All Rights Reserved.
project(CimFrameworkAll)
cmake_minimum_required(VERSION 3.15)

include(GNUInstallDirs)

if (CMAKE_TOOLCHAIN_FILE)
  set (USE_TOOLCHAIN "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}")
endif (CMAKE_TOOLCHAIN_FILE)

if (UNIX)
  set (WSMAN_CLIENTT_LIB_NAME wsman_curl_client_transport)
else (UNIX)
  set (WSMAN_CLIENTT_LIB_NAME wsman_win_client_transport)
  set (WSMAN_ARCH -DPACKAGE_ARCHITECTURE=${CMAKE_GENERATOR_PLATFORM})
  set (WSMAN_STATIC_RUNTIME -DMSVC_STATIC_RUNTIME=ON)
endif (UNIX)
if (DEFINED ENV{LIBXML2_INCLUDE_DIR})
  set (WSMAN_LIBXML2_INCLUDE_DIR -DLIBXML2_INCLUDE_DIR=$ENV{LIBXML2_INCLUDE_DIR})
endif (DEFINED ENV{LIBXML2_INCLUDE_DIR})
if (DEFINED ENV{LIBXML2_LIBRARY})
  set (WSMAN_LIBXML2_LIBRARY -DLIBXML2_LIBRARY=$ENV{LIBXML2_LIBRARY})
  get_filename_component (LIBXML2_LIB $ENV{LIBXML2_LIBRARY} DIRECTORY)
  find_library (LIBXML2_LIBRARIES LibXml2 REQUIRED HINTS ${LIBXML2_LIB} NO_DEFAULT_PATH)
  install(
    FILES ${LIBXML2_LIBRARIES}
    DESTINATION ${CMAKE_INSTALL_LIBDIR}
  )
else (DEFINED ENV{LIBXML2_LIBRARY})
  find_package (LibXml2 REQUIRED)
endif (DEFINED ENV{LIBXML2_LIBRARY})

set (WSMAN_LIB_FULL_NAME ${CMAKE_STATIC_LIBRARY_PREFIX}wsman${CMAKE_STATIC_LIBRARY_SUFFIX})
set (WSMAN_CLIENT_LIB_FULL_NAME ${CMAKE_STATIC_LIBRARY_PREFIX}wsman_client${CMAKE_STATIC_LIBRARY_SUFFIX})
set (WSMAN_CLIENTT_LIB_FULL_NAME ${CMAKE_STATIC_LIBRARY_PREFIX}${WSMAN_CLIENTT_LIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX})
set (WSMAN_CLIENTPP_LIB_FULL_NAME ${CMAKE_STATIC_LIBRARY_PREFIX}wsman_clientpp${CMAKE_STATIC_LIBRARY_SUFFIX})

set (WSMAN_LIB ${CMAKE_CURRENT_BINARY_DIR}/openwsman/src/lib/${CMAKE_CFG_INTDIR}/${WSMAN_LIB_FULL_NAME})
set (WSMAN_CLIENT_LIB ${CMAKE_CURRENT_BINARY_DIR}/openwsman/src/lib/${CMAKE_CFG_INTDIR}/${WSMAN_CLIENT_LIB_FULL_NAME})
set (WSMAN_CLIENTT_LIB ${CMAKE_CURRENT_BINARY_DIR}/openwsman/src/lib/${CMAKE_CFG_INTDIR}/${WSMAN_CLIENTT_LIB_FULL_NAME})
set (WSMAN_CLIENTPP_LIB ${CMAKE_CURRENT_BINARY_DIR}/openwsman/src/cpp/${CMAKE_CFG_INTDIR}/${WSMAN_CLIENTPP_LIB_FULL_NAME})

string (REPLACE ";" "|" CMAKE_MODULE_PATH_ALT_SEP "${CMAKE_MODULE_PATH}")
set (WSMAN_MODULE_PATH -DCMAKE_MODULE_PATH=${CMAKE_MODULE_PATH_ALT_SEP})

include (ExternalProject)
externalproject_add (openwsman
  SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/openwsman
  BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/openwsman
  DOWNLOAD_COMMAND ""
  UPDATE_COMMAND ""
  PATCH_COMMAND ""
  TEST_COMMAND ""
  INSTALL_COMMAND ""
  BUILD_BYPRODUCTS
    ${WSMAN_LIB}
    ${WSMAN_CLIENT_LIB}
    ${WSMAN_CLIENTT_LIB}
    ${WSMAN_CLIENTPP_LIB}
  LIST_SEPARATOR | # Use the alternate list separator
  CMAKE_ARGS
    -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
    -DCMAKE_SYSTEM_VERSION=${CMAKE_SYSTEM_VERSION}
    -DBUILD_EXAMPLES=OFF
    -DBUILD_PYTHON=OFF
    -DBUILD_PYTHON3=OFF
    -DBUILD_RUBY=OFF
    -DDISABLE_PLUGINS=ON
    -DBUILD_TESTS=OFF
    -DBUILD_SWIG_PLUGIN=OFF
    -DBUILD_CSHARP=OFF
    -DBUILD_JAVA=OFF
    -DDISABLE_SERVER=ON
    -DBUILD_PERL=OFF
    -DUSE_PAM=OFF
    -DENABLE_EVENTING_SUPPORT=OFF
    -DBUILD_SHARED_LIBS=OFF
    -DBUILD_LIBCIM=OFF
    -DDISABLE_SERVER=ON
    ${WSMAN_MODULE_PATH}
    ${WSMAN_STATIC_RUNTIME}
    ${WSMAN_ARCH}
    ${USE_TOOLCHAIN}
    ${WSMAN_LIBXML2_INCLUDE_DIR}
    ${WSMAN_LIBXML2_LIBRARY}
)

add_library (WSMAN STATIC IMPORTED)
set_target_properties (WSMAN PROPERTIES IMPORTED_LOCATION ${WSMAN_LIB})
add_dependencies (WSMAN openwsman)
add_library (WSMAN_CLIENT STATIC IMPORTED)
set_target_properties (WSMAN_CLIENT PROPERTIES IMPORTED_LOCATION ${WSMAN_CLIENT_LIB})
add_dependencies (WSMAN_CLIENT openwsman)
add_library (WSMAN_CLIENTT STATIC IMPORTED)
set_target_properties (WSMAN_CLIENTT PROPERTIES IMPORTED_LOCATION ${WSMAN_CLIENTT_LIB})
add_dependencies (WSMAN_CLIENTT openwsman)
add_library (WSMAN_CLIENTPP STATIC IMPORTED)
set_target_properties (WSMAN_CLIENTPP PROPERTIES IMPORTED_LOCATION ${WSMAN_CLIENTPP_LIB})
add_dependencies (WSMAN_CLIENTPP openwsman)
list(APPEND OPENWSMAN_INCLUDES ${CMAKE_CURRENT_SOURCE_DIR}/openwsman/include)
list(APPEND OPENWSMAN_INCLUDES ${CMAKE_CURRENT_SOURCE_DIR}/openwsman/src/cpp)
set_target_properties (WSMAN_CLIENTPP PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${OPENWSMAN_INCLUDES}")

if (UNIX)
  find_package (CURL REQUIRED)
  set_target_properties(WSMAN_CLIENTT
    PROPERTIES INTERFACE_LINK_LIBRARIES
    ${CURL_LIBRARIES}
  )
else (UNIX)
  set_target_properties(WSMAN_CLIENTPP
    PROPERTIES INTERFACE_LINK_LIBRARIES
    Rpcrt4.lib
  )
  set_target_properties(WSMAN_CLIENTT
    PROPERTIES INTERFACE_LINK_LIBRARIES
    Crypt32.lib
  )
endif (UNIX)

find_package (Threads REQUIRED)
set_property (TARGET WSMAN
  PROPERTY INTERFACE_LINK_LIBRARIES
  Threads::Threads ${LIBXML2_LIBRARIES}
)

add_subdirectory (CimFrameworkUntyped)
add_subdirectory (CimOpenWsmanClient)
add_subdirectory (CIMFramework)