Skip to content

Instantly share code, notes, and snippets.

@CodaFi
Forked from ddunbar/update-swift-dev
Last active February 13, 2018 15:46
Show Gist options
  • Save CodaFi/e5a72d8c08bc4bc5df577ef18b3ac130 to your computer and use it in GitHub Desktop.
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.
#!/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