Signed-off-by: Pawel Zalewski pzalewski@thegoodpenguin.co.uk --- ...01-pcre_jit_compile-cheri-provenance.patch | 89 +++++++++ ...2-sljitNativeARM_64-cheri-provenance.patch | 61 ++++++ .../0003-sljitUtils-cheri-provenance.patch | 39 ++++ recipes-support/libpcre/files/Makefile | 183 ++++++++++++++++++ recipes-support/libpcre/files/run-ptest | 3 + .../libpcre/libpcre-morello_8.45.bb | 91 +++++++++ 6 files changed, 466 insertions(+) create mode 100644 recipes-support/libpcre/cheri-patches/0001-pcre_jit_compile-cheri-provenance.patch create mode 100644 recipes-support/libpcre/cheri-patches/0002-sljitNativeARM_64-cheri-provenance.patch create mode 100644 recipes-support/libpcre/cheri-patches/0003-sljitUtils-cheri-provenance.patch create mode 100644 recipes-support/libpcre/files/Makefile create mode 100644 recipes-support/libpcre/files/run-ptest create mode 100644 recipes-support/libpcre/libpcre-morello_8.45.bb
diff --git a/recipes-support/libpcre/cheri-patches/0001-pcre_jit_compile-cheri-provenance.patch b/recipes-support/libpcre/cheri-patches/0001-pcre_jit_compile-cheri-provenance.patch new file mode 100644 index 0000000..7677c0e --- /dev/null +++ b/recipes-support/libpcre/cheri-patches/0001-pcre_jit_compile-cheri-provenance.patch @@ -0,0 +1,89 @@ +From 69e5f4de49027e37d3a232cfc9ec882038091a13 Mon Sep 17 00:00:00 2001 +From: Pawel Zalewski pzalewski@thegoodpenguin.co.uk +Date: Thu, 9 Nov 2023 11:50:36 +0000 +Subject: [PATCH 1/3] pcre_jit_compile: cheri provenance + +Signed-off-by: Pawel Zalewski pzalewski@thegoodpenguin.co.uk +--- + pcre_jit_compile.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +diff --git a/pcre_jit_compile.c b/pcre_jit_compile.c +index 4dcf8fc..b7b2cbc 100644 +--- a/pcre_jit_compile.c ++++ b/pcre_jit_compile.c +@@ -2486,7 +2486,7 @@ while (current != NULL) + break; + + case type_mark: +- if (STRCMP_UC_UC(skip_arg, (pcre_uchar *)current[2]) == 0) ++ if (STRCMP_UC_UC(skip_arg, (pcre_uchar *)(uintptr_t)current[2]) == 0) + return current[3]; + break; + +@@ -2495,7 +2495,7 @@ while (current != NULL) + break; + } + SLJIT_ASSERT(current[0] == 0 || current < (sljit_sw*)current[0]); +- current = (sljit_sw*)current[0]; ++ current = (sljit_sw*)(uintptr_t)current[0]; + } + return 0; + } +@@ -3683,7 +3683,7 @@ while (TRUE) + + case OP_DIGIT: + #if defined SUPPORT_UTF && defined COMPILE_PCRE8 +- if (common->utf && !is_char7_bitset((const sljit_u8 *)common->ctypes - cbit_length + cbit_digit, FALSE)) ++ if (common->utf && !is_char7_bitset((const sljit_u8 *)(uintptr_t)(common->ctypes - cbit_length + cbit_digit), FALSE)) + return consumed; + #endif + any = TRUE; +@@ -3692,7 +3692,7 @@ while (TRUE) + + case OP_WHITESPACE: + #if defined SUPPORT_UTF && defined COMPILE_PCRE8 +- if (common->utf && !is_char7_bitset((const sljit_u8 *)common->ctypes - cbit_length + cbit_space, FALSE)) ++ if (common->utf && !is_char7_bitset((const sljit_u8 *)(uintptr_t)(common->ctypes - cbit_length + cbit_space), FALSE)) + return consumed; + #endif + any = TRUE; +@@ -3701,7 +3701,7 @@ while (TRUE) + + case OP_WORDCHAR: + #if defined SUPPORT_UTF && defined COMPILE_PCRE8 +- if (common->utf && !is_char7_bitset((const sljit_u8 *)common->ctypes - cbit_length + cbit_word, FALSE)) ++ if (common->utf && !is_char7_bitset((const sljit_u8 *)(uintptr_t)(common->ctypes - cbit_length + cbit_word), FALSE)) + return consumed; + #endif + any = TRUE; +@@ -6422,7 +6422,7 @@ switch(type) + if (check_str_ptr) + detect_partial_match(common, backtracks); + #if defined SUPPORT_UTF && defined COMPILE_PCRE8 +- if (common->utf && is_char7_bitset((const sljit_u8 *)common->ctypes - cbit_length + cbit_digit, FALSE)) ++ if (common->utf && is_char7_bitset((const sljit_u8 *)(uintptr_t)(common->ctypes - cbit_length + cbit_digit), FALSE)) + read_char7_type(common, type == OP_NOT_DIGIT); + else + #endif +@@ -6437,7 +6437,7 @@ switch(type) + if (check_str_ptr) + detect_partial_match(common, backtracks); + #if defined SUPPORT_UTF && defined COMPILE_PCRE8 +- if (common->utf && is_char7_bitset((const sljit_u8 *)common->ctypes - cbit_length + cbit_space, FALSE)) ++ if (common->utf && is_char7_bitset((const sljit_u8 *)(uintptr_t)(common->ctypes - cbit_length + cbit_space), FALSE)) + read_char7_type(common, type == OP_NOT_WHITESPACE); + else + #endif +@@ -6451,7 +6451,7 @@ switch(type) + if (check_str_ptr) + detect_partial_match(common, backtracks); + #if defined SUPPORT_UTF && defined COMPILE_PCRE8 +- if (common->utf && is_char7_bitset((const sljit_u8 *)common->ctypes - cbit_length + cbit_word, FALSE)) ++ if (common->utf && is_char7_bitset((const sljit_u8 *)(uintptr_t)(common->ctypes - cbit_length + cbit_word), FALSE)) + read_char7_type(common, type == OP_NOT_WORDCHAR); + else + #endif +-- +2.34.1 + diff --git a/recipes-support/libpcre/cheri-patches/0002-sljitNativeARM_64-cheri-provenance.patch b/recipes-support/libpcre/cheri-patches/0002-sljitNativeARM_64-cheri-provenance.patch new file mode 100644 index 0000000..9c0880c --- /dev/null +++ b/recipes-support/libpcre/cheri-patches/0002-sljitNativeARM_64-cheri-provenance.patch @@ -0,0 +1,61 @@ +From b6c4c1121f09698ff8bc5c491898aeda33b449c8 Mon Sep 17 00:00:00 2001 +From: Pawel Zalewski pzalewski@thegoodpenguin.co.uk +Date: Thu, 9 Nov 2023 11:50:55 +0000 +Subject: [PATCH 2/3] sljitNativeARM_64: cheri provenance + +Signed-off-by: Pawel Zalewski pzalewski@thegoodpenguin.co.uk +--- + sljit/sljitNativeARM_64.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +diff --git a/sljit/sljitNativeARM_64.c b/sljit/sljitNativeARM_64.c +index e15b345..6d450f1 100644 +--- a/sljit/sljitNativeARM_64.c ++++ b/sljit/sljitNativeARM_64.c +@@ -24,6 +24,7 @@ + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + ++#include <stdint.h> + SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void) + { + return "ARM-64" SLJIT_CPUINFO; +@@ -324,7 +325,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil + while (jump) { + do { + addr = (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target; +- buf_ptr = (sljit_ins *)jump->addr; ++ buf_ptr = (sljit_ins *)(uintptr_t)jump->addr; + + if (jump->flags & PATCH_B) { + addr = (sljit_sw)(addr - (sljit_uw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset)) >> 2; +@@ -358,7 +359,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil + put_label = compiler->put_labels; + while (put_label) { + addr = put_label->label->addr; +- buf_ptr = (sljit_ins *)put_label->addr; ++ buf_ptr = (sljit_ins *)(uintptr_t)put_label->addr; + + buf_ptr[0] |= (addr & 0xffff) << 5; + buf_ptr[1] |= ((addr >> 16) & 0xffff) << 5; +@@ -2020,7 +2021,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct slj + + SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset) + { +- sljit_ins* inst = (sljit_ins*)addr; ++ sljit_ins* inst = (sljit_ins*)(uintptr_t)addr; + modify_imm64_const(inst, new_target); + inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + SLJIT_CACHE_FLUSH(inst, inst + 4); +@@ -2028,7 +2029,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_ta + + SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset) + { +- sljit_ins* inst = (sljit_ins*)addr; ++ sljit_ins* inst = (sljit_ins*)(uintptr_t)addr; + modify_imm64_const(inst, new_constant); + inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + SLJIT_CACHE_FLUSH(inst, inst + 4); +-- +2.34.1 + diff --git a/recipes-support/libpcre/cheri-patches/0003-sljitUtils-cheri-provenance.patch b/recipes-support/libpcre/cheri-patches/0003-sljitUtils-cheri-provenance.patch new file mode 100644 index 0000000..5fb8b5c --- /dev/null +++ b/recipes-support/libpcre/cheri-patches/0003-sljitUtils-cheri-provenance.patch @@ -0,0 +1,39 @@ +From ac44bb2ccdf9c926c2a217e1002f5c4a49c549a8 Mon Sep 17 00:00:00 2001 +From: Pawel Zalewski pzalewski@thegoodpenguin.co.uk +Date: Thu, 9 Nov 2023 14:07:09 +0000 +Subject: [PATCH 3/3] sljitUtils: cheri provenance + +Signed-off-by: Pawel Zalewski pzalewski@thegoodpenguin.co.uk +--- + sljit/sljitUtils.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/sljit/sljitUtils.c b/sljit/sljitUtils.c +index 857492a..094cb5a 100644 +--- a/sljit/sljitUtils.c ++++ b/sljit/sljitUtils.c +@@ -312,7 +312,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_u8 *SLJIT_FUNC sljit_stack_resize(struct sljit_st + return NULL; + } + else { +- if (!VirtualFree((void*)aligned_old_start, aligned_new_start - aligned_old_start, MEM_DECOMMIT)) ++ if (!VirtualFree((void*)(uintptr_t)aligned_old_start, aligned_new_start - aligned_old_start, MEM_DECOMMIT)) + return NULL; + } + } +@@ -323,10 +323,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_u8 *SLJIT_FUNC sljit_stack_resize(struct sljit_st + /* If madvise is available, we release the unnecessary space. */ + #if defined(MADV_DONTNEED) + if (aligned_new_start > aligned_old_start) +- madvise((void*)aligned_old_start, aligned_new_start - aligned_old_start, MADV_DONTNEED); ++ madvise((void*)(uintptr_t)aligned_old_start, aligned_new_start - aligned_old_start, MADV_DONTNEED); + #elif defined(POSIX_MADV_DONTNEED) + if (aligned_new_start > aligned_old_start) +- posix_madvise((void*)aligned_old_start, aligned_new_start - aligned_old_start, POSIX_MADV_DONTNEED); ++ posix_madvise((void*)(uintptr_t)aligned_old_start, aligned_new_start - aligned_old_start, POSIX_MADV_DONTNEED); + #endif + } + #endif +-- +2.34.1 + diff --git a/recipes-support/libpcre/files/Makefile b/recipes-support/libpcre/files/Makefile new file mode 100644 index 0000000..708d807 --- /dev/null +++ b/recipes-support/libpcre/files/Makefile @@ -0,0 +1,183 @@ +TESTS = pcre_stringpiece_unittest RunTest RunGrepTest +subdir = . +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red='[0;31m'; \ + grn='[0;32m'; \ + lgn='[1;32m'; \ + blu='[1;34m'; \ + mgn='[0;35m'; \ + brg='[1m'; \ + std='[m'; \ + fi; \ +} +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +am__sh_e_setup = case $$- in *e*) set +e;; esac +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/.log$$//'`; \ + bases=`echo $$bases` +RECHECK_LOGS = $(TEST_LOGS) +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +MKDIR_P = /bin/mkdir -p +PACKAGE_STRING = PCRE 8.36 +SHELL = /bin/sh +srcdir = . +top_srcdir = . +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done; \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 +check-TESTS: + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +pcre_stringpiece_unittest.log: pcre_stringpiece_unittest$(EXEEXT) + @p='pcre_stringpiece_unittest$(EXEEXT)'; \ + b='pcre_stringpiece_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) -- "$$tst" +RunTest.log: RunTest + @p='RunTest'; \ + b='RunTest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) -- "$$tst" +RunGrepTest.log: RunGrepTest + @p='RunGrepTest'; \ + b='RunGrepTest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) -- "$$tst" diff --git a/recipes-support/libpcre/files/run-ptest b/recipes-support/libpcre/files/run-ptest new file mode 100644 index 0000000..990d4a1 --- /dev/null +++ b/recipes-support/libpcre/files/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +make check-TESTS diff --git a/recipes-support/libpcre/libpcre-morello_8.45.bb b/recipes-support/libpcre/libpcre-morello_8.45.bb new file mode 100644 index 0000000..82e8c38 --- /dev/null +++ b/recipes-support/libpcre/libpcre-morello_8.45.bb @@ -0,0 +1,91 @@ +inherit autotools binconfig-disabled ptest purecap-sysroot + +MORELLO_SRC = "poky/meta/recipes-support/libpcre/libpcre_8.45.bb" + +DESCRIPTION = "The PCRE library is a set of functions that implement regular \ +expression pattern matching using the same syntax and semantics as Perl 5. PCRE \ +has its own native API, as well as a set of wrapper functions that correspond \ +to the POSIX regular expression API." +SUMMARY = "Perl Compatible Regular Expressions" +HOMEPAGE = "http://www.pcre.org" +SECTION = "devel" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENCE;md5=b5d5d1a69a24ea2718263f1ff85a1c58" + +FILESEXTRAPATHS:prepend := "${THISDIR}/cheri-patches:" + +TOOLCHAIN = "${MORELLO_TOOLCHAIN}" + +SRC_URI = "${SOURCEFORGE_MIRROR}/pcre/pcre-${PV}.tar.bz2 \ + file://run-ptest \ + file://Makefile \ + " + +SRC_URI += "file://0001-pcre_jit_compile-cheri-provenance.patch \ + file://0002-sljitNativeARM_64-cheri-provenance.patch \ + file://0003-sljitUtils-cheri-provenance.patch \ + " + +SRC_URI[sha256sum] = "4dae6fdcd2bb0bb6c37b5f97c33c2be954da743985369cddac3546e3218bffb8" + +CVE_PRODUCT = "pcre" + +S = "${WORKDIR}/pcre-${PV}" + +PROVIDES += "pcre-morello" +DEPENDS += "bzip2-morello zlib-morello" + +PACKAGECONFIG ??= "pcre8 unicode-properties jit" + +PACKAGECONFIG[pcre8] = "--enable-pcre8,--disable-pcre8" +PACKAGECONFIG[pcre16] = "--enable-pcre16,--disable-pcre16" +PACKAGECONFIG[pcre32] = "--enable-pcre32,--disable-pcre32" +PACKAGECONFIG[pcretest-readline] = "--enable-pcretest-libreadline,--disable-pcretest-libreadline,readline-morello," +PACKAGECONFIG[unicode-properties] = "--enable-unicode-properties,--disable-unicode-properties" +PACKAGECONFIG[jit] = "--enable-jit=auto,--disable-jit" + +BINCONFIG = "${bindir}/pcre-config" + +EXTRA_OECONF = "--enable-utf --disable-cpp" + +PACKAGES =+ "libpcrecpp-morello libpcreposix-morello pcregrep-morello pcregrep-doc-morello pcretest-morello pcretest-doc-morello" + +SUMMARY:libpcrecpp-morello = "${SUMMARY} - C++ wrapper functions" +SUMMARY:libpcreposix-morello = "${SUMMARY} - C wrapper functions based on the POSIX regex API" +SUMMARY:pcregrep-morello = "grep utility that uses perl 5 compatible regexes" +SUMMARY:pcregrep-doc-morello = "grep utility that uses perl 5 compatible regexes - docs" +SUMMARY:pcretest-morello = "program for testing Perl-comatible regular expressions" +SUMMARY:pcretest-doc-morello = "program for testing Perl-comatible regular expressions - docs" + + +FILES:libpcrecpp-morello = "${libdir}/libpcrecpp.so.*" +FILES:libpcreposix-morello = "${libdir}/libpcreposix.so.*" +FILES:pcregrep-morello = "${bindir}/pcregrep" +FILES:pcregrep-doc-morello = "${mandir}/man1/pcregrep.1" +FILES:pcretest-morello = "${bindir}/pcretest" +FILES:pcretest-doc-morello = "${mandir}/man1/pcretest.1" + +do_install:append() { + ${OBJDUMP_COMMAND} ${D}${libdir}/libpcre.so.1.2.13 > ${D}${PURECAP_DEBUGDIR}/libpcre.dump + ${READELF_COMMAND} ${D}${libdir}/libpcre.so.1.2.13 > ${D}${PURECAP_DEBUGDIR}/libpcre.readelf +} + +PTEST_PATH = "${libdir}/libpcre/ptest" + +do_install_ptest() { + t=${D}${PTEST_PATH} + cp ${WORKDIR}/Makefile $t + cp -r ${S}/testdata $t + for i in pcre_stringpiece_unittest pcregrep pcretest; \ + do cp ${B}/.libs/$i $t; \ + done + for i in RunTest RunGrepTest test-driver; \ + do cp ${S}/$i $t; \ + done + # Skip the fr_FR locale test. If the locale fr_FR is found, it is tested. + # If not found, the test is skipped. The test program assumes fr_FR is non-UTF-8 + # locale so the test fails if fr_FR is UTF-8 locale. + sed -i -e 's:do3=yes:do3=no:g' ${D}${PTEST_PATH}/RunTest +} + +RDEPENDS:${PN}-ptest += "make" \ No newline at end of file