check_utils.cmake 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. # Search project's build configuration line by project name and target configuration name.
  58. # Returns TRUE if found and FALSE otherwise
  59. function(check_custom_configuration TARGET_FILE PROJECT_NAME SLN_CONFIG DST_CONFIG RESULT)
  60. set(${RESULT} "FALSE" PARENT_SCOPE)
  61. # extract project guid
  62. parse_project_section(${TARGET_FILE} ${PROJECT_NAME})
  63. if(NOT IS_FOUND)
  64. return()
  65. endif()
  66. set(REG_EXP "^(\t)*\\{${FOUND_GUID}\\}\\.${SLN_CONFIG}[^ ]*\\.ActiveCfg = ${DST_CONFIG}\\|.*$")
  67. check_line_exists(${TARGET_FILE} REG_EXP)
  68. set(${RESULT} ${IS_FOUND} PARENT_SCOPE)
  69. endfunction()
  70. # RunCMake test check helper
  71. function(check_project test name guid type platform imported_release_config_name)
  72. set(sln "${RunCMake_TEST_BINARY_DIR}/${test}.sln")
  73. set(sep "")
  74. set(failed "")
  75. if(NOT type)
  76. set(type 8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942)
  77. endif()
  78. if(NOT platform)
  79. if(RunCMake_GENERATOR_PLATFORM)
  80. set(platform "${RunCMake_GENERATOR_PLATFORM}")
  81. elseif("${RunCMake_GENERATOR}" MATCHES "Win64")
  82. set(platform "x64")
  83. else()
  84. set(platform "Win32")
  85. endif()
  86. endif()
  87. if(NOT imported_release_config_name)
  88. set(imported_release_config_name "Release")
  89. endif()
  90. if(guid)
  91. check_project_guid("${sln}" "${name}" "${guid}" passed_guid)
  92. if(NOT passed_guid)
  93. string(APPEND failed "${sep}${name} solution has no project with expected GUID=${guid}")
  94. set(sep "\n")
  95. endif()
  96. else()
  97. set(passed_guid 1)
  98. endif()
  99. check_project_type("${sln}" "${name}" "${type}" passed_type)
  100. if(NOT passed_type)
  101. string(APPEND failed "${sep}${name} solution has no project with expected TYPE=${type}")
  102. set(sep "\n")
  103. endif()
  104. check_custom_platform("${sln}" "${name}" "${platform}" passed_platform)
  105. if(NOT passed_platform)
  106. string(APPEND failed "${sep}${name} solution has no project with expected PLATFORM=${platform}")
  107. set(sep "\n")
  108. endif()
  109. check_custom_configuration("${sln}" "${name}" "Release" "${imported_release_config_name}" passed_configuration)
  110. if(NOT passed_configuration)
  111. string(APPEND failed "${sep}${name} solution has no project with expected CONFIG=${imported_release_config_name}")
  112. set(sep "\n")
  113. endif()
  114. set(RunCMake_TEST_FAILED "${failed}" PARENT_SCOPE)
  115. endfunction()