project(OpenGTL)

cmake_minimum_required(VERSION 2.6)

set(LIB_SUFFIX "" CACHE STRING "Define suffix of directory name (32/64)" )

option(OPENGTL_BUILD_TESTS "Build tests" OFF)
option(OPENGTL_ENABLE_DEBUG_OUTPUT "Enable (heavy) debug output (only do that for debugging OpenGTL" OFF)
option(OPENGTL_FULL_WARNINGS "Build OpenGTL with all warnings" OFF)

set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules )

set(OPENGTL_VERSION "0.9.12")
set(OPENGTL_LIB_VERSION ${OPENGTL_VERSION})
set(OPENGTL_LIB_SOVERSION "0.6")

set(LIB_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}/)
set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/include/)
set(BIN_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/bin/)
set(SHARE_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/OpenGTL/)
set(DOC_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/doc/OpenGTL/)
set(GTLIMAGEIO_EXTENSIONS_INSTALL_DIR ${LIB_INSTALL_DIR}/GTLImageIO/Extensions)

set(OPENGTL_TESTS_DATA "" CACHE FILEPATH "Directory that contains the data of the tests.")

include (TestBigEndian)
test_big_endian(CMAKE_WORDS_BIGENDIAN)
configure_file(config-endian.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-endian.h )

find_package(LLVM REQUIRED)
if( NOT LLVM_VERSION STREQUAL "2.6" )
  message(FATAL_ERROR "LLVM 2.6 is required.")
endif(NOT LLVM_VERSION STREQUAL "2.6" )

find_package(Threads)

if(CMAKE_USE_PTHREADS_INIT)
  set(PTHREAD_FOUND TRUE)
  set(GTLTEST_THREAD_SUPPORT TRUE)
  add_definitions(-DOPENGTL_HAVE_PTHREAD)
  add_definitions(-DGTLTEST_HAVE_THREAD)
  message(STATUS "pthread was found.")
else(CMAKE_USE_PTHREADS_INIT)
  message(STATUS "pthread wasn't found, thread tests won't be available and memory manager will use hash.")
endif(CMAKE_USE_PTHREADS_INIT)

if(OPENGTL_BUILD_TESTS)
  include(CTest)
  add_definitions(-DOPENGTL_ENABLE_TESTS)
endif(OPENGTL_BUILD_TESTS)

if(OPENGTL_ENABLE_DEBUG_OUTPUT)
  add_definitions(-DOPENGTL_ENABLE_DEBUG_OUTPUT)
endif(OPENGTL_ENABLE_DEBUG_OUTPUT)

if(OPENGTL_FULL_WARNINGS)
  set(OPENGTL_BUILD_DEFINITION "-Wall -Werror")
endif(OPENGTL_FULL_WARNINGS)

if(CMAKE_SIZEOF_VOID_P EQUAL 4)
  # 32 bits
  message(STATUS "OpenGTL detected that you use a 32 bit processor.")
  set(OPENGTL_TESTS_DATA_RESULTS_DIR results32)
  set(OPENGTL_32_BITS TRUE)
  
else(CMAKE_SIZEOF_VOID_P EQUAL 4)
  # 32 bits
  message(STATUS "OpenGTL detected that you use a 64 bit processor.")
  set(OPENGTL_TESTS_DATA_RESULTS_DIR results64)
  set(OPENGTL_32_BITS FALSE)
  # TODO check that llvm was build with -fPIC
  if(NOT LLVM_COMPILED_WITH_PIC)
    message(FATAL_ERROR "llvm wasn't build with PIC enabled, this is not surported on 64bits.")
  endif(NOT LLVM_COMPILED_WITH_PIC)
endif(CMAKE_SIZEOF_VOID_P EQUAL 4)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/OpenGTL ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/OpenGTL
)

# Test for visibility in gcc

if (CMAKE_COMPILER_IS_GNUCXX)
  include (MacroEnsureVersion)
  include (CheckCXXCompilerFlag)

  # visibility support
  check_cxx_compiler_flag(-fvisibility=hidden __GTL_HAVE_GCC_VISIBILITY)
  set( __GTL_HAVE_GCC_VISIBILITY ${__GTL_HAVE_GCC_VISIBILITY} CACHE BOOL "GCC support for hidden visibility")

   # get the gcc version
   exec_program(${CMAKE_C_COMPILER} ARGS ${CMAKE_C_COMPILER_ARG1} --version OUTPUT_VARIABLE _gcc_version_info)

   string (REGEX MATCH "[345]\\.[0-9]\\.[0-9]" _gcc_version "${_gcc_version_info}")
   # gcc on mac just reports: "gcc (GCC) 3.3 20030304 ..." without the patch level, handle this here:
   if (NOT _gcc_version)
      string (REGEX REPLACE ".*\\(GCC\\).* ([34]\\.[0-9]) .*" "\\1.0" _gcc_version "${_gcc_version_info}")
   endif (NOT _gcc_version)

   macro_ensure_version("4.1.0" "${_gcc_version}" GCC_IS_NEWER_THAN_4_1)
   macro_ensure_version("4.2.0" "${_gcc_version}" GCC_IS_NEWER_THAN_4_2)
   macro_ensure_version("4.3.0" "${_gcc_version}" GCC_IS_NEWER_THAN_4_3)

   # save a little by making local statics not threadsafe
   # ### do not enable it for older compilers, see
   # ### http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31806
   if (GCC_IS_NEWER_THAN_4_3)
       set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-threadsafe-statics")
   endif (GCC_IS_NEWER_THAN_4_3)

   set(_GCC_COMPILED_WITH_BAD_ALLOCATOR FALSE)
   if (GCC_IS_NEWER_THAN_4_1)
      exec_program(${CMAKE_C_COMPILER} ARGS ${CMAKE_C_COMPILER_ARG1} -v OUTPUT_VARIABLE _gcc_alloc_info)
      string(REGEX MATCH "(--enable-libstdcxx-allocator=mt)" _GCC_COMPILED_WITH_BAD_ALLOCATOR "${_gcc_alloc_info}")
   endif (GCC_IS_NEWER_THAN_4_1)

   if (__GTL_HAVE_GCC_VISIBILITY AND GCC_IS_NEWER_THAN_4_1 AND NOT _GCC_COMPILED_WITH_BAD_ALLOCATOR AND NOT WIN32)
      set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")

      if (GCC_IS_NEWER_THAN_4_2)
          set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility-inlines-hidden")
      endif (GCC_IS_NEWER_THAN_4_2)
   else (__GTL_HAVE_GCC_VISIBILITY AND GCC_IS_NEWER_THAN_4_1 AND NOT _GCC_COMPILED_WITH_BAD_ALLOCATOR AND NOT WIN32)
      set (__GTL_HAVE_GCC_VISIBILITY 0)
   endif (__GTL_HAVE_GCC_VISIBILITY AND GCC_IS_NEWER_THAN_4_1 AND NOT _GCC_COMPILED_WITH_BAD_ALLOCATOR AND NOT WIN32)

endif (CMAKE_COMPILER_IS_GNUCXX)

# Add subdirectories

add_subdirectory(OpenGTL)
add_subdirectory(OpenCTL)
add_subdirectory(OpenShiva)
add_subdirectory(Extensions)

