Fix allowlist regex in bindgen invocation

The allowlist is just a regex, which means bindgen leaves it to the
user to resolve Windows vs POSIX filepath differences. We need to
support both / and \. It's unclear why only some headers are broken, but
it's probably something to do with whether the header is included
directly or indirectly.

Unfortunately, in doing so, we run into a mess of escaping issues, so
the regex is more permissing than ideal.

Bug: 595
Change-Id: I8b785aeaaeff162d9eb2aced89928f9602445903
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58967
Auto-Submit: David Benjamin <davidben@google.com>
Reviewed-by: Bob Beck <bbe@google.com>
Commit-Queue: Bob Beck <bbe@google.com>
diff --git a/rust/bssl-sys/CMakeLists.txt b/rust/bssl-sys/CMakeLists.txt
index 4cf8507..c11510b 100644
--- a/rust/bssl-sys/CMakeLists.txt
+++ b/rust/bssl-sys/CMakeLists.txt
@@ -5,15 +5,33 @@
 
 # Generate architecture-specific wrappers.
 set(WRAPPER_TARGET ${CMAKE_BINARY_DIR}/rust/bssl-sys/src/wrapper_${RUST_BINDINGS}.rs)
-set(COMMAND ${BINDGEN_EXECUTABLE} "wrapper.h"
+set(COMMAND ${BINDGEN_EXECUTABLE} wrapper.h
             -o ${WRAPPER_TARGET}
             --no-derive-default
             --enable-function-attribute-detection
             --use-core
-            --default-macro-constant-type="signed"
-            --rustified-enum="point_conversion_form_t"
-            --allowlist-file=".*/include/openssl/.*\\.h"
-            --allowlist-file=".*/rust_wrapper\\.h"
+            --default-macro-constant-type=signed
+            --rustified-enum=point_conversion_form_t
+            # These regexes need to accept both / and \ to handle Windows file
+            # path differences, due a bindgen issue. See
+            # https://crbug.com/boringssl/595. Ideally, we would write [/\\],
+            # but there are many layers of escaping here. First, CMake
+            # interprets backslashes. Then CMake generates a Ninja or Make file.
+            # That, in turn, launches passes inputs to the shell on POSIX, and
+            # does something else on Windows.
+            #
+            # It is unlikely that every layer here has sufficiently well-defined
+            # escaping and correctly handled the next layer's escaping. On top
+            # of that, we'd likely need to detect Windows vs POSIX hosts and
+            # change the input. Instead, just use [[:punct:]] which is more
+            # permissive than necessary, but we only need to exclude unwanted
+            # libc heaaders.
+            #
+            # If bindgen ever supports some file-based config (see
+            # https://github.com/rust-lang/rust-bindgen/issues/2508), we can
+            # switch to that.
+            --allowlist-file=".*[[:punct:]]include[[:punct:]]openssl[[:punct:]].*\\.h"
+            --allowlist-file=".*[[:punct:]]rust_wrapper\\.h"
             -- # these are LLVM arg passthroughs
             -I../../include
             # https://doc.rust-lang.org/nightly/rustc/platform-support.html