# Copyright (C) 2020, 2021 |Meso|Star> (contact@meso-star.com)
# Copyright (C) 2015, 2016 CNRS
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.

cmake_minimum_required(VERSION 3.1)
project(star-schiff C)
enable_testing()

set(SSCHIFF_SOURCE_DIR ${PROJECT_SOURCE_DIR}/../src)
option(NO_TEST "Disable the test" OFF)

################################################################################
# Check dependencies
################################################################################
find_package(RCMake 0.4 REQUIRED)
find_package(RSys 0.8 REQUIRED)
find_package(StarSP 0.12 REQUIRED)
find_package(Star3D 0.8 REQUIRED)
find_package(OpenMP 1.2 REQUIRED)
find_package(PkgConfig REQUIRED)

# Resolve the absolute paths of the submitted prefix paths. This is required
# by the pkg_check_modules routine to correctly handle the paths listed in
# CMAKE_PREFIX_PATH
set(_prefix_paths ${CMAKE_PREFIX_PATH})
set(CMAKE_PREFIX_PATH)
foreach(_path ${_prefix_paths})
  get_filename_component(_abs_path ${_path} ABSOLUTE)
  list(APPEND CMAKE_PREFIX_PATH ${_abs_path})
endforeach()

set(PKG_CONFIG_USE_CMAKE_PREFIX_PATH 1)
pkg_check_modules(GSL REQUIRED gsl)
find_package(GSL REQUIRED)

include_directories(
  ${RSys_INCLUDE_DIR}
  ${StarSP_INCLUDE_DIR}
  ${Star3D_INCLUDE_DIR}
  ${GSL_INCLUDE_DIRS})

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${RCMAKE_SOURCE_DIR})
include(rcmake)
include(rcmake_runtime)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")

################################################################################
# Configure and define targets
################################################################################
set(VERSION_MAJOR 0)
set(VERSION_MINOR 4)
set(VERSION_PATCH 1)
set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH})

set(SSCHIFF_FILES_SRC
  sschiff_device.c
  sschiff_estimator.c
  sschiff_scattering_angles_distributions.c)
set(SSCHIFF_FILES_INC_API sschiff.h)
set(SSCHIFF_FILES_INC sschiff_device.h)
set(SSCHIFF_FILES_DOC COPYING README.md)

# Prepend each file in the `SSCHIFF_FILES_<SRC|INC>' list by `SSCHIFF_SOURCE_DIR'
rcmake_prepend_path(SSCHIFF_FILES_SRC ${SSCHIFF_SOURCE_DIR})
rcmake_prepend_path(SSCHIFF_FILES_INC_API ${SSCHIFF_SOURCE_DIR})
rcmake_prepend_path(SSCHIFF_FILES_INC ${SSCHIFF_SOURCE_DIR})
rcmake_prepend_path(SSCHIFF_FILES_DOC ${PROJECT_SOURCE_DIR}/../)

add_library(sschiff SHARED ${SSCHIFF_FILES_SRC} ${SSCHIFF_FILES_INC_API} ${SSCHIFF_FILES_INC})
set_target_properties(sschiff PROPERTIES
  DEFINE_SYMBOL SSCHIFF_SHARED_BUILD
  VERSION ${VERSION}
  SOVERSION ${VERSION_MAJOR})

target_link_libraries(sschiff RSys Star3D StarSP ${GSL_LIBRARIES})
if(CMAKE_COMPILER_IS_GNUCC)
  target_link_libraries(sschiff m)
endif()

set_target_properties(sschiff PROPERTIES
  COMPILE_FLAGS ${OpenMP_C_FLAGS}
  COMPILE_DEFINITIONS SSCHIFF_USE_OPENMP)
if(CMAKE_COMPILER_IS_GNUCC)
  set_target_properties(sschiff PROPERTIES LINK_FLAGS ${OpenMP_C_FLAGS})
endif()

rcmake_setup_devel(sschiff StarSchiff ${VERSION} star/sschiff_version.h)

################################################################################
# Add tests
################################################################################
if(NOT NO_TEST)
  function(new_test _name)
    add_executable(${_name} ${SSCHIFF_SOURCE_DIR}/${_name}.c)
    target_link_libraries(${_name} sschiff RSys)
    add_test(${_name} ${_name})
  endfunction(new_test)
  new_test(test_sschiff_device)
  new_test(test_sschiff_estimator_sphere)
  new_test(test_sschiff_estimator_cylinder)
  new_test(test_sschiff_estimator_rhodo)
  rcmake_copy_runtime_libraries(test_sschiff_device)
endif()

################################################################################
# Define output & install directories
################################################################################
install(TARGETS sschiff
  ARCHIVE DESTINATION bin
  LIBRARY DESTINATION lib
  RUNTIME DESTINATION bin)
install(FILES ${SSCHIFF_FILES_INC_API} DESTINATION include/star)
install(FILES ${SSCHIFF_FILES_DOC} DESTINATION share/doc/star-schiff)

