paulb777
(Paul Beusterien)
1
Is there a way to specify platform specific source files for a target?
I'm looking for the best way to port this podspec that has a different set of sources for the iOS, macOS and tvOS variations.
1 Like
The manifest API does not contain anything that was specifically designed for that yet.
- The most semantically correct way is to frame the file’s own source with
#if os(macOS), etc.
- If you do not care about cross‐compiling, then a viable workaround that doesn’t touch the source files is to use
#if statements in the manifest itself:let package = Package(/* ... */)
// There are a million ways to arrange this,
// but here is the general idea:
#if os(Linux)
package.targets.first(where: { $0.name == "MyTarget" })!
.exclude += ["Platform Shims/macOS"]
#elseif os(macOS)
package.targets.first(where: { $0.name == "MyTarget" })!
.exclude += ["Platform Shims/Linux"]
#endif
1 Like
ddunbar
(Daniel Dunbar)
3
Now that we have some support for platform conditions in BuildSettingCondition, it might be interesting for someone to explore a proposal to allow a target to explicitly declare additional sources...
paulb777
(Paul Beusterien)
4
This seems to an approach for a host, but not a target platform. Adding if os(macOS) does exclude the files from the macOS target, but it also excludes them from the iOS target.
How can I define files to include in the iOS target, but exclude from the macOS target?
1 Like
Those bullet points were intended as two separate strategies.
You are doing the second bullet, where there was a caveat about cross‐compilation:
- If you do not care about cross‐compiling, then a viable workaround that doesn’t touch the source files is to use
#if statements in the manifest itself
The bullet you quote...
- The most semantically correct way is to frame the file’s own source with
#if os(macOS) , etc.
...was referring to the source of each file, not the manifest. For example:
NSApplication.swift
#if os(macOS)
import AppKit
extension NSApplication {
// ...
}
#endif
UIApplication.swift:
#if canImport(UIKIt) && !os(watchOS)
import UIKit
extension UIApplication {
// ...
}
#endif
1 Like