Merge branch '135-xcode-project'
diff --git a/.gitignore b/.gitignore
index d3423ee..33dbe44 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,3 @@
-demo
-demo.app
-ios-deploy
-ios-deploy.dSYM
+build/*
 /.DS_Store
 *~
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 26974ee..0000000
--- a/Makefile
+++ /dev/null
@@ -1,35 +0,0 @@
-IOS_SDK_VERSION = 8.3
-
-IOS_CC = gcc -ObjC
-DEVICE_SUPPORT = $(shell xcode-select --print-path)/Platforms/iPhoneOS.platform/DeviceSupport
-IOS_SDK = $(shell xcode-select --print-path)/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS$(IOS_SDK_VERSION).sdk
-
-all: clean ios-deploy demo.app
-
-demo.app: demo Info.plist
-	mkdir -p demo.app
-	cp demo demo.app/
-	cp Info.plist ResourceRules.plist demo.app/
-	codesign -f -s "iPhone Developer" --entitlements Entitlements.plist demo.app
-
-demo: demo.c
-	$(IOS_CC) -g -arch armv7 -isysroot $(IOS_SDK) -framework CoreFoundation -o demo demo.c
-
-ios-deploy: clean ios-deploy.c
-	$(IOS_CC) -g -o ios-deploy -framework Foundation -framework CoreFoundation -framework MobileDevice -F/System/Library/PrivateFrameworks ios-deploy.c
-
-symlink: 
-	cd $(DEVICE_SUPPORT); ln -sfn "`find . -type d -maxdepth 1 -exec basename {} \; | tail -1`" Latest	
-    
-install: symlink ios-deploy
-	mkdir -p $(prefix)/bin
-	cp ios-deploy $(prefix)/bin
-
-uninstall:
-	rm $(prefix)/bin/ios-deploy
-
-debug: all
-	./ios-deploy --debug --bundle demo.app
-
-clean:
-	@rm -rf *.app demo ios-deploy
diff --git a/demo/.gitignore b/demo/.gitignore
new file mode 100644
index 0000000..c2ef55d
--- /dev/null
+++ b/demo/.gitignore
@@ -0,0 +1,5 @@
+demo
+demo.app
+demo.dSYM
+/.DS_Store
+*~
diff --git a/Entitlements.plist b/demo/Entitlements.plist
similarity index 100%
rename from Entitlements.plist
rename to demo/Entitlements.plist
diff --git a/Info.plist b/demo/Info.plist
similarity index 100%
rename from Info.plist
rename to demo/Info.plist
diff --git a/demo/Makefile b/demo/Makefile
new file mode 100644
index 0000000..cf7c36a
--- /dev/null
+++ b/demo/Makefile
@@ -0,0 +1,24 @@
+IOS_SDK_VERSION = 9.0
+
+IOS_CC = gcc -ObjC
+IOS_SDK = $(shell xcode-select --print-path)/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS$(IOS_SDK_VERSION).sdk
+
+all: clean demo.app
+
+demo.app: demo Info.plist
+	mkdir -p demo.app
+	cp demo demo.app/
+	cp Info.plist ResourceRules.plist demo.app/
+	codesign -f -s "iPhone Developer" --entitlements Entitlements.plist demo.app
+
+demo: demo.c
+	$(IOS_CC) -g -arch armv7 -isysroot $(IOS_SDK) -framework CoreFoundation -o demo demo.c
+
+debug: all ios-deploy
+	@../build/Release/ios-deploy --debug --bundle demo.app
+
+clean:
+	@rm -rf *.app demo demo.dSYM
+	
+ios-deploy:
+	@xcodebuild -project ../ios-deploy.xcodeproj
diff --git a/ResourceRules.plist b/demo/ResourceRules.plist
similarity index 100%
rename from ResourceRules.plist
rename to demo/ResourceRules.plist
diff --git a/demo.c b/demo/demo.c
similarity index 98%
rename from demo.c
rename to demo/demo.c
index 583f43b..b366b14 100644
--- a/demo.c
+++ b/demo/demo.c
@@ -6,4 +6,4 @@
         printf("argv[%d] = %s\n", i, argv[i]);
     }
     return 0;
-}
+}
\ No newline at end of file
diff --git a/ios-deploy.xcodeproj/project.pbxproj b/ios-deploy.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..2b26eb1
--- /dev/null
+++ b/ios-deploy.xcodeproj/project.pbxproj
@@ -0,0 +1,275 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 46;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		7E70899C1B587DE4004D23AA /* ios-deploy.c in Sources */ = {isa = PBXBuildFile; fileRef = 7E7089991B587DE4004D23AA /* ios-deploy.c */; settings = {COMPILER_FLAGS = "-x objective-c -fno-objc-arc"; }; };
+		7E70899E1B587F29004D23AA /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E70899D1B587F29004D23AA /* CoreFoundation.framework */; };
+		7E7089A01B58801E004D23AA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E70899F1B58801E004D23AA /* Foundation.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+		7E70898C1B587BF3004D23AA /* CopyFiles */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 2147483647;
+			dstPath = /usr/share/man/man1/;
+			dstSubfolderSpec = 0;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 1;
+		};
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+		7E70898E1B587BF3004D23AA /* ios-deploy */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "ios-deploy"; sourceTree = BUILT_PRODUCTS_DIR; };
+		7E7089991B587DE4004D23AA /* ios-deploy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ios-deploy.c"; path = "src/ios-deploy.c"; sourceTree = SOURCE_ROOT; };
+		7E70899A1B587DE4004D23AA /* errors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = errors.h; path = src/errors.h; sourceTree = SOURCE_ROOT; };
+		7E70899B1B587DE4004D23AA /* MobileDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MobileDevice.h; path = src/MobileDevice.h; sourceTree = SOURCE_ROOT; };
+		7E70899D1B587F29004D23AA /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; };
+		7E70899F1B58801E004D23AA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		7E70898B1B587BF3004D23AA /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				7E7089A01B58801E004D23AA /* Foundation.framework in Frameworks */,
+				7E70899E1B587F29004D23AA /* CoreFoundation.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		7E7089851B587BF3004D23AA = {
+			isa = PBXGroup;
+			children = (
+				7E7089901B587BF3004D23AA /* ios-deploy */,
+				7E7089A21B588219004D23AA /* Frameworks */,
+				7E70898F1B587BF3004D23AA /* Products */,
+			);
+			sourceTree = "<group>";
+		};
+		7E70898F1B587BF3004D23AA /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				7E70898E1B587BF3004D23AA /* ios-deploy */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		7E7089901B587BF3004D23AA /* ios-deploy */ = {
+			isa = PBXGroup;
+			children = (
+				7E7089991B587DE4004D23AA /* ios-deploy.c */,
+				7E70899A1B587DE4004D23AA /* errors.h */,
+				7E70899B1B587DE4004D23AA /* MobileDevice.h */,
+			);
+			path = "ios-deploy";
+			sourceTree = "<group>";
+		};
+		7E7089A21B588219004D23AA /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				7E70899F1B58801E004D23AA /* Foundation.framework */,
+				7E70899D1B587F29004D23AA /* CoreFoundation.framework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		7E70898D1B587BF3004D23AA /* ios-deploy */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 7E7089951B587BF3004D23AA /* Build configuration list for PBXNativeTarget "ios-deploy" */;
+			buildPhases = (
+				7E70898A1B587BF3004D23AA /* Sources */,
+				7E70898B1B587BF3004D23AA /* Frameworks */,
+				7E70898C1B587BF3004D23AA /* CopyFiles */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = "ios-deploy";
+			productName = "ios-deploy";
+			productReference = 7E70898E1B587BF3004D23AA /* ios-deploy */;
+			productType = "com.apple.product-type.tool";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		7E7089861B587BF3004D23AA /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 0710;
+				ORGANIZATIONNAME = PhoneGap;
+				TargetAttributes = {
+					7E70898D1B587BF3004D23AA = {
+						CreatedOnToolsVersion = 6.4;
+					};
+				};
+			};
+			buildConfigurationList = 7E7089891B587BF3004D23AA /* Build configuration list for PBXProject "ios-deploy" */;
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+				Base,
+			);
+			mainGroup = 7E7089851B587BF3004D23AA;
+			productRefGroup = 7E70898F1B587BF3004D23AA /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				7E70898D1B587BF3004D23AA /* ios-deploy */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXSourcesBuildPhase section */
+		7E70898A1B587BF3004D23AA /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				7E70899C1B587DE4004D23AA /* ios-deploy.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+		7E7089931B587BF3004D23AA /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				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 = gnu99;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+				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.8;
+				MTL_ENABLE_DEBUG_INFO = YES;
+				ONLY_ACTIVE_ARCH = YES;
+				OTHER_LDFLAGS = (
+					"-framework",
+					MobileDevice,
+					"-F/System/Library/PrivateFrameworks",
+				);
+				SDKROOT = macosx;
+			};
+			name = Debug;
+		};
+		7E7089941B587BF3004D23AA /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				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 = gnu99;
+				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.8;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				OTHER_LDFLAGS = (
+					"-framework",
+					MobileDevice,
+					"-F/System/Library/PrivateFrameworks",
+				);
+				SDKROOT = macosx;
+			};
+			name = Release;
+		};
+		7E7089961B587BF3004D23AA /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Debug;
+		};
+		7E7089971B587BF3004D23AA /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		7E7089891B587BF3004D23AA /* Build configuration list for PBXProject "ios-deploy" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				7E7089931B587BF3004D23AA /* Debug */,
+				7E7089941B587BF3004D23AA /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		7E7089951B587BF3004D23AA /* Build configuration list for PBXNativeTarget "ios-deploy" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				7E7089961B587BF3004D23AA /* Debug */,
+				7E7089971B587BF3004D23AA /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 7E7089861B587BF3004D23AA /* Project object */;
+}
diff --git a/package.json b/package.json
index c279b07..cd4bdfb 100644
--- a/package.json
+++ b/package.json
@@ -7,9 +7,9 @@
   "description": "launch iOS apps iOS devices from the command line (Xcode 7)",
   "main": "ios-deploy",
   "scripts": {
-    "preinstall": "./check_reqs.js && make ios-deploy"
+    "preinstall": "./check_reqs.js && xcodebuild"
   },
