cmake_minimum_required(VERSION 3.7)

project(util CXX)

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

include(Util)
include(CppUnit)
include(JNI)

if(BUILD_OPENSUSE)
    require_util_boost()
    require_cppunit()
    require_libiconv()
else()
    find_util_boost()
    find_cppunit()
    find_libiconv()
endif()
require_jni()

set(UTIL_SOURCES 
	cpp/boost/assertion_failed.cpp
	cpp/boost/lexical_cast_specializations.cpp
	cpp/boost/filesystem/remove_all.cpp
	cpp/cppunit/specializations.cpp
	cpp/util/convert/convert.cpp
	cpp/util/data/file/data_name_extractor.cpp
	cpp/util/data/file/shared_file_data.cpp
	cpp/util/double/double.cpp
	cpp/util/double/boost_double_comparison.cpp
	cpp/util/file/codecvt/fancier_codecvt.cpp
	cpp/util/file/basic_filebuf.cpp
	cpp/util/file/bom.cpp
	cpp/util/file/file_range.cpp
	cpp/util/jni/array.cpp
	cpp/util/jni/exception.cpp
	cpp/util/jni/jni_iterable.cpp
	cpp/util/jni/jni_iterator.cpp
	cpp/util/jni/jni_list.cpp
	cpp/util/jni/jni_object.cpp
	cpp/util/jni/string_char_array.cpp
	cpp/util/assert.cpp
	cpp/util/terminal.cpp
	cpp/util/type.cpp)

include_directories(include) 

# see https://www.boost.org/doc/libs/master/libs/config/doc/html/boost_config/boost_macro_reference.html
set(COMPILE_FLAGS_PROPERTIES "-DBOOST_NO_AUTO_PTR -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.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 CXX compile flags: ${COMPILE_FLAGS_PROPERTIES}")
    set_source_files_properties(${UTIL_SOURCES} PROPERTIES COMPILE_FLAGS ${COMPILE_FLAGS_PROPERTIES})
endif()

add_library(util SHARED ${UTIL_SOURCES})
target_link_libraries(util ${UTIL_BOOST_PREFIX_LIBRARIES} ${Libiconv_LIBRARY_NAME} ${Libcharset_LIBRARY_NAME})
if(DEPENDENCIES)
	message(STATUS "Util Native Dependencies = ${DEPENDENCIES}")
	add_dependencies(util ${DEPENDENCIES})
endif()	

if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
	set(CMAKE_INSTALL_PREFIX ${UTIL_INSTALL_DIR})
endif()	

install(TARGETS util 
	RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib)
    
install(DIRECTORY include/ DESTINATION include)
