Mockingbird CI-safe won't find dylib #3 when run from a symlink for the first time
s-hocking opened this issue · comments
New Issue Checklist
- [✅] I updated my Mockingbird framework and CLI to the latest version
- [✅] I searched for existing GitHub issues
Description
mockingbird generate
doesn't work when it is run for the first time via a symlink. The lib_InternalSwiftSyntaxParser.dylib
file gets created in the same file location as the symlink, and Mockingbird complains that it can't find it.
Running the Mockingbird binary directly creates the lib_InternalSwiftSyntaxParser.dylib
in the same location as the real binary and works correctly. Once the .dylib
is in the right place, running Mockingbird via a symlink works correctly too.
Generator Bugs
# The symlink setup in project root directory
?130 MockingbirdTestProject % ls -l Mockingbird-cisafe
total 0
drwxr-xr-x 4 shocking staff 128 28 Jan 15:37 0.16.0
lrwxr-xr-x 1 shocking staff 94 28 Jan 15:37 mockingbird -> /Users/shocking/checkouts/sandbox/MockingbirdTestProject/Mockingbird-cisafe/0.16.0/mockingbird
# Running Mockingbird symlink from command line
√ MockingbirdTestProject % ./Mockingbird-cisafe/mockingbird generate --targets 'MockingbirdTestProject' --outputs "./MockingbirdMocks/MockingbirdTestProjectMocks.generated.swift" --support "./MockingbirdSupport" --disable-cache --verbose
Parse Arguments - Took 0.48 ms
Using inferred Xcode project at /Users/shocking/Documents/checkouts/sandbox/MockingbirdTestProject/MockingbirdTestProject.xcodeproj
Parse Xcode Project - Took 6.96 ms
Resolved product module name 'MockingbirdTestProject' for target 'MockingbirdTestProject'
Resolved product module name 'MockingbirdTestProject' for target 'MockingbirdTestProject'
Extract Sources - Took 3.31 ms
Found 3 source files and 14 dependency source files for target 'MockingbirdTestProject'
dyld: lazy symbol binding failed: can't resolve symbol _swiftparse_syntax_structure_versioning_identifier in /Users/shocking/Documents/checkouts/sandbox/MockingbirdTestProject/Mockingbird-cisafe/mockingbird because dependent dylib #3 could not be loaded
dyld: can't resolve symbol _swiftparse_syntax_structure_versioning_identifier in /Users/shocking/Documents/checkouts/sandbox/MockingbirdTestProject/Mockingbird-cisafe/mockingbird because dependent dylib #3 could not be loaded
# dylib created in symlink location
?6 MockingbirdTestProject % ls -l Mockingbird-cisafe
total 14616
drwxr-xr-x 4 shocking staff 128 28 Jan 15:37 0.16.0
-rw-r--r-- 1 shocking staff 7481136 28 Jan 15:39 lib_InternalSwiftSyntaxParser.dylib
lrwxr-xr-x 1 shocking staff 94 28 Jan 15:37 mockingbird -> /Users/shocking/checkouts/sandbox/MockingbirdTestProject/Mockingbird-cisafe/0.16.0/mockingbird
# Nothing in the binary's location
√ MockingbirdTestProject % ls -l Mockingbird-cisafe/0.16.0
total 90176
-rw-r--r-- 1 shocking staff 13282884 28 Jan 15:37 Mockingbird-cisafe.zip
-rwxr-xr-x 1 shocking staff 32520768 8 Oct 15:38 mockingbird
# Running Mockingbird binary directly
?130 MockingbirdTestProject % ./Mockingbird-cisafe/0.16.0/mockingbird generate --targets 'MockingbirdTestProject' --outputs "./MockingbirdMocks/MockingbirdTestProjectMocks.generated.swift" --support "./MockingbirdSupport" --disable-cache --verbose
Using inferred Xcode project at /Users/shocking/Documents/checkouts/sandbox/MockingbirdTestProject/MockingbirdTestProject.xcodeproj
Parse Xcode Project - Took 7.08 ms
Resolved product module name 'MockingbirdTestProject' for target 'MockingbirdTestProject'
Resolved product module name 'MockingbirdTestProject' for target 'MockingbirdTestProject'
Extract Sources - Took 3.22 ms
Found 3 source files and 14 dependency source files for target 'MockingbirdTestProject'
Parsed 3 import declarations and 0 compiler directives in source file at /Users/shocking/Documents/checkouts/sandbox/MockingbirdTestProject/MockingbirdSupport/UIKit/UIViewController.swift
Parsed dependency source structure for module 'UIKit' at /Users/shocking/Documents/checkouts/sandbox/MockingbirdTestProject/MockingbirdSupport/UIKit/UIViewController.swift
Parsed 1 import declaration and 0 compiler directives in source file at /Users/shocking/Documents/checkouts/sandbox/MockingbirdTestProject/MockingbirdSupport/Swift/Misc.swift
# etc... works correctly!
Environment
- Mockingbird CLI version (
mockingbird version
) - 0.16.0 - Xcode and macOS version (are you running a beta?) - Xcode 12.4 (12D4e), macOS 10.15.7
- Swift version (
swift --version
) - Apple Swift version 5.3.2 (swiftlang-1200.0.45 clang-1200.0.32.28), Target: x86_64-apple-darwin19.6.0 - Installation method (CocoaPods, Carthage, from source, etc) - downloading CI-safe binary manually
- Unit testing framework (XCTest, Quick + Nimble, etc) - N/A
- Does your project use
.mockingbird-ignore
? - no - Are you using supporting source files? - yes
I've also noticed the same problem show up when CI-safe Mockingbird is run for the first time via an Xcode build phase. The lib_InternalSwiftSyntaxParser.dylib
file is created in an unknown location and causes the same error about dylib #3
.
Thanks for reporting, this is an interesting edge case. We should be using POSIX.realpath()
to determine the dylib unbundling location. It should be a pretty straightforward change (only to the CLI launch code); happy to review PRs if anyone wants to take a shot (https://github.com/birdrides/mockingbird/wiki/Local-Development).