cmake_minimum_required(VERSION 3.7)

project(geofis CXX)

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

include(GeoFIS)
include(FISPro)
include(JNI)
include(CGAL)

if(BUILD_OPENSUSE)
    require_util()
    require_fispro()
    require_cgal()
else()
    find_util()
    find_fispro()
    find_cgal()
    if(BUILD_ZONING)
        if(MINGW)
            find_gdal()
        else()
            require_gdal()
        endif()
    endif()        
endif()
require_jni()

set(GEOFIS_SOURCES 
	cpp/geofis/data/attribute_equality.cpp
	cpp/geofis/data/dataset_attribute_visitor.cpp
	cpp/geofis/data/feature_attribute_visitor.cpp
	cpp/geofis/jni/feature/source/jni_feature_source.cpp
	cpp/geofis/jni/feature/jni_attribute_getter.cpp
	cpp/geofis/jni/feature/jni_feature.cpp
	cpp/geofis/jni/feature/jni_id_getter.cpp
	cpp/geofis/jni/geometry/jni_point.cpp
	cpp/geofis/process/zoning/fusion/fusion_process_impl.cpp
	cpp/geofis/process/zoning/fusion/fusion_process.cpp
	cpp/geofis/process/zoning/merge/merge_process_impl.cpp
	cpp/geofis/process/zoning/merge/merge_process.cpp
	cpp/geofis/process/zoning/neighborhood/neighborhood_process_impl.cpp
	cpp/geofis/process/zoning/neighborhood/neighborhood_process.cpp
	cpp/geofis/process/zoning/voronoi/voronoi_process_impl.cpp
	cpp/geofis/process/zoning/voronoi/voronoi_process.cpp
	cpp/geofis/process/zoning/zoning_process_impl.cpp
	cpp/geofis/process/zoning/zoning_process.cpp)

set(GEOFIS_OGR_SOURCES 
	cpp/geofis/ogr/ogr_data_source.cpp
	cpp/geofis/ogr/ogr_directory_data_source.cpp
	cpp/geofis/ogr/ogr_exception.cpp
	cpp/geofis/ogr/ogr_feature.cpp
	cpp/geofis/ogr/ogr_layer.cpp
	cpp/geofis/ogr/ogr_spatial_reference.cpp)

if(BUILD_ZONING)
    set(GEOFIS_SOURCES ${GEOFIS_SOURCES} ${GEOFIS_OGR_SOURCES})  
endif()

include_directories(include)

# the SWIG %template directive only accepts one parameter substitution, see http://www.swig.org/Doc3.0/CPlusPlus11.html#CPlusPlus11_variadic_templates for BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES preprocessor option
# see https://www.boost.org/doc/libs/master/libs/config/doc/html/boost_config/boost_macro_reference.html
set(COMPILE_FLAGS_PROPERTIES "-DBOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES -DBOOST_NO_AUTO_PTR -Wno-nonnull -Wno-dangling-reference -Wno-maybe-uninitialized")

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.69) OR (BOOST_VERSION VERSION_EQUAL 1.74))
    set(COMPILE_FLAGS_PROPERTIES "${COMPILE_FLAGS_PROPERTIES} -DBOOST_ALLOW_DEPRECATED_HEADERS")
endif()

if(MINGW AND TARGET_32_BITS AND ((BOOST_VERSION VERSION_GREATER 1.72) AND (BOOST_VERSION VERSION_LESS 1.76)))
    # see boost/config/compiler/gcc.hpp
    # if __MINGW32__ BOOST_NO_CXX11_THREAD_LOCAL defined
    # so Boost.Multiprecision and Boost.Math deprecated
    set(COMPILE_FLAGS_PROPERTIES "${COMPILE_FLAGS_PROPERTIES} -DBOOST_MP_DISABLE_DEPRECATE_03_WARNING -DBOOST_MATH_DISABLE_DEPRECATED_03_WARNING")
endif()

if(CGAL_VERSION VERSION_LESS 4.9)
    # warn about catching polymorphic type 'class CGAL::Uncertain_conversion_exception' by value in CGAL/Lazy.h
    # uninitialized warning in CGAL/Arr_dcel_base.h default constructor of Arr_vertex and Arr_face classes
    set(COMPILE_FLAGS_PROPERTIES "${COMPILE_FLAGS_PROPERTIES} -Wno-attributes -Wno-catch-value -Wno-uninitialized")
elseif(CGAL_VERSION VERSION_LESS 4.10)
    set(COMPILE_FLAGS_PROPERTIES "${COMPILE_FLAGS_PROPERTIES} -Wno-catch-value -Wno-uninitialized")
elseif(CGAL_VERSION VERSION_LESS 4.12)
    set(COMPILE_FLAGS_PROPERTIES "${COMPILE_FLAGS_PROPERTIES} -Wno-uninitialized")
endif()

if(COMPILE_FLAGS_PROPERTIES)
    message(STATUS "GeoFIS CXX compile flags: ${COMPILE_FLAGS_PROPERTIES}")
    set_source_files_properties(${GEOFIS_SOURCES} PROPERTIES COMPILE_FLAGS ${COMPILE_FLAGS_PROPERTIES})
endif()

add_library(geofis SHARED ${GEOFIS_SOURCES})
target_link_libraries(geofis ${CGAL_LIBRARIES_NAME} ${CGAL_BOOST_PREFIX_LIBRARIES} ${Util_LIBRARY_NAME} ${UTIL_BOOST_PREFIX_LIBRARIES} ${FISPro_LIBRARY_NAME} ${GEOFIS_BOOST_PREFIX_LIBRARIES} ${GDAL_LIBRARY_NAME} ${MPFR_LIBRARY} ${GMP_LIBRARY})
if(DEPENDENCIES)
	message(STATUS "GeoFIS Native Dependencies = ${DEPENDENCIES}")
	add_dependencies(geofis ${DEPENDENCIES})
endif()

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

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