PROJECT(OSG_WRAPPERS)

IF(NOT DYNAMIC_OPENSCENEGRAPH)
    ADD_DEFINITIONS(-DOSG_LIBRARY_STATIC)
ENDIF()

SET(LIBRARY_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH}/${OSG_PLUGINS}")

SET(CMAKE_SHARED_MODULE_PREFIX ${OSG_PLUGIN_PREFIX})

IF(MSVC80)
    IF(NOT OSG_MSVC_GENERATE_PLUGINS_AND_WRAPPERS_MANIFESTS)
        SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /MANIFEST:NO")
    ENDIF()
ENDIF()

MACRO(ADD_WRAPPER_LIB SUBDIR EXPORTDEF)
    SET(TARGET_NAME "osgwrapper_${SUBDIR}")
#    MESSAGE(STATUS "--inizio-->${TARGET_NAME}<->${LINK}<-")

    FILE(GLOB SRC_FILES ${OSGWRAPPER_DIR}/${SUBDIR}/*.cpp)
    
    #-- extract link files, defines, exclude files form additional arguments 

    SET(LISTNAME "TEMP")
    SET(DEFSTR "")

    FOREACH(ARG ${ARGN})                    # parse remaining args 
        #MESSAGE(STATUS "+ [${ARG}]")
        #MESSAGE("ARG-->${ARG}")
        # if we find our keywords set the active list to given keyname 
        STRING(COMPARE EQUAL "${ARG}" "LINK" IS_LINK)
        STRING(COMPARE EQUAL "${ARG}" "DEFINE" IS_DEFINE)
        STRING(COMPARE EQUAL "${ARG}" "EXCLUDE" IS_EXCLUDE)
        
        #MESSAGE(STATUS "STRSTUFF L ${IS_LINK} D ${IS_DEFINE} E ${IS_EXCLUDE}")
        
        SET(EXPRESSION ${IS_LINK} OR ${IS_DEFINE} OR ${IS_EXCLUDE})
        IF(${EXPRESSION})
            SET(${LISTNAME} ${CURRLIST})
            # MESSAGE(STATUS "STORED LIST [${LISTNAME}] = (${CURRLIST})")
            SET(LISTNAME ${ARG})
            REMOVE(CURRLIST ${CURRLIST} )
        ELSE()
            SET(CURRLIST ${CURRLIST} ${ARG})    
        ENDIF()
    ENDFOREACH()
    SET(${LISTNAME} ${CURRLIST})
    #MESSAGE(STATUS "STORED LIST [${LISTNAME}] = (${CURRLIST})")
    REMOVE(CURRLIST ${CURRLIST} )
    
    #MESSAGE(STATUS "AFTER: EXC (${EXCLUDE}) DEF (${DEFINE}) LINK (${LINK})")
    FOREACH(EXF ${EXCLUDE})
        REMOVE(SRC_FILES ${OPENSCENEGRAPH_DIR}/src/${SUBDIR}/${EXF})
    ENDFOREACH()
        
    FOREACH(DEF ${DEFINE})
        SET(DEFSTR "${DEFSTR} /D \"${DEF}\"")
        #MESSAGE(STATUS "add symbol : " ${DEF})
    ENDFOREACH()
    
    IF(NOT DEFSTR STREQUAL "")
        SET_SOURCE_FILES_PROPERTIES(${SRC_FILES} PROPERTIES COMPILE_FLAGS ${DEFSTR})
        #MESSAGE(STATUS "*********  ADD COMPILE FLAGS ${DEFSTR} **********")
    ENDIF()
    
    #ADD_LIBRARY(${TARGET_NAME} SHARED ${SRC_FILES} )
    ADD_LIBRARY(${TARGET_NAME} MODULE ${SRC_FILES} )
        
    #not sure if needed, but for plugins only msvc need the d suffix
    IF(NOT MSVC)
        SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES DEBUG_POSTFIX "")
    ELSE()
        IF(OSG_MSVC_VERSIONED_DLL) 
            #this is a hack... the build place is set to lib/<debug or release> by LIBARARY_OUTPUT_PATH equal to OUTPUT_LIBDIR
            #the .lib will be crated in ../ so going straight in lib by the IMPORT_PREFIX property
            #because we want dll placed in OUTPUT_BINDIR ie the bin folder sibling of lib, we can use ../../bin to go there,
            #it is hardcoded, we should compute OUTPUT_BINDIR position relative to OUTPUT_LIBDIR ... to be implemented
            #changing bin to something else breaks this hack
            #the dll are placed in bin/${OSG_PLUGINS} 
            
            IF(NOT MSVC_IDE)
                SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES PREFIX "../bin/${OSG_PLUGINS}/")
            ELSE()
                SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES PREFIX "../../bin/${OSG_PLUGINS}/" IMPORT_PREFIX "../")
            ENDIF()

        ELSE()
            #in standard mode (unversioned) the .lib and .dll are placed in lib/<debug or release>/${OSG_PLUGINS}.
            #here the PREFIX property has been used, the same result would be accomplidhe by prepending ${OSG_PLUGINS}/ to OUTPUT_NAME target property
            SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES PREFIX "${OSG_PLUGINS}/")
        ENDIF()
    ENDIF()

    SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES DEFINE_SYMBOL "${EXPORTDEF}" PROJECT_LABEL "Wrapper ${SUBDIR}")
    IF(MSVC AND OSG_MSVC_VERSIONED_DLL)
        LINK_INTERNAL(${TARGET_NAME} ${LINK})
        #when using full path name to specify linkage, it seems that already linked libs must be specified
        LINK_EXTERNAL(${TARGET_NAME} ${OPENGL_LIBRARIES}) 

    ELSE()
        TARGET_LINK_LIBRARIES(${TARGET_NAME} ${LINK})
    ENDIF()
    #MESSAGE(STATUS "--TARGET_LINK_LIBRARIES-->${TARGET_NAME}<->${LINK}<-")
    
    #FIXME: Deprecated
    REMOVE(DEFINE ${DEFINE})    
    REMOVE(LINK ${LINK})    
    REMOVE(EXCLUDE ${EXCLUDE})    
    
    IF(WIN32)
        INSTALL(TARGETS ${TARGET_NAME}
            RUNTIME DESTINATION bin
            ARCHIVE DESTINATION lib/${OSG_PLUGINS}
            LIBRARY DESTINATION bin/${OSG_PLUGINS}
            COMPONENT libopenscenegraph-wrappers)
    ELSE()
        INSTALL(TARGETS ${TARGET_NAME}
            RUNTIME DESTINATION bin
            ARCHIVE DESTINATION lib${LIB_POSTFIX}/${OSG_PLUGINS}
            LIBRARY DESTINATION lib${LIB_POSTFIX}/${OSG_PLUGINS}
            COMPONENT libopenscenegraph-wrappers)
    ENDIF()
ENDMACRO(ADD_WRAPPER_LIB)

SET(OSGWRAPPER_LIB_LIST 
    OpenThreads
    osg
    osgDB
    osgFX
    osgGA
    osgManipulator
    osgAnimation
    osgParticle
    osgShadow
    osgSim
    osgTerrain
    osgText
    osgUtil
    osgViewer
    osgVolume
    osgWidget
)


SET(OSGWRAPPER_DIR ${CMAKE_CURRENT_SOURCE_DIR})

IF(MSVC)
    SET(LIBRARY_OUTPUT_PATH ${OUTPUT_LIBDIR})
ENDIF()

FOREACH(LIB ${OSGWRAPPER_LIB_LIST})
    ADD_WRAPPER_LIB(${LIB} OSGWRAPPERS_LIBRARY LINK OpenThreads osg osgGA ${LIB} osgIntrospection)    
ENDFOREACH()
