# -*- mode: cmake -*-
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (C) 2022 CASA project
#
# This library is free software; you can redistribute it and/or modify it
# under the terms of the GNU Library General Public License as published by
# the Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
#
# This library 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 Library General Public
# License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
#
# Correspondence concerning CASA should be addressed as follows:
#        Internet email: casa-feedback@nrao.edu.

## Set general cmake configuration

# Minimum cmake required version
cmake_minimum_required(VERSION 3.12)

execute_process(COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/../../scripts/version
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    OUTPUT_VARIABLE CASACPP_VERSION)
string(REGEX MATCH "([0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+)" CASACPP_VERSION ${CASACPP_VERSION})
message("CASACPP version: " ${CASACPP_VERSION})

project(
  casacpp
  VERSION ${CASACPP_VERSION}
  DESCRIPTION "CASA C++ libraries"
  HOMEPAGE_URL https://casa.nrao.edu/
  LANGUAGES CXX Fortran C)

# Add directory with additional macros
set (CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
set(CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} -ldl")

include(DeclareCasacppComponent)
include(GNUInstallDirs)
include(CheckCXXCompilerFlag)
include(FindPkgConfig)
include(CTest)

# Set a default build type if none was specified
set(default_build_type "RelWithDebInfo")
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
  message(STATUS "Setting build type to '${default_build_type}' as none was specified.")
  set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE
    STRING "Choose the type of build." FORCE)
endif()

set(CMAKE_CXX_STANDARD 14)

message (STATUS "CMAKE_CXX_STANDARD ${CMAKE_CXX_STANDARD}")

set(CMAKE_CXX_STANDARD_REQUIRED ON)

## Set definitions global to the whole project
add_definitions(-DCASACORE_NEEDS_RETHROW)
add_definitions(-DAIPS_DEBUG)

## Check for dependencies

# casacore dependency
pkg_check_modules(CASACORE REQUIRED IMPORTED_TARGET casacore)

# Find BISON, FLEX
find_package(BISON REQUIRED)
find_package(FLEX REQUIRED)

# protobuf/grpc dependency
find_package(Protobuf REQUIRED)
find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin)
# Try to detect GRPC using native cmake support (for distributions like Fedora or source compilation)
find_package(gRPC QUIET)
# If that fails, try detecting GRPC with pkgconfig (for distributions like Ubuntu, Rocky Linux)
if(NOT DEFINED gRPC_FOUND OR gRPC_FOUND EQUAL 0)
  pkg_check_modules(GRPC REQUIRED IMPORTED_TARGET grpc++)
  set(gRPC_USES_FIND_PACKAGE OFF)
else()
  set(gRPC_USES_FIND_PACKAGE ON)
endif()
add_definitions(-DUSE_GRPC)

# GSL dependency
find_package(GSL REQUIRED)

# LIBXML dependecy
pkg_check_modules(LibXML REQUIRED IMPORTED_TARGET libxml-2.0)

# LIBXSLT dependecy
pkg_check_modules(XSLT REQUIRED IMPORTED_TARGET libxslt)

# CFITSIO dependecy
pkg_check_modules(CFITSIO REQUIRED IMPORTED_TARGET cfitsio)

# FFTW dependency
pkg_search_module(FFTW REQUIRED IMPORTED_TARGET fftw3)
pkg_search_module(FFTWF REQUIRED IMPORTED_TARGET fftw3f)
find_library(FFTW_DOUBLE_THREADS_LIB
             NAMES "fftw3_threads"
             PATHS ${PKG_FFTW_LIBRARY_DIRSOOO} REQUIRED)
find_library(FFTW_FLOAT_THREADS_LIB
             NAMES "fftw3f_threads"
             PATHS ${PKG_FFTWF_LIBRARY_DIRS} REQUIRED)

# sqllite3 dependency
find_package(SQLite3 REQUIRED)

# SAKURA dependency
pkg_check_modules(SAKURA REQUIRED IMPORTED_TARGET libsakura)

# HPG dependency
find_package(hpg CONFIG PATHS /opt/nrao.edu/hpg/ )
if(DEFINED hpg_FOUND AND ${hpg_FOUND})
  message("USE_HPG set. ")
  add_definitions(-DUSE_HPG)
endif()

# OpenMP dependency
find_package(OpenMP)

# Find MPI compiler
find_package(MPI)

option(ENABLE_RPATH "Include rpath in shared libraries and executables" YES)
if(ENABLE_RPATH)
  # Optional but helpful for macosx (install_name field)
  set(CMAKE_INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}" )
  # Ensure (but this is expected default:)
  set(CMAKE_SKIP_BUILD_RPATH FALSE)
  # Not needed, it should be auto-done by the next setting
  # set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
  # Required for rpath to be set depending on linked libs
  set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
  set(CMAKE_MACOSX_RPATH TRUE)
  # Ensure (but this is expected default:)
  set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
endif()

# Create a list with all the components
set(casacpp_all_components
  alma
  asdmstman
  atmosphere
  atnf
  calanalysis
  casadbus
  casatools
  casa_sakura
  components
  imageanalysis
  flagging
  graphics
  miriad
  mstransform
  msvis
  nrao
  parallel
  protobuf_generated
  singledish
  singledishfiller
  spectrallines
  stdcasa
  synthesis
)

# Add a subdirectory per casacpp component
foreach(_component IN LISTS casacpp_all_components)
  add_subdirectory(${CMAKE_SOURCE_DIR}/${_component})
  set(PRIVATE_LIBS "${PRIVATE_LIBS} -lcasacpp_${_component}")
endforeach()

# Install pkg-config support file
CONFIGURE_FILE("casacpp.pc.in" "casacpp.pc" @ONLY)
set(CASACPP_PKGCONFIG_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig")
INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/casacpp.pc" DESTINATION "${CASACPP_PKGCONFIG_INSTALL_PREFIX}")