OpenSceneGraph/CMakeModules/OsgMacroUtils.cmake
2007-03-12 12:46:36 +00:00

284 lines
12 KiB
CMake

INCLUDE(UtilityMacros)
#---------------------------------------------------
# ADD_OSG_LIB ( SUBDIR )
# collects source files from given subdir and generates a shared library from them
# additional parameters specify symbols, link libraries and omited files
# begin these with keyword DEFINE LINK or EXCLUDE
# e.g. ADD_OSG_LIB( osgDB DEFINE OSGDB_EXPORT LINK osg EXCLUDE osg_mac.cxx )
# if OSG_PROJECT_LABEL_PREFIX is defined the project label is augmented with prefix
#---------------------------------------------------
MACRO(ADD_OSG_LIB SUBDIR EXPORTDEF)
#MESSAGE(STATUS "=== ADD_OSG_LIB ${SUBDIR}")
MACRO_MESSAGE("---source dir -->${OPENSCENEGRAPH_DIR}/src/${SUBDIR}<---")
SET(TARGET_NAME ${SUBDIR})
FILE(GLOB SRC_FILES ${OPENSCENEGRAPH_DIR}/src/${SUBDIR}/*.cpp)
#FILE(GLOB H_FILES ${OPENSCENEGRAPH_DIR}/include/${SUBDIR}/*)
GET_HEADERS_EXTENSIONLESS("${OPENSCENEGRAPH_DIR}/include/${SUBDIR}" "*" H_FILES)
#patch luigi osgwrapper FILE(GLOB SRC_FILES_SUB ${OPENSCENEGRAPH_DIR}/src/${SUBDIR}/*/*.cpp)
#patch luigi osgwrapper SET(SRC_FILES ${SRC_FILES} ${SRC_FILES_SUB})
#-- extract link files, defines, exclude files form additional arguments
SET(LISTNAME "TEMP")
SET(DEFSTR "")
#--- parse remaining args
FOREACH(ARG ${ARGN})
#MESSAGE(STATUS "+ [${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}")
#--- check for label change
SET(LIST_CHANGED ${IS_LINK} OR ${IS_DEFINE} OR ${IS_EXCLUDE})
IF(${LIST_CHANGED})
SET(${LISTNAME} ${CURRLIST}) # in this case change the current list
#MESSAGE(STATUS "STORED LIST [${LISTNAME}] = (${CURRLIST})")
SET(LISTNAME ${ARG}) # new list name
REMOVE(CURRLIST ${CURRLIST} ) # clear current list
ELSE(${LIST_CHANGED})
SET(CURRLIST ${CURRLIST} ${ARG}) # otherwise just add current entry to current list
ENDIF(${LIST_CHANGED})
ENDFOREACH(ARG)
SET(${LISTNAME} ${CURRLIST}) # copy current list to active list
#MESSAGE(STATUS "STORED LIST [${LISTNAME}] = (${CURRLIST})")
REMOVE(CURRLIST ${CURRLIST} ) # clear current list
#MESSAGE(STATUS "AFTER: EXC (${EXCLUDE}) DEF (${DEFINE}) LINK (${LINK})")
#--- exclude files from exclude list
FOREACH(EXF ${EXCLUDE})
REMOVE(SRC_FILES ${OPENSCENEGRAPH_DIR}/src/${SUBDIR}/${EXF})
ENDFOREACH(EXF)
SOURCE_GROUP("Header Files" FILES ${H_FILES})
SET_SOURCE_FILES_PROPERTIES(${H_FILES} PROPERTIES HEADER_FILE_ONLY ON)
#--- add symbols, first assemble string with multiple /D "symbol" entries
FOREACH(DEF ${DEFINE})
IF(WIN32)
SET(DEFSTR "${DEFSTR} /D \"${DEF}\"")
#MESSAGE(STATUS "add symbol : " ${DEF})
ENDIF(WIN32)
IF(UNIX)
SET(DEFSTR "${DEFSTR} -D\"${DEF}\"")
#MESSAGE(STATUS "add symbol : " ${DEF})
ENDIF(UNIX)
ENDFOREACH(DEF)
IF(NOT DEFSTR STREQUAL "") # then set defines
SET_SOURCE_FILES_PROPERTIES(${SRC_FILES} PROPERTIES COMPILE_FLAGS ${DEFSTR})
#MESSAGE(STATUS "********* ADD COMPILE FLAGS ${DEFSTR} **********")
ENDIF(NOT DEFSTR STREQUAL "")
#--- add library with given name
ADD_LIBRARY(${TARGET_NAME} SHARED ${SRC_FILES} ${H_FILES})
SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES DEFINE_SYMBOL "${EXPORTDEF}" PROJECT_LABEL "${OSG_PROJECT_LABEL_PREFIX} ${TARGET_NAME}")
TARGET_LINK_LIBRARIES(${TARGET_NAME} ${LINK})
#speed#TARGET_LOCATIONS_ACCUM(${TARGET_NAME})
REMOVE(DEFINE ${DEFINE})
REMOVE(LINK ${LINK})
REMOVE(EXCLUDE ${EXCLUDE})
#old form# INSTALL_TARGETS(/lib ${TARGET_NAME} )
INSTALL(TARGETS ${TARGET_NAME} ARCHIVE DESTINATION lib LIBRARY DESTINATION lib RUNTIME DESTINATION bin )
INSTALL(FILES ${H_FILES} DESTINATION include/${TARGET_NAME} )
ENDMACRO(ADD_OSG_LIB)
MACRO(ADD_OSG_APPLICATION SUBDIR)
#PROJECT("application_${SUBDIR}")
SET(MYTARGET application_${SUBDIR})
FILE(GLOB APPLICATION_SRC ${OPENSCENEGRAPH_APPLICATION_DIR}/${SUBDIR}/*.cpp)
FILE(GLOB APPLICATION_H ${OPENSCENEGRAPH_APPLICATION_DIR}/${SUBDIR}/*.h)
IF(NOT APPLICATION_SRC)
MESSAGE("application_${SUBDIR}")
ELSE(NOT APPLICATION_SRC)
ADD_EXECUTABLE(${MYTARGET} ${APPLICATION_SRC} ${APPLICATION_H})
ENDIF(NOT APPLICATION_SRC)
SET_TARGET_PROPERTIES(${MYTARGET} PROPERTIES DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX})
SET_TARGET_PROPERTIES(${MYTARGET} PROPERTIES OUTPUT_NAME ${SUBDIR})
#IF(UNIX)
# MESSAGE("so no qui!!!!!!!!!!")
FOREACH(LINKLIB osg osgDB osgUtil osgViewer osgText osgGA OpenThreads ${ARGV1} ${ARGV2} ${ARGV3} ${ARGV4} ${ARGV5})
IF(${LINKLIB} MATCHES "osg")
#MESSAGE("TARGET_LINK_LIBRARIES(${MYTARGET} ${LINKLIB}")
TARGET_LINK_LIBRARIES(${MYTARGET} optimized ${LINKLIB} debug "${LINKLIB}${CMAKE_DEBUG_POSTFIX}")
ELSE(${LINKLIB} MATCHES "osg")
IF(${LINKLIB} MATCHES "Producer")
#MESSAGE("TARGET_LINK_LIBRARIES(${MYTARGET} ${LINKLIB}")
TARGET_LINK_LIBRARIES(${MYTARGET} optimized ${LINKLIB} debug "${LINKLIB}${CMAKE_DEBUG_POSTFIX}")
ELSE(${LINKLIB} MATCHES "Producer")
IF(${LINKLIB} MATCHES "OpenThreads")
#MESSAGE("TARGET_LINK_LIBRARIES(${MYTARGET} ${LINKLIB}")
IF(MSVC)
#change in name from standar VS projects TARGET_LINK_LIBRARIES(${MYTARGET} optimized "${LINKLIB}Win32" debug "${LINKLIB}Win32d" )
TARGET_LINK_LIBRARIES(${MYTARGET} optimized "${LINKLIB}" debug "${LINKLIB}d" )
ELSE(MSVC)
TARGET_LINK_LIBRARIES(${MYTARGET} optimized ${LINKLIB} debug "${LINKLIB}${CMAKE_DEBUG_POSTFIX}")
ENDIF(MSVC)
ELSE(${LINKLIB} MATCHES "OpenThreads")
#MESSAGE("EXTERNAL LIB:TARGET_LINK_LIBRARIES(${MYTARGET} ${LINKLIB}")
TARGET_LINK_LIBRARIES(${MYTARGET} ${LINKLIB} )
ENDIF(${LINKLIB} MATCHES "OpenThreads")
ENDIF(${LINKLIB} MATCHES "Producer")
ENDIF(${LINKLIB} MATCHES "osg")
ENDFOREACH(LINKLIB)
#ELSE(UNIX)
# TARGET_LINK_LIBRARIES(${MYTARGET} osg osgDB osgUtil osgProducer ${ARGV1} ${ARGV2} ${ARGV3} ${ARGV4} ${ARGV5})
#ENDIF(UNIX)
SET_TARGET_PROPERTIES(${MYTARGET} PROPERTIES PROJECT_LABEL "application ${SUBDIR}")
#speed#TARGET_LOCATIONS_ACCUM(${MYTARGET})
#MESSAGE(STATUS "adding osg application ${MYTARGET}")
##INSTALL_TARGETS(/bin ${MYTARGET} )
INSTALL(TARGETS ${MYTARGET} RUNTIME DESTINATION bin )
ENDMACRO(ADD_OSG_APPLICATION)
MACRO(ADD_OSG_EXAMPLE SUBDIR)
#PROJECT("example_${SUBDIR}")
SET(MYTARGET example_${SUBDIR})
FILE(GLOB EXAMPLE_SRC ${OPENSCENEGRAPH_EXAMPLE_DIR}/${SUBDIR}/*.cpp)
FILE(GLOB EXAMPLE_H ${OPENSCENEGRAPH_EXAMPLE_DIR}/${SUBDIR}/*.h)
IF(NOT EXAMPLE_SRC)
MESSAGE("example_${SUBDIR}")
ELSE(NOT EXAMPLE_SRC)
ADD_EXECUTABLE(${MYTARGET} ${EXAMPLE_SRC} ${EXAMPLE_H})
ENDIF(NOT EXAMPLE_SRC)
SET_TARGET_PROPERTIES(${MYTARGET} PROPERTIES DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX})
SET_TARGET_PROPERTIES(${MYTARGET} PROPERTIES OUTPUT_NAME ${SUBDIR})
SET_TARGET_PROPERTIES(${TARGET} PROPERTIES PROJECT_LABEL "Examples ${MYTARGET}")
#IF(UNIX)
# MESSAGE("so no qui!!!!!!!!!!")
FOREACH(LINKLIB osg osgDB osgUtil osgViewer osgText osgGA OpenThreads ${ARGV1} ${ARGV2} ${ARGV3} ${ARGV4} ${ARGV5})
IF(${LINKLIB} MATCHES "osg")
#MESSAGE("TARGET_LINK_LIBRARIES(${MYTARGET} ${LINKLIB}")
TARGET_LINK_LIBRARIES(${MYTARGET} optimized ${LINKLIB} debug "${LINKLIB}${CMAKE_DEBUG_POSTFIX}")
ELSE(${LINKLIB} MATCHES "osg")
IF(${LINKLIB} MATCHES "Producer")
#MESSAGE("TARGET_LINK_LIBRARIES(${MYTARGET} ${LINKLIB}")
TARGET_LINK_LIBRARIES(${MYTARGET} optimized ${LINKLIB} debug "${LINKLIB}${CMAKE_DEBUG_POSTFIX}")
ELSE(${LINKLIB} MATCHES "Producer")
IF(${LINKLIB} MATCHES "OpenThreads")
#MESSAGE("TARGET_LINK_LIBRARIES(${MYTARGET} ${LINKLIB}")
IF(MSVC)
#change in name from standar VS projects TARGET_LINK_LIBRARIES(${MYTARGET} optimized "${LINKLIB}Win32" debug "${LINKLIB}Win32d" )
TARGET_LINK_LIBRARIES(${MYTARGET} optimized "${LINKLIB}" debug "${LINKLIB}d" )
ELSE(MSVC)
TARGET_LINK_LIBRARIES(${MYTARGET} optimized ${LINKLIB} debug "${LINKLIB}${CMAKE_DEBUG_POSTFIX}")
ENDIF(MSVC)
ELSE(${LINKLIB} MATCHES "OpenThreads")
#MESSAGE("EXTERNAL LIB:TARGET_LINK_LIBRARIES(${MYTARGET} ${LINKLIB}")
TARGET_LINK_LIBRARIES(${MYTARGET} ${LINKLIB} )
ENDIF(${LINKLIB} MATCHES "OpenThreads")
ENDIF(${LINKLIB} MATCHES "Producer")
ENDIF(${LINKLIB} MATCHES "osg")
ENDFOREACH(LINKLIB)
#ELSE(UNIX)
# TARGET_LINK_LIBRARIES(${MYTARGET} osg osgDB osgUtil osgProducer ${ARGV1} ${ARGV2} ${ARGV3} ${ARGV4} ${ARGV5})
#ENDIF(UNIX)
SET_TARGET_PROPERTIES(${MYTARGET} PROPERTIES PROJECT_LABEL "example ${SUBDIR}")
#speed#TARGET_LOCATIONS_ACCUM(${MYTARGET})
#MESSAGE(STATUS "adding osg example ${MYTARGET}")
##INSTALL_TARGETS(/bin ${MYTARGET} )
IF(WIN32)
INSTALL(TARGETS ${MYTARGET} RUNTIME DESTINATION bin )
ELSE(WIN32)
INSTALL(TARGETS ${MYTARGET} RUNTIME DESTINATION share/OpenSceneGraph/bin )
ENDIF(WIN32)
ENDMACRO(ADD_OSG_EXAMPLE)
#---------------------------------------------------
# MACRO GET_TARGETNAME SUBDIR RESULT
# generates a plugin target name for given SUBDIR and sets RESULT accordingly
# e.g. GET_TARGETNAME(osg OSG_TARGET) -> OSG_TARGET is osgdb_osg
MACRO(GET_TARGETNAME SUBDIR RESULT)
SET(${RESULT} osgdb_${SUBDIR})
ENDMACRO(GET_TARGETNAME)
#---------------------------------------------------
# MACRO ADD_OSG_PLUGIN SUBDIR [additional libs to link to]
# adds a plugin project for given SUBDIR, links libraries given as additional arguments
# e.g. ADD_OSG_PLUGIN(osg osgSim) -> generates is osgdb_osg and links with osgSim
MACRO(ADD_OSG_PLUGIN SUBDIR)
GET_TARGETNAME(${SUBDIR} TARGET)
# MESSAGE("globbing in -->${PROJECT_SOURCE_DIR}/${SUBDIR}<--")
FILE(GLOB PLUGIN_SRC ${PROJECT_SOURCE_DIR}/${SUBDIR}/*.cpp)
FILE(GLOB PLUGIN_H ${PROJECT_SOURCE_DIR}/${SUBDIR}/*.h)
#ADD_LIBRARY(${TARGET} SHARED ${PLUGIN_SRC} ${PLUGIN_H})
ADD_LIBRARY(${TARGET} MODULE ${PLUGIN_SRC} ${PLUGIN_H})
IF(NOT MSVC)
SET_TARGET_PROPERTIES(${TARGET} PROPERTIES DEBUG_POSTFIX "")
ENDIF(NOT MSVC)
SET_TARGET_PROPERTIES(${TARGET} PROPERTIES PROJECT_LABEL "Plugins ${TARGET}")
FOREACH(LINKLIB osg osgDB osgUtil ${ARGV1} ${ARGV2} ${ARGV3} ${ARGV4} ${ARGV5})
IF(${LINKLIB} MATCHES "osg")
#MESSAGE("TARGET_LINK_LIBRARIES(${TARGET} optimized ${LINKLIB}")
TARGET_LINK_LIBRARIES(${TARGET} optimized ${LINKLIB} debug "${LINKLIB}${CMAKE_DEBUG_POSTFIX}")
ELSE(${LINKLIB} MATCHES "osg")
TARGET_LINK_LIBRARIES(${TARGET} ${LINKLIB})
ENDIF(${LINKLIB} MATCHES "osg")
ENDFOREACH(LINKLIB)
#ELSE(UNIX)
# SET_TARGET_PROPERTIES(${TARGET} PROPERTIES PROJECT_LABEL "osgPlugins ${SUBDIR}")
# TARGET_LINK_LIBRARIES(${TARGET} osg osgDB osgUtil ${ARGV1} ${ARGV2} ${ARGV3} ${ARGV4} ${ARGV5})
#ENDIF(UNIX)
#speed#TARGET_LOCATIONS_ACCUM(${TARGET})
#old_form#INSTALL_TARGETS(/lib ${TARGET} )
IF(WIN32)
INSTALL(TARGETS ${TARGET} RUNTIME DESTINATION bin ARCHIVE DESTINATION lib LIBRARY DESTINATION bin )
ELSE(WIN32)
INSTALL(TARGETS ${TARGET} RUNTIME DESTINATION bin ARCHIVE DESTINATION lib${LIB_POSTFIX}/osgPlugins LIBRARY DESTINATION lib${LIB_POSTFIX}/osgPlugins )
ENDIF(WIN32)
ENDMACRO(ADD_OSG_PLUGIN)
MACRO(ADD_OSG_PLUGIN_EXTERN SOURCE_DIR _TARGET)
FILE(GLOB PLUGIN_SRC ${SOURCE_DIR}/*.cpp)
FILE(GLOB PLUGIN_H ${SOURCE_DIR}/*.h)
#ADD_LIBRARY(${TARGET} SHARED ${PLUGIN_SRC} ${PLUGIN_H})
ADD_LIBRARY(${_TARGET} MODULE ${PLUGIN_SRC} ${PLUGIN_H})
IF(UNIX)
SET_TARGET_PROPERTIES(${_TARGET} PROPERTIES DEBUG_POSTFIX "")
ENDIF(UNIX)
FOREACH(LINKLIB osg osgDB osgUtil ${ARGV2} ${ARGV3} ${ARGV4} ${ARGV5})
IF(${LINKLIB} MATCHES "osg")
#MESSAGE("TARGET_LINK_LIBRARIES(${TARGET} optimized ${LINKLIB}")
TARGET_LINK_LIBRARIES(${_TARGET} optimized ${LINKLIB} debug "${LINKLIB}${CMAKE_DEBUG_POSTFIX}")
ELSE(${LINKLIB} MATCHES "osg")
TARGET_LINK_LIBRARIES(${_TARGET} ${LINKLIB})
ENDIF(${LINKLIB} MATCHES "osg")
ENDFOREACH(LINKLIB)
#ELSE(UNIX)
# SET_TARGET_PROPERTIES(${TARGET} PROPERTIES PROJECT_LABEL "osgPlugin ${SUBDIR}")
# TARGET_LINK_LIBRARIES(${TARGET} osg osgDB osgUtil ${ARGV1} ${ARGV2} ${ARGV3} ${ARGV4} ${ARGV5})
#ENDIF(UNIX)
#speed#TARGET_LOCATIONS_ACCUM(${_TARGET})
##INSTALL_TARGETS(/lib ${_TARGET} )
INSTALL(TARGETS ${_TARGET} RUNTIME DESTINATION bin )
ENDMACRO(ADD_OSG_PLUGIN_EXTERN)