cmake_minimum_required(VERSION 3.15)
project(scattnlay VERSION 2.3)

cmake_host_system_information(RESULT HOSTNAME QUERY HOSTNAME)

message("Build type is: ${CMAKE_BUILD_TYPE}")
message("Host OS System: ${CMAKE_HOST_SYSTEM}")
message("Hostname:  ${HOSTNAME}")
message("CMake version:  ${CMAKE_VERSION}")

# Select flags.
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -g ")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

add_compile_options(-W -Wall -pedantic -Werror)
add_compile_options(-funroll-loops -fstrict-aliasing)


# compiler details
message("  C++ Compiler: ${CMAKE_CXX_COMPILER_ID} "
        "${CMAKE_CXX_COMPILER_VERSION} "
        "${CMAKE_CXX_COMPILER_WRAPPER}")

# installation details
message("  Installation prefix: ${CMAKE_INSTALL_PREFIX}")

# Find Boost
set(BOOSTROOT $ENV{BOOST_DIR})
if (USE_STATIC_LIBRARIES)
    set(Boost_USE_STATIC_LIBS ON)
endif ()
set(Boost_USE_MULTITHREADED OFF)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost)
# Set options
option(ENABLE_MP "Use multiple precision" OFF)
if (Boost_FOUND)
    if (${ENABLE_MP})
        add_compile_options(-DMULTI_PRECISION=100)
    endif ()
    if (Boost_INCLUDE_DIRS)
        if (${Boost_VERSION} VERSION_LESS 1.60.0)
            message(FATAL_ERROR
                    "Found Boost library is too old; required is version 1.60.0 or newer!")
        endif ()
        message("Found Boost include dir: ${Boost_INCLUDE_DIR}")
        message("Found Boost library dir: ${Boost_LIBRARY_DIR}")
        message("Found Boost libraries: ${Boost_LIBRARIES}")
        include_directories(${Boost_INCLUDE_DIRS})
    endif ()
endif()

#Find Python, NumPy and PyBind11
find_package(Python COMPONENTS Interpreter Development)

include_directories(${Python_INCLUDE_DIRS})

message("Python_EXECUTABLE: ${Python_EXECUTABLE}")
message("Python_FOUND: ${Python_FOUND}")
message("Python_VERSION: ${Python_VERSION}")
message("Python_Development_FOUND: ${Python_Development_FOUND}")
message("Python_LIBRARIES: ${Python_LIBRARIES}")
message("Python_INCLUDE_DIRS: ${Python_INCLUDE_DIRS}")

# Ensure that numpy is installed and read its include dir
exec_program(${Python_EXECUTABLE}
        ARGS "-c \"import numpy; print(numpy.get_include())\""
        OUTPUT_VARIABLE NUMPY_INCLUDE_DIR
        RETURN_VALUE NUMPY_NOT_FOUND
        )
if (NUMPY_NOT_FOUND)
    message(FATAL_ERROR "NumPy headers not found")
endif ()

# Ensure that pybind11 is installed and read its include dir
exec_program(${Python_EXECUTABLE}
        ARGS "-c \"import pybind11; print(pybind11.get_include())\""
        OUTPUT_VARIABLE PYBIND11_INCLUDE_DIR
        RETURN_VALUE PYBIND11_NOT_FOUND
        )
if (PYBIND11_NOT_FOUND)
    message(FATAL_ERROR "PyBind11 headers not found")
endif ()

# Determine correct extension suffix
exec_program(${Python_EXECUTABLE}
        ARGS "-c \"import distutils.sysconfig; print(distutils.sysconfig.get_config_var('EXT_SUFFIX'))\""
        OUTPUT_VARIABLE EXT_SUFFIX
        RETURN_VALUE SUFFIX_NOT_FOUND
        )
if (SUFFIX_NOT_FOUND)
    message(FATAL_ERROR "Extension suffix not found")
endif ()

#include_directories(src)
add_subdirectory(src)
add_subdirectory(examples)
#
# Copy all python scripts to the build directory.
#
set(Python_SCRIPTS scattnlay/__init__.py scattnlay/main.py)

foreach (_script ${Python_SCRIPTS})
    configure_file(
            ${PROJECT_SOURCE_DIR}/${_script}
            ${PROJECT_BINARY_DIR}/${_script}
            COPYONLY
    )
endforeach ()

enable_testing()
add_subdirectory(tests)
add_test(NAME BuildExtWithPythonSetupPy
   COMMAND ${Python_EXECUTABLE} setup.py build_ext
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})