@@ -80,12 +80,112 @@ NC='\033[0m' # No Color
8080echo -e " ${BLUE} === MigTD Custom Policy Builder ===${NC} "
8181echo
8282
83+ print_error () {
84+ printf ' %b\n' " ${RED} Error: $1 ${NC} " >&2
85+ }
86+
87+ print_hint_header () {
88+ printf ' %b\n' " ${YELLOW} $1 ${NC} " >&2
89+ }
90+
91+ print_hint_lines () {
92+ local hint
93+ for hint in " $@ " ; do
94+ printf ' %s\n' " $hint " >&2
95+ done
96+ }
97+
98+ require_cmd () {
99+ local cmd=" $1 "
100+ local error_message=" $2 "
101+ local hint_header=" $3 "
102+ shift 3
103+
104+ if ! command -v " $cmd " > /dev/null 2>&1 ; then
105+ print_error " $error_message "
106+ print_hint_header " $hint_header "
107+ print_hint_lines " $@ "
108+ exit 127
109+ fi
110+ }
111+
112+ require_pkg_config_module () {
113+ local module=" $1 "
114+ local error_message=" $2 "
115+ local hint_header=" $3 "
116+ shift 3
117+
118+ if ! pkg-config --exists " $module " > /dev/null 2>&1 ; then
119+ print_error " $error_message "
120+ print_hint_header " $hint_header "
121+ print_hint_lines " $@ "
122+ exit 127
123+ fi
124+ }
125+
83126# Default paths
84127PROJECT_ROOT=" $( cd " $( dirname " ${BASH_SOURCE[0]} " ) /.." && pwd) "
85128SOURCE_MATERIAL_DIR=" $PROJECT_ROOT /config/AzCVMEmu"
86129OUTPUT_DIR=" $PROJECT_ROOT /config/AzCVMEmu"
87130TEMP_DIR=$( mktemp -d)
88131TOOLS_DIR=" $PROJECT_ROOT /target/release"
132+ AZCVM_EXTRACT_REPORT_LOCAL_BIN=" $PROJECT_ROOT /deps/td-shim-AzCVMEmu/azcvm-extract-report/target/release/azcvm-extract-report"
133+ AZCVM_EXTRACT_REPORT_WORKSPACE_BIN=" $TOOLS_DIR /azcvm-extract-report"
134+ AZCVM_EXTRACT_REPORT_BIN=" "
135+
136+ # Ensure cargo is available (try loading rustup env first).
137+ if ! command -v cargo > /dev/null 2>&1 ; then
138+ if [ -f " $HOME /.cargo/env" ]; then
139+ # shellcheck source=/dev/null
140+ . " $HOME /.cargo/env"
141+ fi
142+ fi
143+
144+ require_cmd \
145+ cargo \
146+ " cargo not found in PATH." \
147+ " Install Rust toolchain and reload your shell (platform-specific):" \
148+ " Cross-platform (recommended): https://rustup.rs" \
149+ " Debian/Ubuntu: sudo apt install -y rustup" \
150+ " rustup default stable" \
151+ " source \"\$ HOME/.cargo/env\" " \
152+ " ./sh_script/build_AzCVMEmu_policy_and_test.sh --mock-report"
153+
154+ require_cmd \
155+ pkg-config \
156+ " pkg-config not found in PATH." \
157+ " Install required build dependencies (platform-specific):" \
158+ " Debian/Ubuntu: sudo apt install -y pkg-config libtss2-dev"
159+
160+ require_pkg_config_module \
161+ tss2-sys \
162+ " TPM2 system library 'tss2-sys' not found." \
163+ " Install required TPM2 development package (platform-specific):" \
164+ " Debian/Ubuntu: sudo apt install -y libtss2-dev"
165+
166+ require_cmd \
167+ nasm \
168+ " nasm not found in PATH." \
169+ " Install required assembler dependency (platform-specific):" \
170+ " Debian/Ubuntu: sudo apt install -y nasm"
171+
172+ require_cmd \
173+ unzip \
174+ " unzip not found in PATH." \
175+ " Install required archive extraction tool (platform-specific):" \
176+ " Debian/Ubuntu: sudo apt install -y unzip"
177+
178+ require_cmd \
179+ autoreconf \
180+ " autoreconf not found in PATH." \
181+ " Install required autotools dependencies (platform-specific):" \
182+ " Debian/Ubuntu: sudo apt install -y autoconf automake libtool"
183+
184+ require_cmd \
185+ ocamlbuild \
186+ " ocamlbuild not found in PATH." \
187+ " Install required OCaml build tools (platform-specific):" \
188+ " Debian/Ubuntu: sudo apt install -y ocaml ocamlbuild"
89189
90190# Input Files
91191POLICY_DATA_RAW=" $SOURCE_MATERIAL_DIR /policy_v2_raw.json"
@@ -376,21 +476,40 @@ echo -e "${BLUE}=== Step 1: Building Tools ===${NC}"
376476cd " $PROJECT_ROOT "
377477
378478echo " Building azcvm-extract-report (from deps/td-shim-AzCVMEmu)..."
379- (cd deps/td-shim-AzCVMEmu/azcvm-extract-report && cargo build --release) 2>&1 | grep -E " (Compiling|Finished|error)" || true
479+ if ! (cd deps/td-shim-AzCVMEmu/azcvm-extract-report && cargo build --release); then
480+ echo -e " ${RED} Error: Failed to build azcvm-extract-report${NC} " >&2
481+ exit 1
482+ fi
380483
381484echo " Building json-signer..."
382- cargo build --release -p json-signer 2>&1 | grep -E " (Compiling|Finished|error)" || true
485+ if ! cargo build --release -p json-signer; then
486+ echo -e " ${RED} Error: Failed to build json-signer${NC} " >&2
487+ exit 1
488+ fi
383489
384490echo " Building servtd-collateral-generator..."
385- cargo build --release -p servtd-collateral-generator 2>&1 | grep -E " (Compiling|Finished|error)" || true
491+ if ! cargo build --release -p servtd-collateral-generator; then
492+ echo -e " ${RED} Error: Failed to build servtd-collateral-generator${NC} " >&2
493+ exit 1
494+ fi
386495
387496echo " Building migtd-policy-generator..."
388- cargo build --release -p migtd-policy-generator 2>&1 | grep -E " (Compiling|Finished|error)" || true
497+ if ! cargo build --release -p migtd-policy-generator; then
498+ echo -e " ${RED} Error: Failed to build migtd-policy-generator${NC} " >&2
499+ exit 1
500+ fi
389501
390502# Verify tools exist
391- # Note: azcvm-extract-report is in a different location
392- if [ ! -f " $PROJECT_ROOT /deps/td-shim-AzCVMEmu/azcvm-extract-report/target/release/azcvm-extract-report" ]; then
393- echo -e " ${RED} Error: Tool 'azcvm-extract-report' not found${NC} " >&2
503+ # azcvm-extract-report may be emitted either to the local crate target/ or the
504+ # workspace target/ when CARGO_TARGET_DIR is set.
505+ if [ -f " $AZCVM_EXTRACT_REPORT_LOCAL_BIN " ]; then
506+ AZCVM_EXTRACT_REPORT_BIN=" $AZCVM_EXTRACT_REPORT_LOCAL_BIN "
507+ elif [ -f " $AZCVM_EXTRACT_REPORT_WORKSPACE_BIN " ]; then
508+ AZCVM_EXTRACT_REPORT_BIN=" $AZCVM_EXTRACT_REPORT_WORKSPACE_BIN "
509+ else
510+ echo -e " ${RED} Error: Tool 'azcvm-extract-report' not found at either:${NC} " >&2
511+ echo -e " ${RED} - $AZCVM_EXTRACT_REPORT_LOCAL_BIN ${NC} " >&2
512+ echo -e " ${RED} - $AZCVM_EXTRACT_REPORT_WORKSPACE_BIN ${NC} " >&2
394513 exit 1
395514fi
396515
@@ -424,7 +543,7 @@ if [ "$USE_MOCK_REPORT" = true ]; then
424543 export MOCK_QUOTE_FILE
425544 fi
426545
427- " $PROJECT_ROOT /deps/td-shim-AzCVMEmu/azcvm-extract-report/target/release/azcvm-extract-report " \
546+ " $AZCVM_EXTRACT_REPORT_BIN " \
428547 --mock-report \
429548 --output-json " migtd_report_data.json"
430549
@@ -436,7 +555,7 @@ if [ "$USE_MOCK_REPORT" = true ]; then
436555else
437556 # Use sudo to access vTPM device (requires /dev/tpmrm0 access)
438557 echo " Note: Using sudo to access vTPM device..."
439- sudo " $PROJECT_ROOT /deps/td-shim-AzCVMEmu/azcvm-extract-report/target/release/azcvm-extract-report "
558+ sudo " $AZCVM_EXTRACT_REPORT_BIN "
440559
441560 # Report extractor creates migtd_report_data.json in current directory
442561 if [ ! -f " migtd_report_data.json" ]; then
0 commit comments