add_definitions(-DDUCKDB)

if(NOT MSVC)
  set(CMAKE_CXX_FLAGS_DEBUG
      "${CMAKE_CXX_FLAGS_DEBUG} -Wextra -Wno-unused-parameter -Wno-redundant-move -Wnarrowing"
  )
endif()

# clang-tidy config from presto-cpp set(CMAKE_CXX_CLANG_TIDY clang-tidy
# --checks=*,-abseil-*,-android-*,-cert-err58-cpp,-clang-analyzer-
# osx-*,-cppcoreguidelines-avoid-c-arrays,-cppcoreguidelines-avoid-magic-
# numbers,-cppcoreguidelines-pro-bounds-array-to-pointer-
# decay,-cppcoreguidelines-pro-bounds-pointer-arithmetic,-cppcoreguidelines-pro-
# type-reinterpret-cast,-cppcoreguidelines-pro-type-
# vararg,-fuchsia-*,-google-*,-hicpp-avoid-c-arrays,-hicpp-deprecated-
# headers,-hicpp-no-array-decay,-hicpp-use-equals-default,-hicpp-
# vararg,-llvmlibc-*,-llvm-header-guard,-llvm-include-order,-mpi-*,-misc-non-
# private-member-variables-in-classes,-misc-no-recursion,-misc-unused-
# parameters,-modernize-avoid-c-arrays,-modernize-deprecated-headers,-modernize-
# use-nodiscard,-modernize-use-trailing-return-
# type,-objc-*,-openmp-*,-readability-avoid-const-params-in-decls,-readability-
# convert-member-functions-to-static,-readability-magic-numbers,-zircon-*)

if(AMALGAMATION_BUILD)

  if(WIN32)
    add_definitions(/bigobj)
  endif()

  add_library(duckdb SHARED "${PROJECT_SOURCE_DIR}/src/amalgamation/duckdb.cpp")
  add_library(duckdb_static STATIC
              "${PROJECT_SOURCE_DIR}/src/amalgamation/duckdb.cpp")

  target_link_libraries(duckdb Threads::Threads)
  target_link_libraries(duckdb_static Threads::Threads)

  install(FILES "${PROJECT_SOURCE_DIR}/src/amalgamation/duckdb.hpp"
          DESTINATION "${INSTALL_INCLUDE_DIR}")

else()

  add_subdirectory(optimizer)
  add_subdirectory(planner)
  add_subdirectory(parser)
  add_subdirectory(function)
  add_subdirectory(catalog)
  add_subdirectory(common)
  add_subdirectory(execution)
  add_subdirectory(main)
  add_subdirectory(parallel)
  add_subdirectory(storage)
  add_subdirectory(transaction)

  set(DUCKDB_LINK_LIBS fmt pg_query duckdb_re2 miniz utf8proc Threads::Threads)

  add_library(duckdb SHARED ${ALL_OBJECT_FILES})
  target_link_libraries(duckdb ${DUCKDB_LINK_LIBS})

  add_library(duckdb_static STATIC ${ALL_OBJECT_FILES})
  target_link_libraries(duckdb_static ${DUCKDB_LINK_LIBS})

  target_include_directories(
    duckdb PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
                  $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)

  target_include_directories(
    duckdb_static PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
                         $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)

  install(
    DIRECTORY "${PROJECT_SOURCE_DIR}/src/include/duckdb"
    DESTINATION "${INSTALL_INCLUDE_DIR}"
    FILES_MATCHING
    PATTERN "*.hpp")
  install(FILES "${PROJECT_SOURCE_DIR}/src/include/duckdb.hpp"
                "${PROJECT_SOURCE_DIR}/src/include/duckdb.h"
          DESTINATION "${INSTALL_INCLUDE_DIR}")

endif()

if(BUILD_PYTHON OR BUILD_R)
  if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    set(ALL_COMPILE_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}")
  elseif(CMAKE_BUILD_TYPE STREQUAL "Release")
    set(ALL_COMPILE_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}")
  elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
    set(ALL_COMPILE_FLAGS
        "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
  else()
    set(ALL_COMPILE_FLAGS "${CMAKE_CXX_FLAGS}")
  endif()

  get_target_property(duckdb_libs duckdb LINK_LIBRARIES)

  if(BUILD_PYTHON)
    add_custom_target(
      duckdb_python ALL
      COMMAND python3 setup.py install --binary-dir=${CMAKE_BINARY_DIR}
              --compile-flags=${ALL_COMPILE_FLAGS} --libs="${duckdb_libs}"
      DEPENDS duckdb parquet_extension icu_extension
      WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/tools/pythonpkg
      COMMENT Build
      Python package)
  endif()
  if(BUILD_R)
    add_custom_target(
      duckdb_r ALL
      COMMAND
        DUCKDB_R_BINDIR=${CMAKE_BINARY_DIR}
        DUCKDB_R_CFLAGS=\"${ALL_COMPILE_FLAGS}\"
        DUCKDB_R_LIBS=\"${duckdb_libs}\" R CMD INSTALL .
      DEPENDS duckdb parquet_extension icu_extension
      WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/tools/rpkg
      COMMENT Build
      R package)
  endif()
endif()

install(
  TARGETS duckdb duckdb_static
  EXPORT "${DUCKDB_EXPORT_SET}"
  LIBRARY DESTINATION "${INSTALL_LIB_DIR}"
  ARCHIVE DESTINATION "${INSTALL_LIB_DIR}")
