api.sh (4544B)
1 #!/bin/sh 2 3 audit_api_fixture_dir=$SCRIPT_DIR/fixtures 4 5 audit_api_require_dist() { 6 if [ -z "$HARNESS_DIST" ]; then 7 audit_case_blocked "language API workflows require --dist for include/, lib/, and support/" 8 return 1 9 fi 10 for audit_api_component in include lib/libkit.a support; do 11 if [ ! -e "$HARNESS_DIST/$audit_api_component" ]; then 12 audit_case_blocked "distribution component is missing: $HARNESS_DIST/$audit_api_component" 13 return 1 14 fi 15 done 16 return 0 17 } 18 19 audit_api_discover_sysroot() { 20 audit_case_step_exec_kit discover-sysroot cc \ 21 --support-dir "$HARNESS_DIST/support" -print-sysroot 22 audit_expect_exit 0 23 audit_expect_stderr_empty 24 audit_expect_stdout_nonempty 25 AUDIT_API_SYSROOT= 26 IFS= read -r AUDIT_API_SYSROOT < "$CASE_ACTIVE_DIR/stdout" || : 27 if [ -z "$AUDIT_API_SYSROOT" ] || [ ! -d "$AUDIT_API_SYSROOT" ]; then 28 audit_check_fail "native SDK reported by -print-sysroot is unavailable: $AUDIT_API_SYSROOT" 29 return 1 30 fi 31 audit_check_pass "native SDK exists: $AUDIT_API_SYSROOT" 32 return 0 33 } 34 35 audit_api_copy_fixture() { 36 audit_api_name=$1 37 printf 'cp %s %s\n' \ 38 "$audit_api_fixture_dir/$audit_api_name" "$CASE_DIR/work/$audit_api_name" \ 39 >> "$CASE_DIR/setup.command" 40 if ! cp "$audit_api_fixture_dir/$audit_api_name" "$CASE_DIR/work/$audit_api_name" \ 41 >> "$CASE_DIR/setup.stdout" 2>> "$CASE_DIR/setup.stderr"; then 42 audit_case_blocked "could not stage fixture $audit_api_name" 43 return 1 44 fi 45 return 0 46 } 47 48 audit_api_headers() { 49 if ! audit_case_start api.public-headers api cc header-self-sufficiency native native native p1; then 50 return 51 fi 52 audit_api_require_dist || return 53 audit_api_discover_sysroot || { 54 audit_case_finish 55 return 56 } 57 58 audit_api_header_list=$CASE_DIR/artifacts/public-headers.txt 59 find "$HARNESS_DIST/include" -type f -name '*.h' -print | sort \ 60 > "$audit_api_header_list" 2> "$CASE_DIR/setup.stderr" 61 audit_api_header_count=0 62 while IFS= read -r audit_api_header_path; do 63 audit_api_header_count=$((audit_api_header_count + 1)) 64 audit_api_header_rel=${audit_api_header_path#"$HARNESS_DIST/include/"} 65 audit_api_header_safe=$(printf '%s' "$audit_api_header_rel" | tr '/.-' '___') 66 audit_api_probe=$CASE_DIR/work/header-$audit_api_header_safe.c 67 printf '#include <%s>\n' "$audit_api_header_rel" > "$audit_api_probe" 68 69 audit_case_step_exec_kit "header-$audit_api_header_safe" cc \ 70 --support-dir "$HARNESS_DIST/support" --sysroot "$AUDIT_API_SYSROOT" \ 71 -I "$HARNESS_DIST/include" -fsyntax-only "$audit_api_probe" 72 audit_expect_exit 0 73 audit_expect_stderr_empty 74 done < "$audit_api_header_list" 75 if [ "$audit_api_header_count" -eq 0 ]; then 76 audit_check_fail "no public headers found below $HARNESS_DIST/include" 77 else 78 audit_check_pass "audited $audit_api_header_count public headers" 79 fi 80 audit_case_finish 81 } 82 83 audit_api_program() { 84 audit_api_id=$1 85 audit_api_fixture=$2 86 audit_api_workflow=$3 87 if ! audit_case_start "$audit_api_id" api cc,libkit "$audit_api_workflow" native native native p1; then 88 return 89 fi 90 audit_api_require_dist || return 91 audit_api_copy_fixture "$audit_api_fixture" || return 92 audit_api_discover_sysroot || { 93 audit_case_finish 94 return 95 } 96 97 audit_api_executable=${audit_api_fixture%.c} 98 audit_case_step_exec_kit build cc \ 99 --support-dir "$HARNESS_DIST/support" --sysroot "$AUDIT_API_SYSROOT" \ 100 -fno-stack-protector -I "$HARNESS_DIST/include" \ 101 "$audit_api_fixture" "$HARNESS_DIST/lib/libkit.a" \ 102 -o "$CASE_DIR/artifacts/$audit_api_executable" 103 audit_expect_exit 0 104 audit_expect_stderr_empty 105 audit_expect_file_nonempty "$CASE_DIR/artifacts/$audit_api_executable" 106 107 if [ -f "$CASE_DIR/artifacts/$audit_api_executable" ]; then 108 audit_case_step_exec run "$CASE_DIR/artifacts/$audit_api_executable" 109 audit_expect_exit 0 110 audit_expect_stderr_empty 111 fi 112 audit_case_finish 113 } 114 115 audit_module_api() { 116 audit_api_headers 117 audit_api_program api.context-lifecycle api_context.c context-target-compiler 118 audit_api_program api.compile-session-link api_compile_session.c source-session-link 119 audit_api_program api.frontend-link api_frontend.c cg-object-link 120 audit_api_program api.diagnostic-sink api_diagnostic.c diagnostics 121 }