Unverified Commit d7c0b2b3 authored by Samuel Giddins's avatar Samuel Giddins Committed by GitHub

Merge pull request #6966 from CocoaPods/dani_static_swift

Swift Static Library support
parents 8307a689 11c9226f
...@@ -40,6 +40,11 @@ To install release candidates run `[sudo] gem install cocoapods --pre` ...@@ -40,6 +40,11 @@ To install release candidates run `[sudo] gem install cocoapods --pre`
[iv-mexx](https://github.com/iv-mexx) [iv-mexx](https://github.com/iv-mexx)
[#7372](https://github.com/CocoaPods/CocoaPods/issues/7372) [#7372](https://github.com/CocoaPods/CocoaPods/issues/7372)
* Add support for integrating swift pods as static libraries.
[Danielle Tomlinson](https://github.com/dantoml)
[Samuel Giddins](https://github.com/segiddins)
[#6899](https://github.com/CocoaPods/CocoaPods/issues/6899)
##### Bug Fixes ##### Bug Fixes
* Clear input/output paths if they exceed an arbitrary limit * Clear input/output paths if they exceed an arbitrary limit
......
...@@ -152,8 +152,6 @@ ...@@ -152,8 +152,6 @@
F8129BF71591061B009BFE23 /* Sources */, F8129BF71591061B009BFE23 /* Sources */,
F8129BF81591061B009BFE23 /* Frameworks */, F8129BF81591061B009BFE23 /* Frameworks */,
F8129BF91591061B009BFE23 /* Resources */, F8129BF91591061B009BFE23 /* Resources */,
CC1632E381344B54BA63986B /* [CP] Copy Pods Resources */,
F0DC30B6798CF042746A5614 /* [CP] Embed Pods Frameworks */,
); );
buildRules = ( buildRules = (
); );
...@@ -220,36 +218,6 @@ ...@@ -220,36 +218,6 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0; showEnvVarsInLog = 0;
}; };
CC1632E381344B54BA63986B /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "[CP] Copy Pods Resources";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-AFNetworking Example/Pods-AFNetworking Example-resources.sh\"\n";
showEnvVarsInLog = 0;
};
F0DC30B6798CF042746A5614 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-AFNetworking Example/Pods-AFNetworking Example-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */ /* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */
......
...@@ -227,8 +227,6 @@ ...@@ -227,8 +227,6 @@
F8E4695C1395739C00DB05C8 /* Sources */, F8E4695C1395739C00DB05C8 /* Sources */,
F8E4695D1395739C00DB05C8 /* Frameworks */, F8E4695D1395739C00DB05C8 /* Frameworks */,
F8E4695E1395739C00DB05C8 /* Resources */, F8E4695E1395739C00DB05C8 /* Resources */,
226FE837057C4F98AD9FFB32 /* [CP] Copy Pods Resources */,
CB0CF751F97DB411456460D5 /* [CP] Embed Pods Frameworks */,
); );
buildRules = ( buildRules = (
); );
...@@ -284,36 +282,6 @@ ...@@ -284,36 +282,6 @@
/* End PBXResourcesBuildPhase section */ /* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */
226FE837057C4F98AD9FFB32 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "[CP] Copy Pods Resources";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-AFNetworking iOS Example/Pods-AFNetworking iOS Example-resources.sh\"\n";
showEnvVarsInLog = 0;
};
CB0CF751F97DB411456460D5 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-AFNetworking iOS Example/Pods-AFNetworking iOS Example-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
E4419DF1E8B742E49777FFE0 /* [CP] Check Pods Manifest.lock */ = { E4419DF1E8B742E49777FFE0 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
......
...@@ -109,7 +109,6 @@ ...@@ -109,7 +109,6 @@
F8111E0219A951050040E7D1 /* Frameworks */, F8111E0219A951050040E7D1 /* Frameworks */,
F8111E0319A951050040E7D1 /* Resources */, F8111E0319A951050040E7D1 /* Resources */,
232F8168EB8673C9D2405BA7 /* [CP] Embed Pods Frameworks */, 232F8168EB8673C9D2405BA7 /* [CP] Embed Pods Frameworks */,
B81850C1CB84CCCCFC8FFC52 /* [CP] Copy Pods Resources */,
); );
buildRules = ( buildRules = (
); );
...@@ -202,21 +201,6 @@ ...@@ -202,21 +201,6 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0; showEnvVarsInLog = 0;
}; };
B81850C1CB84CCCCFC8FFC52 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "[CP] Copy Pods Resources";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-iOS Example/Pods-iOS Example-resources.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */ /* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */
......
...@@ -91,7 +91,6 @@ ...@@ -91,7 +91,6 @@
295BB55B1CEA95DE00E79F82 /* Frameworks */, 295BB55B1CEA95DE00E79F82 /* Frameworks */,
295BB55C1CEA95DE00E79F82 /* Resources */, 295BB55C1CEA95DE00E79F82 /* Resources */,
6E2B4891468DB661A63F8065 /* [CP] Embed Pods Frameworks */, 6E2B4891468DB661A63F8065 /* [CP] Embed Pods Frameworks */,
0B71E1EA08FB405324201E97 /* [CP] Copy Pods Resources */,
); );
buildRules = ( buildRules = (
); );
...@@ -147,21 +146,6 @@ ...@@ -147,21 +146,6 @@
/* End PBXResourcesBuildPhase section */ /* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */
0B71E1EA08FB405324201E97 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "[CP] Copy Pods Resources";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-App/Pods-App-resources.sh\"\n";
showEnvVarsInLog = 0;
};
62E9CD52D31153978437D4C2 /* [CP] Check Pods Manifest.lock */ = { 62E9CD52D31153978437D4C2 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
......
Pod::Spec.new do |s|
s.name = "CustomModuleMapPod"
s.version = "0.0.1"
s.summary = "A long description of CustomModuleMapPod."
s.source = { :git => "http://foo/CustomModuleMapPod.git", :tag => "#{s.version}" }
s.authors = ['me']
s.homepage = 'http://example.com'
s.license = 'proprietary'
s.source_files = "src/**/*.{h,m,swift}"
s.private_header_files = "src/Private/*.h"
s.module_map = "src/CustomModuleMapPod.modulemap"
s.ios.deployment_target = '9.0'
s.macos.deployment_target = '10.10'
end
#import <CustomModuleMapPod/CMMFunctions.h>
@import Foundation;
@interface CMM : NSObject
+ (void)log;
@end
#import <CustomModuleMapPod/CMM.h>
#import <CustomModuleMapPod/CMM+Private.h>
#import <CustomModuleMapPod/CMMFunctions.h>
#import <Foundation/Foundation.h>
@implementation CMM
+ (void)log { NSLog(@"module maps are the wurst"); }
@end
void CMM_doThing(void) {
NSLog(@"CMM doing thing");
}
extern void CMM_doThing(void);
\ No newline at end of file
framework module CustomModuleMapPod {
umbrella header "CMM.h"
explicit module Private {
header "CMM+Private.h"
}
export *
module * { export * }
}
#import <CustomModuleMapPod/CMM.h>
@interface CMM (PrivateExtension)
@end
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:iOS Modules.xcodeproj">
</FileRef>
<FileRef
location = "group:macOS Modules.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict/>
</plist>
Pod::Spec.new do |s|
s.name = "MixedPod"
s.version = "0.0.1"
s.summary = "A long description of objc."
s.source = { :git => "http://foo/objc.git", :tag => "#{s.version}" }
s.authors = ['me']
s.homepage = 'http://example.com'
s.license = 'proprietary'
s.source_files = "src/**/*.{h,m,swift}"
s.public_header_files = "src/**/*.h"
s.dependency 'ObjCPod'
s.dependency 'SwiftPod'
s.ios.deployment_target = '9.0'
s.macos.deployment_target = '10.10'
end
@import Foundation;
@interface BCE : NSObject
+ (void)meow;
@end
#import <MixedPod/bce.h>
#if __has_include(<MixedPod/MixedPod-Swift.h>)
# import <MixedPod/MixedPod-Swift.h>
#else
// This really shouldn't be neccessary (ideally the first would just work)
// Additionally, it shouldn't show as "not found" in the navigator
# import "MixedPod-Swift.h"
#endif
@import ObjCPod;
@import SwiftPod;
#import <Foundation/Foundation.h>
@implementation BCE
+ (void)meow {
id a = [ABC new]; // from ObjCPod
[[XYZ new] doThing:@"in bce.m"]; // from SwiftPod
NSLog(@"meow meow");
(void)[[Foo alloc] initWithS:a]; // from MixedPod
}
@end
import SwiftPod
import ObjCPod
func testImportedThings() {
print(XYZStruct(name: "string"))
print(ABC())
}
public func superMeow() -> BCE {
testImportedThings()
BCE.meow()
return BCE()
}
@objc public
class Foo: NSObject {
@objc public
init(s: AnyObject) {
print("Initializing with \(s)")
}
}
Pod::Spec.new do |s|
s.name = "ObjCPod"
s.version = "0.0.1"
s.summary = "A long description of objc."
s.source = { :git => "http://foo/objc.git", :tag => "#{s.version}" }
s.authors = ['me']
s.homepage = 'http://example.com'
s.license = 'proprietary'
s.source_files = "src/**/*.{h,m,swift}"
s.private_header_files = "src/Private/*.h"
s.public_header_files = "src/**/*.h"
s.ios.deployment_target = '9.0'
s.macos.deployment_target = '10.10'
end
@interface ABC (Private)
+ (void)barkSuperLoudly;
@end
\ No newline at end of file
@interface ABC : NSObject
+ (void)bark;
@end
\ No newline at end of file
#import <ObjCPod/abc.h>
#import "abc_private.h"
#import <Foundation/Foundation.h>
@implementation ABC
+ (void)bark { NSLog(@"woof woof"); }
+ (void)barkSuperLoudly { NSLog(@"WOOF WOOF"); }
@end
workspace 'Examples.xcworkspace'
abstract_target 'Abstract Target' do
use_modular_headers!
pod 'ObjCPod', path: 'ObjCPod'
pod 'SwiftPod', path: 'SwiftPod'
pod 'MixedPod', path: 'MixedPod'
pod 'CustomModuleMapPod', path: 'CustomModuleMapPod'
pod 'Alamofire', path: '../Alamofire Example/Alamofire'
%w[iOS macOS].each do |platform|
abstract_target "#{platform} Pods" do
project "#{platform} Modules.xcodeproj"
case platform
when 'iOS' then self.platform :ios, '10.0'
when 'macOS' then self.platform :macos, '10.10'
end
target 'Static' do
use_frameworks!(false)
end
target 'Dynamic' do
use_frameworks!(true)
end
end
end
end
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
#if os(iOS)
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
return true
}
}
#elseif os(macOS)
import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ aNotification: Notification) {
}
}
#endif
{
"images" : [
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "3x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "76x76",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "76x76",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "83.5x83.5",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" systemVersion="17A277" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
</document>
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" systemVersion="17A277" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="ViewController" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>
//
// ModelThing.h
// Static Swift
//
// Created by Samuel Giddins on 1/23/18.
// Copyright © 2018 Samuel Giddins. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface ModelThing : NSObject
+ (instancetype)copy;
@end
//
// ModelThing.m
// Static Swift
//
// Created by Samuel Giddins on 1/23/18.
// Copyright © 2018 Samuel Giddins. All rights reserved.
//
#import "ModelThing.h"
@import MixedPod;
@import SwiftPod;
@import ObjCPod;
@import CustomModuleMapPod;
@import CustomModuleMapPod.Private;
@implementation ModelThing
+ (instancetype)copy {
[CMM log]; // CustomModuleMapPod
CMM_doThing(); // CustomModuleMapPod.Private
[BCE meow]; // MixedPod
[ABC bark]; // ObjCPod
[XYZ.new doThing:@"objc thing?"]; // from SwiftPod
return [self.class new];
}
@end
#if os(iOS)
import UIKit
typealias BaseViewController = UIViewController
#elseif os(macOS)
import AppKit
typealias BaseViewController = NSViewController
#endif
import ObjCPod
import SwiftPod
import MixedPod
import Alamofire
class ViewController: BaseViewController {
#if os(iOS)
override func viewDidAppear(_ animated: Bool) {
doThings()
}
#endif
func doThings() {
ABC.bark() // ObjCPod
print(XYZStruct(name: "")) // SwiftPod
XYZ().doThing("thiiiing") // SwiftPod
print(superMeow()) // MixedPod
BCE.meow() // MixedPod
print(NSClassFromString("ModelThing")?.copy() as Any) // App, done this way to avoid using a bridging header
networkRequest()
}
func networkRequest() {
Alamofire.request("https://httpbin.org/get").responseJSON { response in
print("\n\nAlamofire:\n")
print("Request: \(String(describing: response.request))") // original url request
if let json = response.result.value {
print("JSON: \(json)") // serialized json response
}
}
}
}
Pod::Spec.new do |s|
s.name = "SwiftPod"
s.version = "0.0.1"
s.summary = "A long description of objc."
s.source = { :git => "http://foo/objc.git", :tag => "#{s.version}" }
s.authors = ['me']
s.homepage = 'http://example.com'
s.license = 'proprietary'
s.source_files = "src/**/*.{h,m,swift}"
s.public_header_files = "src/**/*.h"
s.ios.deployment_target = '9.0'
s.macos.deployment_target = '10.10'
end
import Foundation
private func doTheThing() {
print("doing the thing!")
}
@objc public
class XYZ : NSObject {
@objc public
func doThing(_ x: String) {
print("do thing \(x):")
doTheThing()
}
}
public struct XYZStruct {
public let name: String
public init(name: String) { self.name = name }
}
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 48;
objects = {
/* Begin PBXBuildFile section */
4A97D3749BDE8B3E35AC9A3E /* Pods_Abstract_Target_iOS_Pods_Dynamic.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 66EF8CD87550366CE411E9E5 /* Pods_Abstract_Target_iOS_Pods_Dynamic.framework */; };
C00A217F2017E42500A11955 /* ModelThing.m in Sources */ = {isa = PBXBuildFile; fileRef = C00A217E2017E42500A11955 /* ModelThing.m */; };
C00A21802017E42500A11955 /* ModelThing.m in Sources */ = {isa = PBXBuildFile; fileRef = C00A217E2017E42500A11955 /* ModelThing.m */; };
C06248E92016A708009EF3DE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C06248E82016A708009EF3DE /* AppDelegate.swift */; };
C06248EB2016A708009EF3DE /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C06248EA2016A708009EF3DE /* ViewController.swift */; };
C06248EE2016A708009EF3DE /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C06248EC2016A708009EF3DE /* Main.storyboard */; };
C06248F02016A708009EF3DE /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C06248EF2016A708009EF3DE /* Assets.xcassets */; };
C06248F32016A708009EF3DE /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C06248F12016A708009EF3DE /* LaunchScreen.storyboard */; };
C06248FC2016AE3A009EF3DE /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C06248EA2016A708009EF3DE /* ViewController.swift */; };
C06248FD2016AE3A009EF3DE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C06248E82016A708009EF3DE /* AppDelegate.swift */; };
C06249002016AE3A009EF3DE /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C06248F12016A708009EF3DE /* LaunchScreen.storyboard */; };
C06249012016AE3A009EF3DE /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C06248EF2016A708009EF3DE /* Assets.xcassets */; };
C06249022016AE3A009EF3DE /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C06248EC2016A708009EF3DE /* Main.storyboard */; };
D4E1F29F12EAE0C62388EDDF /* libPods-Abstract Target-iOS Pods-Static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E99245D1CAE3EAEA11963B29 /* libPods-Abstract Target-iOS Pods-Static.a */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
33A84E66EBEDC738A1DC928D /* Pods-Abstract Target-iOS Pods-Static.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Abstract Target-iOS Pods-Static.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Abstract Target-iOS Pods-Static/Pods-Abstract Target-iOS Pods-Static.debug.xcconfig"; sourceTree = "<group>"; };
66EF8CD87550366CE411E9E5 /* Pods_Abstract_Target_iOS_Pods_Dynamic.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Abstract_Target_iOS_Pods_Dynamic.framework; sourceTree = BUILT_PRODUCTS_DIR; };
BCCB47A125EFE121F6CB0060 /* Pods-Abstract Target-iOS Pods-Static.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Abstract Target-iOS Pods-Static.release.xcconfig"; path = "Pods/Target Support Files/Pods-Abstract Target-iOS Pods-Static/Pods-Abstract Target-iOS Pods-Static.release.xcconfig"; sourceTree = "<group>"; };
BFD3374B6AE6E01A26161DF6 /* Pods-Abstract Target-iOS Pods-Dynamic.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Abstract Target-iOS Pods-Dynamic.release.xcconfig"; path = "Pods/Target Support Files/Pods-Abstract Target-iOS Pods-Dynamic/Pods-Abstract Target-iOS Pods-Dynamic.release.xcconfig"; sourceTree = "<group>"; };
C00A217D2017E42500A11955 /* ModelThing.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ModelThing.h; sourceTree = "<group>"; };
C00A217E2017E42500A11955 /* ModelThing.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ModelThing.m; sourceTree = "<group>"; };
C06248E52016A708009EF3DE /* Static.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Static.app; sourceTree = BUILT_PRODUCTS_DIR; };
C06248E82016A708009EF3DE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
C06248EA2016A708009EF3DE /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
C06248ED2016A708009EF3DE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
C06248EF2016A708009EF3DE /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
C06248F22016A708009EF3DE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
C06248F42016A708009EF3DE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
C06249062016AE3A009EF3DE /* Dynamic.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Dynamic.app; sourceTree = BUILT_PRODUCTS_DIR; };
C8305F6CEF9F399F706F50A8 /* Pods-Abstract Target-iOS Pods-Dynamic.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Abstract Target-iOS Pods-Dynamic.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Abstract Target-iOS Pods-Dynamic/Pods-Abstract Target-iOS Pods-Dynamic.debug.xcconfig"; sourceTree = "<group>"; };
E99245D1CAE3EAEA11963B29 /* libPods-Abstract Target-iOS Pods-Static.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Abstract Target-iOS Pods-Static.a"; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
C06248E22016A708009EF3DE /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
D4E1F29F12EAE0C62388EDDF /* libPods-Abstract Target-iOS Pods-Static.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
C06248FE2016AE3A009EF3DE /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
4A97D3749BDE8B3E35AC9A3E /* Pods_Abstract_Target_iOS_Pods_Dynamic.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
C06248DC2016A708009EF3DE = {
isa = PBXGroup;
children = (
C06248E72016A708009EF3DE /* Static Swift */,
C06248E62016A708009EF3DE /* Products */,
E0634AD47DB51DF85CD1FD7F /* Pods */,
C8E28305E444304C4C82CA36 /* Frameworks */,
);
sourceTree = "<group>";
};
C06248E62016A708009EF3DE /* Products */ = {
isa = PBXGroup;
children = (
C06248E52016A708009EF3DE /* Static.app */,
C06249062016AE3A009EF3DE /* Dynamic.app */,
);
name = Products;
sourceTree = "<group>";
};
C06248E72016A708009EF3DE /* Static Swift */ = {
isa = PBXGroup;
children = (
C06248E82016A708009EF3DE /* AppDelegate.swift */,
C06248EA2016A708009EF3DE /* ViewController.swift */,
C00A217D2017E42500A11955 /* ModelThing.h */,
C00A217E2017E42500A11955 /* ModelThing.m */,
C06248EC2016A708009EF3DE /* Main.storyboard */,
C06248EF2016A708009EF3DE /* Assets.xcassets */,
C06248F12016A708009EF3DE /* LaunchScreen.storyboard */,
C06248F42016A708009EF3DE /* Info.plist */,
);
path = "Static Swift";
sourceTree = "<group>";
};
C8E28305E444304C4C82CA36 /* Frameworks */ = {
isa = PBXGroup;
children = (
66EF8CD87550366CE411E9E5 /* Pods_Abstract_Target_iOS_Pods_Dynamic.framework */,
E99245D1CAE3EAEA11963B29 /* libPods-Abstract Target-iOS Pods-Static.a */,
);
name = Frameworks;
sourceTree = "<group>";
};
E0634AD47DB51DF85CD1FD7F /* Pods */ = {
isa = PBXGroup;
children = (
C8305F6CEF9F399F706F50A8 /* Pods-Abstract Target-iOS Pods-Dynamic.debug.xcconfig */,
BFD3374B6AE6E01A26161DF6 /* Pods-Abstract Target-iOS Pods-Dynamic.release.xcconfig */,
33A84E66EBEDC738A1DC928D /* Pods-Abstract Target-iOS Pods-Static.debug.xcconfig */,
BCCB47A125EFE121F6CB0060 /* Pods-Abstract Target-iOS Pods-Static.release.xcconfig */,
);
name = Pods;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
C06248E42016A708009EF3DE /* Static */ = {
isa = PBXNativeTarget;
buildConfigurationList = C06248F72016A708009EF3DE /* Build configuration list for PBXNativeTarget "Static" */;
buildPhases = (
1AE3CB4E770292D4D58BE8E1 /* [CP] Check Pods Manifest.lock */,
C06248E12016A708009EF3DE /* Sources */,
C06248E22016A708009EF3DE /* Frameworks */,
C06248E32016A708009EF3DE /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = Static;
productName = "Static Swift";
productReference = C06248E52016A708009EF3DE /* Static.app */;
productType = "com.apple.product-type.application";
};
C06248FA2016AE3A009EF3DE /* Dynamic */ = {
isa = PBXNativeTarget;
buildConfigurationList = C06249032016AE3A009EF3DE /* Build configuration list for PBXNativeTarget "Dynamic" */;
buildPhases = (
2F12433D31909FF2EF9D0658 /* [CP] Check Pods Manifest.lock */,
C06248FB2016AE3A009EF3DE /* Sources */,
C06248FE2016AE3A009EF3DE /* Frameworks */,
C06248FF2016AE3A009EF3DE /* Resources */,
74F94906590759F5A32D42CD /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = Dynamic;
productName = "Static Swift";
productReference = C06249062016AE3A009EF3DE /* Dynamic.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
C06248DD2016A708009EF3DE /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0920;
LastUpgradeCheck = 0930;
ORGANIZATIONNAME = "Samuel Giddins";
TargetAttributes = {
C06248E42016A708009EF3DE = {
CreatedOnToolsVersion = 9.2;
LastSwiftMigration = 0920;
ProvisioningStyle = Automatic;
};
C06248FA2016AE3A009EF3DE = {
LastSwiftMigration = 0920;
ProvisioningStyle = Automatic;
};
};
};
buildConfigurationList = C06248E02016A708009EF3DE /* Build configuration list for PBXProject "iOS Modules" */;
compatibilityVersion = "Xcode 8.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = C06248DC2016A708009EF3DE;
productRefGroup = C06248E62016A708009EF3DE /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
C06248E42016A708009EF3DE /* Static */,
C06248FA2016AE3A009EF3DE /* Dynamic */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
C06248E32016A708009EF3DE /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
C06248F32016A708009EF3DE /* LaunchScreen.storyboard in Resources */,
C06248F02016A708009EF3DE /* Assets.xcassets in Resources */,
C06248EE2016A708009EF3DE /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
C06248FF2016AE3A009EF3DE /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
C06249002016AE3A009EF3DE /* LaunchScreen.storyboard in Resources */,
C06249012016AE3A009EF3DE /* Assets.xcassets in Resources */,
C06249022016AE3A009EF3DE /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
1AE3CB4E770292D4D58BE8E1 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Abstract Target-iOS Pods-Static-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
2F12433D31909FF2EF9D0658 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Abstract Target-iOS Pods-Dynamic-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
74F94906590759F5A32D42CD /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${SRCROOT}/Pods/Target Support Files/Pods-Abstract Target-iOS Pods-Dynamic/Pods-Abstract Target-iOS Pods-Dynamic-frameworks.sh",
"${BUILT_PRODUCTS_DIR}/Alamofire-framework-iOS/Alamofire.framework",
"${BUILT_PRODUCTS_DIR}/CustomModuleMapPod-framework-iOS/CustomModuleMapPod.framework",
"${BUILT_PRODUCTS_DIR}/MixedPod-framework-iOS/MixedPod.framework",
"${BUILT_PRODUCTS_DIR}/ObjCPod-framework-iOS/ObjCPod.framework",
"${BUILT_PRODUCTS_DIR}/SwiftPod-framework-iOS/SwiftPod.framework",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CustomModuleMapPod.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MixedPod.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ObjCPod.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftPod.framework",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Abstract Target-iOS Pods-Dynamic/Pods-Abstract Target-iOS Pods-Dynamic-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
C06248E12016A708009EF3DE /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
C06248EB2016A708009EF3DE /* ViewController.swift in Sources */,
C00A217F2017E42500A11955 /* ModelThing.m in Sources */,
C06248E92016A708009EF3DE /* AppDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
C06248FB2016AE3A009EF3DE /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
C06248FC2016AE3A009EF3DE /* ViewController.swift in Sources */,
C00A21802017E42500A11955 /* ModelThing.m in Sources */,
C06248FD2016AE3A009EF3DE /* AppDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
C06248EC2016A708009EF3DE /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
C06248ED2016A708009EF3DE /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
C06248F12016A708009EF3DE /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
C06248F22016A708009EF3DE /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
C06248F52016A708009EF3DE /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.2;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = (
"$(inherited)",
"-Wincomplete-umbrella",
);
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
C06248F62016A708009EF3DE /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.2;
MTL_ENABLE_DEBUG_INFO = NO;
OTHER_CFLAGS = (
"$(inherited)",
"-Wincomplete-umbrella",
);
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
C06248F82016A708009EF3DE /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 33A84E66EBEDC738A1DC928D /* Pods-Abstract Target-iOS Pods-Static.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CODE_SIGN_STYLE = Automatic;
INFOPLIST_FILE = "Static Swift/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "me.segiddins.Static-Swift";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 4.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
C06248F92016A708009EF3DE /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = BCCB47A125EFE121F6CB0060 /* Pods-Abstract Target-iOS Pods-Static.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CODE_SIGN_STYLE = Automatic;
INFOPLIST_FILE = "Static Swift/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "me.segiddins.Static-Swift";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 4.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
C06249042016AE3A009EF3DE /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = C8305F6CEF9F399F706F50A8 /* Pods-Abstract Target-iOS Pods-Dynamic.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = "";
INFOPLIST_FILE = "Static Swift/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "me.segiddins.Static-Swift";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 4.0;
TARGETED_DEVICE_FAMILY = 1;
};
name = Debug;
};
C06249052016AE3A009EF3DE /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = BFD3374B6AE6E01A26161DF6 /* Pods-Abstract Target-iOS Pods-Dynamic.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = "";
INFOPLIST_FILE = "Static Swift/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "me.segiddins.Static-Swift";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_VERSION = 4.0;
TARGETED_DEVICE_FAMILY = 1;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
C06248E02016A708009EF3DE /* Build configuration list for PBXProject "iOS Modules" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C06248F52016A708009EF3DE /* Debug */,
C06248F62016A708009EF3DE /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
C06248F72016A708009EF3DE /* Build configuration list for PBXNativeTarget "Static" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C06248F82016A708009EF3DE /* Debug */,
C06248F92016A708009EF3DE /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
C06249032016AE3A009EF3DE /* Build configuration list for PBXNativeTarget "Dynamic" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C06249042016AE3A009EF3DE /* Debug */,
C06249052016AE3A009EF3DE /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = C06248DD2016A708009EF3DE /* Project object */;
}
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0920"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C06248FA2016AE3A009EF3DE"
BuildableName = "Dynamic.app"
BlueprintName = "Dynamic"
ReferencedContainer = "container:iOS Modules.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C06248FA2016AE3A009EF3DE"
BuildableName = "Dynamic.app"
BlueprintName = "Dynamic"
ReferencedContainer = "container:iOS Modules.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C06248FA2016AE3A009EF3DE"
BuildableName = "Dynamic.app"
BlueprintName = "Dynamic"
ReferencedContainer = "container:iOS Modules.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C06248FA2016AE3A009EF3DE"
BuildableName = "Dynamic.app"
BlueprintName = "Dynamic"
ReferencedContainer = "container:iOS Modules.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0920"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C06248E42016A708009EF3DE"
BuildableName = "Static.app"
BlueprintName = "Static"
ReferencedContainer = "container:iOS Modules.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C06248E42016A708009EF3DE"
BuildableName = "Static.app"
BlueprintName = "Static"
ReferencedContainer = "container:iOS Modules.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C06248E42016A708009EF3DE"
BuildableName = "Static.app"
BlueprintName = "Static"
ReferencedContainer = "container:iOS Modules.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C06248E42016A708009EF3DE"
BuildableName = "Static.app"
BlueprintName = "Static"
ReferencedContainer = "container:iOS Modules.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 48;
objects = {
/* Begin PBXBuildFile section */
2F2D3E7DD8020F358D2B018A /* Pods_Abstract_Target_macOS_Pods_Dynamic.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BB2203E94F7BFB62CF9A4152 /* Pods_Abstract_Target_macOS_Pods_Dynamic.framework */; };
3BF69813355DB62D739E48D1 /* libPods-Abstract Target-macOS Pods-Static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5773DFEBB1F7D6376E3C6617 /* libPods-Abstract Target-macOS Pods-Static.a */; };
C00A217F2017E42500A11955 /* ModelThing.m in Sources */ = {isa = PBXBuildFile; fileRef = C00A217E2017E42500A11955 /* ModelThing.m */; };
C00A21802017E42500A11955 /* ModelThing.m in Sources */ = {isa = PBXBuildFile; fileRef = C00A217E2017E42500A11955 /* ModelThing.m */; };
C06248E92016A708009EF3DE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C06248E82016A708009EF3DE /* AppDelegate.swift */; };
C06248EB2016A708009EF3DE /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C06248EA2016A708009EF3DE /* ViewController.swift */; };
C06248FC2016AE3A009EF3DE /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C06248EA2016A708009EF3DE /* ViewController.swift */; };
C06248FD2016AE3A009EF3DE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C06248E82016A708009EF3DE /* AppDelegate.swift */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
1E949C071CEB4793A667756F /* Pods-Abstract Target-macOS Pods-Dynamic.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Abstract Target-macOS Pods-Dynamic.release.xcconfig"; path = "Pods/Target Support Files/Pods-Abstract Target-macOS Pods-Dynamic/Pods-Abstract Target-macOS Pods-Dynamic.release.xcconfig"; sourceTree = "<group>"; };
47E1D32B15E8199CE61CF31B /* Pods-Abstract Target-macOS Pods-Static.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Abstract Target-macOS Pods-Static.release.xcconfig"; path = "Pods/Target Support Files/Pods-Abstract Target-macOS Pods-Static/Pods-Abstract Target-macOS Pods-Static.release.xcconfig"; sourceTree = "<group>"; };
5773DFEBB1F7D6376E3C6617 /* libPods-Abstract Target-macOS Pods-Static.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Abstract Target-macOS Pods-Static.a"; sourceTree = BUILT_PRODUCTS_DIR; };
BB2203E94F7BFB62CF9A4152 /* Pods_Abstract_Target_macOS_Pods_Dynamic.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Abstract_Target_macOS_Pods_Dynamic.framework; sourceTree = BUILT_PRODUCTS_DIR; };
C00A217D2017E42500A11955 /* ModelThing.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ModelThing.h; sourceTree = "<group>"; };
C00A217E2017E42500A11955 /* ModelThing.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ModelThing.m; sourceTree = "<group>"; };
C06248E52016A708009EF3DE /* Static.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Static.app; sourceTree = BUILT_PRODUCTS_DIR; };
C06248E82016A708009EF3DE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
C06248EA2016A708009EF3DE /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
C06248F42016A708009EF3DE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
C06249062016AE3A009EF3DE /* Dynamic.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Dynamic.app; sourceTree = BUILT_PRODUCTS_DIR; };
CD9AE208D231588BF9A4C0D2 /* Pods-Abstract Target-macOS Pods-Dynamic.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Abstract Target-macOS Pods-Dynamic.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Abstract Target-macOS Pods-Dynamic/Pods-Abstract Target-macOS Pods-Dynamic.debug.xcconfig"; sourceTree = "<group>"; };
CFDA82AEB5C8A1B1DD6949AC /* Pods-Abstract Target-macOS Pods-Static.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Abstract Target-macOS Pods-Static.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Abstract Target-macOS Pods-Static/Pods-Abstract Target-macOS Pods-Static.debug.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
C06248E22016A708009EF3DE /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
3BF69813355DB62D739E48D1 /* libPods-Abstract Target-macOS Pods-Static.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
C06248FE2016AE3A009EF3DE /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
2F2D3E7DD8020F358D2B018A /* Pods_Abstract_Target_macOS_Pods_Dynamic.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
4674A866F88199466931F160 /* Frameworks */ = {
isa = PBXGroup;
children = (
BB2203E94F7BFB62CF9A4152 /* Pods_Abstract_Target_macOS_Pods_Dynamic.framework */,
5773DFEBB1F7D6376E3C6617 /* libPods-Abstract Target-macOS Pods-Static.a */,
);
name = Frameworks;
sourceTree = "<group>";
};
901AECEC8BB930DDFA940951 /* Pods */ = {
isa = PBXGroup;
children = (
CD9AE208D231588BF9A4C0D2 /* Pods-Abstract Target-macOS Pods-Dynamic.debug.xcconfig */,
1E949C071CEB4793A667756F /* Pods-Abstract Target-macOS Pods-Dynamic.release.xcconfig */,
CFDA82AEB5C8A1B1DD6949AC /* Pods-Abstract Target-macOS Pods-Static.debug.xcconfig */,
47E1D32B15E8199CE61CF31B /* Pods-Abstract Target-macOS Pods-Static.release.xcconfig */,
);
name = Pods;
sourceTree = "<group>";
};
C06248DC2016A708009EF3DE = {
isa = PBXGroup;
children = (
C06248E72016A708009EF3DE /* Static Swift */,
C06248E62016A708009EF3DE /* Products */,
901AECEC8BB930DDFA940951 /* Pods */,
4674A866F88199466931F160 /* Frameworks */,
);
sourceTree = "<group>";
};
C06248E62016A708009EF3DE /* Products */ = {
isa = PBXGroup;
children = (
C06248E52016A708009EF3DE /* Static.app */,
C06249062016AE3A009EF3DE /* Dynamic.app */,
);
name = Products;
sourceTree = "<group>";
};
C06248E72016A708009EF3DE /* Static Swift */ = {
isa = PBXGroup;
children = (
C06248E82016A708009EF3DE /* AppDelegate.swift */,
C06248EA2016A708009EF3DE /* ViewController.swift */,
C00A217D2017E42500A11955 /* ModelThing.h */,
C00A217E2017E42500A11955 /* ModelThing.m */,
C06248F42016A708009EF3DE /* Info.plist */,
);
path = "Static Swift";
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
C06248E42016A708009EF3DE /* Static */ = {
isa = PBXNativeTarget;
buildConfigurationList = C06248F72016A708009EF3DE /* Build configuration list for PBXNativeTarget "Static" */;
buildPhases = (
FDE12D3B73D1A84536C81922 /* [CP] Check Pods Manifest.lock */,
C06248E12016A708009EF3DE /* Sources */,
C06248E22016A708009EF3DE /* Frameworks */,
C06248E32016A708009EF3DE /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = Static;
productName = "Static Swift";
productReference = C06248E52016A708009EF3DE /* Static.app */;
productType = "com.apple.product-type.application";
};
C06248FA2016AE3A009EF3DE /* Dynamic */ = {
isa = PBXNativeTarget;
buildConfigurationList = C06249032016AE3A009EF3DE /* Build configuration list for PBXNativeTarget "Dynamic" */;
buildPhases = (
9421DA4FCECB32C49E205BEF /* [CP] Check Pods Manifest.lock */,
C06248FB2016AE3A009EF3DE /* Sources */,
C06248FE2016AE3A009EF3DE /* Frameworks */,
C06248FF2016AE3A009EF3DE /* Resources */,
CCC86C1196895CEB7F2D0C9B /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = Dynamic;
productName = "Static Swift";
productReference = C06249062016AE3A009EF3DE /* Dynamic.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
C06248DD2016A708009EF3D0 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0920;
LastUpgradeCheck = 0930;
ORGANIZATIONNAME = "Samuel Giddins";
TargetAttributes = {
C06248E42016A708009EF3DE = {
CreatedOnToolsVersion = 9.2;
LastSwiftMigration = 0920;
ProvisioningStyle = Automatic;
};
C06248FA2016AE3A009EF3DE = {
LastSwiftMigration = 0920;
ProvisioningStyle = Automatic;
};
};
};
buildConfigurationList = C06248E02016A708009EF3DE /* Build configuration list for PBXProject "macOS Modules" */;
compatibilityVersion = "Xcode 8.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = C06248DC2016A708009EF3DE;
productRefGroup = C06248E62016A708009EF3DE /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
C06248E42016A708009EF3DE /* Static */,
C06248FA2016AE3A009EF3DE /* Dynamic */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
C06248E32016A708009EF3DE /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
C06248FF2016AE3A009EF3DE /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
9421DA4FCECB32C49E205BEF /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Abstract Target-macOS Pods-Dynamic-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
CCC86C1196895CEB7F2D0C9B /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${SRCROOT}/Pods/Target Support Files/Pods-Abstract Target-macOS Pods-Dynamic/Pods-Abstract Target-macOS Pods-Dynamic-frameworks.sh",
"${BUILT_PRODUCTS_DIR}/Alamofire-framework-macOS/Alamofire.framework",
"${BUILT_PRODUCTS_DIR}/CustomModuleMapPod-framework-macOS/CustomModuleMapPod.framework",
"${BUILT_PRODUCTS_DIR}/MixedPod-framework-macOS/MixedPod.framework",
"${BUILT_PRODUCTS_DIR}/ObjCPod-framework-macOS/ObjCPod.framework",
"${BUILT_PRODUCTS_DIR}/SwiftPod-framework-macOS/SwiftPod.framework",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CustomModuleMapPod.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MixedPod.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ObjCPod.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftPod.framework",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Abstract Target-macOS Pods-Dynamic/Pods-Abstract Target-macOS Pods-Dynamic-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
FDE12D3B73D1A84536C81922 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Abstract Target-macOS Pods-Static-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
C06248E12016A708009EF3DE /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
C06248EB2016A708009EF3DE /* ViewController.swift in Sources */,
C00A217F2017E42500A11955 /* ModelThing.m in Sources */,
C06248E92016A708009EF3DE /* AppDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
C06248FB2016AE3A009EF3DE /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
C06248FC2016AE3A009EF3DE /* ViewController.swift in Sources */,
C00A21802017E42500A11955 /* ModelThing.m in Sources */,
C06248FD2016AE3A009EF3DE /* AppDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
C06248F52016A708009EF3DE /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.11;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = (
"$(inherited)",
"-Wincomplete-umbrella",
);
SDKROOT = macosx;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
C06248F62016A708009EF3DE /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.11;
MTL_ENABLE_DEBUG_INFO = NO;
OTHER_CFLAGS = (
"$(inherited)",
"-Wincomplete-umbrella",
);
SDKROOT = macosx;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
C06248F82016A708009EF3DE /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = CFDA82AEB5C8A1B1DD6949AC /* Pods-Abstract Target-macOS Pods-Static.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CODE_SIGN_STYLE = Automatic;
INFOPLIST_FILE = "Static Swift/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "me.segiddins.Static-Swift";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 4.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
C06248F92016A708009EF3DE /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 47E1D32B15E8199CE61CF31B /* Pods-Abstract Target-macOS Pods-Static.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CODE_SIGN_STYLE = Automatic;
INFOPLIST_FILE = "Static Swift/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "me.segiddins.Static-Swift";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 4.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
C06249042016AE3A009EF3DE /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = CD9AE208D231588BF9A4C0D2 /* Pods-Abstract Target-macOS Pods-Dynamic.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = "";
INFOPLIST_FILE = "Static Swift/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.11;
PRODUCT_BUNDLE_IDENTIFIER = "me.segiddins.Static-Swift";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 4.0;
TARGETED_DEVICE_FAMILY = 1;
};
name = Debug;
};
C06249052016AE3A009EF3DE /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 1E949C071CEB4793A667756F /* Pods-Abstract Target-macOS Pods-Dynamic.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = "";
INFOPLIST_FILE = "Static Swift/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.11;
PRODUCT_BUNDLE_IDENTIFIER = "me.segiddins.Static-Swift";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_VERSION = 4.0;
TARGETED_DEVICE_FAMILY = 1;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
C06248E02016A708009EF3DE /* Build configuration list for PBXProject "macOS Modules" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C06248F52016A708009EF3DE /* Debug */,
C06248F62016A708009EF3DE /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
C06248F72016A708009EF3DE /* Build configuration list for PBXNativeTarget "Static" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C06248F82016A708009EF3DE /* Debug */,
C06248F92016A708009EF3DE /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
C06249032016AE3A009EF3DE /* Build configuration list for PBXNativeTarget "Dynamic" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C06249042016AE3A009EF3DE /* Debug */,
C06249052016AE3A009EF3DE /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = C06248DD2016A708009EF3D0 /* Project object */;
}
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0920"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C06248FA2016AE3A009EF3DE"
BuildableName = "Dynamic.app"
BlueprintName = "Dynamic"
ReferencedContainer = "container:macOS Modules.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C06248FA2016AE3A009EF3DE"
BuildableName = "Dynamic.app"
BlueprintName = "Dynamic"
ReferencedContainer = "container:macOS Modules.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C06248FA2016AE3A009EF3DE"
BuildableName = "Dynamic.app"
BlueprintName = "Dynamic"
ReferencedContainer = "container:macOS Modules.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C06248FA2016AE3A009EF3DE"
BuildableName = "Dynamic.app"
BlueprintName = "Dynamic"
ReferencedContainer = "container:macOS Modules.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0920"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C06248E42016A708009EF3DE"
BuildableName = "Static.app"
BlueprintName = "Static"
ReferencedContainer = "container:macOS Modules.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C06248E42016A708009EF3DE"
BuildableName = "Static.app"
BlueprintName = "Static"
ReferencedContainer = "container:macOS Modules.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C06248E42016A708009EF3DE"
BuildableName = "Static.app"
BlueprintName = "Static"
ReferencedContainer = "container:macOS Modules.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C06248E42016A708009EF3DE"
BuildableName = "Static.app"
BlueprintName = "Static"
ReferencedContainer = "container:macOS Modules.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
...@@ -115,7 +115,6 @@ ...@@ -115,7 +115,6 @@
A8C77C4C1C9DA931000AFF69 /* Frameworks */, A8C77C4C1C9DA931000AFF69 /* Frameworks */,
A8C77C4D1C9DA931000AFF69 /* Resources */, A8C77C4D1C9DA931000AFF69 /* Resources */,
E1D153F1317B0ED8A0A98DE0 /* [CP] Embed Pods Frameworks */, E1D153F1317B0ED8A0A98DE0 /* [CP] Embed Pods Frameworks */,
41F27F05FA87A7FE9EA1A2BF /* [CP] Copy Pods Resources */,
); );
buildRules = ( buildRules = (
); );
...@@ -172,21 +171,6 @@ ...@@ -172,21 +171,6 @@
/* End PBXResourcesBuildPhase section */ /* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */
41F27F05FA87A7FE9EA1A2BF /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "[CP] Copy Pods Resources";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Resource Bundle Example/Pods-Resource Bundle Example-resources.sh\"\n";
showEnvVarsInLog = 0;
};
8FB5EE32BFE997FC437DE638 /* [CP] Check Pods Manifest.lock */ = { 8FB5EE32BFE997FC437DE638 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
......
...@@ -154,7 +154,6 @@ ...@@ -154,7 +154,6 @@
F58833CB1CBBC0C9007D4DA4 /* Sources */, F58833CB1CBBC0C9007D4DA4 /* Sources */,
F58833CC1CBBC0C9007D4DA4 /* Frameworks */, F58833CC1CBBC0C9007D4DA4 /* Frameworks */,
F58833CD1CBBC0C9007D4DA4 /* Resources */, F58833CD1CBBC0C9007D4DA4 /* Resources */,
2D7DA37C114DD6E56D290D94 /* [CP] Embed Pods Frameworks */,
BEB56E0CAF877FA9577BF299 /* [CP] Copy Pods Resources */, BEB56E0CAF877FA9577BF299 /* [CP] Copy Pods Resources */,
); );
buildRules = ( buildRules = (
...@@ -174,7 +173,6 @@ ...@@ -174,7 +173,6 @@
F58833E41CBBC0C9007D4DA4 /* Sources */, F58833E41CBBC0C9007D4DA4 /* Sources */,
F58833E51CBBC0C9007D4DA4 /* Frameworks */, F58833E51CBBC0C9007D4DA4 /* Frameworks */,
F58833E61CBBC0C9007D4DA4 /* Resources */, F58833E61CBBC0C9007D4DA4 /* Resources */,
6D3C9E5647F2F9BE1B8CA805 /* [CP] Embed Pods Frameworks */,
23FBFF6CF467540E5F102610 /* [CP] Copy Pods Resources */, 23FBFF6CF467540E5F102610 /* [CP] Copy Pods Resources */,
); );
buildRules = ( buildRules = (
...@@ -347,36 +345,6 @@ ...@@ -347,36 +345,6 @@
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-TestInclusionsPods-TestInclusionsTests/Pods-TestInclusionsPods-TestInclusionsTests-resources.sh\"\n"; shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-TestInclusionsPods-TestInclusionsTests/Pods-TestInclusionsPods-TestInclusionsTests-resources.sh\"\n";
showEnvVarsInLog = 0; showEnvVarsInLog = 0;
}; };
2D7DA37C114DD6E56D290D94 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-TestInclusionsPods-TestInclusions/Pods-TestInclusionsPods-TestInclusions-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
6D3C9E5647F2F9BE1B8CA805 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-TestInclusionsPods-TestInclusionsTests/Pods-TestInclusionsPods-TestInclusionsTests-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
BEB56E0CAF877FA9577BF299 /* [CP] Copy Pods Resources */ = { BEB56E0CAF877FA9577BF299 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
......
...@@ -100,7 +100,6 @@ ...@@ -100,7 +100,6 @@
5CAF4FE51CC1125900B44520 /* Frameworks */, 5CAF4FE51CC1125900B44520 /* Frameworks */,
5CAF4FE61CC1125900B44520 /* Resources */, 5CAF4FE61CC1125900B44520 /* Resources */,
4697BF2DD055B93C3DE0E375 /* [CP] Embed Pods Frameworks */, 4697BF2DD055B93C3DE0E375 /* [CP] Embed Pods Frameworks */,
9C2933733E94154FB1F30218 /* [CP] Copy Pods Resources */,
); );
buildRules = ( buildRules = (
); );
...@@ -196,21 +195,6 @@ ...@@ -196,21 +195,6 @@
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Vendored Framework Example/Pods-Vendored Framework Example-frameworks.sh\"\n"; shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Vendored Framework Example/Pods-Vendored Framework Example-frameworks.sh\"\n";
showEnvVarsInLog = 0; showEnvVarsInLog = 0;
}; };
9C2933733E94154FB1F30218 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "[CP] Copy Pods Resources";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Vendored Framework Example/Pods-Vendored Framework Example-resources.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */ /* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */
......
...@@ -206,7 +206,6 @@ ...@@ -206,7 +206,6 @@
A129F8BE1B2CA81600EBC1DD /* Resources */, A129F8BE1B2CA81600EBC1DD /* Resources */,
A129F8F61B2CA81700EBC1DD /* Embed Watch Content */, A129F8F61B2CA81700EBC1DD /* Embed Watch Content */,
B55D105F75FDCEAD4A12BE64 /* [CP] Embed Pods Frameworks */, B55D105F75FDCEAD4A12BE64 /* [CP] Embed Pods Frameworks */,
1E232F64274BFFA8F587E155 /* [CP] Copy Pods Resources */,
); );
buildRules = ( buildRules = (
); );
...@@ -245,7 +244,6 @@ ...@@ -245,7 +244,6 @@
A865B2771CAF18FF0031EFC6 /* Frameworks */, A865B2771CAF18FF0031EFC6 /* Frameworks */,
A865B2781CAF18FF0031EFC6 /* Resources */, A865B2781CAF18FF0031EFC6 /* Resources */,
766BB1279F3F20E30F8D82AC /* [CP] Embed Pods Frameworks */, 766BB1279F3F20E30F8D82AC /* [CP] Embed Pods Frameworks */,
9404B5E651690A16E40B8F95 /* [CP] Copy Pods Resources */,
); );
buildRules = ( buildRules = (
); );
...@@ -328,21 +326,6 @@ ...@@ -328,21 +326,6 @@
/* End PBXResourcesBuildPhase section */ /* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */
1E232F64274BFFA8F587E155 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "[CP] Copy Pods Resources";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-watchOSsample/Pods-watchOSsample-resources.sh\"\n";
showEnvVarsInLog = 0;
};
1E8987D060C89B71B6F2E504 /* [CP] Check Pods Manifest.lock */ = { 1E8987D060C89B71B6F2E504 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
...@@ -397,21 +380,6 @@ ...@@ -397,21 +380,6 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0; showEnvVarsInLog = 0;
}; };
9404B5E651690A16E40B8F95 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "[CP] Copy Pods Resources";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-watchOSsample WatchKit Extension/Pods-watchOSsample WatchKit Extension-resources.sh\"\n";
showEnvVarsInLog = 0;
};
B55D105F75FDCEAD4A12BE64 /* [CP] Embed Pods Frameworks */ = { B55D105F75FDCEAD4A12BE64 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
......
...@@ -57,6 +57,7 @@ module Pod ...@@ -57,6 +57,7 @@ module Pod
autoload :Markdown, 'cocoapods/generator/acknowledgements/markdown' autoload :Markdown, 'cocoapods/generator/acknowledgements/markdown'
autoload :Plist, 'cocoapods/generator/acknowledgements/plist' autoload :Plist, 'cocoapods/generator/acknowledgements/plist'
autoload :BridgeSupport, 'cocoapods/generator/bridge_support' autoload :BridgeSupport, 'cocoapods/generator/bridge_support'
autoload :Constant, 'cocoapods/generator/constant'
autoload :CopyResourcesScript, 'cocoapods/generator/copy_resources_script' autoload :CopyResourcesScript, 'cocoapods/generator/copy_resources_script'
autoload :DummySource, 'cocoapods/generator/dummy_source' autoload :DummySource, 'cocoapods/generator/dummy_source'
autoload :EmbedFrameworksScript, 'cocoapods/generator/embed_frameworks_script' autoload :EmbedFrameworksScript, 'cocoapods/generator/embed_frameworks_script'
......
module Pod
module Generator
# Generates a constant file.
#
class Constant
def initialize(contents)
@generate = contents
end
attr_reader :generate
def save_as(path)
path.open('w') do |f|
f.write(generate)
end
end
end
end
end
...@@ -10,12 +10,41 @@ module Pod ...@@ -10,12 +10,41 @@ module Pod
# #
attr_reader :target attr_reader :target
attr_reader :headers
Header = Struct.new(:path, :umbrella, :private, :textual, :exclude, :size, :mtime) do
alias_method :private?, :private
def to_s
[
(:private if private?),
(:textual if textual),
(:umbrella if umbrella),
(:exclude if exclude),
'header',
%("#{path}"),
attrs,
].compact.join(' ')
end
def attrs
attrs = {
'size' => size,
'mtime' => mtime,
}.reject { |_k, v| v.nil? }
return nil if attrs.empty?
attrs.to_s
end
end
# Initialize a new instance # Initialize a new instance
# #
# @param [PodTarget] target @see target # @param [PodTarget] target @see target
# #
def initialize(target) def initialize(target)
@target = target @target = target
@headers = [
Header.new(target.umbrella_header_path.basename, true),
]
end end
# Generates and saves the Info.plist to the given path. # Generates and saves the Info.plist to the given path.
...@@ -38,14 +67,36 @@ module Pod ...@@ -38,14 +67,36 @@ module Pod
# #
def generate def generate
<<-MODULE_MAP.strip_heredoc <<-MODULE_MAP.strip_heredoc
framework module #{target.product_module_name} { #{module_specifier_prefix}module #{target.product_module_name}#{module_declaration_attributes} {
umbrella header "#{target.umbrella_header_path.basename}" #{headers.join("\n ")}
export * export *
module * { export * } module * { export * }
} }
MODULE_MAP MODULE_MAP
end end
private
# The prefix to `module` to prepend in the module map.
# Ensures that only framework targets have `framework` prepended.
#
def module_specifier_prefix
if target.requires_frameworks?
'framework '
else
''
end
end
# The suffix attributes to `module`.
# Ensures that library module maps are treated as `system` modules,
# supressing warnings when imported, as is done for header imports given via `-isystem`.
#
def module_declaration_attributes
return '' if target.requires_frameworks?
' [system]'
end
end end
end end
end end
...@@ -55,12 +55,16 @@ module Pod ...@@ -55,12 +55,16 @@ module Pod
includes_static_libs = !target.requires_frameworks? includes_static_libs = !target.requires_frameworks?
includes_static_libs ||= pod_targets.flat_map(&:file_accessors).any? { |fa| !fa.vendored_static_artifacts.empty? } includes_static_libs ||= pod_targets.flat_map(&:file_accessors).any? { |fa| !fa.vendored_static_artifacts.empty? }
config = { config = {
'FRAMEWORK_SEARCH_PATHS' => '$(inherited) ',
'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) COCOAPODS=1',
'HEADER_SEARCH_PATHS' => '$(inherited) ',
'LIBRARY_SEARCH_PATHS' => '$(inherited) ',
'OTHER_CFLAGS' => '$(inherited) ',
'OTHER_LDFLAGS' => '$(inherited) ' + XCConfigHelper.default_ld_flags(target, includes_static_libs), 'OTHER_LDFLAGS' => '$(inherited) ' + XCConfigHelper.default_ld_flags(target, includes_static_libs),
'OTHER_SWIFT_FLAGS' => '$(inherited) ',
'PODS_PODFILE_DIR_PATH' => target.podfile_dir_relative_path, 'PODS_PODFILE_DIR_PATH' => target.podfile_dir_relative_path,
'PODS_ROOT' => target.relative_pods_root, 'PODS_ROOT' => target.relative_pods_root,
'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) COCOAPODS=1', 'SWIFT_INCLUDE_PATHS' => '$(inherited) ',
'FRAMEWORK_SEARCH_PATHS' => '$(inherited) ',
'LIBRARY_SEARCH_PATHS' => '$(inherited) ',
}.merge(embedded_content_settings) }.merge(embedded_content_settings)
@xcconfig = Xcodeproj::Config.new(config) @xcconfig = Xcodeproj::Config.new(config)
...@@ -140,12 +144,12 @@ module Pod ...@@ -140,12 +144,12 @@ module Pod
end end
build_settings = { build_settings = {
# Make framework headers discoverable by `import "…"` # Make framework headers discoverable by `import "…"`
'OTHER_CFLAGS' => '$(inherited) ' + XCConfigHelper.quote(framework_header_search_paths, '-iquote'), 'OTHER_CFLAGS' => XCConfigHelper.quote(framework_header_search_paths, '-iquote'),
} }
if pod_targets.any? { |t| !t.should_build? } if pod_targets.any? { |t| !t.should_build? }
# Make library headers discoverable by `#import "…"` # Make library headers discoverable by `#import "…"`
library_header_search_paths = target.sandbox.public_headers.search_paths(target.platform) library_header_search_paths = target.sandbox.public_headers.search_paths(target.platform)
build_settings['HEADER_SEARCH_PATHS'] = '$(inherited) ' + XCConfigHelper.quote(library_header_search_paths) build_settings['HEADER_SEARCH_PATHS'] = XCConfigHelper.quote(library_header_search_paths)
build_settings['OTHER_CFLAGS'] += ' ' + XCConfigHelper.quote(library_header_search_paths, '-isystem') build_settings['OTHER_CFLAGS'] += ' ' + XCConfigHelper.quote(library_header_search_paths, '-isystem')
end end
build_settings build_settings
...@@ -154,9 +158,9 @@ module Pod ...@@ -154,9 +158,9 @@ module Pod
header_search_paths = target.sandbox.public_headers.search_paths(target.platform) header_search_paths = target.sandbox.public_headers.search_paths(target.platform)
{ {
# by `#import "…"` # by `#import "…"`
'HEADER_SEARCH_PATHS' => '$(inherited) ' + XCConfigHelper.quote(header_search_paths), 'HEADER_SEARCH_PATHS' => XCConfigHelper.quote(header_search_paths),
# by `#import <…>` # by `#import <…>`
'OTHER_CFLAGS' => '$(inherited) ' + XCConfigHelper.quote(header_search_paths, '-isystem'), 'OTHER_CFLAGS' => XCConfigHelper.quote(header_search_paths, '-isystem'),
} }
end end
end end
......
...@@ -47,15 +47,17 @@ module Pod ...@@ -47,15 +47,17 @@ module Pod
config = { config = {
'FRAMEWORK_SEARCH_PATHS' => '$(inherited) ', 'FRAMEWORK_SEARCH_PATHS' => '$(inherited) ',
'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) COCOAPODS=1', 'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) COCOAPODS=1',
'HEADER_SEARCH_PATHS' => XCConfigHelper.quote(target.header_search_paths(@test_xcconfig)), 'HEADER_SEARCH_PATHS' => '$(inherited) ' + XCConfigHelper.quote(target.header_search_paths(@test_xcconfig)),
'LIBRARY_SEARCH_PATHS' => '$(inherited) ', 'LIBRARY_SEARCH_PATHS' => '$(inherited) ',
'OTHER_CFLAGS' => '$(inherited) ',
'OTHER_LDFLAGS' => XCConfigHelper.default_ld_flags(target, @test_xcconfig), 'OTHER_LDFLAGS' => XCConfigHelper.default_ld_flags(target, @test_xcconfig),
'OTHER_SWIFT_FLAGS' => '$(inherited) ',
'PODS_ROOT' => '${SRCROOT}', 'PODS_ROOT' => '${SRCROOT}',
'PODS_TARGET_SRCROOT' => target.pod_target_srcroot, 'PODS_TARGET_SRCROOT' => target.pod_target_srcroot,
'PRODUCT_BUNDLE_IDENTIFIER' => 'org.cocoapods.${PRODUCT_NAME:rfc1034identifier}', 'PRODUCT_BUNDLE_IDENTIFIER' => 'org.cocoapods.${PRODUCT_NAME:rfc1034identifier}',
'SKIP_INSTALL' => 'YES', 'SKIP_INSTALL' => 'YES',
'SWIFT_ACTIVE_COMPILATION_CONDITIONS' => '$(inherited) ', 'SWIFT_ACTIVE_COMPILATION_CONDITIONS' => '$(inherited) ',
# 'USE_HEADERMAP' => 'NO' 'SWIFT_INCLUDE_PATHS' => '$(inherited) ',
} }
@xcconfig = Xcodeproj::Config.new(config) @xcconfig = Xcodeproj::Config.new(config)
......
...@@ -329,19 +329,43 @@ module Pod ...@@ -329,19 +329,43 @@ module Pod
build_settings['CONFIGURATION_BUILD_DIR'] = target.configuration_build_dir(CONFIGURATION_BUILD_DIR_VARIABLE) build_settings['CONFIGURATION_BUILD_DIR'] = target.configuration_build_dir(CONFIGURATION_BUILD_DIR_VARIABLE)
end end
module_map_files = []
unless dependent_targets.empty? unless dependent_targets.empty?
framework_search_paths = [] framework_search_paths = []
library_search_paths = [] library_search_paths = []
swift_import_paths = []
dependent_targets.each do |dependent_target| dependent_targets.each do |dependent_target|
if dependent_target.requires_frameworks? if dependent_target.requires_frameworks?
framework_search_paths << dependent_target.configuration_build_dir(CONFIGURATION_BUILD_DIR_VARIABLE) framework_search_paths << dependent_target.configuration_build_dir(CONFIGURATION_BUILD_DIR_VARIABLE)
else else
library_search_paths << dependent_target.configuration_build_dir(CONFIGURATION_BUILD_DIR_VARIABLE) library_search_paths << dependent_target.configuration_build_dir(CONFIGURATION_BUILD_DIR_VARIABLE)
if dependent_target.defines_module?
module_map_file = if dependent_target.uses_swift?
# for swift, we have a custom build phase that copies in the module map, appending the .Swift module
"${PODS_CONFIGURATION_BUILD_DIR}/#{dependent_target.label}/#{dependent_target.product_module_name}.modulemap"
else
"${PODS_ROOT}/#{dependent_target.module_map_path.relative_path_from(dependent_target.sandbox.root)}"
end
module_map_files << %(-fmodule-map-file="#{module_map_file}")
end
end end
swift_import_paths << dependent_target.configuration_build_dir(CONFIGURATION_BUILD_DIR_VARIABLE)
end end
build_settings['FRAMEWORK_SEARCH_PATHS'] = XCConfigHelper.quote(framework_search_paths.uniq) build_settings['FRAMEWORK_SEARCH_PATHS'] = XCConfigHelper.quote(framework_search_paths.uniq)
build_settings['LIBRARY_SEARCH_PATHS'] = XCConfigHelper.quote(library_search_paths.uniq) build_settings['LIBRARY_SEARCH_PATHS'] = XCConfigHelper.quote(library_search_paths.uniq)
build_settings['SWIFT_INCLUDE_PATHS'] = XCConfigHelper.quote(swift_import_paths.uniq)
end
other_swift_flags = module_map_files.tap(&:uniq!).flat_map { |f| ['-Xcc', f] }
if target.is_a?(PodTarget) && !target.requires_frameworks? && target.defines_module?
# make it possible for a mixed swift/objc static library to be able to import the objc from within swift
other_swift_flags += ['-import-underlying-module', '-Xcc', '-fmodule-map-file="${SRCROOT}/${MODULEMAP_FILE}"']
end end
# unconditionally set these, because of (the possibility of) having to add the pod targets own module map file
build_settings['OTHER_CFLAGS'] = module_map_files.join(' ')
build_settings['OTHER_SWIFT_FLAGS'] = other_swift_flags.join(' ')
build_settings build_settings
end end
......
...@@ -165,8 +165,14 @@ module Pod ...@@ -165,8 +165,14 @@ module Pod
def install_libraries def install_libraries
UI.message '- Installing targets' do UI.message '- Installing targets' do
umbrella_headers_by_dir = pod_targets.map do |pod_target|
next unless pod_target.should_build? && pod_target.defines_module?
pod_target.umbrella_header_path
end.compact.group_by(&:dirname)
pod_targets.sort_by(&:name).each do |pod_target| pod_targets.sort_by(&:name).each do |pod_target|
target_installer = PodTargetInstaller.new(sandbox, pod_target) target_installer = PodTargetInstaller.new(sandbox, pod_target)
target_installer.umbrella_headers_by_dir = umbrella_headers_by_dir
target_installer.install! target_installer.install!
end end
......
...@@ -20,6 +20,9 @@ module Pod ...@@ -20,6 +20,9 @@ module Pod
create_info_plist_file(target.info_plist_path, native_target, target.version, target.platform) create_info_plist_file(target.info_plist_path, native_target, target.version, target.platform)
create_module_map create_module_map
create_umbrella_header create_umbrella_header
elsif target.uses_swift?
create_module_map
create_umbrella_header
end end
# Because embedded targets live in their host target, CocoaPods # Because embedded targets live in their host target, CocoaPods
# copies all of the embedded target's pod_targets to its host # copies all of the embedded target's pod_targets to its host
...@@ -60,6 +63,12 @@ module Pod ...@@ -60,6 +63,12 @@ module Pod
'PODS_ROOT' => '$(SRCROOT)', 'PODS_ROOT' => '$(SRCROOT)',
'PRODUCT_BUNDLE_IDENTIFIER' => 'org.cocoapods.${PRODUCT_NAME:rfc1034identifier}', 'PRODUCT_BUNDLE_IDENTIFIER' => 'org.cocoapods.${PRODUCT_NAME:rfc1034identifier}',
'SKIP_INSTALL' => 'YES', 'SKIP_INSTALL' => 'YES',
# Needed to ensure that static libraries won't try to embed the swift stdlib,
# since there's no where to embed in for a static library.
# Not necessary for dynamic frameworks either, since the aggregate targets are never shipped
# on their own, and are always further embedded into an app target.
'ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES' => 'NO',
} }
super.merge(settings) super.merge(settings)
end end
......
...@@ -27,11 +27,11 @@ module Pod ...@@ -27,11 +27,11 @@ module Pod
add_files_to_build_phases add_files_to_build_phases
create_xcconfig_file create_xcconfig_file
create_test_xcconfig_files if target.contains_test_specifications? create_test_xcconfig_files if target.contains_test_specifications?
if target.requires_frameworks?
unless target.static_framework? if target.defines_module?
create_info_plist_file(target.info_plist_path, native_target, target.version, target.platform) create_module_map do |generator|
generator.headers.concat module_map_additional_headers
end end
create_module_map
create_umbrella_header do |generator| create_umbrella_header do |generator|
file_accessors = target.file_accessors file_accessors = target.file_accessors
file_accessors = file_accessors.reject { |f| f.spec.test_specification? } if target.contains_test_specifications? file_accessors = file_accessors.reject { |f| f.spec.test_specification? } if target.contains_test_specifications?
...@@ -41,13 +41,22 @@ module Pod ...@@ -41,13 +41,22 @@ module Pod
end end
else else
file_accessors.flat_map(&:public_headers).map(&:basename) file_accessors.flat_map(&:public_headers).map(&:basename)
end end
end
end
if target.requires_frameworks?
unless target.static_framework?
create_info_plist_file(target.info_plist_path, native_target, target.version, target.platform)
end end
create_build_phase_to_symlink_header_folders create_build_phase_to_symlink_header_folders
if target.static_framework? if target.static_framework?
create_build_phase_to_move_static_framework_archive create_build_phase_to_move_static_framework_archive
end end
elsif target.uses_swift?
add_swift_static_library_compatibility_header_phase
end end
unless skip_pch?(target.non_test_specs) unless skip_pch?(target.non_test_specs)
path = target.prefix_header_path path = target.prefix_header_path
file_accessors = target.file_accessors.reject { |f| f.spec.test_specification? } file_accessors = target.file_accessors.reject { |f| f.spec.test_specification? }
...@@ -64,6 +73,11 @@ module Pod ...@@ -64,6 +73,11 @@ module Pod
end end
end end
# @return [Hash<Pathname,Pathname>] A hash of all umbrella headers, grouped by the directory
# the are stored in
#
attr_accessor :umbrella_headers_by_dir
private private
# @param [Array<Specification>] specs # @param [Array<Specification>] specs
...@@ -87,6 +101,9 @@ module Pod ...@@ -87,6 +101,9 @@ module Pod
settings['PUBLIC_HEADERS_FOLDER_PATH'] = '' settings['PUBLIC_HEADERS_FOLDER_PATH'] = ''
end end
settings['PRODUCT_NAME'] = target.product_basename
settings['PRODUCT_MODULE_NAME'] = target.product_module_name
settings['CODE_SIGN_IDENTITY[sdk=appletvos*]'] = '' settings['CODE_SIGN_IDENTITY[sdk=appletvos*]'] = ''
settings['CODE_SIGN_IDENTITY[sdk=iphoneos*]'] = '' settings['CODE_SIGN_IDENTITY[sdk=iphoneos*]'] = ''
settings['CODE_SIGN_IDENTITY[sdk=watchos*]'] = '' settings['CODE_SIGN_IDENTITY[sdk=watchos*]'] = ''
...@@ -96,6 +113,7 @@ module Pod ...@@ -96,6 +113,7 @@ module Pod
if target.swift_version if target.swift_version
settings['SWIFT_VERSION'] = target.swift_version settings['SWIFT_VERSION'] = target.swift_version
end end
settings settings
end end
...@@ -586,10 +604,7 @@ module Pod ...@@ -586,10 +604,7 @@ module Pod
# @return [PBXFileReference] the file reference of the added file. # @return [PBXFileReference] the file reference of the added file.
# #
def add_file_to_support_group(path) def add_file_to_support_group(path)
pod_name = target.pod_name support_files_group.new_file(path)
dir = target.support_files_dir
group = project.pod_support_files_group(pod_name, dir)
group.new_file(path)
end end
def apply_xcconfig_file_ref_to_resource_bundle_targets(resource_bundle_targets, xcconfig_file_ref) def apply_xcconfig_file_ref_to_resource_bundle_targets(resource_bundle_targets, xcconfig_file_ref)
...@@ -602,11 +617,15 @@ module Pod ...@@ -602,11 +617,15 @@ module Pod
def create_module_map def create_module_map
return super unless custom_module_map return super unless custom_module_map
path = target.module_map_path path = target.module_map_path
UI.message "- Copying module map file to #{UI.path(path)}" do UI.message "- Copying module map file to #{UI.path(path)}" do
unless path.exist? && FileUtils.identical?(custom_module_map, path) contents = custom_module_map.read
FileUtils.cp(custom_module_map, path) unless target.requires_frameworks?
contents.gsub!(/^(\s*)framework\s+(module[^{}]+){/, '\1\2[system] {')
end end
generator = Generator::Constant.new(contents)
update_changed_file(generator, path)
add_file_to_support_group(path) add_file_to_support_group(path)
native_target.build_configurations.each do |c| native_target.build_configurations.each do |c|
...@@ -616,6 +635,17 @@ module Pod ...@@ -616,6 +635,17 @@ module Pod
end end
end end
def module_map_additional_headers
return [] unless umbrella_headers_by_dir
other_paths = umbrella_headers_by_dir[target.module_map_path.dirname] - [target.umbrella_header_path]
other_paths.map do |module_map_path|
# exclude other targets umbrella headers, to avoid
# incomplete umbrella warnings
Generator::ModuleMap::Header.new(module_map_path.basename, nil, nil, nil, true)
end
end
def create_umbrella_header def create_umbrella_header
return super unless custom_module_map return super unless custom_module_map
end end
...@@ -667,6 +697,39 @@ module Pod ...@@ -667,6 +697,39 @@ module Pod
end end
end end
def support_files_group
pod_name = target.pod_name
dir = target.support_files_dir
project.pod_support_files_group(pod_name, dir)
end
# Adds a shell script phase, intended only for static library targets that contain swift,
# to copy the ObjC compatibility header (the -Swift.h file that the swift compiler generates)
# to the built products directory. Additionally, the script phase copies the module map, appending a `.Swift`
# submodule that references the (moved) compatibility header.
#
# @return [Void]
#
def add_swift_static_library_compatibility_header_phase
build_phase = native_target.new_shell_script_build_phase('Copy generated compatibility header')
build_phase.shell_script = <<-SH.strip_heredoc
COMPATIBILITY_HEADER_PATH="${BUILT_PRODUCTS_DIR}/Swift Compatibility Header/${PRODUCT_MODULE_NAME}-Swift.h"
MODULE_MAP_PATH="${BUILT_PRODUCTS_DIR}/${PRODUCT_MODULE_NAME}.modulemap"
ditto "${DERIVED_SOURCES_DIR}/${PRODUCT_MODULE_NAME}-Swift.h" "${COMPATIBILITY_HEADER_PATH}"
ditto "${PODS_ROOT}/#{target.module_map_path.relative_path_from(target.sandbox.root)}" "${MODULE_MAP_PATH}"
printf "\\n\\nmodule ${PRODUCT_MODULE_NAME}.Swift {\\n header \\"${COMPATIBILITY_HEADER_PATH}\\"\\n requires objc\\n}\\n" >> "${MODULE_MAP_PATH}"
SH
build_phase.input_paths = %W(
${DERIVED_SOURCES_DIR}/${PRODUCT_MODULE_NAME}-Swift.h
${PODS_ROOT}/#{target.module_map_path.relative_path_from(target.sandbox.root)}
)
build_phase.output_paths = %w(
${BUILT_PRODUCTS_DIR}/${PRODUCT_MODULE_NAME}.modulemap
${BUILT_PRODUCTS_DIR}/Swift\ Compatibility\ Header/${PRODUCT_MODULE_NAME}-Swift.h
)
end
#-----------------------------------------------------------------------# #-----------------------------------------------------------------------#
end end
end end
......
...@@ -82,7 +82,6 @@ module Pod ...@@ -82,7 +82,6 @@ module Pod
if target.requires_frameworks? if target.requires_frameworks?
framework_name = target.product_module_name framework_name = target.product_module_name
settings['PRODUCT_NAME'] = framework_name
if target.static_framework? if target.static_framework?
settings['PUBLIC_HEADERS_FOLDER_PATH'] = framework_name + '.framework' + '/Headers' settings['PUBLIC_HEADERS_FOLDER_PATH'] = framework_name + '.framework' + '/Headers'
settings['PRIVATE_HEADERS_FOLDER_PATH'] = framework_name + '.framework' + '/PrivateHeaders' settings['PRIVATE_HEADERS_FOLDER_PATH'] = framework_name + '.framework' + '/PrivateHeaders'
...@@ -105,6 +104,7 @@ module Pod ...@@ -105,6 +104,7 @@ module Pod
# @return [Void] # @return [Void]
# #
def update_changed_file(generator, path) def update_changed_file(generator, path)
path.dirname.mkpath
if path.exist? if path.exist?
generator.save_as(support_files_temp_dir) generator.save_as(support_files_temp_dir)
unless FileUtils.identical?(support_files_temp_dir, path) unless FileUtils.identical?(support_files_temp_dir, path)
...@@ -169,9 +169,6 @@ module Pod ...@@ -169,9 +169,6 @@ module Pod
# Creates the module map file which ensures that the umbrella header is # Creates the module map file which ensures that the umbrella header is
# recognized with a customized path # recognized with a customized path
# #
# @yield_param [Generator::ModuleMap]
# yielded once to configure the private headers
#
# @return [void] # @return [void]
# #
def create_module_map def create_module_map
......
...@@ -35,7 +35,7 @@ module Pod ...@@ -35,7 +35,7 @@ module Pod
verify_no_duplicate_framework_and_library_names verify_no_duplicate_framework_and_library_names
verify_no_static_framework_transitive_dependencies verify_no_static_framework_transitive_dependencies
verify_no_pods_used_with_multiple_swift_versions verify_no_pods_used_with_multiple_swift_versions
verify_framework_usage verify_swift_pods_have_module_dependencies
end end
private private
...@@ -106,26 +106,34 @@ module Pod ...@@ -106,26 +106,34 @@ module Pod
unless error_messages.empty? unless error_messages.empty?
raise Informative, 'The following pods are integrated into targets ' \ raise Informative, 'The following pods are integrated into targets ' \
"that do not have the same Swift version:\n\n#{error_messages.join("\n")}" "that do not have the same Swift version:\n\n#{error_messages.join("\n")}"
end end
end end
def verify_framework_usage def verify_swift_pods_have_module_dependencies
aggregate_targets.each do |aggregate_target| error_messages = []
next if aggregate_target.requires_frameworks? pod_targets.each do |pod_target|
next unless pod_target.uses_swift?
aggregate_target.user_build_configurations.keys.each do |config|
pod_targets = aggregate_target.pod_targets_for_build_configuration(config)
swift_pods = pod_targets.select(&:uses_swift?) non_module_dependencies = []
unless swift_pods.empty? pod_target.dependent_targets.each do |dependent_target|
raise Informative, 'Pods written in Swift can only be integrated as frameworks; ' \ next if !dependent_target.should_build? || dependent_target.defines_module?
'add `use_frameworks!` to your Podfile or target to opt into using it. ' \ non_module_dependencies << dependent_target.name
"The Swift #{swift_pods.size == 1 ? 'Pod being used is' : 'Pods being used are'}: " +
swift_pods.map(&:name).to_sentence
end
end end
next if non_module_dependencies.empty?
error_messages << "The swift pod `#{pod_target.name}` depends upon #{non_module_dependencies.map { |d| "`#{d}`" }.to_sentence}, " \
'which do not define modules. ' \
'To opt into those targets generating module maps '\
'(which is necessary to import them from swift when building as static libraries), ' \
'you may set `use_modular_header!` globally in your Podfile, '\
'or specify `:modular_headers => true` for particular dependencies.'
end end
return if error_messages.empty?
raise Informative, 'The following swift pods cannot yet be integrated '\
"as static libraries:\n\n#{error_messages.join("\n\n")}"
end end
end end
end end
......
...@@ -95,7 +95,9 @@ module Pod ...@@ -95,7 +95,9 @@ module Pod
# @return [Boolean] Whether the target should build a static framework. # @return [Boolean] Whether the target should build a static framework.
# #
def static_framework? def static_framework?
!is_a?(Pod::AggregateTarget) && specs.any? && specs.flat_map(&:root).all?(&:static_framework) return if is_a?(Pod::AggregateTarget)
return if specs.empty?
specs.all? { |spec| spec.root.static_framework }
end end
#-------------------------------------------------------------------------# #-------------------------------------------------------------------------#
...@@ -148,14 +150,15 @@ module Pod ...@@ -148,14 +150,15 @@ module Pod
# module map. # module map.
# #
def umbrella_header_path def umbrella_header_path
support_files_dir + "#{label}-umbrella.h" module_map_path.parent + "#{label}-umbrella.h"
end end
# @return [Pathname] the absolute path of the LLVM module map file that # @return [Pathname] the absolute path of the LLVM module map file that
# defines the module structure for the compiler. # defines the module structure for the compiler.
# #
def module_map_path def module_map_path
support_files_dir + "#{label}.modulemap" basename = "#{label}.modulemap"
support_files_dir + basename
end end
# @return [Pathname] the absolute path of the bridge support file. # @return [Pathname] the absolute path of the bridge support file.
......
...@@ -377,6 +377,20 @@ module Pod ...@@ -377,6 +377,20 @@ module Pod
root_spec.name root_spec.name
end end
# @return [Pathname] the absolute path of the LLVM module map file that
# defines the module structure for the compiler.
#
def module_map_path
basename = "#{label}.modulemap"
if requires_frameworks?
super
elsif file_accessors.any?(&:module_map)
build_headers.root + product_module_name + basename
else
sandbox.public_headers.root + product_module_name + basename
end
end
# @param [String] bundle_name # @param [String] bundle_name
# The name of the bundle product, which is given by the +spec+. # The name of the bundle product, which is given by the +spec+.
# #
......
Subproject commit b21c05141a790ac307a0ff605d2015e58c173889 Subproject commit ce9fcea6cbeb3d1f2cdc000c204569182cce92b9
...@@ -313,6 +313,11 @@ describe_cli 'pod' do ...@@ -313,6 +313,11 @@ describe_cli 'pod' do
'install --no-repo-update' 'install --no-repo-update'
end end
describe 'Integrates a pod with static swift libraries and objective c modules' do
behaves_like cli_spec 'install_static_swift_modules',
'install --no-repo-update'
end
describe 'Integrates a Pod with circular subspec dependencies' do describe 'Integrates a Pod with circular subspec dependencies' do
behaves_like cli_spec 'install_circular_subspec_dependency', behaves_like cli_spec 'install_circular_subspec_dependency',
'install --no-repo-update' 'install --no-repo-update'
......
...@@ -10,6 +10,7 @@ module Pod ...@@ -10,6 +10,7 @@ module Pod
it 'writes the module map to the disk' do it 'writes the module map to the disk' do
path = temporary_directory + 'BananaLib.modulemap' path = temporary_directory + 'BananaLib.modulemap'
@pod_target.stubs(:requires_frameworks?).returns(true)
@gen.save_as(path) @gen.save_as(path)
path.read.should == <<-EOS.strip_heredoc path.read.should == <<-EOS.strip_heredoc
framework module BananaLib { framework module BananaLib {
...@@ -20,5 +21,19 @@ module Pod ...@@ -20,5 +21,19 @@ module Pod
} }
EOS EOS
end end
it 'writes the module map to the disk for a library' do
path = temporary_directory + 'BananaLib.modulemap'
@pod_target.stubs(:requires_frameworks?).returns(false)
@gen.save_as(path)
path.read.should == <<-EOS.strip_heredoc
module BananaLib [system] {
umbrella header "BananaLib-umbrella.h"
export *
module * { export * }
}
EOS
end
end end
end end
...@@ -146,7 +146,14 @@ module Pod ...@@ -146,7 +146,14 @@ module Pod
end end
it 'adds the sandbox public headers search paths to the xcconfig, with quotes, as system headers' do it 'adds the sandbox public headers search paths to the xcconfig, with quotes, as system headers' do
expected = '$(inherited) -isystem "${PODS_ROOT}/Headers/Public/BananaLib"' expected = "$(inherited) -isystem \"#{config.sandbox.public_headers.search_paths(Platform.ios).join('" -isystem "')}\""
@xcconfig.to_hash['OTHER_CFLAGS'].should == expected
end
it 'adds the dependent pods module map file to OTHER_CFLAGS' do
@pod_targets.each { |pt| pt.stubs(:defines_module? => true) }
@xcconfig = @generator.generate
expected = '$(inherited) -fmodule-map-file="${PODS_ROOT}/Headers/Private/BananaLib/BananaLib.modulemap" -isystem "${PODS_ROOT}/Headers/Public/BananaLib"'
@xcconfig.to_hash['OTHER_CFLAGS'].should == expected @xcconfig.to_hash['OTHER_CFLAGS'].should == expected
end end
......
...@@ -138,7 +138,7 @@ module Pod ...@@ -138,7 +138,7 @@ module Pod
end end
it 'does not add root public or private header search paths to the xcconfig' do it 'does not add root public or private header search paths to the xcconfig' do
@xcconfig.to_hash['HEADER_SEARCH_PATHS'].should.be.empty @xcconfig.to_hash['HEADER_SEARCH_PATHS'].should.be.nil
end end
it 'adds the COCOAPODS macro definition' do it 'adds the COCOAPODS macro definition' do
...@@ -270,7 +270,7 @@ module Pod ...@@ -270,7 +270,7 @@ module Pod
@coconut_pod_target.dependent_targets = [@banana_pod_target] @coconut_pod_target.dependent_targets = [@banana_pod_target]
generator = PodXCConfig.new(@coconut_pod_target, true) generator = PodXCConfig.new(@coconut_pod_target, true)
xcconfig = generator.generate xcconfig = generator.generate
xcconfig.to_hash['HEADER_SEARCH_PATHS'].should == '"${PODS_ROOT}/Headers/Private/CoconutLib"' \ xcconfig.to_hash['HEADER_SEARCH_PATHS'].should == '$(inherited) "${PODS_ROOT}/Headers/Private/CoconutLib"' \
' "${PODS_ROOT}/Headers/Public/BananaLib" "${PODS_ROOT}/Headers/Public/BananaLib/BananaLib"' \ ' "${PODS_ROOT}/Headers/Public/BananaLib" "${PODS_ROOT}/Headers/Public/BananaLib/BananaLib"' \
' "${PODS_ROOT}/Headers/Public/CoconutLib" "${PODS_ROOT}/Headers/Public/CoconutLib/CoconutLib"' \ ' "${PODS_ROOT}/Headers/Public/CoconutLib" "${PODS_ROOT}/Headers/Public/CoconutLib/CoconutLib"' \
' "${PODS_ROOT}/Headers/Public/monkey" "${PODS_ROOT}/Headers/Public/monkey/monkey"' ' "${PODS_ROOT}/Headers/Public/monkey" "${PODS_ROOT}/Headers/Public/monkey/monkey"'
...@@ -288,7 +288,7 @@ module Pod ...@@ -288,7 +288,7 @@ module Pod
# This is not an test xcconfig so it should exclude header search paths for the 'monkey' pod # This is not an test xcconfig so it should exclude header search paths for the 'monkey' pod
generator = PodXCConfig.new(@coconut_pod_target, false) generator = PodXCConfig.new(@coconut_pod_target, false)
xcconfig = generator.generate xcconfig = generator.generate
xcconfig.to_hash['HEADER_SEARCH_PATHS'].should == '"${PODS_ROOT}/Headers/Private/CoconutLib"' \ xcconfig.to_hash['HEADER_SEARCH_PATHS'].should == '$(inherited) "${PODS_ROOT}/Headers/Private/CoconutLib"' \
' "${PODS_ROOT}/Headers/Public/BananaLib" "${PODS_ROOT}/Headers/Public/BananaLib/BananaLib"' \ ' "${PODS_ROOT}/Headers/Public/BananaLib" "${PODS_ROOT}/Headers/Public/BananaLib/BananaLib"' \
' "${PODS_ROOT}/Headers/Public/CoconutLib" "${PODS_ROOT}/Headers/Public/CoconutLib/CoconutLib"' ' "${PODS_ROOT}/Headers/Public/CoconutLib" "${PODS_ROOT}/Headers/Public/CoconutLib/CoconutLib"'
end end
......
...@@ -503,6 +503,18 @@ module Pod ...@@ -503,6 +503,18 @@ module Pod
] ]
end end
it 'adds the module map when the target defines a module' do
@pod_target.stubs(:defines_module?).returns(true)
@installer.install!
group = @project['Pods/BananaLib/Support Files']
group.children.map(&:display_name).sort.should == [
'BananaLib-Pods-SampleProject-dummy.m',
'BananaLib-Pods-SampleProject-prefix.pch',
'BananaLib-Pods-SampleProject.modulemap',
'BananaLib-Pods-SampleProject.xcconfig',
]
end
it 'adds the target for the static library to the project' do it 'adds the target for the static library to the project' do
@installer.install! @installer.install!
@project.targets.count.should == 1 @project.targets.count.should == 1
...@@ -581,6 +593,18 @@ module Pod ...@@ -581,6 +593,18 @@ module Pod
] ]
end end
it 'adds the module map when the target defines a module' do
@pod_target.stubs(:defines_module?).returns(true)
@installer.install!
group = @project['Pods/BananaLib/Support Files']
group.children.map(&:display_name).sort.should == [
'BananaLib-dummy.m',
'BananaLib-prefix.pch',
'BananaLib.modulemap',
'BananaLib.xcconfig',
]
end
it 'adds the target for the static library to the project' do it 'adds the target for the static library to the project' do
@installer.install! @installer.install!
@project.targets.count.should == 1 @project.targets.count.should == 1
......
...@@ -305,8 +305,8 @@ module Pod ...@@ -305,8 +305,8 @@ module Pod
# when the swift version is unset at the project level, but set in one target, swift_version is nil # when the swift version is unset at the project level, but set in one target, swift_version is nil
podfile.target_definitions['TestRunner'].stubs(:swift_version).returns(nil) podfile.target_definitions['TestRunner'].stubs(:swift_version).returns(nil)
orangeframework_pod_target = stub(:name => 'OrangeFramework', :uses_swift? => true, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']], :spec_swift_version => nil) orangeframework_pod_target = stub(:name => 'OrangeFramework', :uses_swift? => true, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']], :spec_swift_version => nil, :dependent_targets => [])
matryoshka_pod_target = stub(:name => 'matryoshka', :uses_swift? => true, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']], :spec_swift_version => nil) matryoshka_pod_target = stub(:name => 'matryoshka', :uses_swift? => true, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']], :spec_swift_version => nil, :dependent_targets => [])
@validator = TargetValidator.new([], [orangeframework_pod_target, matryoshka_pod_target]) @validator = TargetValidator.new([], [orangeframework_pod_target, matryoshka_pod_target])
lambda { @validator.validate! }.should.not.raise lambda { @validator.validate! }.should.not.raise
...@@ -352,31 +352,62 @@ module Pod ...@@ -352,31 +352,62 @@ module Pod
podfile.target_definitions['SampleProject'].stubs(:swift_version).returns('3.0') podfile.target_definitions['SampleProject'].stubs(:swift_version).returns('3.0')
podfile.target_definitions['TestRunner'].stubs(:swift_version).returns('2.3') podfile.target_definitions['TestRunner'].stubs(:swift_version).returns('2.3')
orangeframework_pod_target = stub(:name => 'OrangeFramework', :uses_swift? => true, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']], :spec_swift_version => '4.0') orangeframework_pod_target = stub(:name => 'OrangeFramework', :uses_swift? => true, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']], :spec_swift_version => '4.0', :dependent_targets => [])
matryoshka_pod_target = stub(:name => 'matryoshka', :uses_swift? => true, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']], :spec_swift_version => '3.2') matryoshka_pod_target = stub(:name => 'matryoshka', :uses_swift? => true, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']], :spec_swift_version => '3.2', :dependent_targets => [])
@validator = TargetValidator.new([], [orangeframework_pod_target, matryoshka_pod_target]) @validator = TargetValidator.new([], [orangeframework_pod_target, matryoshka_pod_target])
lambda { @validator.validate! }.should.not.raise lambda { @validator.validate! }.should.not.raise
end end
end
#-------------------------------------------------------------------------# it 'raises when a swift target depends upon a target that does not define a module' do
fixture_path = ROOT + 'spec/fixtures'
config.repos_dir = fixture_path + 'spec-repos'
podfile = Podfile.new do
project 'SampleProject/SampleProject'
platform :ios, '10.0'
pod 'OrangeFramework', :path => (fixture_path + 'orange-framework').to_s
pod 'matryoshka', :path => (fixture_path + 'matryoshka').to_s
target 'SampleProject'
target 'TestRunner'
end
matryoshka_pod_target = stub(:name => 'matryoshka', :uses_swift? => false,
:target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']],
:should_build? => true, :defines_module? => false, :dependent_targets => [])
orangeframework_pod_target = stub(:name => 'OrangeFramework', :uses_swift? => true,
:target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']],
:should_build? => true, :defines_module? => true, :dependent_targets => [matryoshka_pod_target], :spec_swift_version => '4.0')
describe '#verify_framework_usage' do @validator = TargetValidator.new([], [orangeframework_pod_target, matryoshka_pod_target])
it 'raises when Swift pods are used without explicit `use_frameworks!`' do e = lambda { @validator.validate! }.should.raise Informative
e.message.should.include <<-EOS.strip_heredoc.strip
[!] The following swift pods cannot yet be integrated as static libraries:
The swift pod `OrangeFramework` depends upon `matryoshka`, which do not define modules. To opt into those targets generating module maps (which is necessary to import them from swift when building as static libraries), you may set `use_modular_header!` globally in your Podfile, or specify `:modular_headers => true` for particular dependencies.
EOS
end
it 'does not raise when a swift target depends upon a target thatis not built' do
fixture_path = ROOT + 'spec/fixtures' fixture_path = ROOT + 'spec/fixtures'
config.repos_dir = fixture_path + 'spec-repos' config.repos_dir = fixture_path + 'spec-repos'
podfile = Pod::Podfile.new do podfile = Podfile.new do
platform :ios, '8.0'
project 'SampleProject/SampleProject' project 'SampleProject/SampleProject'
platform :ios, '10.0'
pod 'OrangeFramework', :path => (fixture_path + 'orange-framework').to_s pod 'OrangeFramework', :path => (fixture_path + 'orange-framework').to_s
pod 'matryoshka', :path => (fixture_path + 'matryoshka').to_s pod 'matryoshka', :path => (fixture_path + 'matryoshka').to_s
target 'SampleProject' target 'SampleProject'
target 'TestRunner'
end end
lockfile = generate_lockfile
@validator = create_validator(config.sandbox, podfile, lockfile) matryoshka_pod_target = stub(:name => 'matryoshka', :uses_swift? => false,
should.raise(Informative) { @validator.validate! }.message.should.match /use_frameworks/ :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']],
:should_build? => false, :defines_module? => false, :dependent_targets => [])
orangeframework_pod_target = stub(:name => 'OrangeFramework', :uses_swift? => true,
:target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']],
:should_build? => true, :defines_module? => true, :dependent_targets => [matryoshka_pod_target], :spec_swift_version => '4.0')
@validator = TargetValidator.new([], [orangeframework_pod_target, matryoshka_pod_target])
lambda { @validator.validate! }.should.not.raise
end end
end end
end end
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment