OpenSceneGraph/CMakeModules/UtilityMacros.cmake
2009-04-09 09:23:45 +00:00

221 lines
7.1 KiB
CMake

INCLUDE(ListHandle)
#---------------------------------------------------
# Macro: FILTER_OUT FILTERS INPUTS OUTPUT
#
# Mimicks Gnu Make's $(filter-out) which removes elements
# from a list that match the pattern.
# Arguments:
# FILTERS - list of patterns that need to be removed
# INPUTS - list of inputs that will be worked on
# OUTPUT - the filtered list to be returned
#
# Example:
# SET(MYLIST this that and the other)
# SET(FILTS this that)
#
# FILTER_OUT("${FILTS}" "${MYLIST}" OUT)
# MESSAGE("OUTPUT = ${OUT}")
#
# The output -
# OUTPUT = and;the;other
#
#---------------------------------------------------
MACRO(FILTER_OUT FILTERS INPUTS OUTPUT)
SET(FOUT "")
FOREACH(INP ${INPUTS})
SET(FILTERED 0)
FOREACH(FILT ${FILTERS})
IF(${FILTERED} EQUAL 0)
IF("${FILT}" STREQUAL "${INP}")
SET(FILTERED 1)
ENDIF()
ENDIF()
ENDFOREACH()
IF(${FILTERED} EQUAL 0)
SET(FOUT ${FOUT} ${INP})
ENDIF()
ENDFOREACH(INP ${INPUTS})
SET(${OUTPUT} ${FOUT})
ENDMACRO()
#---------------------------------------------------
# Macro: GET_HEADERS_EXTENSIONLESS DIR GLOB_PATTERN OUTPUT
#
#---------------------------------------------------
MACRO(GET_HEADERS_EXTENSIONLESS DIR GLOB_PATTERN OUTPUT)
FILE(GLOB TMP "${DIR}/${GLOB_PATTERN}" )
#FOREACH(F ${TMP})
# MESSAGE(STATUS "header-->${F}<--")
#ENDFOREACH(F ${TMP})
FILTER_OUT("${DIR}/CVS" "${TMP}" TMP)
FILTER_OUT("${DIR}/cvs" "${TMP}" ${OUTPUT})
FILTER_OUT("${DIR}/.svn" "${TMP}" ${OUTPUT})
ENDMACRO()
#---------------------------------------------------
# Macro: ADD_DIRS_TO_ENV_VAR _VARNAME
#
#---------------------------------------------------
MACRO(ADD_DIRS_TO_ENV_VAR _VARNAME )
FOREACH(_ADD_PATH ${ARGN})
FILE(TO_NATIVE_PATH ${_ADD_PATH} _ADD_NATIVE)
#SET(_CURR_ENV_PATH $ENV{PATH})
#LIST(SET _CURR_ENV_PATH ${_ADD_PATH})
#SET(ENV{PATH} ${_CURR_ENV_PATH})${_FILE}
IF(WIN32)
SET(ENV{${_VARNAME}} "$ENV{${_VARNAME}};${_ADD_NATIVE}")
ELSE()
SET(ENV{${_VARNAME}} "$ENV{${_VARNAME}}:${_ADD_NATIVE}")
ENDIF()
#MESSAGE(" env ${_VARNAME} --->$ENV{${_VARNAME}}<---")
ENDFOREACH()
ENDMACRO()
#---------------------------------------------------
# Macro: CORRECT_PATH VAR PATH
#
# Corrects slashes in PATH to be cmake conformous ( / )
# and puts result in VAR
#---------------------------------------------------
MACRO(CORRECT_PATH VAR PATH)
SET(${VAR} ${PATH})
IF(WIN32)
STRING(REGEX REPLACE "/" "\\\\" ${VAR} "${PATH}")
ENDIF()
ENDMACRO()
#---------------------------------------------------
# Macro: TARGET_LOCATIONS_SET_FILE FILE
# TODO: Ok, this seems a bit ridiculuous.
#---------------------------------------------------
MACRO(TARGET_LOCATIONS_SET_FILE FILE)
SET(ACCUM_FILE_TARGETS ${FILE})
FILE(WRITE ${ACCUM_FILE_TARGETS} "")
ENDMACRO()
#---------------------------------------------------
# Macro: TARGET_LOCATIONS_ACCUM TARGET_NAME
#
#---------------------------------------------------
MACRO(TARGET_LOCATIONS_ACCUM TARGET_NAME)
IF(ACCUM_FILE_TARGETS)
IF(EXISTS ${ACCUM_FILE_TARGETS})
GET_TARGET_PROPERTY(_FILE_LOCATION ${TARGET_NAME} LOCATION)
FILE(APPEND ${ACCUM_FILE_TARGETS} "${_FILE_LOCATION};")
#SET(_TARGETS_LIST ${_TARGETS_LIST} "${_FILE_LOCATION}" CACHE INTERNAL "lista dll")
#MESSAGE("adding target -->${TARGET_NAME}<-- file -->${_FILE_LOCATION}<-- to list -->${_TARGETS_LIST}<--")
#SET(ACCUM_FILE_TARGETS ${ACCUM_FILE_TARGETS} ${_FILE_LOCATION})
ENDIF()
ENDIF()
ENDMACRO()
#---------------------------------------------------
# Macro: TARGET_LOCATIONS_GET_LIST _VAR
#
#---------------------------------------------------
MACRO(TARGET_LOCATIONS_GET_LIST _VAR)
IF(ACCUM_FILE_TARGETS)
IF(EXISTS ${ACCUM_FILE_TARGETS})
FILE(READ ${ACCUM_FILE_TARGETS} ${_VAR})
ENDIF(EXISTS ${ACCUM_FILE_TARGETS})
ENDIF()
ENDMACRO()
#---------------------------------------------------
# Macro: FIND_DEPENDENCY DEPNAME INCLUDEFILE LIBRARY SEARCHPATHLIST
#
#---------------------------------------------------
MACRO(FIND_DEPENDENCY DEPNAME INCLUDEFILE LIBRARY SEARCHPATHLIST)
MESSAGE(STATUS "searching ${DEPNAME} -->${INCLUDEFILE}<-->${LIBRARY}<-->${SEARCHPATHLIST}<--")
SET(MY_PATH_INCLUDE )
SET(MY_PATH_LIB )
SET(MY_PATH_BIN )
FOREACH( MYPATH ${SEARCHPATHLIST} )
SET(MY_PATH_INCLUDE ${MY_PATH_INCLUDE} ${MYPATH}/include)
SET(MY_PATH_LIB ${MY_PATH_LIB} ${MYPATH}/lib)
SET(MY_PATH_BIN ${MY_PATH_BIN} ${MYPATH}/bin)
ENDFOREACH()
SET(MYLIBRARY "${LIBRARY}")
SEPARATE_ARGUMENTS(MYLIBRARY)
#MESSAGE( " include paths: -->${MY_PATH_INCLUDE}<--")
#MESSAGE( " ${DEPNAME}_INCLUDE_DIR --> ${${DEPNAME}_INCLUDE_DIR}<--")
FIND_PATH("${DEPNAME}_INCLUDE_DIR" ${INCLUDEFILE}
${MY_PATH_INCLUDE}
)
MARK_AS_ADVANCED("${DEPNAME}_INCLUDE_DIR")
#MESSAGE( " ${DEPNAME}_INCLUDE_DIR --> ${${DEPNAME}_INCLUDE_DIR}<--")
FIND_LIBRARY("${DEPNAME}_LIBRARY"
NAMES ${MYLIBRARY}
PATHS ${MY_PATH_LIB}
)
IF(${DEPNAME}_LIBRARY)
GET_FILENAME_COMPONENT(MYLIBNAME ${${DEPNAME}_LIBRARY} NAME_WE)
GET_FILENAME_COMPONENT(MYBINPATH ${${DEPNAME}_LIBRARY} PATH)
GET_FILENAME_COMPONENT(MYBINPATH ${MYBINPATH} PATH)
SET(MYBINPATH "${MYBINPATH}/bin")
IF(EXISTS ${MYBINPATH})
SET(MYFOUND 0)
FOREACH(MYPATH ${MY_ACCUM_BINARY_DEP})
IF(MYPATH MATCHES ${MYBINPATH})
SET(MYFOUND 1)
#MESSAGE("found -->${MYPATH}<-->${MYBINPATH}<--")
ENDIF()
ENDFOREACH()
IF(MYFOUND EQUAL 0)
SET(MY_ACCUM_BINARY_DEP ${MY_ACCUM_BINARY_DEP} ${MYBINPATH})
ENDIF()
ENDIF()
#MESSAGE("${DEPNAME}_BINDEP searching -->${MYLIBNAME}${CMAKE_SHARED_MODULE_SUFFIX}<--in-->${MY_PATH_BIN}<--")
# FIND_FILE("${DEPNAME}_BINDEP"
# ${MYLIBNAME}${CMAKE_SHARED_MODULE_SUFFIX}
# PATHS ${MY_PATH_BIN}
# )
# FIND_LIBRARY("${DEPNAME}_BINDEP"
# NAMES ${MYLIBRARY}
# PATHS ${MY_PATH_BIN}
# )
ENDIF()
MARK_AS_ADVANCED("${DEPNAME}_LIBRARY")
#MESSAGE( " ${DEPNAME}_LIBRARY --> ${${DEPNAME}_LIBRARY}<--")
IF(${DEPNAME}_INCLUDE_DIR)
IF(${DEPNAME}_LIBRARY)
SET( ${DEPNAME}_FOUND "YES" )
SET( ${DEPNAME}_LIBRARIES ${${DEPNAME}_LIBRARY} )
ENDIF()
ENDIF()
ENDMACRO()
#---------------------------------------------------
# Macro: MACRO_MESSAGE MYTEXT
#
#---------------------------------------------------
#SET(MACRO_MESSAGE_DEBUG TRUE)
MACRO(MACRO_MESSAGE MYTEXT)
IF(MACRO_MESSAGE_DEBUG)
MESSAGE("in file -->${CMAKE_CURRENT_LIST_FILE}<-- line -->${CMAKE_CURRENT_LIST_LINE}<-- message ${MYTEXT}")
ELSE()
MESSAGE(STATUS "in file -->${CMAKE_CURRENT_LIST_FILE}<-- line -->${CMAKE_CURRENT_LIST_LINE}<-- message ${MYTEXT}")
ENDIF()
ENDMACRO()