interop.sh (2467B)
1 #!/usr/bin/env bash 2 set -u 3 4 ROOT="$(cd "$(dirname "$0")/../../.." && pwd)" 5 KIT="${KIT:-$ROOT/build/kit}" 6 KITCHEN="$ROOT/test/tier1/kitchen/objlink/interop" 7 WORK="$ROOT/build/test/tier1/objlink/interop" 8 9 mkdir -p "$WORK" 10 11 . "$ROOT/test/lib/kit_sh_report.sh" 12 kit_report_init 13 KIT_SKIP_IS_FAILURE=1 14 15 if [ ! -x "$KIT" ]; then 16 kit_fail "interop/setup" "kit not built at $KIT" 17 kit_summary test-t1-objlink-interop 18 kit_exit 19 fi 20 if ! command -v clang >/dev/null 2>&1; then 21 kit_skip "clang-link" "clang not found" 22 kit_skip "clang-object-kit-link" "clang not found" 23 kit_summary test-t1-objlink-interop 24 kit_exit 25 fi 26 27 run_expect_rc() { 28 local label="$1" want="$2" exe="$3" 29 "$exe" >/dev/null 2>&1 30 local got=$? 31 if [ "$got" -eq "$want" ]; then 32 kit_pass "$label" 33 else 34 kit_fail "$label" "expected rc $want, got $got" 35 fi 36 } 37 38 run_cmd() { 39 local label="$1" log="$2" 40 shift 2 41 if "$@" >"$log" 2>&1; then 42 return 0 43 fi 44 kit_fail "$label" "see $log" 45 return 1 46 } 47 48 kit_obj="$WORK/kit_main.o" 49 clang_obj="$WORK/clang_value.o" 50 clang_exe="$WORK/clang_link.exe" 51 kit_exe="$WORK/kit_link.exe" 52 clang_probe_c="$WORK/clang_probe.c" 53 clang_probe_exe="$WORK/clang_probe.exe" 54 clang_args=() 55 56 case "$(uname -s 2>/dev/null)" in 57 Darwin) 58 sdk="$(xcrun --sdk macosx --show-sdk-path 2>/dev/null || true)" 59 if [ -n "$sdk" ] && [ -d "$sdk" ]; then 60 clang_args=(-isysroot "$sdk") 61 fi ;; 62 Linux) 63 if command -v ld.lld >/dev/null 2>&1; then 64 clang_args=(-fuse-ld=lld) 65 fi ;; 66 esac 67 68 printf '%s\n' 'int main(void) { return 0; }' > "$clang_probe_c" 69 70 run_cmd "kit-object" "$WORK/kit-object.log" \ 71 "$KIT" cc -O0 -c "$KITCHEN/kit_main.c" -o "$kit_obj" 72 run_cmd "clang-object" "$WORK/clang-object.log" \ 73 clang -O0 -c "$KITCHEN/clang_value.c" -o "$clang_obj" 74 75 if [ -f "$kit_obj" ] && [ -f "$clang_obj" ]; then 76 if clang "${clang_args[@]}" "$clang_probe_c" -o "$clang_probe_exe" >"$WORK/clang-link-probe.log" 2>&1; then 77 if run_cmd "clang-link" "$WORK/clang-link.log" \ 78 clang "${clang_args[@]}" "$kit_obj" "$clang_obj" -o "$clang_exe"; then 79 run_expect_rc "clang-link-exec" 42 "$clang_exe" 80 fi 81 else 82 kit_skip "clang-link" "host clang cannot link an executable; see $WORK/clang-link-probe.log" 83 fi 84 if run_cmd "clang-object-kit-link" "$WORK/kit-link.log" \ 85 "$KIT" cc "$kit_obj" "$clang_obj" -o "$kit_exe"; then 86 run_expect_rc "clang-object-kit-link-exec" 42 "$kit_exe" 87 fi 88 fi 89 90 kit_summary test-t1-objlink-interop 91 kit_exit