-
-
Save CodaFi/e5a72d8c08bc4bc5df577ef18b3ac130 to your computer and use it in GitHub Desktop.
This is the script I currently use on OS X to get a working "swift-dev.xctoolchain" out of a built Swift. It isn't designed to work for anyone but me, but it should be easy to adapt. I always run this after every build, and then use `TOOLCHAINS=swift-dev swift build` (etc) to use the development compiler.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
set -e | |
if [ -z "${SWIFTPM_CONFIGURATION}" ]; then | |
SWIFTPM_CONFIGURATION=.bootstrap/lib/swift/pm/4 | |
fi | |
if [ -z "${CONFIGURATION}" ]; then | |
CONFIGURATION=release | |
fi | |
if [ -z "${SWIFT_SOURCE_PATH}" ]; then | |
SWIFT_SOURCE_PATH=~/Desktop/Swift | |
fi | |
if [ -z "${XCODE_PATH}" ]; then | |
XCODE_PATH=$(xcode-select -p) | |
fi | |
# Create the development toolchain. | |
rm -rf ${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain | |
cp -r ${XCODE_PATH}/Toolchains/XcodeDefault.xctoolchain ${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain | |
# Rename and expand the Info.plist | |
mv ${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/ToolchainInfo.plist ${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/Info.plist | |
if ! /usr/libexec/PlistBuddy -c "Delete :Identifier" "${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/Info.plist" > /dev/null; then | |
echo "error: unable to write to ToolchainInfo.plist 1" | |
exit 1 | |
fi | |
if ! /usr/libexec/PlistBuddy -c "Add :CFBundleIdentifier string 'com.cfi.swift.toolchain.swift-dev'" "${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/Info.plist" > /dev/null; then | |
echo "error: unable to write to ToolchainInfo.plist 1" | |
exit 1 | |
fi | |
if ! /usr/libexec/PlistBuddy -c "Add :Aliases array" "${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/Info.plist" > /dev/null; then | |
echo "error: unable to write to ToolchainInfo.plist 2" | |
exit 1 | |
fi | |
if ! /usr/libexec/PlistBuddy -c "Add :Aliases:0 string 'swift'" "${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/Info.plist" > /dev/null; then | |
echo "error: unable to write to ToolchainInfo.plist 3" | |
exit 1 | |
fi | |
if ! /usr/libexec/PlistBuddy -c "Add :CompatibilityVersion integer 2" "${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/Info.plist" > /dev/null; then | |
echo "error: unable to write to ToolchainInfo.plist 4" | |
exit 1 | |
fi | |
if ! /usr/libexec/PlistBuddy -c "Add :CompatibilityVersionDisplayString string 'Xcode 8.0'" "${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/Info.plist" > /dev/null; then | |
echo "error: unable to write to ToolchainInfo.plist 5" | |
exit 1 | |
fi | |
INFO_PLIST_DATE=$(date) | |
if ! /usr/libexec/PlistBuddy -c "Add :CreatedDate date ${INFO_PLIST_DATE}" "${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/Info.plist" > /dev/null; then | |
echo "error: unable to write to ToolchainInfo.plist" | |
exit 1 | |
fi | |
if ! /usr/libexec/PlistBuddy -c "Add :DisplayName string 'Swift 4.0 Release'" "${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/Info.plist" > /dev/null; then | |
echo "error: unable to write to ToolchainInfo.plist" | |
exit 1 | |
fi | |
if ! /usr/libexec/PlistBuddy -c "Add :ShortDisplayName string 'Swift 4.0 Release'" "${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/Info.plist" > /dev/null; then | |
echo "error: unable to write to ToolchainInfo.plist" | |
exit 1 | |
fi | |
if ! /usr/libexec/PlistBuddy -c "Add :Version string '4.0'" "${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/Info.plist" > /dev/null; then | |
echo "error: unable to write to ToolchainInfo.plist" | |
exit 1 | |
fi | |
# Install the `swift` provided binaries. | |
rsync -ar \ | |
--link-dest ${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-macosx-x86_64/bin/ \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-macosx-x86_64/bin/swift \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-macosx-x86_64/bin/swiftc \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-macosx-x86_64/bin/swift-demangle \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/usr/bin | |
# Install the `swiftpm` provided binaries. | |
rsync -ar \ | |
--link-dest ${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swiftpm-macosx-x86_64/${CONFIGURATION}/ \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swiftpm-macosx-x86_64/${CONFIGURATION}/swift-build \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swiftpm-macosx-x86_64/${CONFIGURATION}/swift-package \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swiftpm-macosx-x86_64/${CONFIGURATION}/swift-test \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/usr/bin/ | |
# Install the `llbuild` provided binaries. | |
rsync -ar \ | |
--link-dest ${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/llbuild-macosx-x86_64/bin/ \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/llbuild-macosx-x86_64/bin/swift-build-tool \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/usr/bin/ | |
# Install fake versions of `lldb` and `lldb-mi`. | |
rsync -ar \ | |
--link-dest ${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/llbuild-macosx-x86_64/bin/ \ | |
$(which false) \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/usr/bin/lldb | |
rsync -ar \ | |
--link-dest ${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/llbuild-macosx-x86_64/bin/ \ | |
$(which false) \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/usr/bin/lldb-mi | |
# Install the `swiftpm` runtime libraries. | |
mkdir -p ${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/usr/lib/swift/pm/ | |
rsync -ar \ | |
--link-dest ${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swiftpm-macosx-x86_64/${CONFIGURATION}/ \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swiftpm-macosx-x86_64/${SWIFTPM_CONFIGURATION}/libPackageDescription.dylib \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swiftpm-macosx-x86_64/${SWIFTPM_CONFIGURATION}/PackageDescription.swiftmodule \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/usr/lib/swift/pm/ | |
# Install the `clang` runtime data. | |
rsync -ar \ | |
--link-dest ${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/llvm-macosx-x86_64/lib/libclang.dylib \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/llvm-macosx-x86_64/lib/libclang.dylib \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/usr/lib/ | |
# Install the standard libraries. | |
mkdir -p ${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/usr/lib/swift/macosx/ | |
rsync -a \ | |
--link-dest ${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-macosx-x86_64/lib/swift/macosx/ \ | |
$(ls ${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-macosx-x86_64/lib/swift/macosx/*.dylib | \ | |
grep -v SwiftPrivate | \ | |
grep -v StdlibUnittest | \ | |
grep -v SwiftReflectionTest | \ | |
grep -v SwiftExperimental) \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/usr/lib/swift/macosx/ | |
rsync -a \ | |
--link-dest ${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-macosx-x86_64/lib/swift/macosx/x86_64/ \ | |
$(ls ${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-macosx-x86_64/lib/swift/macosx/x86_64/*.swiftdoc | \ | |
grep -v SwiftPrivate | \ | |
grep -v StdlibUnittest | \ | |
grep -v SwiftReflectionTest | \ | |
grep -v SwiftExperimental) \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/usr/lib/swift/macosx/x86_64/ | |
rsync -a \ | |
--link-dest ${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-macosx-x86_64/lib/swift/macosx/x86_64/ \ | |
$(ls ${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-macosx-x86_64/lib/swift/macosx/x86_64/*.swiftmodule | \ | |
grep -v SwiftPrivate | \ | |
grep -v StdlibUnittest | \ | |
grep -v SwiftReflectionTest | \ | |
grep -v SwiftExperimental) \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/usr/lib/swift/macosx/x86_64/ | |
rsync -a \ | |
--link-dest ${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-macosx-x86_64/lib/swift/macosx/x86_64/ \ | |
$(ls ${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-macosx-x86_64/lib/swift/macosx/x86_64/*.apinotesc | \ | |
grep -v SwiftPrivate | \ | |
grep -v StdlibUnittest | \ | |
grep -v SwiftReflectionTest | \ | |
grep -v SwiftExperimental) \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/usr/lib/swift/macosx/x86_64/ | |
rsync -ar --delete-excluded \ | |
--link-dest ${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-macosx-x86_64/lib/sourcekitd.framework/ \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-macosx-x86_64/lib/sourcekitd.framework/ \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/usr/lib/sourcekitd.framework/ | |
# Install the `clang` symlink. | |
rsync -ar \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-macosx-x86_64/lib/swift/clang \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/usr/lib/swift/clang | |
rsync -ar \ | |
--link-dest ${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-macosx-x86_64/lib/swift/shims/ \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-macosx-x86_64/lib/swift/shims/ \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/usr/lib/swift/shims/ | |
rsync -a \ | |
--link-dest ${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-macosx-x86_64/lib/ \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-macosx-x86_64/lib/lib*Demangle.dylib \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/usr/lib/ | |
# Copy over `swift-stdlib-tool`. | |
cp $(xcrun --find swift-stdlib-tool) \ | |
${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain/usr/bin/ | |
read -p "Would you like to move this to /Library/Developer/Toolchains; you must restart Xcode: (y/n)? " answer | |
case ${answer:0:1} in | |
y|Y ) | |
sudo mkdir -p /Library/Developer/Toolchains; | |
sudo rm -rf /Library/Developer/Toolchains/swift-dev.xctoolchain | |
sudo cp -r ${SWIFT_SOURCE_PATH}/build/Ninja-ReleaseAssert/swift-dev.xctoolchain /Library/Developer/Toolchains/swift-dev.xctoolchain; | |
;; | |
* ) | |
exit | |
;; | |
esac |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment