Integrate the new way of C++ symbol prefixing with CMake.

Bug: 42220000
Change-Id: I00a9dc89ff5dc136e0ed4909a1c8e8366a6a6964
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/87030
Reviewed-by: Xiangfei Ding <xfding@google.com>
Commit-Queue: Rudolf Polzer <rpolzer@google.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c37bd80..6917223 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -76,6 +76,10 @@
 endforeach()
 
 if(BORINGSSL_PREFIX AND BORINGSSL_PREFIX_SYMBOLS)
+  if(FIPS AND NOT BUILD_SHARED_LIBS)
+    # Symbol prefixing is currently incompatible with delocate.
+    message(FATAL_ERROR "Cannot use BORINGSSL_PREFIX with FIPS and static libraries")
+  endif()
   require_go()
   add_definitions(-DBORINGSSL_PREFIX=${BORINGSSL_PREFIX})
   # CMake automatically connects include_directories to the NASM command-line,
diff --git a/gen/sources.bzl b/gen/sources.bzl
index 3eb86d2..b0346cb 100644
--- a/gen/sources.bzl
+++ b/gen/sources.bzl
@@ -686,6 +686,7 @@
     "crypto/spake2plus/internal.h",
     "crypto/trust_token/internal.h",
     "crypto/x509/internal.h",
+    "include/openssl/prefix_symbols.h",
     "third_party/fiat/bedrock_unverified_bareminimum.c.inc",
     "third_party/fiat/bedrock_unverified_platform.c.inc",
     "third_party/fiat/curve25519_32.h",
diff --git a/gen/sources.cmake b/gen/sources.cmake
index 2353b0a..d862eef 100644
--- a/gen/sources.cmake
+++ b/gen/sources.cmake
@@ -708,6 +708,7 @@
   crypto/spake2plus/internal.h
   crypto/trust_token/internal.h
   crypto/x509/internal.h
+  include/openssl/prefix_symbols.h
   third_party/fiat/bedrock_unverified_bareminimum.c.inc
   third_party/fiat/bedrock_unverified_platform.c.inc
   third_party/fiat/curve25519_32.h
diff --git a/gen/sources.gni b/gen/sources.gni
index 21af335..56ca0c8 100644
--- a/gen/sources.gni
+++ b/gen/sources.gni
@@ -686,6 +686,7 @@
   "crypto/spake2plus/internal.h",
   "crypto/trust_token/internal.h",
   "crypto/x509/internal.h",
+  "include/openssl/prefix_symbols.h",
   "third_party/fiat/bedrock_unverified_bareminimum.c.inc",
   "third_party/fiat/bedrock_unverified_platform.c.inc",
   "third_party/fiat/curve25519_32.h",
diff --git a/gen/sources.json b/gen/sources.json
index 6b24ac8..dad4298 100644
--- a/gen/sources.json
+++ b/gen/sources.json
@@ -668,6 +668,7 @@
       "crypto/spake2plus/internal.h",
       "crypto/trust_token/internal.h",
       "crypto/x509/internal.h",
+      "include/openssl/prefix_symbols.h",
       "third_party/fiat/bedrock_unverified_bareminimum.c.inc",
       "third_party/fiat/bedrock_unverified_platform.c.inc",
       "third_party/fiat/curve25519_32.h",
diff --git a/gen/sources.mk b/gen/sources.mk
index 94d51b7..0d1d104 100644
--- a/gen/sources.mk
+++ b/gen/sources.mk
@@ -676,6 +676,7 @@
   crypto/spake2plus/internal.h \
   crypto/trust_token/internal.h \
   crypto/x509/internal.h \
+  include/openssl/prefix_symbols.h \
   third_party/fiat/bedrock_unverified_bareminimum.c.inc \
   third_party/fiat/bedrock_unverified_platform.c.inc \
   third_party/fiat/curve25519_32.h \
diff --git a/include/openssl/base.h b/include/openssl/base.h
index 1d050c7..36b9051 100644
--- a/include/openssl/base.h
+++ b/include/openssl/base.h
@@ -42,8 +42,8 @@
 #include <openssl/target.h>  // IWYU pragma: export
 
 #if defined(BORINGSSL_PREFIX)
-#include <boringssl_prefix_symbols.h>
-#endif
+#include <openssl/prefix_symbols.h>
+#endif  // BORINGSSL_PREFIX
 
 #if defined(__cplusplus)
 extern "C" {
diff --git a/gen/boringssl_prefix_symbols_c.inc b/include/openssl/prefix_symbols.h
similarity index 98%
rename from gen/boringssl_prefix_symbols_c.inc
rename to include/openssl/prefix_symbols.h
index 3236487..8b70e0a 100644
--- a/gen/boringssl_prefix_symbols_c.inc
+++ b/include/openssl/prefix_symbols.h
@@ -14,6 +14,22 @@
 
 // Generated by go ./util/pregenerate. Do not edit manually.
 
+#ifndef OPENSSL_HEADER_PREFIX_SYMBOLS_H
+#define OPENSSL_HEADER_PREFIX_SYMBOLS_H
+
+
+#define BORINGSSL_ADD_PREFIX_CONCAT_INNER(a, b) a##_##b
+#define BORINGSSL_ADD_PREFIX_CONCAT(a, b) \
+  BORINGSSL_ADD_PREFIX_CONCAT_INNER(a, b)
+#define BORINGSSL_ADD_PREFIX(s) BORINGSSL_ADD_PREFIX_CONCAT(BORINGSSL_PREFIX, s)
+
+#if defined(__APPLE__)
+#define BORINGSSL_SYMBOL_INNER(s) _##s
+#define BORINGSSL_SYMBOL(s) BORINGSSL_SYMBOL_INNER(s)
+#else  // __APPLE__
+#define BORINGSSL_SYMBOL(s) s
+#endif  // __APPLE__
+
 #if defined(__PRAGMA_REDEFINE_EXTNAME)
 
 #pragma redefine_extname ACCESS_DESCRIPTION_free BORINGSSL_SYMBOL(BORINGSSL_ADD_PREFIX(ACCESS_DESCRIPTION_free))
@@ -6887,3 +6903,5 @@
 #define sk_void_sort BORINGSSL_ADD_PREFIX(sk_void_sort)
 #define sk_void_value BORINGSSL_ADD_PREFIX(sk_void_value)
 #define sk_void_zero BORINGSSL_ADD_PREFIX(sk_void_zero)
+
+#endif  // OPENSSL_HEADER_PREFIX_SYMBOLS_H
diff --git a/util/make_prefix_headers.go b/util/make_prefix_headers.go
index 7cfc48b..8e1e05c 100644
--- a/util/make_prefix_headers.go
+++ b/util/make_prefix_headers.go
@@ -215,11 +215,6 @@
 		os.Exit(1)
 	}
 
-	if err := writeCHeader(symbols, filepath.Join(*out, "boringssl_prefix_symbols.h")); err != nil {
-		fmt.Fprintf(os.Stderr, "Error writing boringssl_prefix_symbols.h: %s\n", err)
-		os.Exit(1)
-	}
-
 	if err := writeASMHeader(symbols, filepath.Join(*out, "boringssl_prefix_symbols_asm.h")); err != nil {
 		fmt.Fprintf(os.Stderr, "Error writing boringssl_prefix_symbols_asm.h: %s\n", err)
 		os.Exit(1)
diff --git a/util/pregenerate/build.go b/util/pregenerate/build.go
index 5853a29..fd829b6 100644
--- a/util/pregenerate/build.go
+++ b/util/pregenerate/build.go
@@ -329,6 +329,14 @@
 	}
 }
 
+// addGeneratedHeader adds a generated `header` to `targetsOut`.
+func addGeneratedHeader(targetsOut map[string]build.Target, header string) {
+	target := targetsOut["crypto"]
+	target.InternalHdrs = append(target.InternalHdrs, header)
+	slices.Sort(target.InternalHdrs)
+	targetsOut["crypto"] = target
+}
+
 // Construct a task to collect assembly global symbols into the file "gen/asm.syms".
 // This task should only run after all the `PerlAsmTask`s in `perlAsmTasks` complete.
 func MakeCollectAsmGlobalTasks(perlAsmTasks []*Task, allAsmSrcs []string) []*Task {
@@ -359,14 +367,15 @@
 }
 
 // MakePrefixingIncludes returns the tasks to generate the header files for symbol prefixing.
