Advertisement
Guest User

CMake Visual Studio tree structure filters

a guest
Jun 5th, 2012
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
CMake 4.30 KB | None | 0 0
  1. #
  2. # SourceGroupByDirname.cmake - routines for groupping files by the dirname
  3. #
  4.  
  5. IF(NOT DEFINED TARGET_GROUP_SOURCES_DEBUG)
  6.   SET(TARGET_GROUP_SOURCES_DEBUG FALSE)
  7. ENDIF()
  8.  
  9. FUNCTION(DIRNAME OUTPUT_VARIABLE PATHNAME)
  10.   STRING(REPLACE / ";" PATHLIST "${PATHNAME}")
  11.   LIST(LENGTH PATHLIST PATH_LENGTH)
  12.   MATH(EXPR LAST_INDEX "${PATH_LENGTH} - 1")
  13.   LIST(REMOVE_AT PATHLIST ${LAST_INDEX})
  14.   STRING(REPLACE ";" / RESULT "${PATHLIST}")
  15.   SET(${OUTPUT_VARIABLE} ${RESULT} PARENT_SCOPE)
  16. ENDFUNCTION()
  17.  
  18. FUNCTION(IS_PREFIX_OF PREFIX LIST OUTPUT_VARIABLE)
  19.   LIST(LENGTH PREFIX PREFIX_LENGTH)
  20.   LIST(LENGTH LIST LIST_LENGTH)
  21.  
  22.   IF(PREFIX_LENGTH LESS LIST_LENGTH)
  23.     SET(RESULT TRUE)
  24.     MATH(EXPR LAST_PREFIX_INDEX "${PREFIX_LENGTH} - 1")
  25.     FOREACH(I RANGE ${LAST_PREFIX_INDEX})
  26.       LIST(GET PREFIX ${I} PREFIX_I)
  27.       LIST(GET LIST ${I} LIST_I)
  28.       IF(NOT PREFIX_I STREQUAL LIST_I)
  29.     SET(RESULT FALSE)
  30.       ENDIF()
  31.     ENDFOREACH()
  32.   ELSE()
  33.     SET(RESULT FALSE)
  34.   ENDIF()
  35.  
  36.   SET(${OUTPUT_VARIABLE} ${RESULT} PARENT_SCOPE)
  37. ENDFUNCTION()
  38.  
  39. FUNCTION(IS_PATH_PREFIX_OF PREFIX PATH OUTPUT_VARIABLE)
  40.   STRING(REPLACE / ";" PREFIX_LIST "${PREFIX}")
  41.   STRING(REPLACE / ";" PATH_LIST "${PATH}")
  42.   IS_PREFIX_OF("${PREFIX_LIST}" "${PATH_LIST}" RESULT)
  43.   SET(${OUTPUT_VARIABLE} ${RESULT} PARENT_SCOPE)
  44. ENDFUNCTION()
  45.  
  46. FUNCTION(REMOVE_PREFIX LIST PREFIX_LENGTH OUTPUT_VARIABLE)
  47.   FOREACH(I RANGE 1 ${PREFIX_LENGTH})
  48.     LIST(REMOVE_AT LIST 0)
  49.   ENDFOREACH()
  50.   SET(${OUTPUT_VARIABLE} "${LIST}" PARENT_SCOPE)
  51. ENDFUNCTION()
  52.  
  53. FUNCTION(REMOVE_PATH_PREFIX PATH COMPONENT_COUNT OUTPUT_VARIABLE)
  54.   STRING(REPLACE / ";" PATH_LIST "${PATH}")
  55.   REMOVE_PREFIX("${PATH_LIST}" ${COMPONENT_COUNT} RESULT)
  56.   STRING(REPLACE ";" / RESULT "${RESULT}")
  57.   SET(${OUTPUT_VARIABLE} ${RESULT} PARENT_SCOPE)
  58. ENDFUNCTION()
  59.  
  60. FUNCTION(PATH_COMPOMENTS PATH OUTPUT_VARIABLE)
  61.   STRING(REPLACE / ";" PATH_LIST "${PATH}")
  62.   LIST(LENGTH PATH_LIST RESULT)
  63.   SET(${OUTPUT_VARIABLE} ${RESULT} PARENT_SCOPE)
  64. ENDFUNCTION()
  65.  
  66. FUNCTION(GROUP_FILE_BY_DIRNAME PATHNAME DIRNAME)
  67.   IF(ARGC EQUAL 3)
  68.     LIST(GET ARGV 2 GROUP_PREFIX)
  69.     SET(GROUP_PREFIX "${GROUP_PREFIX}")
  70.   ELSEIF(ARGC GREATER 3)
  71.     MESSAGE(SEND_ERROR "GROUP_FILE_BY_DIRNAME must be called with 2 or 3 arguments")
  72.     RETURN()
  73.   ENDIF()
  74.  
  75.   IS_PATH_PREFIX_OF("${DIRNAME}" "${PATHNAME}" IN_DIR)
  76.   IF (IN_DIR)
  77.     PATH_COMPOMENTS("${DIRNAME}" DIRNAME_LENGTH)
  78.     DIRNAME(DIR "${PATHNAME}")
  79.     REMOVE_PATH_PREFIX("${DIR}" ${DIRNAME_LENGTH} GROUP_NAME)
  80.     STRING(REPLACE / \\ GROUP_NAME "${GROUP_NAME}")
  81.  
  82.     IF(GROUP_NAME)
  83.       IF(TARGET_GROUP_SOURCES_DEBUG)
  84.     MESSAGE(STATUS "Adding file ${PATHNAME} to the group ${GROUP_PREFIX}\\${GROUP_NAME}")
  85.       ENDIF()
  86.       SOURCE_GROUP("${GROUP_PREFIX}\\${GROUP_NAME}" FILES "${PATHNAME}")
  87.     ELSE()
  88.       IF(TARGET_GROUP_SOURCES_DEBUG)
  89.     MESSAGE(STATUS "Adding file ${PATHNAME} to the group ${GROUP_PREFIX}")
  90.       ENDIF()
  91.       SOURCE_GROUP("${GROUP_PREFIX}" FILES "${PATHNAME}")
  92.     ENDIF()
  93.   ENDIF()
  94. ENDFUNCTION()
  95.  
  96. FUNCTION(TARGET_GROUP_SOURCES TARGET)
  97.   MATH(EXPR CORRECT_ARGC "(${ARGC} - 1) % 4")
  98.   IF(NOT CORRECT_ARGC EQUAL 0)
  99.     MESSAGE(SEND_ERROR "Incorrect arguments for TARGET_GROUP_SOURCES, expecting TARGET_GROUP_SOURCES(target DIR dir GROUP group ...)")
  100.     RETURN()
  101.   ENDIF()
  102.  
  103.   MATH(EXPR LAST_WORD_INDEX "${ARGC} - 2")
  104.   FOREACH(WORD_INDEX RANGE 0 ${LAST_WORD_INDEX} 4)
  105.     LIST(GET ARGN ${WORD_INDEX} WORD)
  106.     IF(NOT WORD STREQUAL DIR)
  107.       MESSAGE(SEND_ERROR "Incorrect arguments for TARGET_GROUP_SOURCES, expecting TARGET_GROUP_SOURCES(target DIR dir GROUP group ...)")
  108.       RETURN()
  109.     ENDIF()
  110.   ENDFOREACH()
  111.  
  112.   FOREACH(WORD_INDEX RANGE 2 ${LAST_WORD_INDEX} 4)
  113.     LIST(GET ARGN ${WORD_INDEX} WORD)
  114.     IF(NOT WORD STREQUAL GROUP)
  115.       MESSAGE(SEND_ERROR "Incorrect arguments for TARGET_GROUP_SOURCES, expecting TARGET_GROUP_SOURCES(target DIR dir GROUP group ...)")
  116.       RETURN()
  117.     ENDIF()
  118.   ENDFOREACH()
  119.  
  120.   GET_PROPERTY(FILES TARGET ${TARGET} PROPERTY SOURCES)
  121.   FOREACH(F ${FILES})
  122.     FOREACH(WORD_INDEX RANGE 1 ${LAST_WORD_INDEX} 4)
  123.       MATH(EXPR NEXT_WORD_INDEX "${WORD_INDEX} + 2")
  124.  
  125.       LIST(GET ARGN ${WORD_INDEX} DIR_NAME)
  126.       LIST(GET ARGN ${NEXT_WORD_INDEX} GROUP_NAME)
  127.  
  128.       GROUP_FILE_BY_DIRNAME("${F}" ${DIR_NAME} ${GROUP_NAME})
  129.     ENDFOREACH()
  130.   ENDFOREACH()
  131. ENDFUNCTION()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement