summaryrefslogtreecommitdiff
path: root/Tests/RunCMake/include_external_msproject/check_utils.cmake
blob: 7f5ef5394beeb64b97dcbf1bead26f20c9cf9e91 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# Check that file contains line that matches regular expression.
# Sets IS_FOUND variable to TRUE if found and to FALSE otherwise.
macro(check_line_exists TARGET_FILE REG_EXP_REF)
  set(IS_FOUND "FALSE")

  file(STRINGS ${TARGET_FILE} FOUND_LINE LIMIT_COUNT 1 REGEX "${${REG_EXP_REF}}")
  list(LENGTH FOUND_LINE _VAR_LEN)

  if(_VAR_LEN GREATER 0)
    set(IS_FOUND "TRUE")
  endif()
endmacro()

# Search and parse project section line by project name.
# If search was successful stores found type and guid into FOUND_TYPE and FOUND_GUID variables respectively.
# Sets IS_FOUND variable to TRUE if found and to FALSE otherwise.
macro(parse_project_section TARGET_FILE PROJECT_NAME)
  set(REG_EXP "^Project\\(\\\"{(.+)}\\\"\\) = \\\"${PROJECT_NAME}\\\", \\\".+\\..+\\\", \\\"{(.+)}\\\"$")

  check_line_exists(${TARGET_FILE} REG_EXP)
  if(NOT IS_FOUND)
    return()
  endif()

  string(REGEX REPLACE "${REG_EXP}" "\\1;\\2" _GUIDS "${FOUND_LINE}")

  list(GET _GUIDS 0 FOUND_TYPE)
  list(GET _GUIDS 1 FOUND_GUID)
endmacro()

# Search project section line by project name and type.
# Returns TRUE if found and FALSE otherwise
function(check_project_type TARGET_FILE PROJECT_NAME PROJECT_TYPE RESULT)
  set(${RESULT} "FALSE" PARENT_SCOPE)

  parse_project_section(${TARGET_FILE} ${PROJECT_NAME})
  if(IS_FOUND AND FOUND_TYPE STREQUAL PROJECT_TYPE)
    set(${RESULT} "TRUE" PARENT_SCOPE)
  endif()
endfunction()


# Search project section line by project name and id.
# Returns TRUE if found and FALSE otherwise
function(check_project_guid TARGET_FILE PROJECT_NAME PROJECT_GUID RESULT)
  set(${RESULT} "FALSE" PARENT_SCOPE)

  parse_project_section(${TARGET_FILE} ${PROJECT_NAME})
  if(IS_FOUND AND FOUND_GUID STREQUAL PROJECT_GUID)
    set(${RESULT} "TRUE" PARENT_SCOPE)
  endif()
endfunction()


# Search project's build configuration line by project name and target platform name.
# Returns TRUE if found and FALSE otherwise
function(check_custom_platform TARGET_FILE PROJECT_NAME PLATFORM_NAME RESULT)
  set(${RESULT} "FALSE" PARENT_SCOPE)

  # extract project guid
  parse_project_section(${TARGET_FILE} ${PROJECT_NAME})
  if(NOT IS_FOUND)
    return()
  endif()

  # probably whould be better to use configuration name
  # extracted from CMAKE_CONFIGURATION_TYPES than just hardcoded "Debug" instead
  set(REG_EXP "^(\t)*\\{${FOUND_GUID}\\}\\.Debug[^ ]*\\.ActiveCfg = Debug\\|${PLATFORM_NAME}$")
  check_line_exists(${TARGET_FILE} REG_EXP)

  set(${RESULT} ${IS_FOUND} PARENT_SCOPE)
endfunction()

# RunCMake test check helper
function(check_project test name guid type platform)
  set(sln "${RunCMake_TEST_BINARY_DIR}/${test}.sln")
  set(sep "")
  set(failed "")
  if(NOT type)
    set(type 8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942)
  endif()
  if(NOT platform)
    if("${RunCMake_GENERATOR}" MATCHES "Win64")
      set(platform "x64")
    else()
      set(platform "Win32")
    endif()
  endif()
  if(guid)
    check_project_guid("${sln}" "${name}" "${guid}" passed_guid)
    if(NOT passed_guid)
      set(failed "${failed}${sep}${name} solution has no project with expected GUID=${guid}")
      set(sep "\n")
    endif()
  else()
    set(passed_guid 1)
  endif()
  check_project_type("${sln}" "${name}" "${type}" passed_type)
  if(NOT passed_type)
    set(failed "${failed}${sep}${name} solution has no project with expected TYPE=${type}")
    set(sep "\n")
  endif()
  check_custom_platform("${sln}" "${name}" "${platform}" passed_platform)
  if(NOT passed_platform)
    set(failed "${failed}${sep}${name} solution has no project with expected PLATFORM=${platform}")
    set(sep "\n")
  endif()
  set(RunCMake_TEST_FAILED "${failed}" PARENT_SCOPE)
endfunction()