kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

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 }