-func MakePrefixingIncludes(in map[string]InputTarget) []*Task {
+func MakePrefixingIncludes(in map[string]InputTarget, targetsOut map[string]build.Target) []*Task {
 	var headers []string
 	for _, t := range in {
 		headers = append(headers, t.Hdrs...)
 	}
+	addGeneratedHeader(targetsOut, "include/openssl/prefix_symbols.h")
 	return []*Task{
-		NewSimpleTask("gen/boringssl_prefix_symbols_c.inc", func() ([]byte, error) {
-			return BuildCRenamingIncludes(headers)
+		NewSimpleTask("include/openssl/prefix_symbols.h", func() ([]byte, error) {
+			return BuildCRenamingHeader(headers)
 		}),
 	}
 }
diff --git a/util/pregenerate/idextractor.go b/util/pregenerate/idextractor.go
index e844d9b..c1086d8 100644
--- a/util/pregenerate/idextractor.go
+++ b/util/pregenerate/idextractor.go
@@ -52,10 +52,10 @@
 	return strings.TrimSuffix(strings.ToLower(filepath.Base(clang)), ".exe") == "clang-cl", nil
 }
 
-// BuildCRenamingMacros calls Clang to extract the AST of the headers, then processes them to extract the symbols.
+// BuildCRenamingHeader calls Clang to extract the AST of the headers, then processes them to extract the symbols.
 //
 // It returns an include for C.
-func BuildCRenamingIncludes(headers []string) (cInclude []byte, err error) {
+func BuildCRenamingHeader(headers []string) (cInclude []byte, err error) {
 	cmd := *clangPath
 	if cmd == "" {
 		return nil, fmt.Errorf("%w: clang has been disabled by flag", TaskSkipped)
@@ -198,7 +198,24 @@
 
 	var cOutput bytes.Buffer
 	writeHeader(&cOutput, "//")
-	cOutput.WriteString("\n")
+	cOutput.WriteString(`
+#ifndef OPENSSL_HEADER_PREFIX_SYMBOLS_H
+#define OPENSSL_HEADER_PREFIX_SYMBOLS_H
+
+
+#define BORINGSSL_ADD_PREFIX_CONCAT_INNER(a, b) a##_##b
+#define BORINGSSL_ADD_PREFIX_CONCAT(a, b) \
+  BORINGSSL_ADD_PREFIX_CONCAT_INNER(a, b)
+#define BORINGSSL_ADD_PREFIX(s) BORINGSSL_ADD_PREFIX_CONCAT(BORINGSSL_PREFIX, s)
+
+#if defined(__APPLE__)
+#define BORINGSSL_SYMBOL_INNER(s) _##s
+#define BORINGSSL_SYMBOL(s) BORINGSSL_SYMBOL_INNER(s)
+#else  // __APPLE__
+#define BORINGSSL_SYMBOL(s) s
+#endif  // __APPLE__
+
+`)
 	cOutput.WriteString("#if defined(__PRAGMA_REDEFINE_EXTNAME)\n")
 	cOutput.WriteString("\n")
 	for _, sym := range slices.Sorted(maps.Keys(viaRedefineExtname)) {
@@ -216,5 +233,8 @@
 	for _, sym := range slices.Sorted(maps.Keys(viaMacro)) {
 		fmt.Fprintf(&cOutput, "#define %s BORINGSSL_ADD_PREFIX(%s)\n", sym, sym)
 	}
+	cOutput.WriteString(`
+#endif  // OPENSSL_HEADER_PREFIX_SYMBOLS_H
+`)
 	return cOutput.Bytes(), nil
 }
diff --git a/util/pregenerate/pregenerate.go b/util/pregenerate/pregenerate.go
index 4f558e8..969426a 100644
--- a/util/pregenerate/pregenerate.go
+++ b/util/pregenerate/pregenerate.go
@@ -178,7 +178,7 @@
 		allAsmSrcs = append(allAsmSrcs, targetAsmSrcs...)
 	}
 
-	tasks = append(tasks, MakePrefixingIncludes(targetsIn)...)
+	tasks = append(tasks, MakePrefixingIncludes(targetsIn, targetsOut)...)
 	tasks = append(tasks, MakeBuildFiles(targetsOut)...)
 	tasks = append(tasks, MakeCollectAsmGlobalTasks(perlAsmTasks, allAsmSrcs)...)
 	tasks = append(tasks, NewSimpleTask("gen/README.md", func() ([]byte, error) {