Skip to content

Commit d6563ff

Browse files
authored
chore: add buildswiftsdk script as a help builder (#526)
1 parent 238d6c0 commit d6563ff

File tree

1 file changed

+348
-0
lines changed

1 file changed

+348
-0
lines changed

scripts/buildswiftsdk.sh

Lines changed: 348 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,348 @@
1+
#!/bin/bash
2+
3+
# Pre-requisite:
4+
# - Clone the following github repositories to a __single directory__:
5+
# mkdir ~/Projects/SwiftSDK
6+
# cd ~/Projects/SwiftSDK
7+
# git clone [email protected]:awslabs/aws-sdk-swift.git
8+
# git clone [email protected]:awslabs/smithy-swift.git
9+
# git clone --recurse-submodules [email protected]:awslabs/aws-crt-swift.git
10+
#
11+
# Setup Instructions:
12+
# 1. Ensure buildswiftsdk.sh is in your PATH
13+
# 2. Export the environment variable BUILDSWIFTSDK_DIR to point to where you cloned aws-sdk-swift
14+
# For example:
15+
# emacs ~/.bashrc
16+
# export BUILDSWIFTSDK_DIR=/path/to/aws-sdk-swift
17+
#
18+
# Run:
19+
# buildswiftsdk.sh <recipe>
20+
#
21+
# Suggestion:
22+
# You may want to create an alias for this script
23+
# For example:
24+
# alias bss=buildswiftsdk.sh
25+
#
26+
27+
usage() {
28+
echo "Usage:"
29+
echo " buildswiftsdk <recipe>"
30+
}
31+
32+
pushdir() {
33+
if [[ ! -d "${1}" ]]; then
34+
echo "Error: pushdir: invalid directory: ${1}"
35+
exit 1
36+
fi
37+
pushd "${1}" > /dev/null 2>&1
38+
}
39+
40+
popdir() {
41+
popd > /dev/null 2>&1
42+
}
43+
44+
RETURNVAL=
45+
dereference() {
46+
local VAR=$1
47+
if [[ $IS_ZSH -eq 1 ]]; then
48+
RETURNVAL="${(P)VAR}"
49+
else
50+
RETURNVAL="${!VAR}"
51+
fi
52+
}
53+
54+
setupPaths() {
55+
pushdir "${AWS_SDK_SWIFT_DIR_REL}"
56+
AWS_SDK_SWIFT_DIR="${PWD}"
57+
SMITHY_SWIFT_DIR_REL="${PWD}/../smithy-swift"
58+
if [[ -d "${SMITHY_SWIFT_DIR_REL}" ]]; then
59+
pushdir "${SMITHY_SWIFT_DIR_REL}"
60+
SMITHY_SWIFT_DIR="${PWD}"
61+
popdir
62+
fi
63+
CLIENT_RUNTIME_DIR="${SMITHY_SWIFT_DIR}/Packages"
64+
AWS_CLIENT_RUNTIME_DIR="${AWS_SDK_SWIFT_DIR}/AWSClientRuntime"
65+
popdir
66+
BASEPCG="${AWS_SDK_SWIFT_DIR}/codegen/protocol-test-codegen/build/smithyprojections/protocol-test-codegen"
67+
BASEPCGL="${AWS_SDK_SWIFT_DIR}/codegen/protocol-test-codegen-local/build/smithyprojections/protocol-test-codegen-local"
68+
REST_JSON="${BASEPCG}/aws-restjson/swift-codegen"
69+
AWSJSON10="${BASEPCG}/aws-json-10/swift-codegen"
70+
AWSJSON11="${BASEPCG}/aws-json-11/swift-codegen"
71+
REST_XML="${BASEPCG}/rest-xml/swift-codegen"
72+
AWSQUERY="${BASEPCG}/aws-query/swift-codegen"
73+
EC2QUERY="${BASEPCG}/ec2-query/swift-codegen"
74+
}
75+
76+
checkPaths() {
77+
error=0
78+
if [[ ! -d "${SMITHY_SWIFT_DIR}" ]]; then
79+
echo "Was unable to detect smithy-swift"
80+
error=1
81+
fi
82+
if [[ ! -d "${AWS_SDK_SWIFT_DIR}" ]]; then
83+
echo "Was unable to detect where aws-sdk-swift"
84+
error=1
85+
fi
86+
if [[ ${error} -eq 1 ]]; then
87+
exit 1
88+
fi
89+
}
90+
SWIFTLINT=
91+
swiftlintSetup() {
92+
SWIFTLINT=`which swiftlint`
93+
}
94+
95+
AWS_SDK_SWIFT_DIR=""
96+
SMITHY_SWIFT_DIR=""
97+
BASEPCG=""
98+
if [[ -z "${BUILDSWIFTSDK_DIR}" ]]; then
99+
AWS_SDK_SWIFT_DIR_REL=`dirname ${0}`/../
100+
else
101+
AWS_SDK_SWIFT_DIR_REL="${BUILDSWIFTSDK_DIR}"
102+
fi
103+
setupPaths
104+
checkPaths
105+
swiftlintSetup
106+
107+
108+
checkReturn() {
109+
if [ $1 -ne 0 ]; then
110+
echo ""
111+
echo $2
112+
exit 1
113+
fi
114+
}
115+
116+
buildall() {
117+
cd "${SMITHY_SWIFT_DIR}" && ./gradlew build
118+
checkReturn $? "Failed on: ./gradlew build in ${SMITHY_SWIFT_DIR}"
119+
cd "${SMITHY_SWIFT_DIR}/Packages" && swift test
120+
checkReturn $? "Failed on: swift test in ${SMITHY_SWIFT_DIR}/Packages"
121+
cd "${AWS_SDK_SWIFT_DIR}" && ./gradlew build
122+
checkReturn $? "Failed on: ./gradlew build in ${AWS_SDK_SWIFT_DIR}"
123+
cd "${CLIENT_RUNTIME_DIR}" && swift test
124+
checkReturn $? "Failed on: swift test in ${CLIENT_RUNTIME_DIR}"
125+
cd "${AWS_CLIENT_RUNTIME_DIR}" && swift test
126+
checkReturn $? "Failed on: swift test in ${AWS_CLIENT_RUNTIME_DIR}"
127+
cd "${AWS_SDK_SWIFT_DIR}/codegen" && swift test
128+
checkReturn $? "Failed on: swift test in codegen"
129+
}
130+
131+
132+
pcg() {
133+
cd "${SMITHY_SWIFT_DIR}" && \
134+
./gradlew -p smithy-swift-codegen assemble && \
135+
cd "${AWS_SDK_SWIFT_DIR}" && \
136+
./gradlew -p codegen/protocol-test-codegen clean &&\
137+
./gradlew -p codegen/protocol-test-codegen-local clean &&\
138+
./gradlew -p codegen/protocol-test-codegen build &&
139+
./gradlew -p codegen/protocol-test-codegen-local build
140+
echo "Generated files should be in both:"
141+
echo "${BASEPCG}"
142+
echo "${BASEPCGL}"
143+
}
144+
145+
rpcg() {
146+
if [ -z $1 ]; then
147+
RUNDIRS="${AWS_SDK_SWIFT_DIR}/codegen"
148+
elif [ x$1 == x"rj" ]; then
149+
RUNDIRS="${REST_JSON}"
150+
elif [ x$1 == x"10" ]; then
151+
RUNDIRS="${AWSJSON10}"
152+
elif [ x$1 == x"11" ]; then
153+
RUNDIRS="${AWSJSON11}"
154+
elif [ x$1 == x"rx" ]; then
155+
RUNDIRS="${REST_XML}"
156+
elif [ x$1 == x"aq" ]; then
157+
RUNDIRS="${AWSQUERY}"
158+
elif [ x$1 == x"e2" ]; then
159+
RUNDIRS="${EC2QUERY}"
160+
fi
161+
162+
FAILEDDIRS=""
163+
for codegendir in ${RUNDIRS}; do
164+
echo "entering: ${codegendir}"
165+
cd ${codegendir} && swift test
166+
RETVAL=$?
167+
if [ $RETVAL -ne 0 ]; then
168+
temp="${FAILEDDIRS} ${codegendir}"
169+
FAILEDDIRS="${temp}"
170+
fi
171+
done
172+
173+
ATTEMPTED_DISPLAYDIRS_ABS=`echo ${RUNDIRS}|tr ' ' '\n'`
174+
ATTEMPTED_DISPLAYDIRS=`echo ${RUNDIRS}|tr ' ' '\n' |sed "s/.*protocol-test-codegen\/\(.*\)\/swift-codegen/\1/g"`
175+
FAILED_DISPLAYDIRS=`echo ${FAILEDDIRS}|tr ' ' '\n' |sed "s/.*protocol-test-codegen\/\(.*\)\/swift-codegen/\1/g"`
176+
177+
echo ""
178+
echo ""
179+
echo "SUMMARY:"
180+
echo ""
181+
echo "Attempted (Absolute Path):"
182+
echo "${ATTEMPTED_DISPLAYDIRS_ABS}"
183+
echo ""
184+
echo "Attempted (friendly names):"
185+
echo "${ATTEMPTED_DISPLAYDIRS}"
186+
echo ""
187+
if [[ x"${FAILEDDIRS}" != x"" ]]; then
188+
echo "FAILED for:"
189+
echo "${FAILED_DISPLAYDIRS}"
190+
else
191+
echo "SUCCESS!"
192+
fi
193+
}
194+
195+
SDK_cognito=cognito-identity.2014-06-30
196+
SDK_lambda=lambda.2015-03-31
197+
SDK_s3=s3.2006-03-01
198+
SDK_swf=swf.2012-01-25
199+
SDK_ssm=ssm-incidents.2018-05-10
200+
sdk() {
201+
SDKREF=$1
202+
SDK_POINTER="SDK_${SDKREF}"
203+
dereference "${SDK_POINTER}"
204+
SDK_ONLY="${RETURNVAL}"
205+
206+
if [[ ! -z "${SDK_ONLY}" ]]; then
207+
PROPFILE=${AWS_SDK_SWIFT_DIR}/local.properties
208+
cat "${PROPFILE}" | grep -e "^onlyIncludeModels" | tail -1 | grep -e "^onlyIncludeModels=${SDK_ONLY}" > /dev/null 2>&1
209+
if [ $? -ne 0 ]; then
210+
cat "${PROPFILE}" | grep -e "^onlyIncludeModels" > /dev/null 2>&1
211+
HAS_INCLUDE_MODELS=$?
212+
LOCAL_PROPS_FILE="${AWS_SDK_SWIFT_DIR}/local.properties"
213+
if [ ${HAS_INCLUDE_MODELS} -eq 0 ]; then
214+
LOCALTEMP=/tmp/.buildswiftsdktemp
215+
sed "s/^onlyIncludeModels=.*/onlyIncludeModels=${SDK_ONLY}/g" "${LOCAL_PROPS_FILE}" > ${LOCALTEMP}
216+
echo "" >> ${LOCALTEMP}
217+
SUFFIX=`date "+%Y%m%d%H%M%S"`
218+
mv "${LOCAL_PROPS_FILE}" "${LOCAL_PROPS_FILE}.${SUFFIX}"
219+
mv "${LOCALTEMP}" "${LOCAL_PROPS_FILE}"
220+
else
221+
echo "onlyIncludeModels=${SDK_ONLY}" >> ${LOCAL_PROPS_FILE}
222+
echo "" >> ${LOCAL_PROPS_FILE}
223+
fi
224+
fi
225+
fi
226+
227+
cd "${AWS_SDK_SWIFT_DIR}" && \
228+
./gradlew -p codegen/sdk-codegen build
229+
230+
CODEGEN_OUTPUT_DIR="${AWS_SDK_SWIFT_DIR}/codegen/sdk-codegen/build/smithyprojections/sdk-codegen"
231+
SDK_OUTPUT=`ls ${CODEGEN_OUTPUT_DIR} |grep -v "source"`
232+
if [ ! -z "${SDK_OUTPUT}" ]; then
233+
echo "Artifacts folder(s):"
234+
for sdk in ${SDK_OUTPUT}; do
235+
echo "${CODEGEN_OUTPUT_DIR}/${sdk}/swift-codegen"
236+
done
237+
else
238+
echo "Build folder:"
239+
echo "${CODEGEN_OUTPUT_DIR}"
240+
fi
241+
link
242+
}
243+
244+
link() {
245+
PROJ_DIR="${AWS_SDK_SWIFT_DIR}/codegen/sdk-codegen/build/smithyprojections/sdk-codegen"
246+
PROJECTIONS=`ls ${PROJ_DIR}|grep -v source`
247+
for projection in ${PROJECTIONS}; do
248+
projName=`echo ${projection} | tr '.' ' '| awk '{print $1}'`
249+
cd ${PROJ_DIR}/${projection} && ln -vs swift-codegen ${projName}
250+
done
251+
}
252+
253+
lint() {
254+
klint
255+
slint
256+
}
257+
258+
klint() {
259+
cd "${AWS_SDK_SWIFT_DIR}" && \
260+
./gradlew ktlintFormat
261+
cd "${SMITHY_SWIFT_DIR}" && \
262+
./gradlew ktlintFormat
263+
}
264+
265+
slint() {
266+
if [[ ! -z "${SWIFTLINT}" ]]; then
267+
cd "${AWS_CLIENT_RUNTIME_DIR}" && "${SWIFTLINT}" autocorrect
268+
cd "${CLIENT_RUNTIME_DIR}" && "${SWIFTLINT}" autocorrect
269+
else
270+
echo "swiftlint not installed, skipping"
271+
fi
272+
}
273+
274+
ssclean() {
275+
cd "${SMITHY_SWIFT_DIR}" && \
276+
./gradlew clean
277+
}
278+
279+
sdkclean() {
280+
cd "${AWS_SDK_SWIFT_DIR}" && \
281+
./gradlew clean
282+
}
283+
284+
clean() {
285+
ssclean && sdkclean
286+
}
287+
288+
checkIfServiceDefined() {
289+
SDKREF=$1
290+
SDK_POINTER="SDK_${SDKREF}"
291+
dereference "${SDK_POINTER}"
292+
SDK_ONLY="${RETURNVAL}"
293+
if [ x"" != x"${SDK_ONLY}" ]; then
294+
RETURNVAL=0
295+
else
296+
RETURNVAL=1
297+
fi
298+
299+
}
300+
301+
interpretArgs() {
302+
case "$1" in
303+
"b")
304+
buildall
305+
;;
306+
"pcg")
307+
pcg
308+
;;
309+
"rpcg")
310+
rpcg $2
311+
;;
312+
"clean")
313+
clean
314+
;;
315+
"sdk")
316+
sdk $2
317+
;;
318+
"link")
319+
link
320+
;;
321+
"lint")
322+
lint
323+
;;
324+
"klint")
325+
klint
326+
;;
327+
"slint")
328+
slint
329+
;;
330+
"ssclean")
331+
ssclean
332+
;;
333+
"sdkclean")
334+
sdkclean
335+
;;
336+
*)
337+
usage
338+
;;
339+
esac
340+
}
341+
342+
checkIfServiceDefined $1
343+
if [ ${RETURNVAL} -eq 0 ]; then
344+
sdk $1
345+
else
346+
interpretArgs $*
347+
fi
348+

0 commit comments

Comments
 (0)