]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Enable bsdtar -s option on Windows with libregex and fix the problem
authorMichihiro NAKAJIMA <ggcueroad@gmail.com>
Wed, 22 Feb 2012 11:39:15 +0000 (20:39 +0900)
committerMichihiro NAKAJIMA <ggcueroad@gmail.com>
Thu, 23 Feb 2012 00:57:27 +0000 (09:57 +0900)
which appeared from enabling that at test_option_s.

CMakeLists.txt
configure.ac
tar/test/test_option_s.c

index 60672ce64dce011cd3c3f06c9cc71374eaf4ef7e..21464cfa71a23f75c553a911b31a4ebc7bbb9d9c 100644 (file)
@@ -606,6 +606,37 @@ ELSE(LIBXML2_FOUND)
   ENDIF(EXPAT_FOUND)
 ENDIF(LIBXML2_FOUND)
 
+#
+# Find Libregex
+#
+FIND_PATH(REGEX_INCLUDE_DIR regex.h)
+IF(REGEX_INCLUDE_DIR)
+  CHECK_FUNCTION_EXISTS_GLIBC(regcomp HAVE_REGCOMP_LIBC)
+  #
+  # If libc does not provide regex, find libregex.
+  #
+  IF(NOT HAVE_REGCOMP_LIBC)
+    FIND_LIBRARY(REGEX_LIBRARY regex)
+    IF(REGEX_LIBRARY)
+      SET(CMAKE_REQUIRED_LIBRARIES ${REGEX_LIBRARY})
+      CHECK_FUNCTION_EXISTS_GLIBC(regcomp HAVE_REGCOMP_LIBREGEX)
+      IF(HAVE_REGCOMP_LIBREGEX)
+        LIST(APPEND ADDITIONAL_LIBS ${REGEX_LIBRARY})
+        #
+        # If regex.h is not found, retry looking for regex.h at
+        # REGEX_INCLUDE_DIR
+        #
+        IF(NOT HAVE_REGEX_H)
+          UNSET(HAVE_REGEX_H CACHE)
+          INCLUDE_DIRECTORIES(${REGEX_INCLUDE_DIR})
+          SET(CMAKE_REQUIRED_INCLUDES ${REGEX_INCLUDE_DIR})
+          LA_CHECK_INCLUDE_FILE("regex.h" HAVE_REGEX_H)
+        ENDIF(NOT HAVE_REGEX_H)
+      ENDIF(HAVE_REGCOMP_LIBREGEX)
+    ENDIF(REGEX_LIBRARY)
+  ENDIF(NOT HAVE_REGCOMP_LIBC)
+ENDIF(REGEX_INCLUDE_DIR)
+
 #
 # Check functions
 #
index 75c2ca3e99faad9e176391242a46b0769e8ff2ad..91e3469c9b4d2881bababbf38016bc6213689dd1 100644 (file)
@@ -322,6 +322,15 @@ if test "x$ac_cv_header_libxml_xmlreader_h" != "xyes"; then
   fi
 fi
 
+AC_ARG_WITH([libregex],
+  AS_HELP_STRING([--without-libregex], [Don't build support for regex through libregex]))
+
+if test "x$with_libregex" != "xno"; then
+  if test "x$ac_cv_header_regex_h" != "xno"; then
+    AC_CHECK_FUNC(regcomp, , [AC_CHECK_LIB(regex,regcomp)])
+  fi
+fi
+
 # TODO: Give the user the option of using a pre-existing system
 # libarchive.  This will define HAVE_LIBARCHIVE which will cause
 # bsdtar_platform.h to use #include <...> for the libarchive headers.
index f643f1878136b6fb0894247798edf80fb67f5ee4..a1f8697e32b2cd94c52b09c76010af169e50feb1 100644 (file)
@@ -55,33 +55,35 @@ DEFINE_TEST(test_option_s)
         * Test 1: Filename substitution when creating archives.
         */
        assertMakeDir("test1", 0755);
-       systemf("%s -cf - -s /foo/bar/ in/d1/foo | %s -xf - -C test1",
-           testprog, testprog);
+       systemf("%s -cf test1_1.tar -s /foo/bar/ in/d1/foo", testprog);
+       systemf("%s -xf test1_1.tar -C test1", testprog);
        assertFileContents("foo", 3, "test1/in/d1/bar");
-       systemf("%s -cf - -s /d1/d2/ in/d1/foo | %s -xf - -C test1",
-           testprog, testprog);
+       systemf("%s -cf test1_2.tar -s /d1/d2/ in/d1/foo", testprog);
+       systemf("%s -xf test1_2.tar -C test1", testprog);
        assertFileContents("foo", 3, "test1/in/d2/foo");
 
        /*
         * Test 2: Basic substitution when extracting archive.
         */
        assertMakeDir("test2", 0755);
-       systemf("%s -cf - in/d1/foo | %s -xf - -s /foo/bar/ -C test2",
-           testprog, testprog);
+       systemf("%s -cf test2.tar in/d1/foo", testprog);
+       systemf("%s -xf test2.tar -s /foo/bar/ -C test2", testprog);
        assertFileContents("foo", 3, "test2/in/d1/bar");
 
        /*
         * Test 3: Files with empty names shouldn't be archived.
         */
-       systemf("%s -cf - -s ,in/d1/foo,, in/d1/foo | %s -tvf - > in.lst",
-           testprog, testprog);
+       systemf("%s -cf test3.tar -s ,in/d1/foo,, in/d1/foo", testprog);
+       systemf("%s -tvf test3.tar > in.lst", testprog);
        assertEmptyFile("in.lst");
 
        /*
         * Test 4: Multiple substitutions when extracting archive.
         */
        assertMakeDir("test4", 0755);
-       systemf("%s -cf - in/d1/foo in/d1/bar | %s -xf - -s /foo/bar/ -s }bar}baz} -C test4",
+       systemf("%s -cf test4.tar in/d1/foo in/d1/bar",
+           testprog, testprog);
+       systemf("%s -xf test4.tar -s /foo/bar/ -s }bar}baz} -C test4",
            testprog, testprog);
        assertFileContents("foo", 3, "test4/in/d1/bar");
        assertFileContents("bar", 3, "test4/in/d1/baz");
@@ -90,7 +92,9 @@ DEFINE_TEST(test_option_s)
         * Test 5: Name-switching substitutions when extracting archive.
         */
        assertMakeDir("test5", 0755);
-       systemf("%s -cf - in/d1/foo in/d1/bar | %s -xf - -s /foo/bar/ -s }bar}foo} -C test5",
+       systemf("%s -cf test5.tar in/d1/foo in/d1/bar",
+           testprog, testprog);
+       systemf("%s -xf test5.tar -s /foo/bar/ -s }bar}foo} -C test5",
            testprog, testprog);
        assertFileContents("foo", 3, "test5/in/d1/bar");
        assertFileContents("bar", 3, "test5/in/d1/foo");
@@ -140,13 +144,13 @@ DEFINE_TEST(test_option_s)
         */
        /* At extraction time. */
        assertMakeDir("test8a", 0755);
-       systemf("%s -cf - in/d1 | %s -xf - -s /d1/d2/ -C test8a",
-           testprog, testprog);
+       systemf("%s -cf test8a.tar in/d1", testprog);
+       systemf("%s -xf test8a.tar -s /d1/d2/ -C test8a", testprog);
        assertIsHardlink("test8a/in/d2/hardlink1", "test8a/in/d2/hardlink2");
        /* At creation time. */
        assertMakeDir("test8b", 0755);
-       systemf("%s -cf - -s /d1/d2/ in/d1 | %s -xf - -C test8b",
-           testprog, testprog);
+       systemf("%s -cf test8b.tar -s /d1/d2/ in/d1", testprog);
+       systemf("%s -xf test8b.tar -C test8b", testprog);
        assertIsHardlink("test8b/in/d2/hardlink1", "test8b/in/d2/hardlink2");
 
        /*
@@ -154,23 +158,27 @@ DEFINE_TEST(test_option_s)
         */
        /* At extraction. (assuming hardlink2 is the hardlink entry) */
        assertMakeDir("test9a", 0755);
-       systemf("%s -cf - in/d1 | %s -xf - -s /hardlink1/hardlink1-renamed/ -C test9a",
-           testprog, testprog);
+       systemf("%s -cf test9a.tar in/d1", testprog);
+       systemf("%s -xf test9a.tar -s /hardlink1/hardlink1-renamed/ -C test9a",
+           testprog);
        assertIsHardlink("test9a/in/d1/hardlink1-renamed", "test9a/in/d1/hardlink2");
        /* At extraction. (assuming hardlink1 is the hardlink entry) */
        assertMakeDir("test9b", 0755);
-       systemf("%s -cf - in/d1 | %s -xf - -s /hardlink2/hardlink2-renamed/ -C test9b",
-           testprog, testprog);
+       systemf("%s -cf test9b.tar in/d1", testprog);
+       systemf("%s -xf test9b.tar -s /hardlink2/hardlink2-renamed/ -C test9b",
+           testprog);
        assertIsHardlink("test9b/in/d1/hardlink1", "test9b/in/d1/hardlink2-renamed");
        /* At creation. (assuming hardlink2 is the hardlink entry) */
        assertMakeDir("test9c", 0755);
-       systemf("%s -cf - -s /hardlink1/hardlink1-renamed/ in/d1 | %s -xf - -C test9c",
-           testprog, testprog);
+       systemf("%s -cf test9c.tar -s /hardlink1/hardlink1-renamed/ in/d1",
+           testprog);
+       systemf("%s -xf test9c.tar -C test9c", testprog);
        assertIsHardlink("test9c/in/d1/hardlink1-renamed", "test9c/in/d1/hardlink2");
        /* At creation. (assuming hardlink1 is the hardlink entry) */
        assertMakeDir("test9d", 0755);
-       systemf("%s -cf - -s /hardlink2/hardlink2-renamed/ in/d1 | %s -xf - -C test9d",
-           testprog, testprog);
+       systemf("%s -cf test9d.tar -s /hardlink2/hardlink2-renamed/ in/d1",
+           testprog);
+       systemf("%s -xf test9d.tar -C test9d", testprog);
        assertIsHardlink("test9d/in/d1/hardlink1", "test9d/in/d1/hardlink2-renamed");
 
        /*
@@ -224,8 +232,8 @@ DEFINE_TEST(test_option_s)
         */
        extract_reference_file("test_option_s.tar.Z");
        assertMakeDir("test12a", 0755);
-       systemf("%s -xf test_option_s.tar.Z -s /hardlink1/foo/H -s /foo/hardlink1/ -C test12a",
-           testprog);
+       systemf("%s -xf test_option_s.tar.Z -s /hardlink1/foo/H -s /foo/hardlink1/ %s -C test12a",
+           testprog, canSymlink()?"":"--exclude in/d1/symlink");
        assertFileContents("foo", 3, "test12a/in/d1/hardlink1");
        assertFileContents("hardlinkedfile", 14, "test12a/in/d1/foo");
        assertFileContents("foo", 3, "test12a/in/d1/hardlink2");
@@ -243,8 +251,8 @@ DEFINE_TEST(test_option_s)
         */
        extract_reference_file("test_option_s.tar.Z");
        assertMakeDir("test13a", 0755);
-       systemf("%s -xf test_option_s.tar.Z -s /hardlink1/foo/Rh -s /foo/hardlink1/Rh -C test13a",
-           testprog);
+       systemf("%s -xf test_option_s.tar.Z -s /hardlink1/foo/Rh -s /foo/hardlink1/Rh %s -C test13a",
+           testprog, canSymlink()?"":"--exclude in/d1/symlink");
        assertFileContents("foo", 3, "test13a/in/d1/foo");
        assertFileContents("hardlinkedfile", 14, "test13a/in/d1/hardlink1");
        assertFileContents("foo", 3, "test13a/in/d1/hardlink2");