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 */;