File: compile_testing_protos.sh

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (136 lines) | stat: -rwxr-xr-x 4,881 bytes parent folder | download | duplicates (7)
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
#!/bin/bash -eu
# Invoked by the Xcode projects to build the protos needed for the unittests.

readonly OUTPUT_DIR="${PROJECT_DERIVED_FILE_DIR}/protos"

# -----------------------------------------------------------------------------
# Helper for bailing.
die() {
  echo "Error: $1"
  exit 2
}

# -----------------------------------------------------------------------------
# What to do.
case "${ACTION}" in
  "")
    # Build, fall thru
    ;;
  "clean")
    rm -rf "${OUTPUT_DIR}"
    exit 0
    ;;
  *)
    die "Unknown action requested: ${ACTION}"
    ;;
esac

# -----------------------------------------------------------------------------
# The objc unittest specific proto files.

OBJC_TEST_PROTO_FILES=(
  objectivec/Tests/any_test.proto
  objectivec/Tests/map_proto2_unittest.proto
  objectivec/Tests/map_unittest.proto
  objectivec/Tests/unittest_cycle.proto
  objectivec/Tests/unittest_deprecated_file.proto
  objectivec/Tests/unittest_deprecated.proto
  objectivec/Tests/unittest_extension_chain_a.proto
  objectivec/Tests/unittest_extension_chain_b.proto
  objectivec/Tests/unittest_extension_chain_c.proto
  objectivec/Tests/unittest_extension_chain_d.proto
  objectivec/Tests/unittest_extension_chain_e.proto
  objectivec/Tests/unittest_extension_chain_f.proto
  objectivec/Tests/unittest_extension_chain_g.proto
  objectivec/Tests/unittest_import_public.proto
  objectivec/Tests/unittest_import.proto
  objectivec/Tests/unittest_mset.proto
  objectivec/Tests/unittest_objc_options.proto
  objectivec/Tests/unittest_objc_startup.proto
  objectivec/Tests/unittest_objc.proto
  objectivec/Tests/unittest_preserve_unknown_enum.proto
  objectivec/Tests/unittest_runtime_proto2.proto
  objectivec/Tests/unittest_runtime_proto3.proto
  objectivec/Tests/unittest.proto
)

OBJC_EXTENSIONS=( .pbobjc.h .pbobjc.m )

# -----------------------------------------------------------------------------
# Ensure the output dir exists
mkdir -p "${OUTPUT_DIR}"

# -----------------------------------------------------------------------------
# Move to the top of the protobuf directories and ensure there is a protoc
# binary to use.
cd "${SRCROOT}/.."
readonly PROTOC="bazel-bin/protoc"
[[ -x "${PROTOC}" ]] || \
  die "Could not find the protoc binary; make sure you have built it (objectivec/DevTools/full_mac_build.sh -h)."

# -----------------------------------------------------------------------------
RUN_PROTOC=no

# Check to if all the output files exist (in case a new one got added).

for PROTO_FILE in "${OBJC_TEST_PROTO_FILES[@]}"; do
  DIR=${PROTO_FILE%/*}
  BASE_NAME=${PROTO_FILE##*/}
  # Drop the extension
  BASE_NAME=${BASE_NAME%.*}
  OBJC_NAME=$(echo "${BASE_NAME}" | awk -F _ '{for(i=1; i<=NF; i++) printf "%s", toupper(substr($i,1,1)) substr($i,2);}')

  for EXT in "${OBJC_EXTENSIONS[@]}"; do
    if [[ ! -f "${OUTPUT_DIR}/${DIR}/${OBJC_NAME}${EXT}" ]]; then
      RUN_PROTOC=yes
    fi
  done
done

# If we haven't decided to run protoc because of a missing file, check to see if
# an input has changed.
if [[ "${RUN_PROTOC}" != "yes" ]] ; then
  # Find the newest input file (protos, compiler, and this script).
  # (these patterns catch some extra stuff, but better to over sample than
  # under)
  readonly NewestInput=$(find \
     objectivec/Tests/*.proto "${PROTOC}" \
     objectivec/DevTools/compile_testing_protos.sh \
        -type f -print0 \
        | xargs -0 stat -f "%m %N" \
        | sort -n | tail -n1 | cut -f2- -d" ")
  # Find the oldest output file.
  readonly OldestOutput=$(find \
        "${OUTPUT_DIR}" \
        -type f -name "*.pbobjc.[hm]" -print0 \
        | xargs -0 stat -f "%m %N" \
        | sort -n -r | tail -n1 | cut -f2- -d" ")
  # If the newest input is newer than the oldest output, regenerate.
  if [[ "${NewestInput}" -nt "${OldestOutput}" ]] ; then
    RUN_PROTOC=yes
  fi
fi

if [[ "${RUN_PROTOC}" != "yes" ]] ; then
  # Up to date.
  exit 0
fi

# -----------------------------------------------------------------------------
# Prune out all the files from previous generations to ensure we only have
# current ones.
find "${OUTPUT_DIR}" \
    -type f -name "*.pbobjc.[hm]" -print0 \
    | xargs -0 rm -rf

# -----------------------------------------------------------------------------
# Generate the Objective C specific testing protos.

"${PROTOC}"                                                                 \
  --objc_out="${OUTPUT_DIR}"                                                \
  --objc_opt=expected_prefixes_path=objectivec/Tests/expected_prefixes.txt  \
  --objc_opt=prefixes_must_be_registered=yes                                \
  --objc_opt=require_prefixes=yes                                           \
  --proto_path=.                                                            \
  --proto_path=src                                                          \
  "${OBJC_TEST_PROTO_FILES[@]}"