CMAKE_MINIMUM_REQUIRED( VERSION 2.4.6 )

PROJECT(TPCCondData)

IF(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
    SET(TPC_COND_DATA_STAND_ALONE TRUE)
ENDIF()

MESSAGE(STATUS "\n-- >>> Processing CMakeLists.txt for ${PROJECT_NAME} ...")

IF(TPC_COND_DATA_STAND_ALONE)
    MESSAGE(STATUS "TPCConddata is build stand-alone.")
    
    # Modules for FIND_PACKAGE command of cmake
    FIND_PACKAGE( ILCUTIL REQUIRED COMPONENTS ILCSOFT_CMAKE_MODULES )

    # load default settings from ILCSOFT_CMAKE_MODULES
    INCLUDE( ilcsoft_default_settings )
ENDIF()

# in MarlinTPC two libraries are built, which both should be versioned
# so the version definition is swapped to a single file in the tpcconddata project directory
INCLUDE ( "TPCCondData_Version" )

# library *nix style versioning
SET( ${PROJECT_NAME}_SOVERSION
    "${${PROJECT_NAME}_VERSION_MAJOR}.${${PROJECT_NAME}_VERSION_MINOR}" )
SET( ${PROJECT_NAME}_VERSION
    "${${PROJECT_NAME}_SOVERSION}.${${PROJECT_NAME}_VERSION_PATCH}" )

# project options
OPTION( BUILD_SHARED_LIBS "Set to OFF to build static libraries" ON )
OPTION( BUILD_32BIT_COMPATIBLE "Set to ON to build in 32 bit compatibility mode" OFF )
OPTION( INSTALL_DOC "Set to OFF to skip build/install Documentation" OFF )

# For debugging the build:
# MESSAGE(STATUS "TPCCondData_INSTALL_PREFIX is ${TPCCondData_INSTALL_PREFIX}" )
# MESSAGE(STATUS "CMAKE_INSTALL_PREFIX is ${CMAKE_INSTALL_PREFIX}" )
# MESSAGE(STATUS "PROJECT_SOURCE_DIR is ${PROJECT_SOURCE_DIR}" )
# MESSAGE(STATUS "CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT ${CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT}" )
# MESSAGE(STATUS "TPCCondData_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT ${TPCCondData_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT}" )
 
# Set the default installation directory to be the source directory.
# ------------------------------------------------------------------
# We can't use CMAKE_INSTALL_PREFIX, as it will be modified by MarlinTPC 
# which causes problems in renewed cmake calls.
# The CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT flag is unset in a second
# cmake call, but we can test alternatively, if the install prefix was 
# already defined and set to the project source directory (default behaviour)
# in a previous call.
# If CMAKE_INSTALL_PREFIX was indeed specified on the command line, it will
# be used for MarlinTPC and TPCCondData.
 
IF(DEFINED TPCCondData_INSTALL_PREFIX)
    IF(TPCCondData_INSTALL_PREFIX STREQUAL PROJECT_SOURCE_DIR)
        SET(TPCCondData_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT TRUE)
    ENDIF()
ENDIF()

IF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT OR
    TPCCondData_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)

    SET(TPCCondData_INSTALL_PREFIX ${PROJECT_SOURCE_DIR} CACHE PATH  
    "install prefix path  - overwrite with -D CMAKE_INSTALL_PREFIX = ..." 
    FORCE )
    # If we install into the project source directory, there is no need to
    # copy the include files of TPCCondData:
    SET(USE_PROJECT_SOURCE_INCLUDE_DIR TRUE)
ELSE()
    SET(TPCCondData_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX})
ENDIF()

MESSAGE(STATUS "TPCCondData_INSTALL_PREFIX is ${TPCCondData_INSTALL_PREFIX} - overwrite with -D CMAKE_INSTALL_PREFIX" )



#---------------- 32/64 bit issues ---------------------------------------
IF( CMAKE_SIZEOF_VOID_P EQUAL 4 )
    MESSAGE( STATUS "32 bit architecture detected" )
ENDIF()

