sagecal/CMakeModules/FindCasaCore.cmake

258 lines
9.5 KiB
CMake

# $Id: FindCasacore.cmake 14552 2009-11-26 16:12:40Z loose $
#
# - Try to find Casacore include dirs and libraries
# Usage:
# find_package(Casacore [REQUIRED] [COMPONENTS components...])
# Valid components are:
# casa, scimath_f, scimath, tables, measures, lattices,
# fits, ms, coordinates, msfits, mirlib, images
#
# Note that most components are dependent on other (more basic) components.
# In that case, it suffices to specify the "top-level" components; dependent
# components will be searched for automatically.
#
# Here's the dependency tree:
# scimath_f -> casa
# scimath -> scimath_f
# tables -> casa
# measures -> scimath, tables
# lattices -> scimath, tables
# fits -> measures
# ms -> measures
# coordinates -> fits
# msfits -> fits, ms
# images -> mirlib, lattices
#
# Variables used by this module:
# CASACORE_ROOT_DIR - Casacore root directory.
#
# Variables defined by this module:
# CASACORE_FOUND - System has Casacore, which means that the
# include dir was found, as well as all
# libraries specified (not cached)
# CASACORE_INCLUDE_DIR - Casacore include directory (cached)
# CASACORE_INCLUDE_DIRS - Casacore include directories (not cached)
# identical to CASACORE_INCLUDE_DIR
# CASACORE_LIBRARIES - The Casacore libraries (not cached)
# CASA_${COMPONENT}_LIBRARY - The absolute path of Casacore library
# "component" (cached)
# HAVE_AIPSPP - True if system has Casacore (cached)
# for backward compatibility with AIPS++
# HAVE_CASACORE - True if system has Casacore (cached)
# identical to CASACORE_FOUND
#
# ATTENTION: The component names need to be in lower case, just as the
# casacore library names. However, the CMake variables use all upper case.
#
#
# Copyright (C) 2008-2009
# ASTRON (Netherlands Foundation for Research in Astronomy)
# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
#
# 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# - casacore_resolve_dependencies(_result)
#
# Resolve the Casacore library dependencies for the given components.
# The list of dependent libraries will be returned in the variable result.
# It is sorted from least dependent to most dependent library, so it can be
# directly fed to the linker.
#
# Usage: casacore_resolve_dependencies(result components...)
if (NOT "$ENV{CASACORE_ROOT_DIR}" STREQUAL "")
set(CASACORE_ROOT_DIR "$ENV{CASACORE_ROOT_DIR}" CACHE INTERNAL "Got from environment variable")
endif()
macro(casacore_resolve_dependencies _result)
set(${_result} ${ARGN})
set(_index 0)
# Do a breadth-first search through the dependency graph; append to the
# result list the dependent components for each item in that list.
# Duplicates will be removed later.
while(1)
list(LENGTH ${_result} _length)
if(NOT _index LESS _length)
break()
endif(NOT _index LESS _length)
list(GET ${_result} ${_index} item)
list(APPEND ${_result} ${Casacore_${item}_DEPENDENCIES})
math(EXPR _index "${_index}+1")
endwhile(1)
# Remove all duplicates in the current result list, while retaining only the
# last of each duplicate.
list(REVERSE ${_result})
list(REMOVE_DUPLICATES ${_result})
list(REVERSE ${_result})
endmacro(casacore_resolve_dependencies _result)
# - casacore_find_library(_name)
#
# Search for the library ${_name}.
# If library is found, add it to CASACORE_LIBRARIES; if not, add ${_name}
# to CASACORE_MISSING_COMPONENTS and set CASACORE_FOUND to false.
#
# Usage: casacore_find_library(name)
#
macro(casacore_find_library _name)
string(TOUPPER ${_name} _NAME)
find_library(${_NAME}_LIBRARY ${_name}
HINTS ${CASACORE_ROOT_DIR} PATH_SUFFIXES lib)
mark_as_advanced(${_NAME}_LIBRARY)
if(${_NAME}_LIBRARY)
list(APPEND CASACORE_LIBRARIES ${${_NAME}_LIBRARY})
else(${_NAME}_LIBRARY)
set(CASACORE_FOUND FALSE)
list(APPEND CASACORE_MISSING_COMPONENTS ${_name})
endif(${_NAME}_LIBRARY)
endmacro(casacore_find_library _name)
# - casacore_find_package(_name)
#
# Search for the package ${_name}.
# If the package is found, add the contents of ${_name}_INCLUDE_DIRS to
# CASACORE_INCLUDE_DIRS and ${_name}_LIBRARIES to CASACORE_LIBRARIES.
#
# If Casacore itself is required, then, strictly speaking, the packages it
# requires must be present. However, when linking against static libraries
# they may not be needed. One can override the REQUIRED setting by switching
# CASACORE_MAKE_REQUIRED_EXTERNALS_OPTIONAL to ON. Beware that this might cause
# compile and/or link errors.
#
# Usage: casacore_find_package(name [REQUIRED])
#
macro(casacore_find_package _name)
if("${ARGN}" MATCHES "^REQUIRED$" AND
Casacore_FIND_REQUIRED AND
NOT CASACORE_MAKE_REQUIRED_EXTERNALS_OPTIONAL)
find_package(${_name} REQUIRED)
else()
find_package(${_name})
endif()
if(${_name}_FOUND)
list(APPEND CASACORE_INCLUDE_DIRS ${${_name}_INCLUDE_DIRS})
list(APPEND CASACORE_LIBRARIES ${${_name}_LIBRARIES})
endif(${_name}_FOUND)
endmacro(casacore_find_package _name)
# Define the Casacore components.
set(Casacore_components
casa
coordinates
fits
images
lattices
measures
mirlib
ms
msfits
scimath
scimath_f
tables
)
# Define the Casacore components' inter-dependencies.
set(Casacore_coordinates_DEPENDENCIES fits)
set(Casacore_fits_DEPENDENCIES measures)
set(Casacore_images_DEPENDENCIES lattices mirlib)
set(Casacore_lattices_DEPENDENCIES scimath tables)
set(Casacore_measures_DEPENDENCIES scimath tables)
set(Casacore_ms_DEPENDENCIES measures)
set(Casacore_msfits_DEPENDENCIES fits ms)
set(Casacore_scimath_DEPENDENCIES scimath_f)
set(Casacore_scimath_f_DEPENDENCIES casa)
set(Casacore_tables_DEPENDENCIES casa)
# Initialize variables.
set(CASACORE_FOUND FALSE)
set(CASACORE_DEFINITIONS)
set(CASACORE_LIBRARIES)
set(CASACORE_MISSING_COMPONENTS)
# Search for the header file first. Note that casacore installs the header
# files in ${prefix}/include/casacore, instead of ${prefix}/include.
if(NOT CASACORE_INCLUDE_DIR)
find_path(CASACORE_INCLUDE_DIR casacore/casa/aips.h
HINTS ${CASACORE_ROOT_DIR} PATH_SUFFIXES include)
mark_as_advanced(CASACORE_INCLUDE_DIR)
endif(NOT CASACORE_INCLUDE_DIR)
if(NOT CASACORE_INCLUDE_DIR)
set(CASACORE_ERROR_MESSAGE "Casacore: unable to find the header file casa/aips.h.\nPlease set CASACORE_ROOT_DIR to the root directory containing Casacore.")
else(NOT CASACORE_INCLUDE_DIR)
# We've found the header file; let's continue.
set(CASACORE_FOUND TRUE)
set(CASACORE_INCLUDE_DIRS ${CASACORE_INCLUDE_DIR} ${CASACORE_INCLUDE_DIR}/casacore)
# If the user specified components explicity, use that list; otherwise we'll
# assume that the user wants to use all components.
if(NOT Casacore_FIND_COMPONENTS)
set(Casacore_FIND_COMPONENTS ${Casacore_components})
endif(NOT Casacore_FIND_COMPONENTS)
# Get a list of all dependent Casacore libraries that need to be found.
casacore_resolve_dependencies(_find_components ${Casacore_FIND_COMPONENTS})
# Find the library for each component, and handle external dependencies
foreach(_comp ${_find_components})
casacore_find_library(casa_${_comp})
if(${_comp} STREQUAL casa)
# casacore_find_package(HDF5)
casacore_find_library(m)
list(APPEND CASACORE_LIBRARIES ${CMAKE_DL_LIBS})
elseif(${_comp} STREQUAL coordinates)
casacore_find_package(WcsLib REQUIRED)
elseif(${_comp} STREQUAL fits)
casacore_find_package(CfitsIO REQUIRED)
elseif(${_comp} STREQUAL scimath_f)
casacore_find_package(LAPACK REQUIRED)
endif(${_comp} STREQUAL casa)
endforeach(_comp ${_find_components})
endif(NOT CASACORE_INCLUDE_DIR)
# Set HAVE_CASACORE; and HAVE_AIPSPP (for backward compatibility with AIPS++).
if(CASACORE_FOUND)
set(HAVE_CASACORE TRUE CACHE INTERNAL "Define if Casacore is installed")
set(HAVE_AIPSPP TRUE CACHE INTERNAL "Define if AIPS++/Casacore is installed")
endif(CASACORE_FOUND)
# Compose diagnostic message if not all necessary components were found.
if(CASACORE_MISSING_COMPONENTS)
set(CASACORE_ERROR_MESSAGE "Casacore: the following components could not be found:\n ${CASACORE_MISSING_COMPONENTS}")
endif(CASACORE_MISSING_COMPONENTS)
# Print diagnostics.
if(CASACORE_FOUND)
if(NOT Casacore_FIND_QUIETLY)
message(STATUS "Found the following Casacore components: ")
foreach(comp ${_find_components})
message(STATUS " ${comp}")
endforeach(comp ${_find_components})
endif(NOT Casacore_FIND_QUIETLY)
else(CASACORE_FOUND)
if(Casacore_FIND_REQUIRED)
message(FATAL_ERROR "${CASACORE_ERROR_MESSAGE}")
else(Casacore_FIND_REQUIRED)
message(STATUS "${CASACORE_ERROR_MESSAGE}")
endif(Casacore_FIND_REQUIRED)
endif(CASACORE_FOUND)