cmake_minimum_required ( VERSION 2.6 )

project( OpenLibraries )

set( VERSION_MAJOR 0 )
set( VERSION_MINOR 5 )
set( VERSION_PATCH 0 )
set( PACKAGE "openlibraries-${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}" )
set( VERSION_STRING "${VERSION_MAJOR}_${VERSION_MINOR}_${VERSION_PATCH}" )

# only required for non-umbrella builds
option( OPTION_UMBRELLA "enable umbrella build" OFF )
if ( NOT OPTION_UMBRELLA )
   message( "defining plugin paths" )
   add_definitions( -DOPENIMAGELIB_PLUGINS="${CMAKE_INSTALL_PREFIX}/lib/${PACKAGE}/openimagelib/plugins" )
   add_definitions( -DOPENMEDIALIB_PLUGINS="${CMAKE_INSTALL_PREFIX}/lib/${PACKAGE}/openmedialib/plugins" )
   add_definitions( -DOPENASSETLIB_PLUGINS="${CMAKE_INSTALL_PREFIX}/lib/${PACKAGE}/openassetlib/plugins" )
   add_definitions( -DOPENOBJECTLIB_PLUGINS="${CMAKE_INSTALL_PREFIX}/lib/${PACKAGE}/openobjectlib/plugins" )
   add_definitions( -DOPENEFFECTSLIB_PLUGINS="${CMAKE_INSTALL_PREFIX}/lib/${PACKAGE}/openeffectslib/plugins" )
endif( NOT OPTION_UMBRELLA )

# find optional and required modules
# check in the source directory
set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR} )

# boost
find_package( Boost COMPONENTS filesystem regex thread iostreams REQUIRED )
if ( Boost_FOUND )
   message( "found boost: ${Boost_INCLUDE_DIR}" )
   include_directories( ${Boost_INCLUDE_DIR} )
   link_directories( ${Boost_LIBRARY_DIRS} )
   add_definitions( -DHAVE_BOOST_FILESYSTEM )
endif ( Boost_FOUND )

# libxml
if ( NOT WIN32 )
   find_package( LibXml2 REQUIRED )
   if ( LIBXML2_FOUND )
      message( "found LibXml2: ${LIBXML2_INCLUDE_DIR}" )
      include_directories( ${LIBXML2_INCLUDE_DIR} )      
   endif( LIBXML2_FOUND )	
endif( NOT WIN32 )

# opengl
find_package( OpenGL )
if( OPENGL_FOUND )
    message( "found OpenGL: ${OPENGL_INCLUDE_DIR}" )
    include_directories( ${OPENGL_INCLUDE_DIR} )
endif( OPENGL_FOUND )

# GLEW
find_package( GLEW )
if ( GLEW_FOUND )
   message( "found GLEW: ${GLEW_INCLUDE_DIR}" )
   include_directories( ${GLEW_INCLUDE_DIR} )
   link_directories( ${GLEW_LIBRARY_DIR} )

   set ( SHARE_PATH ${CMAKE_INSTALL_PREFIX}/share/${PACKAGE} )
   add_definitions( -DOPENOBJECTLIB_SHADERS="\\\"${SHARE_PATH}/shaders\\\"" )
   add_definitions( -DOPENEFFECTSLIB_SHADERS="\\\"${SHARE_PATH}/shaders\\\"" )
   add_definitions( -DHAVE_GL_GLEW_H )
endif ( GLEW_FOUND )

# kill some warnings, add some windows specific defines
if ( WIN32 )
   set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4273 /wd4251 /wd4503" )
   add_definitions( -DUNICODE )
   add_definitions( -D_CRT_SECURE_NO_DEPRECATE )

   if( MSVC80 )
       set( COMPILER "vc80" )
   endif( MSVC80 )
   if( MSVC71 )
       set( COMPILER "vc71" )
   endif( MSVC71 )
   if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
      set( LIBRARY_IDENTIFIER "-${COMPILER}-d-${VERSION_STRING}" )
   else( CMAKE_BUILD_TYPE STREQUAL "Debug" )
      set( LIBRARY_IDENTIFIER "-${COMPILER}-r-${VERSION_STRING}" )
   endif( CMAKE_BUILD_TYPE STREQUAL "Debug" )
