# -*- mode: cmake; coding: utf-8 -*-
###  CMakeLists.txt ---

#  Author(s): Christophe Prud'homme <christophe.prudhomme@ujf-grenoble.fr>
#       Date: 2009-11-12
#
#  Copyright (C) 2009-2010 Université Joseph Fourier (Grenoble I)
#
# Distributed under the GPL(GNU Public License):
# 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., 675 Mass Ave, Cambridge, MA 02139, USA.
#
#
cmake_minimum_required (VERSION 2.6)
project( feelpp_opus C CXX Fortran)


if ( ${PROJECT_SOURCE_DIR} )
  set(FEELPP_OPUS_VERSION_MAJOR "0" PARENT_SCOPE)
  set(FEELPP_OPUS_VERSION_MINOR "93" PARENT_SCOPE)
  set(FEELPP_OPUS_VERSION_MICRO "0" PARENT_SCOPE)
  set(FEELPP_OPUS_VERSION_EXTRA "" PARENT_SCOPE)
else()
  set(FEELPP_OPUS_VERSION_MAJOR "0" )
  set(FEELPP_OPUS_VERSION_MINOR "93" )
  set(FEELPP_OPUS_VERSION_MICRO "0" )
  set(FEELPP_OPUS_VERSION_EXTRA "" )
endif()


SET(FEELPP_OPUS_VERSION_DEB "1")
set(FEELPP_OPUS_SHARED_VERSION "1.0.0" )
set(FEELPP_OPUS_SHARED_SOVERSION "1" )

FIND_PACKAGE(Subversion)
IF(FEEL_ENABLE_SVN AND ( Subversion_FOUND AND EXISTS ${FEELPP_OPUS_SOURCE_DIR}/.svn ) )
#IF ( Subversion_FOUND AND EXISTS ${PROJECT_SOURCE_DIR}/.svn )
  Subversion_WC_INFO(${FEELPP_OPUS_SOURCE_DIR} Feelpp_opus)
  MESSAGE("Current revision is ${Feelpp_opus_WC_REVISION}")
  Subversion_WC_LOG(${FEELPP_OPUS_SOURCE_DIR} Feelpp_opus)
  MESSAGE("Last changed log is ${Feelpp_opus_LAST_CHANGED_LOG}")
  set(FEELPP_OPUS_VERSION_EXTRA "~svn${Feelpp_opus_WC_REVISION}" PARENT_SCOPE)
ELSE()
  FIND_PACKAGE(Git)
  if(FEEL_ENABLE_SVN AND GIT_FOUND AND  EXISTS ${FEELPP_OPUS_SOURCE_DIR}/.git )

    execute_process(
      COMMAND git rev-parse --verify -q --short git-svn
      WORKING_DIRECTORY ${FEELPP_OPUS_SOURCE_DIR}
      OUTPUT_VARIABLE FEELPP_OPUS_GIT_COMMIT
      ERROR_VARIABLE FEELPP_OPUS_GIT_COMMIT_error
      RESULT_VARIABLE FEELPP_OPUS_GIT_COMMIT_result)
    if ( NOT ${FEELPP_OPUS_GIT_COMMIT_result} EQUAL 0 )
      MESSAGE(SEND_ERROR "Command \"git rev-parse --verify -q --short git-svn\" failed with output:\n${FEELPP_OPUS_GIT_COMMIT_error}")
    else()
      STRING(STRIP "${FEELPP_OPUS_GIT_COMMIT}" FEELPP_OPUS_GIT_COMMIT )
      MESSAGE(STATUS "Git commit: ${FEELPP_OPUS_GIT_COMMIT}")
    endif()
    execute_process(
      COMMAND git show --raw ${FEELPP_OPUS_GIT_COMMIT}
#      COMMAND "grep git-svn-id"
#      COMMAND sed -re "s/^\\s*git-svn-id: .*@([0-9]+).*$/\\1/"
      WORKING_DIRECTORY ${FEELPP_OPUS_SOURCE_DIR}
      OUTPUT_VARIABLE FEELPP_OPUS_SVN_COMMIT
      ERROR_VARIABLE Feelpp_opus_WC_REVISION_error
      RESULT_VARIABLE Feelpp_opus_WC_REVISION_result)
    if ( NOT ${Feelpp_opus_WC_REVISION_result} EQUAL 0 )
      MESSAGE(SEND_ERROR "Command \"git show --raw ${FEELPP_OPUS_GIT_COMMIT}\" failed with output:\n${Feelpp_opus_WC_REVISION_error}")
    endif()
    string(REGEX REPLACE ".*git-svn-id: .*trunk/modules/crb@([0-9]+) .*" "\\1"Feelpp_opus_WC_REVISION ${FEELPP_OPUS_SVN_COMMIT})
    MESSAGE(STATUS "Current SVN(git) revision is ${Feelpp_opus_WC_REVISION}")
    set(FEELPP_OPUS_VERSION_EXTRA "~svn${Feelpp_opus_WC_REVISION}" PARENT_SCOPE)
  endif()
