Set a macOS version in a Vapor project - vapor

I'm starting a new vapor project and one of my own swift packages has a min deployment target of macOS 10.12.
The swift build tool itself accepts specifying the target version as follows:
swift build -Xswiftc -target -Xswiftc x86_64-apple-macosx10.12
Is it possible to specify the macOS target when building with the vapor toolbox?

You should be able to pass arbitrary arguments through the vapor toolbox, but to be honest I'd just bypass it and use swift build directory - the toolbox doesn't add anything

Related

Swift build settings in Xcode to use lower 4.0.3 version instead of 5.0.1 are not enforced

I'm creating a simple Swift framework in Xcode 10.3 and trying to use a lower Swift 4.0.3 version. I went to the Xcode build settings and switch from 5.0.1 to 4.0.3 and then build the project.
I ran otool against resulted framework to make sure it's built using correct Swift version but the libraries included are still from Swift 5.0.1 (corresponds to 1001.0.82 from the output below):
otool -l SwiftyHello.framework/SwiftyHello
cmd LC_LOAD_DYLIB
cmdsize 56
name #rpath/libswiftCore.dylib (offset 24)
time stamp 2 Wed Dec 31 16:00:02 1969
current version **1001.0.82**
compatibility version 1.0.0
My toolchain is running Swift 5.0.1:
swift -version
Apple Swift version 5.0.1 (swiftlang-1001.0.82.4 clang-1001.0.46.5)
Target: x86_64-apple-darwin18.7.0
How can I make sure that the Swift framework is built using Swift 4.0.3?
SWIFT_VERSION (Swift Language Version) key does nothing with an actual Swift version of the resulting binary. From $ swift --help:
-swift-version Interpret input according to a specific Swift language version number
So, basically, Xcode executes Swift compiler with -swift-version 4 argument. It changes how Swift compiler parses the source files, but do not affect the binary in any way.
To build the actual Swift 4 binary, you have to install the Swift 4 toolchain. Then you would be able to pick the correct toolchain from the menu Xcode -> Toolchains. But, honestly, I wouldn't recommend doing this way, because Apple does not care about older versions of toolchains, and Xcode usually behaves unstable with them.
Instead, I'd recommend you install older Xcode (in your case 9.3) from the Apple Downloads website and build the project from there.
Alternatively, you can set up relatively simple CI/CD inside Github Actions, CircleCI or TravisCI and build in multiple Xcode versions at the same time there. And use the latest Xcode locally. Because they these CIs provide you multiple virtual environments with different Xcode and macOS versions.

Swift Module is compiled in version 4.2.1 instead of 5.0.1

