cmake_minimum_required(VERSION 3.7)

project(util-jni CXX)

get_filename_component(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" ABSOLUTE)
get_filename_component(CMAKE_EXTERNALS "${CMAKE_EXTERNALS}" ABSOLUTE)

include(Util)
include(JNI)

if(BUILD_OPENSUSE)
    require_util()
else()
    find_util()
endif()
require_jni()

#file(GLOB_RECURSE UTIL_JNI_CPP_FILES *.cpp)
#foreach(UTIL_JNI_CPP_FILE ${UTIL_JNI_CPP_FILES})
#    file(RELATIVE_PATH UTIL_JNI_RELATIVE_CPP_FILE ${CMAKE_CURRENT_SOURCE_DIR} ${UTIL_JNI_CPP_FILE}) 
#    message(${UTIL_JNI_RELATIVE_CPP_FILE})
#endforeach()

set(UTIL_JNI_SOURCES
    ${UTIL_JNI_SOURCE_DIR}/cpp/boost/boost_wrap.cpp
    ${UTIL_JNI_SOURCE_DIR}/cpp/boost/filesystem/filesystem_wrap.cpp
    ${UTIL_JNI_SOURCE_DIR}/cpp/boost/logic/logic_wrap.cpp
    ${UTIL_JNI_SOURCE_DIR}/cpp/boost/range/range_wrap.cpp
    ${UTIL_JNI_SOURCE_DIR}/cpp/util/util_wrap.cpp
    ${UTIL_JNI_SOURCE_DIR}/cpp/util/data/data_wrap.cpp
    ${UTIL_JNI_SOURCE_DIR}/cpp/util/data/file/file_wrap.cpp
    ${UTIL_JNI_SOURCE_DIR}/cpp/util/functional/functional_wrap.cpp
    ${UTIL_JNI_SOURCE_DIR}/cpp/util/functional/distance/distance_wrap.cpp) 

# see https://www.boost.org/doc/libs/master/libs/config/doc/html/boost_config/boost_macro_reference.html for BOOST_NO_AUTO_PTR
# see http://www.swig.org/Doc1.3/Java.html#compiling_dynamic for no-strict-aliasing option
set(COMPILE_FLAGS_PROPERTIES "-DBOOST_NO_AUTO_PTR -Wno-maybe-uninitialized -fno-strict-aliasing -Wno-nonnull")

if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6)
    # gnu++14 is now the default standard 
    # see https://gcc.gnu.org/gcc-6/changes.html
    set(COMPILE_FLAGS_PROPERTIES "${COMPILE_FLAGS_PROPERTIES} -std=gnu++14")
endif()

if(CMAKE_CXX_COMPILER_VERSION GREATER_EQUAL 12)
	# The standard library no longer supports std::unary_function and std::binary_function. They were deprecated in C++11 and is removed from C++14.
	# see https://www.boost.org/doc/libs/1_69_0/libs/config/doc/html/boost_config/boost_macro_reference.html
	# gcc 12 warns deprecated-declarations
    set(COMPILE_FLAGS_PROPERTIES "${COMPILE_FLAGS_PROPERTIES} -DBOOST_NO_CXX98_FUNCTION_BASE")
endif()

if(BOOST_VERSION VERSION_LESS 1.67)
    set(COMPILE_FLAGS_PROPERTIES "${COMPILE_FLAGS_PROPERTIES} -Wno-parentheses -Wno-deprecated-declarations")
elseif(BOOST_VERSION VERSION_LESS 1.68)    
    set(COMPILE_FLAGS_PROPERTIES "${COMPILE_FLAGS_PROPERTIES} -Wno-parentheses")
elseif(BOOST_VERSION VERSION_EQUAL 1.74)
    set(COMPILE_FLAGS_PROPERTIES "${COMPILE_FLAGS_PROPERTIES} -DBOOST_ALLOW_DEPRECATED_HEADERS")
endif()

if(COMPILE_FLAGS_PROPERTIES)
    message(STATUS "Util JNI CXX compile flags: ${COMPILE_FLAGS_PROPERTIES}")
    set_source_files_properties(${UTIL_JNI_SOURCES} PROPERTIES COMPILE_FLAGS ${COMPILE_FLAGS_PROPERTIES})
endif()

add_library(util-jni MODULE ${UTIL_JNI_SOURCES})
target_link_libraries(util-jni ${Util_LIBRARY_NAME} ${UTIL_BOOST_PREFIX_LIBRARIES})
if(MSYS)
    set_target_properties(util-jni PROPERTIES LINK_FLAGS "-Wl,--kill-at")
endif()    
if(DEPENDENCIES)
	message(STATUS "Util JNI Dependencies = ${DEPENDENCIES}")
	add_dependencies(util-jni ${DEPENDENCIES})
endif()	

if(UNIX)
    set_target_properties(util-jni PROPERTIES INSTALL_RPATH "$ORIGIN/")
endif()

if(BUILD_OPENSUSE)
    install(TARGETS util-jni 
        	RUNTIME DESTINATION bin
            LIBRARY DESTINATION lib
            ARCHIVE DESTINATION lib)
endif()
