cmake_minimum_required(VERSION 3.2)

if(NOT DEFINED REPO_ROOT_PATH)
  get_filename_component(REPO_ROOT_PATH ".." ABSOLUTE)
  message(STATUS "== REPO_ROOT_PATH=${REPO_ROOT_PATH}")
endif()
if(NOT IS_DIRECTORY ${REPO_ROOT_PATH})
  message(FATAL_ERROR "== REPO_ROOT_PATH=${REPO_ROOT_PATH} is not a Directory")
endif()

# The jni_wrapper.dll and libjnietk_wrapper.so must be positioned in the same directory to use the same java.library.path value in Gradle scripts
# TODO: The below statement is not suffisient because on Windows (MSVC) the DLL will be in a subdirectory "Release"
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})

# Set internal variable JAVA_HOME depending on environment variable JAVA_HOME or common java directories
if(DEFINED       ENV{JAVA_HOME})
  set(JAVA_HOME $ENV{JAVA_HOME})
  message(STATUS "== Detected environment variable JAVA_HOME=${JAVA_HOME}")
elseif(IS_DIRECTORY /usr/lib/jvm/default/)
  set(JAVA_HOME     /usr/lib/jvm/default)
  message(STATUS "== Detected path /usr/lib/jvm/default => JAVA_HOME=${JAVA_HOME}")
elseif(IS_DIRECTORY /usr/lib/jvm/default-java/)
  set(JAVA_HOME     /usr/lib/jvm/default-java)
  message(STATUS "== Detected path /usr/lib/jvm/default-java => JAVA_HOME=${JAVA_HOME}")
else()
  message(FATAL_ERROR "== Cannot find either JAVA_HOME or /usr/lib/jvm/default or /usr/lib/jvm/default-java (required to include jni.h)")
endif()

# Set the path to #include <jni.h>
include_directories(SYSTEM "${JAVA_HOME}/include")
if(MSVC)
  include_directories(SYSTEM "${JAVA_HOME}/include/win32")
  message(STATUS "== Detected MSVC => Include '${JAVA_HOME}/include/win32'")
else()
  include_directories(SYSTEM "${JAVA_HOME}/include/linux")
  message(STATUS "== No MSVC => Include '${JAVA_HOME}/include/linux'")
endif()

add_subdirectory(${REPO_ROOT_PATH}/src)

# The C++ file 'wrapper.cc' is generated by swig in the directory 'build'
add_library(jni_wrapper SHARED ${CMAKE_BINARY_DIR}/../src/main/cpp/wrapper.cc)
target_link_libraries(jni_wrapper cpp)
