cmake_minimum_required(VERSION 3.28)

project(whalejs-common VERSION 0.4.0)


###############################################################################
# Dependencies

include(whale)

# NOTE: Update config.cmake.in when changing dependencies.

if (NOT EMSCRIPTEN)
  find_package(Boost REQUIRED CONFIG)
endif()
find_package(dukcpp REQUIRED CONFIG)
find_package(SDL2 CONFIG)
find_package(whale-core)
find_package(whalejs-duktape)


###############################################################################
# whalejs-common

function(whljs_common_target TARGET_NAME TARGET_ALIAS DUKTAPE_TARGET)
  # TODO: Consider supporting both, static and dynamic, library builds.
  add_library(${TARGET_NAME} INTERFACE
    "include/whalejs/duk.h"
    "include/whalejs/duk_doc_gen.h"
    "include/whalejs/duktape_utils.h"
    "include/whalejs/duktape_wrapper.h"
    "include/whalejs/export.h"
    "include/whalejs/module.h"
    "include/whalejs/options.h"
    "include/whalejs/variant_utils.h"
  )

  add_library(${TARGET_ALIAS} ALIAS ${TARGET_NAME})
  
  target_compile_definitions(${TARGET_NAME}
    INTERFACE
      WHL_BUILD_SHARED_LIB
      WHLJS_COMMON_BUILD
      WHL_USE_SMART_POINTERS
  )

  target_include_directories(${TARGET_NAME}
    INTERFACE
      "$<INSTALL_INTERFACE:include>"
      "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
      "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>"
  )

  target_link_libraries(${TARGET_NAME}
    INTERFACE
      whale::core-sp-shared
      ${DUKTAPE_TARGET}
      dukcpp::dukcpp
  )

  if(NOT EMSCRIPTEN)
    target_link_libraries(${TARGET_NAME}
      INTERFACE
        SDL2::SDL2
    )
  endif()

  set_target_properties(${TARGET_NAME}
    PROPERTIES
      PREFIX ""
      IMPORT_PREFIX ""
  )

  target_compile_features(${TARGET_NAME}
    INTERFACE
      cxx_std_23
  )
endfunction()


whljs_common_target(whalejs-common whalejs::common whalejs::duktape)
whljs_common_target(whalejs-common-dbg whalejs::common-dbg whalejs::duktape-dbg)

set(LIBRARY_NAME_EXPORT "WHLJS_COMMON")
configure_file("${WHL_WHALE_CMAKE_DIR}/export.h.in" "include/whalejs/dllexport.h" @ONLY)


###############################################################################
# whalejs-module

include(cmake/whalejs-module.cmake)


###############################################################################
# Install

set(PACKAGE_CONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
set(PACKAGE_TARGETS_NAME "${PROJECT_NAME}-targets")

set_target_properties(whalejs-common
  PROPERTIES
    EXPORT_NAME common
)

set_target_properties(whalejs-common-dbg
  PROPERTIES
    EXPORT_NAME common-dbg
)

install(
  TARGETS whalejs-common whalejs-common-dbg
  EXPORT ${PACKAGE_TARGETS_NAME}
  ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
  LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
  RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
  INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
)

install(
  EXPORT ${PACKAGE_TARGETS_NAME}
  FILE "${PROJECT_NAME}-targets.cmake"
  NAMESPACE whalejs::
  DESTINATION "${PACKAGE_CONFIG_INSTALL_DIR}"
)

install(
  DIRECTORY "include/"
  DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
)

write_basic_package_version_file(
  "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake"
  VERSION ${PROJECT_VERSION}
  COMPATIBILITY AnyNewerVersion
)

configure_package_config_file(
  "${CMAKE_CURRENT_LIST_DIR}/cmake/config.cmake.in"
  "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake"
  INSTALL_DESTINATION "${PACKAGE_CONFIG_INSTALL_DIR}"
)

install(
  FILES
    "${CMAKE_CURRENT_LIST_DIR}/cmake/whalejs-module.cmake"
    "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake"
    "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake"

  DESTINATION
    "${PACKAGE_CONFIG_INSTALL_DIR}"
)