IF( CMAKE_SIZEOF_VOID_P EQUAL 8 )
    MESSAGE( STATUS "64 bit architecture detected" )

    IF( BUILD_32BIT_COMPATIBLE )
        IF( COMMAND SET_PROPERTY )
            SET_PROPERTY(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS 0)
            SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32" )
            #SET( CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -m32" )
            #SET( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32" )
            SET( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -m32" )
            SET( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -m32" )
            SET( CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -m32" )
        ELSE()
            MESSAGE( FATAL_ERROR "to build in 32 bit compatibility mode you need cmake >= 2.6" )
        ENDIF()
        MESSAGE( STATUS "Build in 32 bit compatibility mode" )
    ELSE()
        MESSAGE( STATUS "Build in native 64 bit mode" )
    ENDIF()
ENDIF()


# Documentation
# -------------
FIND_PACKAGE( Doxygen )
IF( DOXYGEN_FOUND )

    ADD_CUSTOM_COMMAND(
        OUTPUT  "${PROJECT_SOURCE_DIR}/doc/html"
        COMMAND "${DOXYGEN_EXECUTABLE}" ARGS "Doxyfile"
        WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/doc"
        COMMENT "Building API Documentation..."
        VERBATIM )

    # add doc target
    ADD_CUSTOM_TARGET( ${PROJECT_NAME}doc DEPENDS
        "${PROJECT_SOURCE_DIR}/doc/html" )
ELSE()
    MESSAGE( STATUS "Doxygen not found in your system!!" )
    IF( INSTALL_DOC )
        MESSAGE( STATUS "INSTALL_DOC forced to OFF" )
        SET( INSTALL_DOC OFF )
    ENDIF()
ENDIF()

# install documentation
IF( INSTALL_DOC )
    # make sure doxygen is executed (make TPCCondDatadoc) before make install
    INSTALL( CODE "EXEC_PROGRAM(${CMAKE_BUILD_TOOL} ${PROJECT_BINARY_DIR} ARGS
${PROJECT_NAME}doc)" )
    # install documentation
    INSTALL( DIRECTORY "${PROJECT_SOURCE_DIR}/doc"
            DESTINATION . )
ENDIF()


#-------------------------------------------------------------------------

#Include LCIO dependency
FIND_PACKAGE( LCIO REQUIRED )
include_directories( ${LCIO_INCLUDE_DIRS} )

#Include LCCD dependency
FIND_PACKAGE( LCCD REQUIRED )
include_directories( ${LCCD_INCLUDE_DIRS} )

#Include CLHEP dependency
FIND_PACKAGE( CLHEP REQUIRED )
include_directories( ${CLHEP_INCLUDE_DIRS} )

# activate relevant source code fractions by adding pre-processor definitions
IF( LCCD_FOUND )
    ADD_DEFINITIONS( "-DUSE_LCCD" )
ENDIF()

# require proper c++
ADD_DEFINITIONS( "-Wall -g -ansi -pedantic" )
ADD_DEFINITIONS( "-Wno-long-long" )

# FIXME add debug definitions - is this still needed?
#IF( CMAKE_BUILD_TYPE STREQUAL "Debug" OR
#    CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo" )
#    ADD_DEFINITIONS( "-DDEBUG" )
##ENDIF()

# ======================== TPCCondData library ==============================
include_directories( ${PROJECT_SOURCE_DIR}/include )

file(GLOB sources ${PROJECT_SOURCE_DIR}/src/*.cc)

add_library(TPCCondData SHARED ${sources})
TARGET_LINK_LIBRARIES( TPCCondData ${LCIO_LIBRARIES} )
TARGET_LINK_LIBRARIES( TPCCondData ${LCCD_LIBRARIES} )
# only headers are used from CLHEP, so library doesn't need to be linked
         
SET_TARGET_PROPERTIES( TPCCondData PROPERTIES VERSION ${TPCCondData_VERSION} SOVERSION ${TPCCondData_SOVERSION})

#if TPCCondData is build as part of MarlinTPC 
if( NOT TPC_COND_DATA_STAND_ALONE) 
    MESSAGE (STATUS "TPCCondData being built as part of parent project in ${PROJECT_BINARY_DIR}, export variables ...")
    SET ( TPCCondData_LIBRARIES TPCCondData  PARENT_SCOPE )
    SET ( TPCCondData_INCLUDE_DIRS ${PROJECT_SOURCE_DIR}/include  PARENT_SCOPE ) 
    SET ( TPCCondData_LIB_DIRS ${TPCCondData_INSTALL_PREFIX}/lib  PARENT_SCOPE )

    # Make install path of libTPCCondData.so known to other binaries
    # in the project
    SET(CMAKE_INSTALL_RPATH ${TPCCondData_INSTALL_PREFIX}/lib PARENT_SCOPE)

    # Put libraries in a separate lib directory tpcconddata/lib during build
    set_target_properties(TPCCondData PROPERTIES
             LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
endif()

# In case TPCCondData is installed to a different location, one can't use the
# include files from the source directory
if(NOT USE_PROJECT_SOURCE_INCLUDE_DIR)
    install(DIRECTORY include/
        DESTINATION ${TPCCondData_INSTALL_PREFIX}/include/TPCCondData
        FILES_MATCHING 
        PATTERN "*.h"
        PATTERN ".svn" EXCLUDE)
endif()

# Install the library to lib directory
# no binary targets, yet, but who knows ...
install(TARGETS TPCCondData
  RUNTIME DESTINATION ${TPCCondData_INSTALL_PREFIX}/bin
    LIBRARY DESTINATION ${TPCCondData_INSTALL_PREFIX}/lib )

# Export the package for use from the build-tree
# (this registers the build-tree with a global CMake-registry)
export(PACKAGE TPCCondData)
 
# Create the TPCCondDataConfig.cmake and TPCCondDataConfigVersion files
CONFIGURE_FILE( "${PROJECT_SOURCE_DIR}/cmake/TPCCondDataConfig.cmake.in"
"${PROJECT_BINARY_DIR}/TPCCondDataConfig.cmake" @ONLY)
INSTALL( FILES "${PROJECT_BINARY_DIR}/TPCCondDataConfig.cmake" 
    DESTINATION ${TPCCondData_INSTALL_PREFIX} )

CONFIGURE_FILE( "${PROJECT_SOURCE_DIR}/cmake/TPCCondDataConfigVersion.cmake.in"
"${PROJECT_BINARY_DIR}/TPCCondDataConfigVersion.cmake" @ONLY)
INSTALL( FILES "${PROJECT_BINARY_DIR}/TPCCondDataConfigVersion.cmake"
    DESTINATION ${TPCCondData_INSTALL_PREFIX} )

MESSAGE(STATUS "<<< Processing CMakeLists.txt for ${PROJECT_NAME} done.\n")