From: Michihiro NAKAJIMA Date: Wed, 22 Feb 2012 11:39:15 +0000 (+0900) Subject: Enable bsdtar -s option on Windows with libregex and fix the problem X-Git-Tag: v3.0.4~2^2~62 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c9b68f41c051658bb3f6890f7b83110d40c841b7;p=thirdparty%2Flibarchive.git Enable bsdtar -s option on Windows with libregex and fix the problem which appeared from enabling that at test_option_s. --- diff --git a/CMakeLists.txt b/CMakeLists.txt index a80c2e287..2adae3d32 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -670,6 +670,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 # diff --git a/configure.ac b/configure.ac index c15d43272..5e258fed0 100644 --- a/configure.ac +++ b/configure.ac @@ -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. diff --git a/tar/test/test_option_s.c b/tar/test/test_option_s.c index f643f1878..a1f8697e3 100644 --- a/tar/test/test_option_s.c +++ b/tar/test/test_option_s.c @@ -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");