endif( WIN32 )

IF ( UNIX )
    IF ( NOT APPLE )
        SET( CMAKE_SKIP_RPATH TRUE )
    ENDIF ( NOT APPLE )
ENDIF ( UNIX )

# apple specific stuff
IF (APPLE)
   FIND_LIBRARY( COREFOUNDATION_LIBRARY CoreFoundation )
ENDIF (APPLE)

# Define options
option ( WITH_PYTHON_EXTENTIONS "Compile the python extentions for OpenLibraries." FALSE )
option ( WITH_OPENFX_PLUGIN "Compile the OpenFX plugin for openmedialib." FALSE ) 
option ( WITH_OPENML "Compile the openmedialib." TRUE ) 
option ( WITH_OPENIL "Compile the openimagelib." TRUE ) 
option ( WITH_OPENAL "Compile the openassetlib." TRUE ) 
option ( WITH_OPENFXL "Compile the openeffectslib." FALSE ) 
option ( WITH_OPENOL "Compile the openobjectlib." TRUE ) 

if ( WITH_PYTHON_EXTENSIONS )
   # Python
   find_package( PythonLibs )
endif ( WITH_PYTHON_EXTENSIONS )

if ( WIN32 )
   option ( WITH_WCHAR_T "Compile with /Zc:wchar_t" TRUE ) 
   IF ( WITH_WCHAR_T )
      set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zc:wchar_t" )
   ELSE ( WITH_WCHAR_T )
      set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zc:wchar_t-" )
   ENDIF ( WITH_WCHAR_T )
endif( WIN32 )

# Install .so files with execcuteable permissions
if ( NOT WIN32 )
    set ( CMAKE_INSTALL_SO_NO_EXE FALSE )
endif ( NOT WIN32 )

add_subdirectory( src )

# function to convert a list (with their damned semicolons)
# to a space separated list
FUNCTION( CONVERT_LIST_TO_STRING _list _result )
   SET( result )
   LIST( LENGTH ${_list} _len ) 

   # hack for brain dead range command... I mean, RANGE N yields N+1 numbers
   MATH( EXPR len ${_len}-1 )
   FOREACH( index RANGE 0 ${len} )
      LIST( GET ${_list} ${index} li )
      SET( result "${result} ${li}" )
   ENDFOREACH( index RANGE 0 ${len} )

   SET( ${_result} ${result} PARENT_SCOPE )
ENDFUNCTION( CONVERT_LIST_TO_STRING )

# create openlibraries.pc for UNIX
if ( NOT WIN32 )
   list( APPEND EXTRA_LIBS_LIST -L${Boost_LIBRARY_DIRS} -lboost_filesystem )
   if ( GLEW_FOUND )
         list( APPEND EXTRA_LIBS_LIST -L${GLEW_LIBRARY_DIR} -lGLEW )
         list( APPEND EXTRA_LIBS_LIST -L${CMAKE_INSTALL_PREFIX}/lib/${PACKAGE}/openobjectlib/lib -lopenobjectlib_sg )
   endif ( GLEW_FOUND )

   CONVERT_LIST_TO_STRING( EXTRA_LIBS_LIST EXTRA_LIBS )

   list( APPEND EXTRA_INCLUDE_LIST -I${Boost_INCLUDE_DIRS} )
   if ( GLEW_FOUND )
         list( APPEND EXTRA_INCLUDE_LIST -I${GLEW_INCLUDE_DIR} )
   endif ( GLEW_FOUND )

   CONVERT_LIST_TO_STRING( EXTRA_INCLUDE_LIST EXTRA_INCLUDES )

   configure_file( openlibraries.pc.cmake ${CMAKE_SOURCE_DIR}/openlibraries.pc @ONLY )
   install( 
        FILES
        ${CMAKE_SOURCE_DIR}/openlibraries.pc
        DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig/" )
endif ( NOT WIN32 )
