cmake_minimum_required(VERSION 3.18)
project(h5z_ebcc)

if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE Release)
endif()

if(MSVC)
  set(CMAKE_C_FLAGS_RELEASE "/O2")
  set(CMAKE_CXX_FLAGS_RELEASE "/O2")
  set(CMAKE_C_FLAGS_DEBUG "/Od /Zi /DDEBUG")
  set(CMAKE_CXX_FLAGS_DEBUG "/Od /Zi")
else()
  set(CMAKE_C_FLAGS_RELEASE "-O3")
  set(CMAKE_CXX_FLAGS_RELEASE "-O3")
  set(CMAKE_C_FLAGS_DEBUG "-g -O2 -DDEBUG")
  set(CMAKE_CXX_FLAGS_DEBUG "-g -O2")
endif()
set(BUILD_THIRDPARTY True)

option(ENABLE_PERF "Enable Linux perf event collection around compression" OFF)

set(CMAKE_POSITION_INDEPENDENT_CODE True)

if(WIN32)
  # OpenJPEG exposes only the "openjp2" target on Windows; force a static build
  # so EBCC can link it without pulling in the shared variant.
  set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared libraries" FORCE)
  set(BUILD_STATIC_LIBS ON CACHE BOOL "Build static libraries" FORCE)

  # zstd builds both shared and static variants by default; disable the shared
  # target on Windows to avoid unnecessary shared-library build failures.
  set(ZSTD_BUILD_SHARED OFF CACHE BOOL "Build zstd shared libraries" FORCE)
  set(ZSTD_BUILD_STATIC ON CACHE BOOL "Build zstd static libraries" FORCE)
  set(OPENJPEG_LINK_TARGET openjp2)
else()
  set(OPENJPEG_LINK_TARGET openjp2_static)
endif()

add_library(h5z_ebcc SHARED h5z_ebcc.c ebcc_codec.c spiht/spiht_re.c log/log.c)
set_property(TARGET h5z_ebcc PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
if(WIN32)
  target_compile_definitions(h5z_ebcc PRIVATE EBCC_DLL_EXPORTS)
endif()

# Add static EBCC library for Rust bindings
add_library(ebcc STATIC ebcc_codec.c spiht/spiht_re.c log/log.c)

option(ZSTD_BUILD_PROGRAMS "" OFF)
option(BUILD_CODEC "Build OPENJPEG CLI APPS" OFF)
add_subdirectory(zstd/build/cmake zstd)
add_subdirectory(openjpeg)

include_directories(
  ${CMAKE_CURRENT_SOURCE_DIR}/zstd/lib
  ${CMAKE_CURRENT_SOURCE_DIR}/zstd/build/cmake/lib
  ${CMAKE_CURRENT_SOURCE_DIR}/openjpeg/src/lib/openjp2
  ${CMAKE_CURRENT_BINARY_DIR}/openjpeg/src/lib/openjp2
  ${CMAKE_CURRENT_SOURCE_DIR}/spiht
  ${CMAKE_CURRENT_SOURCE_DIR}/log
)

target_link_libraries(h5z_ebcc PRIVATE libzstd_static ${OPENJPEG_LINK_TARGET})
target_link_libraries(ebcc PRIVATE libzstd_static ${OPENJPEG_LINK_TARGET})

if(ENABLE_PERF)
    target_compile_definitions(h5z_ebcc PRIVATE ENABLE_PERF)
    target_compile_definitions(ebcc PRIVATE ENABLE_PERF)
endif()

install(
    TARGETS h5z_ebcc ebcc
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib
)
