Add tests for cloning on Apple File System.
Will be skipped if run on another filesysetm.
diff --git a/regress/CMakeLists.txt b/regress/CMakeLists.txt
index d69386b..e2ce232 100644
--- a/regress/CMakeLists.txt
+++ b/regress/CMakeLists.txt
@@ -17,6 +17,8 @@
tryopen
)
+ADD_EXECUTABLE(can_clone_file can_clone_file.c)
+
SET(ENV{srcdir} ${CMAKE_CURRENT_SOURCE_DIR})
FOREACH(PROGRAM ${TEST_PROGRAMS})
ADD_EXECUTABLE(${PROGRAM} ${PROGRAM}.c)
@@ -87,11 +89,14 @@
add_from_zip_stored.test
add_stored.test
add_stored_in_memory.test
- clone-add.test
- clone-delete.test
- clone-replace.test
buffer-fragment-read.test
buffer-fragment-write.test
+ clone-buffer-add.test
+ clone-buffer-delete.test
+ clone-buffer-replace.test
+ clone-fs-add.test
+ clone-fs-delete.test
+ clone-fs-replace.test
cm-default.test
count_entries.test
decrypt-correct-password-aes128.test
diff --git a/regress/NiHTest.pm b/regress/NiHTest.pm
index a19c95e..736ebae 100644
--- a/regress/NiHTest.pm
+++ b/regress/NiHTest.pm
@@ -84,6 +84,9 @@
# pipein COMMAND ARGS ...
# pipe output of running COMMAND to program's stdin.
#
+# precheck COMMAND ARGS ...
+# if COMMAND exits with non-zero status, skip test.
+#
# preload LIBRARY
# pre-load LIBRARY before running program.
#
@@ -159,6 +162,7 @@
mkdir => { type => 'string string' },
pipefile => { type => 'string', once => 1 },
pipein => { type => 'string', once => 1 },
+ precheck => { type => 'string...' },
preload => { type => 'string', once => 1 },
program => { type => 'string', once => 1 },
'return' => { type => 'int', once => 1, required => 1 },
@@ -443,6 +447,7 @@
$self->die("error in test case definition") unless $self->parse_case($testcase_file);
$self->check_features_requirement() if ($self->{test}->{features});
+ $self->run_precheck() if ($self->{test}->{precheck});
$self->end_test('SKIP') if ($self->{test}->{preload} && $^O eq 'darwin');
}
@@ -1115,6 +1120,20 @@
}
+sub run_precheck {
+ my ($self) = @_;
+
+ for my $precheck (@{$self->{test}->{precheck}}) {
+ unless (system(@{$precheck}) == 0) {
+ $self->print_test_result('SKIP', "precheck failed");
+ $self->end_test('SKIP');
+ }
+ }
+
+ return 1;
+}
+
+
sub run_program {
my ($self) = @_;
goto &pipein_win32 if $^O eq 'MSWin32' && $self->{test}->{pipein};
diff --git a/regress/can_clone_file.c b/regress/can_clone_file.c
new file mode 100644
index 0000000..f6f720a
--- /dev/null
+++ b/regress/can_clone_file.c
@@ -0,0 +1,85 @@
+/*
+ can_clone_file.c -- does the current filesystem support cloning
+ Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner
+
+ This file is part of libzip, a library to manipulate ZIP archives.
+ The authors can be contacted at <libzip@nih.at>
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ 3. The names of the authors may not be used to endorse or promote
+ products derived from this software without specific prior
+ written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "config.h"
+
+#ifdef HAVE_CLONEFILE
+#include <sys/attr.h>
+#include <sys/param.h>
+#include <sys/mount.h>
+#include <unistd.h>
+#endif
+
+int
+main(int argc, char *argv[])
+{
+#ifdef HAVE_CLONEFILE
+ struct statfs fs;
+ struct attrlist attribute_list;
+ struct {
+ uint32_t size;
+ vol_capabilities_attr_t capabilities;
+ } volume_attributes;
+
+ if (statfs(".", &fs) < 0) {
+ fprintf(stderr, "%s: can't get mount point of current directory: %s\n", argv[0], strerror(errno));
+ exit(1);
+ }
+
+ /* Not all volumes support clonefile(). A volume can be tested for
+ clonefile() support by using getattrlist(2) to get the volume
+ capabilities attribute ATTR_VOL_CAPABILITIES, and then testing the
+ VOL_CAP_INT_CLONE flag. */
+
+ memset(&attribute_list, 0, sizeof(attribute_list));
+ attribute_list.bitmapcount = ATTR_BIT_MAP_COUNT;
+ attribute_list.volattr = ATTR_VOL_INFO|ATTR_VOL_CAPABILITIES;
+ memset(&volume_attributes, 0, sizeof(volume_attributes));
+
+ if (getattrlist(fs.f_mntonname, &attribute_list, &volume_attributes, sizeof(volume_attributes), 0) < 0) {
+ fprintf(stderr, "%s: can't get volume capabilities of '%s': %s\n", argv[0], fs.f_mntonname, strerror(errno));
+ exit(1);
+ }
+
+ if (volume_attributes.capabilities.capabilities[VOL_CAPABILITIES_INTERFACES] & VOL_CAP_INT_CLONE) {
+ exit(0);
+ }
+#endif
+
+ exit(1);
+}
diff --git a/regress/clone-add.test b/regress/clone-buffer-add.test
similarity index 70%
rename from regress/clone-add.test
rename to regress/clone-buffer-add.test
index 42d0eaf..c66791b 100644
--- a/regress/clone-add.test
+++ b/regress/clone-buffer-add.test
@@ -1,4 +1,4 @@
-# test cloning archive, add new file
+# test cloning archive from buffer, add new file
return 0
args -mF 100 test.zzip add new "A new file." set_file_mtime 3 1512998132
file test.zzip gap.zip gap-add.zip
diff --git a/regress/clone-delete.test b/regress/clone-buffer-delete.test
similarity index 60%
rename from regress/clone-delete.test
rename to regress/clone-buffer-delete.test
index 253d2e4..221f8d2 100644
--- a/regress/clone-delete.test
+++ b/regress/clone-buffer-delete.test
@@ -1,4 +1,4 @@
-# test cloning archive, deleteing a file
+# test cloning archive from buffer, deleteing a file
return 0
args -mF 100 test.zzip delete 2
file test.zzip gap.zip gap-delete.zip
diff --git a/regress/clone-replace.test b/regress/clone-buffer-replace.test
similarity index 72%
rename from regress/clone-replace.test
rename to regress/clone-buffer-replace.test
index 813d6bc..cb21f33 100644
--- a/regress/clone-replace.test
+++ b/regress/clone-buffer-replace.test
@@ -1,4 +1,4 @@
-# test cloning archive, replacing a file
+# test cloning archive from buffer, replacing a file
return 0
args -mF 100 test.zzip replace_file_contents 2 "A changed file." set_file_mtime 2 1512998082
file test.zzip gap.zip gap-replace.zip
diff --git a/regress/clone-fs-add.test b/regress/clone-fs-add.test
new file mode 100644
index 0000000..f187cb7
--- /dev/null
+++ b/regress/clone-fs-add.test
@@ -0,0 +1,5 @@
+# test cloning archive from filesystem, add new file
+precheck ./can_clone_file
+return 0
+args test.zzip add new "A new file." set_file_mtime 3 1512998132
+file test.zzip gap.zip gap-add.zip
diff --git a/regress/clone-fs-delete.test b/regress/clone-fs-delete.test
new file mode 100644
index 0000000..b2e63cc
--- /dev/null
+++ b/regress/clone-fs-delete.test
@@ -0,0 +1,5 @@
+# test cloning archive from filesystem, deleteing a file
+precheck ./can_clone_file
+return 0
+args test.zzip delete 2
+file test.zzip gap.zip gap-delete.zip
diff --git a/regress/clone-fs-replace.test b/regress/clone-fs-replace.test
new file mode 100644
index 0000000..3d3b8f3
--- /dev/null
+++ b/regress/clone-fs-replace.test
@@ -0,0 +1,5 @@
+# test cloning archive from filesystem, replacing a file
+precheck ./can_clone_file
+return 0
+args test.zzip replace_file_contents 2 "A changed file." set_file_mtime 2 1512998082
+file test.zzip gap.zip gap-replace.zip
diff --git a/xcode/libzip.xcodeproj/project.pbxproj b/xcode/libzip.xcodeproj/project.pbxproj
index ba3217c..546cb86 100644
--- a/xcode/libzip.xcodeproj/project.pbxproj
+++ b/xcode/libzip.xcodeproj/project.pbxproj
@@ -39,6 +39,7 @@
buildPhases = (
);
dependencies = (
+ 4BFF2B531FE13002006EF3F3 /* PBXTargetDependency */,
4BD6CB6E19E71D0800710654 /* PBXTargetDependency */,
4BACD65515BC303B00920691 /* PBXTargetDependency */,
4BACD65715BC303B00920691 /* PBXTargetDependency */,
@@ -325,6 +326,7 @@
4BDC729615B1B25E00236D3C /* zip_utf-8.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC724315B1B25E00236D3C /* zip_utf-8.c */; };
4BDC729B15B1B2C400236D3C /* zip.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BDC729815B1B2A600236D3C /* zip.h */; settings = {ATTRIBUTES = (Public, ); }; };
4BDC729F15B1B4E900236D3C /* zipconf.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BDC729E15B1B4E900236D3C /* zipconf.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 4BFF2B551FE13033006EF3F3 /* can_clone_file.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BFF2B541FE13033006EF3F3 /* can_clone_file.c */; };
736ED9BB1E3D6B6B00C36873 /* zip_source_winzip_aes_decode.c in Sources */ = {isa = PBXBuildFile; fileRef = 736ED9B91E3D688C00C36873 /* zip_source_winzip_aes_decode.c */; };
736ED9BC1E3D6B6F00C36873 /* zip_source_winzip_aes_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = 736ED9BA1E3D688C00C36873 /* zip_source_winzip_aes_encode.c */; };
736ED9BD1E3D6B7200C36873 /* zip_random_unix.c in Sources */ = {isa = PBXBuildFile; fileRef = 736ED9B81E3D688C00C36873 /* zip_random_unix.c */; };
@@ -497,6 +499,13 @@
remoteGlobalIDString = 4BD6CB5F19E71CD100710654;
remoteInfo = hole;
};
+ 4BFF2B521FE13002006EF3F3 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 4BFF2B451FE12FCA006EF3F3;
+ remoteInfo = can_clone_file;
+ };
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
@@ -590,6 +599,15 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ 4BFF2B4D1FE12FCA006EF3F3 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 12;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
@@ -687,13 +705,16 @@
4B3A5F4C1DF96D83005A53A1 /* gladman-fcrypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gladman-fcrypt.h"; sourceTree = "<group>"; };
4B3A5F4D1DF96D83005A53A1 /* zip_fseek.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_fseek.c; sourceTree = "<group>"; };
4B3A5F4E1DF96D83005A53A1 /* zip_ftell.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_ftell.c; sourceTree = "<group>"; };
+ 4B41A2651FE15E99005D8C91 /* clone-fs-add.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "clone-fs-add.test"; sourceTree = "<group>"; };
+ 4B41A2661FE15FCE005D8C91 /* clone-fs-delete.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "clone-fs-delete.test"; sourceTree = "<group>"; };
+ 4B41A2671FE1604E005D8C91 /* clone-fs-replace.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "clone-fs-replace.test"; sourceTree = "<group>"; };
4B51DDB21FDADEDF00C5CA85 /* INSTALL.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = INSTALL.md; sourceTree = "<group>"; };
4B51DDB31FDAE1DB00C5CA85 /* ziptool_regress.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ziptool_regress.c; sourceTree = "<group>"; };
4B51DDC01FDAE20A00C5CA85 /* ziptool_regress */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ziptool_regress; sourceTree = BUILT_PRODUCTS_DIR; };
4B77E61A1FDDCD3A006786BA /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
- 4B77E61B1FDEDEA4006786BA /* clone-delete.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "clone-delete.test"; sourceTree = "<group>"; };
- 4B77E61C1FDEDEA5006786BA /* clone-replace.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "clone-replace.test"; sourceTree = "<group>"; };
- 4B77E61D1FDEDEA5006786BA /* clone-add.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "clone-add.test"; sourceTree = "<group>"; };
+ 4B77E61B1FDEDEA4006786BA /* clone-buffer-delete.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "clone-buffer-delete.test"; sourceTree = "<group>"; };
+ 4B77E61C1FDEDEA5006786BA /* clone-buffer-replace.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "clone-buffer-replace.test"; sourceTree = "<group>"; };
+ 4B77E61D1FDEDEA5006786BA /* clone-buffer-add.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "clone-buffer-add.test"; sourceTree = "<group>"; };
4B82CED319915F360097BC18 /* zip_file_set_mtime.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_file_set_mtime.c; sourceTree = "<group>"; };
4B97204D188EBE85002FAFAD /* zip_file_get_external_attributes.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_file_get_external_attributes.c; sourceTree = "<group>"; };
4B97204E188EBE85002FAFAD /* zip_file_set_external_attributes.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_file_set_external_attributes.c; sourceTree = "<group>"; };
@@ -978,6 +999,8 @@
4BFF2B341FDEEF8B006EF3F3 /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
4BFF2B351FDEF277006EF3F3 /* cmake-config.h.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "cmake-config.h.in"; sourceTree = "<group>"; };
4BFF2B361FDEF277006EF3F3 /* cmake-zipconf.h.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "cmake-zipconf.h.in"; sourceTree = "<group>"; };
+ 4BFF2B511FE12FCA006EF3F3 /* can_clone_file */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = can_clone_file; sourceTree = BUILT_PRODUCTS_DIR; };
+ 4BFF2B541FE13033006EF3F3 /* can_clone_file.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = can_clone_file.c; sourceTree = "<group>"; };
736ED9B71E3D688C00C36873 /* zip_file_set_encryption.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_file_set_encryption.c; sourceTree = "<group>"; };
736ED9B81E3D688C00C36873 /* zip_random_unix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_random_unix.c; sourceTree = "<group>"; };
736ED9B91E3D688C00C36873 /* zip_source_winzip_aes_decode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_winzip_aes_decode.c; sourceTree = "<group>"; };
@@ -1090,6 +1113,13 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ 4BFF2B4A1FE12FCA006EF3F3 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
@@ -1244,6 +1274,7 @@
4BACD57B15BC2AEF00920691 /* fread.c */,
4BC03F9A1FDD5617003C7B62 /* fseek.c */,
4BD6CB5E19E71B3B00710654 /* hole.c */,
+ 4BFF2B541FE13033006EF3F3 /* can_clone_file.c */,
4BC03F9C1FDD5617003C7B62 /* malloc.c */,
4BC03F991FDD5617003C7B62 /* nonrandomopen.c */,
4BC03F9B1FDD5617003C7B62 /* nonrandomopentest.c */,
@@ -1277,9 +1308,12 @@
4BD35E4F1A33366200256CB7 /* add_stored.test */,
4BC03F8E1FDD55C4003C7B62 /* buffer-fragment-read.test */,
4BC03F941FDD55C5003C7B62 /* buffer-fragment-write.test */,
- 4B77E61D1FDEDEA5006786BA /* clone-add.test */,
- 4B77E61B1FDEDEA4006786BA /* clone-delete.test */,
- 4B77E61C1FDEDEA5006786BA /* clone-replace.test */,
+ 4B77E61D1FDEDEA5006786BA /* clone-buffer-add.test */,
+ 4B77E61B1FDEDEA4006786BA /* clone-buffer-delete.test */,
+ 4B77E61C1FDEDEA5006786BA /* clone-buffer-replace.test */,
+ 4B41A2651FE15E99005D8C91 /* clone-fs-add.test */,
+ 4B41A2661FE15FCE005D8C91 /* clone-fs-delete.test */,
+ 4B41A2671FE1604E005D8C91 /* clone-fs-replace.test */,
4BD35E501A33366200256CB7 /* cm-default.test */,
4BC03F9F1FDD5642003C7B62 /* count_entries.test */,
4BC03F921FDD55C4003C7B62 /* decrypt-correct-password-aes128.test */,
@@ -1421,6 +1455,7 @@
4BD6CB6C19E71CD100710654 /* hole */,
3D7E35371B3305FB00022624 /* in-memory */,
4B51DDC01FDAE20A00C5CA85 /* ziptool_regress */,
+ 4BFF2B511FE12FCA006EF3F3 /* can_clone_file */,
);
name = Products;
sourceTree = "<group>";
@@ -1818,6 +1853,23 @@
productReference = 4BDC71E015B182B200236D3C /* libzip_iOS.framework */;
productType = "com.apple.product-type.bundle";
};
+ 4BFF2B451FE12FCA006EF3F3 /* can_clone_file */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 4BFF2B4E1FE12FCA006EF3F3 /* Build configuration list for PBXNativeTarget "can_clone_file" */;
+ buildPhases = (
+ 4BFF2B481FE12FCA006EF3F3 /* Sources */,
+ 4BFF2B4A1FE12FCA006EF3F3 /* Frameworks */,
+ 4BFF2B4D1FE12FCA006EF3F3 /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = can_clone_file;
+ productName = tryopen;
+ productReference = 4BFF2B511FE12FCA006EF3F3 /* can_clone_file */;
+ productType = "com.apple.product-type.tool";
+ };
/* End PBXNativeTarget section */
/* Begin PBXProject section */
@@ -1855,6 +1907,7 @@
4B01D70A15B2F4EB002D5007 /* zipcmp */,
3D7E35361B3305FB00022624 /* in-memory */,
4BACD5B515BC2DC900920691 /* add_from_filep */,
+ 4BFF2B451FE12FCA006EF3F3 /* can_clone_file */,
4BACD5C415BC2DF200920691 /* fopen_unchanged */,
4BACD5D315BC2F3700920691 /* fread */,
4BD6CB5F19E71CD100710654 /* hole */,
@@ -2245,6 +2298,14 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ 4BFF2B481FE12FCA006EF3F3 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 4BFF2B551FE13033006EF3F3 /* can_clone_file.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
@@ -2363,6 +2424,11 @@
target = 4BD6CB5F19E71CD100710654 /* hole */;
targetProxy = 4BD6CB6D19E71D0800710654 /* PBXContainerItemProxy */;
};
+ 4BFF2B531FE13002006EF3F3 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 4BFF2B451FE12FCA006EF3F3 /* can_clone_file */;
+ targetProxy = 4BFF2B521FE13002006EF3F3 /* PBXContainerItemProxy */;
+ };
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
@@ -2899,6 +2965,30 @@
};
name = Release;
};
+ 4BFF2B4F1FE12FCA006EF3F3 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = YES;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ LD_RUNPATH_SEARCH_PATHS = "@loader_path/";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 4BFF2B501FE12FCA006EF3F3 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ LD_RUNPATH_SEARCH_PATHS = "@loader_path/";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
@@ -3064,6 +3154,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
+ 4BFF2B4E1FE12FCA006EF3F3 /* Build configuration list for PBXNativeTarget "can_clone_file" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 4BFF2B4F1FE12FCA006EF3F3 /* Debug */,
+ 4BFF2B501FE12FCA006EF3F3 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
/* End XCConfigurationList section */
};
rootObject = 4BDC71BF15B181DA00236D3C /* Project object */;