-
Notifications
You must be signed in to change notification settings - Fork 6.7k
/
Copy pathvcpkg_execute_required_process.cmake
144 lines (134 loc) · 5.27 KB
/
vcpkg_execute_required_process.cmake
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
function(vcpkg_execute_required_process)
cmake_parse_arguments(PARSE_ARGV 0 arg
"ALLOW_IN_DOWNLOAD_MODE;OUTPUT_STRIP_TRAILING_WHITESPACE;ERROR_STRIP_TRAILING_WHITESPACE"
"WORKING_DIRECTORY;LOGNAME;TIMEOUT;OUTPUT_VARIABLE;ERROR_VARIABLE"
"COMMAND;SAVE_LOG_FILES"
)
if(DEFINED arg_UNPARSED_ARGUMENTS)
message(WARNING "${CMAKE_CURRENT_FUNCTION} was passed extra arguments: ${arg_UNPARSED_ARGUMENTS}")
endif()
foreach(required_arg IN ITEMS WORKING_DIRECTORY COMMAND)
if(NOT DEFINED arg_${required_arg})
message(FATAL_ERROR "${required_arg} must be specified.")
endif()
endforeach()
if(NOT DEFINED arg_LOGNAME)
message(WARNING "LOGNAME should be specified.")
set(arg_LOGNAME "required")
endif()
if (VCPKG_DOWNLOAD_MODE AND NOT arg_ALLOW_IN_DOWNLOAD_MODE)
message(FATAL_ERROR
[[
This command cannot be executed in Download Mode.
Halting portfile execution.
]])
endif()
set(timeout_param "")
if(DEFINED arg_TIMEOUT)
set(timeout_param TIMEOUT "${arg_TIMEOUT}")
endif()
set(log_out "${CURRENT_BUILDTREES_DIR}/${arg_LOGNAME}-out.log")
set(log_err "${CURRENT_BUILDTREES_DIR}/${arg_LOGNAME}-err.log")
set(output_param OUTPUT_FILE "${log_out}")
set(error_param ERROR_FILE "${log_err}")
set(output_and_error_same OFF)
if(DEFINED arg_OUTPUT_VARIABLE AND DEFINED arg_ERROR_VARIABLE AND arg_OUTPUT_VARIABLE STREQUAL arg_ERROR_VARIABLE)
set(output_param OUTPUT_VARIABLE out_err_var)
set(error_param ERROR_VARIABLE out_err_var)
set(output_and_error_same ON)
else()
if(DEFINED arg_OUTPUT_VARIABLE)
set(output_param OUTPUT_VARIABLE out_var)
endif()
if(DEFINED arg_ERROR_VARIABLE)
set(error_param ERROR_VARIABLE err_var)
endif()
endif()
if(arg_OUTPUT_STRIP_TRAILING_WHITESPACE)
list(APPEND output_param OUTPUT_STRIP_TRAILING_WHITESPACE)
endif()
if(arg_ERROR_STRIP_TRAILING_WHITESPACE)
list(APPEND error_param ERROR_STRIP_TRAILING_WHITESPACE)
endif()
if(X_PORT_PROFILE AND NOT arg_ALLOW_IN_DOWNLOAD_MODE)
vcpkg_list(PREPEND arg_COMMAND "${CMAKE_COMMAND}" "-E" "time")
endif()
vcpkg_execute_in_download_mode(
COMMAND ${arg_COMMAND}
RESULT_VARIABLE error_code
WORKING_DIRECTORY "${arg_WORKING_DIRECTORY}"
${timeout_param}
${output_param}
${error_param}
)
if(output_and_error_same)
file(WRITE "${log_out}" "${out_err_var}")
file(WRITE "${log_err}" "")
else()
if(DEFINED arg_OUTPUT_VARIABLE)
file(WRITE "${log_out}" "${out_var}")
endif()
if(DEFINED arg_ERROR_VARIABLE)
file(WRITE "${log_err}" "${err_var}")
endif()
endif()
vcpkg_list(SET logfiles)
vcpkg_list(SET logfile_copies)
set(expect_alias FALSE)
foreach(item IN LISTS arg_SAVE_LOG_FILES)
if(expect_alias)
vcpkg_list(POP_BACK logfile_copies)
vcpkg_list(APPEND logfile_copies "${CURRENT_BUILDTREES_DIR}/${arg_LOGNAME}-${item}")
set(expect_alias FALSE)
elseif(item STREQUAL "ALIAS")
if(NOT logfiles)
message(FATAL_ERROR "ALIAS used without source file")
endif()
set(expect_alias TRUE)
else()
vcpkg_list(APPEND logfiles "${arg_WORKING_DIRECTORY}/${item}")
cmake_path(GET item FILENAME filename)
if(NOT filename MATCHES "[.]log\$")
string(APPEND filename ".log")
endif()
vcpkg_list(APPEND logfile_copies "${CURRENT_BUILDTREES_DIR}/${arg_LOGNAME}-${filename}")
endif()
endforeach()
vcpkg_list(SET saved_logs)
foreach(logfile logfile_copy IN ZIP_LISTS logfiles logfile_copies)
if(EXISTS "${logfile}")
configure_file("${logfile}" "${logfile_copy}" COPYONLY)
vcpkg_list(APPEND saved_logs "${logfile_copy}")
endif()
endforeach()
if(NOT error_code EQUAL 0)
set(stringified_logs "")
foreach(log IN LISTS saved_logs ITEMS "${log_out}" "${log_err}")
if(NOT EXISTS "${log}")
continue()
endif()
file(SIZE "${log}" log_size)
if(NOT log_size EQUAL "0")
file(TO_NATIVE_PATH "${log}" native_log)
string(APPEND stringified_logs " ${native_log}\n")
file(APPEND "${Z_VCPKG_ERROR_LOG_COLLECTION_FILE}" "${native_log}\n")
endif()
endforeach()
z_vcpkg_prettify_command_line(pretty_command ${arg_COMMAND})
message(FATAL_ERROR
" Command failed: ${pretty_command}\n"
" Working Directory: ${arg_WORKING_DIRECTORY}\n"
" Error code: ${error_code}\n"
" See logs for more information:\n"
"${stringified_logs}"
)
endif()
# pass output parameters back to caller's scope
if(output_and_error_same)
z_vcpkg_forward_output_variable(arg_OUTPUT_VARIABLE out_err_var)
# arg_ERROR_VARIABLE = arg_OUTPUT_VARIABLE, so no need to set it again
else()
z_vcpkg_forward_output_variable(arg_OUTPUT_VARIABLE out_var)
z_vcpkg_forward_output_variable(arg_ERROR_VARIABLE err_var)
endif()
endfunction()