-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathbuild-workspace-target.sh
executable file
·177 lines (149 loc) · 5.01 KB
/
build-workspace-target.sh
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#!/bin/bash
# Script origins were https://github.com/couchbase/couchbase-lite-ios/blob/master/Scripts/build_framework.sh
# but has heavily diverged since.
set -e
function usage
{
echo "Usage: ${0} -s <Scheme> -o <Output Directory: default 'build'> -d <Framework Destination>"
}
while [[ $# -gt 0 ]]
do
key=${1}
case $key in
-s)
SCHEME=${2}
shift
;;
-o)
OUTPUT_DIR=${2}
shift
;;
-d)
DESTINATION_DIR=${2}
shift
;;
--quiet)
QUIET="Y"
;;
*)
usage
exit 3
;;
esac
shift
done
if [ -z "$SCHEME" ]
then
usage
exit 4
fi
CONFIGURATION="Release"
PLATFORM_NAME="ios"
SDKS=("iphoneos" "iphonesimulator")
PLATFORM_NAME="iOS"
if [ -z "$DESTINATION_DIR" ]
then
DESTINATION_DIR="../swift-framework/Frameworks"
fi
if [ -z "$OUTPUT_DIR" ]
then
OUTPUT_DIR="build"
fi
echo "Scheme: ${SCHEME}"
echo "Configuration : ${CONFIGURATION}"
echo "Platform: ${PLATFORM_NAME}"
echo "Output Directory: ${OUTPUT_DIR}"
echo "Destination Directory: ${DESTINATION_DIR}"
OUTPUT_BASE_DIR=${OUTPUT_DIR}/${SCHEME}/${PLATFORM_NAME}
OUTPUT_SIMULATOR_BASE_DIR=${OUTPUT_DIR}/${SCHEME}/${PLATFORM_NAME}/iphonesimulator
rm -rf "${OUTPUT_BASE_DIR}"
ROUND=0
OUTPUT_BINS=()
OUTPUT_SWIFT_MODULES=()
# Building all frameworks based on the SDK list:
for SDK in "${SDKS[@]}"
do
echo "Running xcodebuild on scheme=${SCHEME} configuration=${CONFIGURATION} and sdk=${SDK} ..."
ACTION="build"
if [[ ${ROUND} == 0 ]]
then
ACTION="clean build"
fi
xcodebuild -workspace "Fritz.xcworkspace" -scheme "${SCHEME}" -configuration "${CONFIGURATION}" -sdk ${SDK} "ONLY_ACTIVE_ARCH=NO" "BITCODE_GENERATION_MODE=bitcode" "CODE_SIGNING_REQUIRED=NO" "CODE_SIGN_IDENTITY=" ${ACTION} ${QUIET}
echo "Finished building SDK $SDK"
ROUND=$((ROUND + 1))
done
TARGETS=( $(xcodebuild -workspace "Fritz.xcworkspace" -scheme "${SCHEME}" -configuration ${CONFIGURATION} -showBuildSettings | grep TARGETNAME | awk '{print $3}') )
BUILD_ROOT=`xcodebuild -workspace "Fritz.xcworkspace" -scheme "${SCHEME}" -configuration "${CONFIGURATION}" -showBuildSettings|grep -w BUILD_ROOT|head -n 1|awk '{ print $3 }'`
for BIN_NAME in "${TARGETS[@]}"
do
echo "$BIN_NAME"
ROUND=0
OUTPUT_BINS=()
OUTPUT_SWIFT_MODULES=()
# Get binary and framework name:
FRAMEWORK_FILE_NAME=${BIN_NAME}.framework
OUTPUT_FRAMEWORK_BUNDLE_DIR=${OUTPUT_BASE_DIR}/${FRAMEWORK_FILE_NAME}
OUTPUT_SIMULATOR_BUNDLE_DIR=${OUTPUT_SIMULATOR_BASE_DIR}/${FRAMEWORK_FILE_NAME}
for SDK in "${SDKS[@]}"
do
echo "Building SDK $BIN_NAME-$SDK"
# Get the XCode built framework file path:
PRODUCTS_DIR=${BUILD_ROOT}/${CONFIGURATION}-${SDK}
FRAMEWORK_FILE_PATH=${PRODUCTS_DIR}/${FRAMEWORK_FILE_NAME}
# Create output dir to copy the built framework to:
OUTPUT_SDK_DIR=${OUTPUT_BASE_DIR}/${SDK}
mkdir -p "${OUTPUT_SDK_DIR}"
# Copy the framework files:
if [ ${ROUND} == 0 ]
then
cp -a "${FRAMEWORK_FILE_PATH}" "${OUTPUT_BASE_DIR}"
fi
cp -a "${FRAMEWORK_FILE_PATH}" "${OUTPUT_SDK_DIR}"
# Collect output paths to use for making the FAT framework:
OUTPUT_BINS+=("\"${OUTPUT_SDK_DIR}/${FRAMEWORK_FILE_NAME}/${BIN_NAME}\"")
SWIFT_MODULE_DIR=${OUTPUT_SDK_DIR}/${FRAMEWORK_FILE_NAME}/Modules/${BIN_NAME}.swiftmodule
if [ -d "${SWIFT_MODULE_DIR}" ]
then
OUTPUT_SWIFT_MODULES+=("${SWIFT_MODULE_DIR}")
fi
ROUND=$((ROUND + 1))
done
# Make FAT framework:
if [[ ${#SDKS[@]} > 1 ]]
then
# Binary:
LIPO_BIN_INPUTS=$(IFS=" " ; echo "${OUTPUT_BINS[*]}")
echo "Generate FAT binary: ${LIPO_BIN_INPUTS}"
LIPO_CMD="lipo ${LIPO_BIN_INPUTS} -create -output \"${OUTPUT_FRAMEWORK_BUNDLE_DIR}/${BIN_NAME}\""
echo "${LIPO_CMD}"
eval "${LIPO_CMD}"
# Swift modules:
for SWIFT_MODULE in "${OUTPUT_SWIFT_MODULES[@]}"
do
cp -a "${SWIFT_MODULE}/" "${OUTPUT_FRAMEWORK_BUNDLE_DIR}/Modules/${BIN_NAME}.swiftmodule/"
done
# Combine simulator and ios swift headers for Xcode 10.2 bug.
# https://developer.apple.com/documentation/xcode_release_notes/xcode_10_2_release_notes
SWIFT_HEADER_NAME=${BIN_NAME}-Swift.h
SWIFT_HEADER_TMP_FILE=${OUTPUT_FRAMEWORK_BUNDLE_DIR}/Headers/${SWIFT_HEADER_NAME}.tmp
SWIFT_HEADER_SIMULATOR_FILE=${OUTPUT_SIMULATOR_BUNDLE_DIR}/Headers/${SWIFT_HEADER_NAME}
SWIFT_HEADER_IOS_FILE=${OUTPUT_FRAMEWORK_BUNDLE_DIR}/Headers/${SWIFT_HEADER_NAME}
cat > $SWIFT_HEADER_TMP_FILE <<EOF
#if TARGET_OS_SIMULATOR
$(cat $SWIFT_HEADER_SIMULATOR_FILE)
#else
$(cat $SWIFT_HEADER_IOS_FILE)
#endif
EOF
mv $SWIFT_HEADER_TMP_FILE $SWIFT_HEADER_IOS_FILE
# Copy framework to destination
rm -rf ${DESTINATION_DIR}/${BIN_NAME}*
cp -R ${OUTPUT_FRAMEWORK_BUNDLE_DIR} ${DESTINATION_DIR}
fi
done
# Cleanup build directory.
for SDK in "${SDKS[@]}"
do
rm -rf "${OUTPUT_BASE_DIR}/${SDK}"
done