check_utils.cmake 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. # Check that file contains line that matches regular expression.
  2. # Sets IS_FOUND variable to TRUE if found and to FALSE otherwise.
  3. macro(check_line_exists TARGET_FILE REG_EXP_REF)
  4. set(IS_FOUND "FALSE")
  5. file(STRINGS ${TARGET_FILE} FOUND_LINE LIMIT_COUNT 1 REGEX "${${REG_EXP_REF}}")
  6. list(LENGTH FOUND_LINE _VAR_LEN)
  7. if(_VAR_LEN GREATER 0)
  8. set(IS_FOUND "TRUE")
  9. endif()
  10. endmacro()
  11. # Search and parse project section line by project name.
  12. # If search was successful stores found type and guid into FOUND_TYPE and FOUND_GUID variables respectively.
  13. # Sets IS_FOUND variable to TRUE if found and to FALSE otherwise.
  14. macro(parse_project_section TARGET_FILE PROJECT_NAME)
  15. set(REG_EXP "^Project\\(\\\"{(.+)}\\\"\\) = \\\"${PROJECT_NAME}\\\", \\\".+\\..+\\\", \\\"{(.+)}\\\"$")
  16. check_line_exists(${TARGET_FILE} REG_EXP)
  17. if(NOT IS_FOUND)
  18. return()
  19. endif()
  20. string(REGEX REPLACE "${REG_EXP}" "\\1;\\2" _GUIDS "${FOUND_LINE}")
  21. list(GET _GUIDS 0 FOUND_TYPE)
  22. list(GET _GUIDS 1 FOUND_GUID)
  23. endmacro()
  24. # Search project section line by project name and type.
  25. # Returns TRUE if found and FALSE otherwise
  26. function(check_project_type TARGET_FILE PROJECT_NAME PROJECT_TYPE RESULT)
  27. set(${RESULT} "FALSE" PARENT_SCOPE)
  28. parse_project_section(${TARGET_FILE} ${PROJECT_NAME})
  29. if(IS_FOUND AND FOUND_TYPE STREQUAL PROJECT_TYPE)
  30. set(${RESULT} "TRUE" PARENT_SCOPE)
  31. endif()
  32. endfunction()
  33. # Search project section line by project name and id.
  34. # Returns TRUE if found and FALSE otherwise
  35. function(check_project_guid TARGET_FILE PROJECT_NAME PROJECT_GUID RESULT)
  36. set(${RESULT} "FALSE" PARENT_SCOPE)
  37. parse_project_section(${TARGET_FILE} ${PROJECT_NAME})
  38. if(IS_FOUND AND FOUND_GUID STREQUAL PROJECT_GUID)
  39. set(${RESULT} "TRUE" PARENT_SCOPE)
  40. endif()
  41. endfunction()
  42. # Search project's build configuration line by project name and target platform name.
  43. # Returns TRUE if found and FALSE otherwise
  44. function(check_custom_platform TARGET_FILE PROJECT_NAME PLATFORM_NAME RESULT)
  45. set(${RESULT} "FALSE" PARENT_SCOPE)
  46. # extract project guid
  47. parse_project_section(${TARGET_FILE} ${PROJECT_NAME})
  48. if(NOT IS_FOUND)
  49. return()
  50. endif()
  51. # probably whould be better to use configuration name
  52. # extracted from CMAKE_CONFIGURATION_TYPES than just hardcoded "Debug" instead
  53. set(REG_EXP "^(\t)*\\{${FOUND_GUID}\\}\\.Debug[^ ]*\\.ActiveCfg = Debug\\|${PLATFORM_NAME}$")
  54. check_line_exists(${TARGET_FILE} REG_EXP)
  55. set(${RESULT} ${IS_FOUND} PARENT_SCOPE)
  56. endfunction()
  57. # RunCMake test check helper
  58. function(check_project test name guid type platform)
  59. set(sln "${RunCMake_TEST_BINARY_DIR}/${test}.sln")
  60. set(sep "")
  61. set(failed "")
  62. if(NOT type)
  63. set(type 8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942)
  64. endif()
  65. if(NOT platform)
  66. if(RunCMake_GENERATOR_PLATFORM)
  67. set(platform "${RunCMake_GENERATOR_PLATFORM}")
  68. elseif("${RunCMake_GENERATOR}" MATCHES "Win64")
  69. set(platform "x64")
  70. else()
  71. set(platform "Win32")
  72. endif()
  73. endif()
  74. if(guid)
  75. check_project_guid("${sln}" "${name}" "${guid}" passed_guid)
  76. if(NOT passed_guid)
  77. set(failed "${failed}${sep}${name} solution has no project with expected GUID=${guid}")
  78. set(sep "\n")
  79. endif()
  80. else()
  81. set(passed_guid 1)
  82. endif()
  83. check_project_type("${sln}" "${name}" "${type}" passed_type)
  84. if(NOT passed_type)
  85. set(failed "${failed}${sep}${name} solution has no project with expected TYPE=${type}")
  86. set(sep "\n")
  87. endif()
  88. check_custom_platform("${sln}" "${name}" "${platform}" passed_platform)
  89. if(NOT passed_platform)
  90. set(failed "${failed}${sep}${name} solution has no project with expected PLATFORM=${platform}")
  91. set(sep "\n")
  92. endif()
  93. set(RunCMake_TEST_FAILED "${failed}" PARENT_SCOPE)
  94. endfunction()