I have a Swift Module that was fully migrated to Swift 5 using XCode version 10.2.1. When I 'distribute' the Module internally, I have no issues when integrating. When I distribute (using XCode's Organizer) the Module to another developer, they see the following error:
Module compiled with Swift 4.2.1 cannot be imported by the Swift 5.0.1
My internal applications all use Swift 5 as the build language. My XCode command line tools are version 10.2.1.
The other developer is also using Swift 5 with XCode 10.2.1.
What do I need to do to make my Module compile appropriately?
In most cases, this happens because the swift version of the module is not set correctly.
Before building the module, check the swift version of the module in Build Settings/Swift Language Version.
How is your module imported into your Xcode project? Are you using Carthage or Pod by any chance? If so, make sure your Terminal is pointing to the right XCode version prior to importing and installing your package locally via carthage or pod install.
Open a Terminal and check the selected XCode version:
/usr/bin/xcodebuild -version
If this is not the same version of XCode, make sure to point to the your current XCode app binary
sudo xcode-select -switch PATH_TO_YOUR_XCODE.APP
Import your package via carthage/pod, go back to your project in xcode, clean and build.

Module compiled with Swift 4.1.2 cannot be imported by the Swift 4.2 compiler

Short story: Xcode 10 is set to Swift 4, but it is using Swift 4.2.
Long story: Our project is not ready for Swift 4.2, since our dependent frameworks are not Swift 4.2, yet. But, I would like to, at least, use Xcode 10.
I have Xcode 9.4.1 and Xcode 10 installed.
I have Command Line Tools set to use Xcode 9.4.1:
In Xcode 10, I have the project setting, Swift Language Version, set to
Swift 4.
I have verified on the command line the Swift version the shell is
using is 4.1.2:
"swift --version Apple Swift version 4.1.2 (swiftlang-902.0.54 clang-902.0.39.2)"
I've run carthage update.
I've quit Xcode 10 and relaunched.
I have deep cleaned and deleted Derived Data.
I build and I get this error:
"Module compiled with Swift 4.1.2 cannot be imported by the Swift 4.2
compiler:
.../App/Carthage/Build/iOS/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64.swiftmodule"
To me, this indicates that I have my intended Swift version (4.1.2) set correctly and Xcode is still trying to use the wrong version of Swift (4.2).
Does anyone have suggestions on how to resolve this? Am I missing something? Xcode bug?
I'm not positive, but my guess is that this is the reason:
I have Command Line Tools set to use Xcode 9.4.1
You have to recompile your Swift 4 dependencies using Xcode 10, because Swift is not ABI-stable, i.e. binaries compiled with different compiler versions are not compatible. And even Swift 4.0 binaries compiled with different versions of Xcode may not be compatible.
I don't have much experience with Carthage, but my guess is that you should use Xcode 10 as a command-line tool, but you have to set a different Swift language version to be used by Xcode 10. It should probably be specified in the project (in this case RealmSwift), or using environment variables, but you'll need someone else to answer with more details, I'm afraid.
Using Realm with Xcode 10 requires building it from source. In Terminal write:
git clone --recursive https://github.com/realm/realm-cocoa.git
cd realm-cocoa
sh build.sh ios-swift
you can use multiple swift toolchains. download url swift toolchain download after you install some version. restart your xcode, in xocde menu you can see toolchains option.
I had the same problem and then I realised I had not selected Xcode 10 as my Xcode. Try:
sudo xcode-select -s /Applications/Xcode10.app
Also, if you will be switching between Xcode9 and 10, I recommend you the following: If you change from 9 to 10, run mv Carthage Carthage9 and then rebuild Carthage. Whenever you want to switch back, move Carthage to Carthage10 and do mv Carthage9 Carthage. This will save you lots of time building.

Module compiled with Swift 4.0 cannot be imported in Swift 4.0.1

However I have recompiled the framework using the same Xcode and it still gives me this error.
Base SDK iOS 11.1 for both
Swift Language Version Swift 4.0 for both
Not using Pods/Carthage
I hope someone might know
Update:
For release versions of Xcode:
This error (and similar errors involving Swift 4.1, 4.2, etc.) will occur when opening a project with Xcode 9.1, 9.2, 9.3, 9.4, 10, etc. that uses frameworks that were built with earlier Xcode tools.
To fix the issue, update and rebuild your frameworks using Carthage ( carthage update --platform iOS), Cocoapods (pod update or pod install), or manually, with the new updated Xcode tools. The tools should be updated automatically when you update Xcode, but if not, you can follow the steps outlined below in the original answer.
You may also need to clean your project cmd + shift + k and possibly your build folder cmd + option + shift + k to get Xcode to not use cached framework builds.
In some cases you may also need to delete your derived data folder (Easily found by going to Xcode Preferences -> Locations -> Derived Data Folder
(Thanks Stunner)
For beta versions of Xcode:
See original answer below and then follow steps above.
Original Answer:
You probably still have your xcodebuild tools set to Xcode 9.0 which builds with Swift 4.0 and is incompatible with Xcode 9.1 beta's Swift 4.0.1.
Check in the terminal using the command:
xcodebuild -version
Or just go into Xcode preferences -> Locations and check/change the command line tools to Xcode 9.1. You should be set then.
My issue was due to an external framework not being compiled for Swift 4.0.2. I had added this file via Carthage, so running:
carthage update --platform iOS
And then cleaning the project cmd + shift + k and build folder cmd + option + shift + k and deleting the derived data folder (merely moving it to trash works as well) worked for me.
In my case, I downloaded xCode 11 Beta version to test SwiftUI. When i run my project, i got "Module compiled with Swift 5.1 cannot be imported by the Swift 5.0.1 compiler:..." error.
To do fix this issue. i changed xCode command line tool to new xCode 11 comment line tool. After that, you can create new xcode project with SwiftUI.
Xcode -> Preferences -> Location -> XCode command Line Tool
i hope, this will help someone who want to test with new freamework :)
Install Xcode Toolchain of specific Xcode version which was working for you from here.
An Xcode toolchain includes a copy of the compiler, lldb, and other related tools needed to provide a cohesive development experience for working in a specific version of Swift.
Open Xcode's Preferences, navigate to Components > Toolchains , and select the installed Swift toolchain.
This will let you compile and run the app for now.
I hit this issue with Xcode 10 beta, which adds Swift 4.2. My issue was unrelated to Carthage or any external dependencies.
Go to YourTarget > Build Settings > Swift Language Version for all of your Xcode targets.
Mine were all set to Swift 4.
After adding a Copy Files Build Phase, I started getting the error
:0: error: module compiled with Swift 4.1.2 cannot be imported by the Swift 4.2 compiler: /Users/user/Library/Developer/Xcode/DerivedData/MyApp-faskfrihumfcdibjxisjvbfshppp/Build/Intermediates.noindex/MyApp.build/Debug/MyAppExtension.build/Objects-normal/x86_64/MyClass~partial.swiftmodule
Command MergeSwiftModule failed with a nonzero exit code
I then set each target's Swift Language Version to Swift 4.2, which eliminated the error.
I'm not sure why the error was occuring in the first place, though, as having all targets set to Swift 4 should be equally as valid.
In my case (Xcode 9.2):
I went to Xcode Preferences > Locations > Derived Data
I then deleted the data and did a clean build and was ok.
In my case, I used CocoaPods with plugin cocoapods-binary to prebuild libraries to binaries. After I upgrade Xcode from 10 to 11, Xcode gives me this error:
Module compiled with Swift 5.0.1 cannot be imported by the Swift 5.1 compiler
I fix it by removing the /Pods directory and running pod install.
In my case, I re-compiled the framework with whatever version it was complaining about.
To recompile, run pod update or update the carthage (which ever one you're using), and build the project.
Then search for the framework in finder. Copy-paste the theFramework.framework to your project and make sure to "Copy items if needed."Build the project again and it should work.

Objective Sharpie Does Not See Older iPhone SDKs when using iPhoneos 9.3

I am trying to bind a framework that has its own Info.plist which requires iphoneos8.2. Per the documentation
https://developer.xamarin.com/guides/cross-platform/macios/binding/objective-sharpie/tools/
I installed Xcode 6.2 which shows the iPhoneos8.2.sdk inside of Applications/Contents/... so that a sharpie command of
sharpie xcode -sdks -v
should return any sdk found at /Application/Xcode*.app. However, my output still just shows the 9.3 sdks. I also tried copying the 8.2 sdk into the Xcode.app/Contents/.. folders as suggested in other posts on SO to no avail. The output does see both Xcode 7.3.1 and 6.2 but it does not list sdk: iphoneos8.2 under the Xcode 6.2 only the macosx10.10 sdk. Like I said the 8.2 iphoneos8.2 is confirmed in the contents/developer/sdks folder for 6.2.
Does anyone know why the 8.2 sdk would not be found by sharpie?
So here's the short of why this doesn't appear.
Objective Sharpie enumerates /Applications/Xcode*.app thus you would think it would pickup an old iphoneos sdk. However it cannot do that because it has a dependency on clang in which clang has a minimum compatibility version against the respective iphoneos, macosx, and watchos. Thus in this case, iphoneos must be > 8.3 and any that meet this requirement will be detected against the sharpie xcode -sdks command.
These of course come directly from clang:
http://clang.llvm.org/docs/AttributeReference.html#availability
ios
Apple’s iOS operating system. The minimum deployment target is specified by the -mios-version-min=*version* or -miphoneos-version-min=*version* command-line arguments.
macos
Apple’s Mac OS X operating system. The minimum deployment target is specified by the -mmacosx-version-min=*version* command-line argument. macosx is supported for backward-compatibility reasons, but it is deprecated.
tvos
Apple’s tvOS operating system. The minimum deployment target is specified by the -mtvos-version-min=*version* command-line argument.
watchos
Apple’s watchOS operating system. The minimum deployment target is specified by the -mwatchos-version-min=*version* command-line argument.
For me, what I did, was to just go into all the info.plist's in the pods I was trying to bind, and change
DTSDKName iphoneos9.3
to
DTSDKName iphoneos10.2
I came up with iphoneos10.2 by running
sharpie xcode -sdks -v
to see what I had available.
I also had to do a soft-link as sharpie was looking into the wrong frameworks directories for header files.
ln -s Pods/XX/iOS/XX.framework Pods/XX/XX.framework
(of course, remove the Pods/XX/XX.framework directory that contains a redirect run & README before doing the soft link)

Resources