-  "bin": "./ios-deploy",
+  "bin": "./build/Release/ios-deploy",
   "repository": {
     "type": "git",
     "url": "https://github.com/phonegap/ios-deploy"
diff --git a/resources/buildbox/build.sh b/resources/buildbox/build.sh
deleted file mode 100755
index aea6cbf..0000000
--- a/resources/buildbox/build.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env bash
-echo "$ make"
-make
\ No newline at end of file
diff --git a/MobileDevice.h b/src/MobileDevice.h
similarity index 100%
rename from MobileDevice.h
rename to src/MobileDevice.h
diff --git a/errors.h b/src/errors.h
similarity index 100%
rename from errors.h
rename to src/errors.h
diff --git a/ios-deploy.c b/src/ios-deploy.c
similarity index 98%
rename from ios-deploy.c
rename to src/ios-deploy.c
index f562079..a2cae06 100644
--- a/ios-deploy.c
+++ b/src/ios-deploy.c
@@ -169,7 +169,7 @@
 char *device_id = NULL;
 char *args = NULL;
 char *list_root = NULL;
-int timeout = 0;
+int _timeout = 0;
 int port = 0;	// 0 means "dynamically assigned"
 CFStringRef last_path = NULL;
 service_conn_t gdbfd;
@@ -326,7 +326,7 @@
 
 CFStringRef copy_xcode_path_for(CFStringRef subPath, CFStringRef search) {
     CFStringRef xcodeDevPath = copy_xcode_dev_path();
-    CFStringRef path;
+    CFStringRef path = NULL;
     bool found = false;
     const char* home = get_home();
     CFRange slashLocation;
@@ -864,7 +864,7 @@
 void
 server_callback (CFSocketRef s, CFSocketCallBackType callbackType, CFDataRef address, const void *data, void *info)
 {
-    int res;
+    ssize_t res;
 
     if (CFDataGetLength (data) == 0) {
         // close the socket on which we've got end-of-file, the server_socket.
@@ -974,7 +974,7 @@
         return -1;
     }
 
-    kill_ptree_inner(root, signum, kp, len / sizeof(struct kinfo_proc));
+    kill_ptree_inner(root, signum, kp, (int)(len / sizeof(struct kinfo_proc)));
 
     free(kp);
     return 0;
@@ -1365,7 +1365,6 @@
     const void *keys[count];
     CFDictionaryGetKeysAndValues(result, keys, NULL);
     for(int i = 0; i < count; ++i) {
-        CFStringRef test = (CFStringRef)keys[i];
         NSLogOut(@"%@", (CFStringRef)keys[i]);
     }
     
@@ -1506,8 +1505,6 @@
 void make_directory(AMDeviceRef device) {
     service_conn_t houseFd = start_house_arrest_service(device);
 
-    afc_file_ref file_ref;
-
     afc_connection afc_conn;
     afc_connection* afc_conn_p = &afc_conn;
     AFCConnectionOpen(houseFd, 0, &afc_conn_p);
@@ -1519,8 +1516,6 @@
 void remove_path(AMDeviceRef device) {
     service_conn_t houseFd = start_house_arrest_service(device);
 
-    afc_file_ref file_ref;
-
     afc_connection afc_conn;
     afc_connection* afc_conn_p = &afc_conn;
     AFCConnectionOpen(houseFd, 0, &afc_conn_p);
@@ -1862,7 +1857,7 @@
             verbose = 1;
             break;
         case 't':
-            timeout = atoi(optarg);
+            _timeout = atoi(optarg);
             break;
         case 'u':
             unbuffered = 1;
@@ -1951,8 +1946,8 @@
         setbuf(stderr, NULL);
     }
 
-    if (detect_only && timeout == 0) {
-        timeout = 5;
+    if (detect_only && _timeout == 0) {
+        _timeout = 5;
     }
 
     if (app_path) {
@@ -1962,11 +1957,11 @@
     }
 
     AMDSetLogLevel(5); // otherwise syslog gets flooded with crap
-    if (timeout > 0)
+    if (_timeout > 0)
     {
-        CFRunLoopTimerRef timer = CFRunLoopTimerCreate(NULL, CFAbsoluteTimeGetCurrent() + timeout, 0, 0, 0, timeout_callback, NULL);
+        CFRunLoopTimerRef timer = CFRunLoopTimerCreate(NULL, CFAbsoluteTimeGetCurrent() + _timeout, 0, 0, 0, timeout_callback, NULL);
         CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopCommonModes);
-        NSLogOut(@"[....] Waiting up to %d seconds for iOS device to be connected", timeout);
+        NSLogOut(@"[....] Waiting up to %d seconds for iOS device to be connected", _timeout);
     }
     else
     {