endif()

SET(FEELPP_OPUS_HOME_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE INTERNAL "")
SET(FEELPP_OPUS_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE INTERNAL "")
SET(FEELPP_OPUS_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR} CACHE INTERNAL "")

SET( CMAKE_MODULE_PATH  ${FEELPP_OPUS_HOME_DIR}/cmake )

IF(NOT CMAKE_BUILD_TYPE)
  SET(CMAKE_BUILD_TYPE Release CACHE STRING
      "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
      FORCE)
ENDIF(NOT CMAKE_BUILD_TYPE)

INCLUDE(CheckIncludeFile)
INCLUDE(CheckIncludeFiles)
INCLUDE(CheckIncludeFileCXX)
INCLUDE(CheckFunctionExists)
INCLUDE(CheckSymbolExists)
INCLUDE(CheckCXXSourceCompiles)
INCLUDE(CheckLibraryExists)
INCLUDE(ParseArguments)

#
# Ann
#
FIND_PACKAGE(ANN REQUIRED)
INCLUDE_DIRECTORIES( ${ANN_INCLUDE_DIR} )
SET(FEELPP_OPUS_LIBRARIES ${ANN_LIBRARIES} ${FEELPP_OPUS_LIBRARIES})

#
# GLPK
#
FIND_PACKAGE(GLPK REQUIRED)
INCLUDE_DIRECTORIES( ${GLPK_INCLUDE_DIR} )
SET(FEELPP_OPUS_LIBRARIES ${GLPK_LIBRARIES} ${FEELPP_OPUS_LIBRARIES})

#
# Octave
#
FIND_PACKAGE(Octave REQUIRED)
INCLUDE_DIRECTORIES( ${Octave_INCLUDE_DIR} )
SET(FEELPP_OPUS_LIBRARIES ${ANN_LIBRARIES} ${FEELPP_OPUS_LIBRARIES})

# find octave-config and get variables from it
FIND_PROGRAM(OCTAVE_CONFIG octave-config)
IF(NOT OCTAVE_CONFIG)
  MESSAGE(FATAL_ERROR "Octave is required, but octave-config was not found.  Please install Octave and rerun cmake.")
ENDIF(NOT OCTAVE_CONFIG)

EXECUTE_PROCESS(COMMAND ${OCTAVE_CONFIG} --oct-site-dir
  OUTPUT_VARIABLE OCT_SITE_DIR OUTPUT_STRIP_TRAILING_WHITESPACE)
EXECUTE_PROCESS(COMMAND ${OCTAVE_CONFIG} --m-site-dir
  OUTPUT_VARIABLE M_SITE_DIR OUTPUT_STRIP_TRAILING_WHITESPACE)
EXECUTE_PROCESS(COMMAND ${OCTAVE_CONFIG} -p OCTINCLUDEDIR
  OUTPUT_VARIABLE OCTINCLUDEDIR OUTPUT_STRIP_TRAILING_WHITESPACE)
EXECUTE_PROCESS(COMMAND ${OCTAVE_CONFIG} -p OCTLIBDIR
  OUTPUT_VARIABLE OCTLIBDIR OUTPUT_STRIP_TRAILING_WHITESPACE)

# Make the values accessible from other CMakeLists.txt files
# Also, this allows packagers to override the default values
SET(FEELPP_OPUS_OCT_DIR ${OCT_SITE_DIR}/feel++-opus CACHE PATH ".oct files from Feel++-Opus")
SET(FEELPP_OPUS_M_DIR ${M_SITE_DIR}/feel++-opus CACHE PATH ".m files from Feel++-Opus")

message(STATUS "oct dir: ${FEELPP_OPUS_OCT_DIR}" )
message(STATUS "m dir: ${FEELPP_OPUS_M_DIR}" )

include_directories(
  ${FEELPP_OPUS_SOURCE_DIR}/
)

include(UseOpus)

#
# Feel
#
FIND_PACKAGE(Feel++ REQUIRED)
SET(THELIBS  ${FEEL_LIBRARIES}  )

SET(FEEL_LIBRARIES ${FEEL_LIBRARIES} ${FEELPP_OPUS_LIBRARIES})


add_custom_target(opus)

add_subdirectory( feel/feelcrb )
add_subdirectory( feel/feelmodels )
add_subdirectory( test )

INCLUDE(InstallRequiredSystemLibraries)



#
# Installing Feelpp_opus
#
foreach(includedir feel/feelcore feel/feelcrb )
  FILE(GLOB files "${includedir}/*.h*")
  INSTALL(FILES ${files} DESTINATION include/${includedir} COMPONENT Devel)
endforeach()

#
# install DB files if there are any
#
foreach(dbdir 1 2 3 scm )
  FILE(GLOB files "${CMAKE_CURRENT_SOURCE_DIR}/db/crb/${dbdir}/*.crbdb")
  INSTALL(FILES ${files} DESTINATION share/feel/db/crb/${dbdir} COMPONENT Devel)
endforeach()

##
## Archive generation using cpack
##
# SET(CPACK_GENERATOR "TGZ")
if (UNIX AND NOT FEEL_SYSTEM_NAME)
  execute_process(
    COMMAND uname -m
    OUTPUT_VARIABLE FEEL_SYSTEM_MACHINE
    OUTPUT_STRIP_TRAILING_WHITESPACE
    ERROR_VARIABLE FEEL_SYSTEM_MACHINE_error
    RESULT_VARIABLE FEEL_SYSTEM_MACHINE_result)
endif()

SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Feel++ Opus")
SET(CPACK_PACKAGE_VENDOR "Christophe Prud'homme")
SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README")
SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING")
SET(CPACK_PACKAGE_VERSION_MAJOR "${FEELPP_OPUS_VERSION_MAJOR}")
SET(CPACK_PACKAGE_VERSION_MINOR "${FEELPP_OPUS_VERSION_MINOR}")
SET(CPACK_PACKAGE_VERSION_PATCH "${FEELPP_OPUS_VERSION_MICRO}")
SET(CPACK_PACKAGE_INSTALL_DIRECTORY "feel++-opus")
SET(CPACK_SOURCE_GENERATOR "TGZ")
SET(CPACK_SOURCE_OUTPUT_CONFIG_FILE "CPackSourceConfig.cmake")
SET(CPACK_SYSTEM_NAME "${CMAKE_SYSTEM_NAME}-${FEEL_SYSTEM_MACHINE}")
SET(CPACK_PACKAGE_FILE_NAME "feel++-opus-${FEELPP_OPUS_VERSION_MAJOR}.${FEELPP_OPUS_VERSION_MINOR}.${FEELPP_OPUS_VERSION_MICRO}")
SET(CPACK_SOURCE_PACKAGE_FILE_NAME "feel++-opus-${FEELPP_OPUS_VERSION_MAJOR}.${FEELPP_OPUS_VERSION_MINOR}.${FEELPP_OPUS_VERSION_MICRO}")
SET(CPACK_SOURCE_STRIP_FILES "")
# The following components are regex's to match anywhere (unless anchored)
# in absolute path + filename to find files or directories to be excluded
# from source tarball.
set(CPACK_SOURCE_IGNORE_FILES
  "/\\\\.git/;\\\\.gitignore;/\\\\.svn;"
  "/admin/;/tools/;/Templates/;"
  "/auto/;/auto.*/;"
  "/*.tar.gz;*.tar.bz2;*.deb;obj-x86_64-linux-gnu/;/opt/"
  "/TAGS;/#.*;/.*~;/.cvsignore;/.bzrignore"
  "*.aux;*.log;*.bbl;*.idx;*.ist;*.out;*.blg;OpusManualBenchmarkEADSUJF.pdf"
  "${PROJECT_SOURCE_DIR}/debian/"
  "${PROJECT_SOURCE_DIR}/debian/opus/"
  "${PROJECT_SOURCE_DIR}/debian/source/"
  "${PROJECT_SOURCE_DIR}/doc/reports/"
  "${PROJECT_SOURCE_DIR}/doc/projects/"
  "${PROJECT_SOURCE_DIR}/doc/talks/"
  "${PROJECT_SOURCE_DIR}/doc/api/latex"
  "${PROJECT_SOURCE_DIR}/doc/api/html"
  "${PROJECT_SOURCE_DIR}/doc/benchmark"
  "${PROJECT_SOURCE_DIR}/doc/spec"
  "${PROJECT_SOURCE_DIR}/scripts"
  "${PROJECT_SOURCE_DIR}/doc/biblio/pdfs"
  )

# Debian
SET( CPACK_DEBIAN_PACKAGE_DEPENDS "libfeel++-dev, libopenturns-dev")
SET( CPACK_DEBIAN_PACKAGE_SECTION "science")
SET( CPACK_DEBIAN_PACKAGE_PRIORITY "extra" )
SET( CPACK_DEBIAN_PACKAGE_DESCRIPTION "Feel++ Open Platform for Uncertainty in Simulations")
SET( CPACK_DEBIAN_PACKAGE_MAINTAINER "prudhomm@debian.org" )
SET( CPACK_DEBIAN_PACKAGE_VERSION "${FEELPP_OPUS_VERSION_MAJOR}.${FEELPP_OPUS_VERSION_MINOR}.${FEELPP_OPUS_VERSION_MICRO}-${FEELPP_OPUS_VERSION_DEB}")
find_program( DPKG dpkg DOC "dpkg Debian packaging system" )
if ( DPKG )
  execute_process( COMMAND dpkg --print-architecture OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE)
  message( STATUS "arch: ${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}")
endif( DPKG )



include( CPack )

