[Lldb-commits] [lldb] [lldb][headers] Create script to fix up versioning (PR #141116)
Chelsea Cassanova via lldb-commits
lldb-commits at lists.llvm.org
Fri May 23 12:05:47 PDT 2025
https://github.com/chelcassanova updated https://github.com/llvm/llvm-project/pull/141116
>From fcb4a366d9f4659273480f49c491fc50a179cfff Mon Sep 17 00:00:00 2001
From: Chelsea Cassanova <chelsea_cassanova at apple.com>
Date: Thu, 22 May 2025 11:00:06 -0700
Subject: [PATCH] [lldb][headers] Create script to fix up versioning
This commit creates a Python script that fixes up the versioning information in
lldb-defines.h. It also moves the build logic for fixing up the lldb
headers from being in the framework only to being in the same location
that we create the liblldb target.
---
lldb/scripts/framework-header-fix.sh | 6 ---
lldb/scripts/version-header-fix.py | 46 +++++++++++++++++++
lldb/source/API/CMakeLists.txt | 34 ++++++++++++++
lldb/test/Shell/Scripts/Inputs/lldb-defines.h | 7 +++
.../TestFrameworkFixScriptIncludes.test | 17 +++++++
.../Shell/Scripts/TestVersionFixScript.test | 11 +++++
6 files changed, 115 insertions(+), 6 deletions(-)
create mode 100755 lldb/scripts/version-header-fix.py
create mode 100644 lldb/test/Shell/Scripts/Inputs/lldb-defines.h
create mode 100644 lldb/test/Shell/Scripts/TestFrameworkFixScriptIncludes.test
create mode 100644 lldb/test/Shell/Scripts/TestVersionFixScript.test
diff --git a/lldb/scripts/framework-header-fix.sh b/lldb/scripts/framework-header-fix.sh
index 3459dd91c9ec1..345579c80cdf5 100755
--- a/lldb/scripts/framework-header-fix.sh
+++ b/lldb/scripts/framework-header-fix.sh
@@ -7,11 +7,5 @@ for file in `find $1 -name "*.h"`
do
/usr/bin/sed -i.bak 's/\(#include\)[ ]*"lldb\/\(API\/\)\{0,1\}\(.*\)"/\1 <LLDB\/\3>/1' "$file"
/usr/bin/sed -i.bak 's|<LLDB/Utility|<LLDB|' "$file"
- LLDB_VERSION=`echo $2 | /usr/bin/sed -E 's/^([0-9]+).([0-9]+).([0-9]+)(.[0-9]+)?$/\\1/g'`
- LLDB_REVISION=`echo $2 | /usr/bin/sed -E 's/^([0-9]+).([0-9]+).([0-9]+)(.[0-9]+)?$/\\3/g'`
- LLDB_VERSION_STRING=`echo $2`
- /usr/bin/sed -i.bak "s|//#define LLDB_VERSION$|#define LLDB_VERSION $LLDB_VERSION |" "$file"
- /usr/bin/sed -i.bak "s|//#define LLDB_REVISION|#define LLDB_REVISION $LLDB_REVISION |" "$file"
- /usr/bin/sed -i.bak "s|//#define LLDB_VERSION_STRING|#define LLDB_VERSION_STRING \"$LLDB_VERSION_STRING\" |" "$file"
rm -f "$file.bak"
done
diff --git a/lldb/scripts/version-header-fix.py b/lldb/scripts/version-header-fix.py
new file mode 100755
index 0000000000000..cf5b525d9a2e8
--- /dev/null
+++ b/lldb/scripts/version-header-fix.py
@@ -0,0 +1,46 @@
+#!/usr/bin/env python3
+"""
+Usage: <path/to/input-header.h> <path/to/output-header.h> LLDB_MAJOR_VERSION LLDB_MINOR_VERSION LLDB_PATCH_VERSION
+
+This script uncomments and populates the versioning information in lldb-defines.h
+"""
+
+import argparse
+import os
+import re
+
+LLDB_VERSION_REGEX = re.compile(r'//\s*#define LLDB_VERSION\s*$', re.M)
+LLDB_REVISION_REGEX = re.compile(r'//\s*#define LLDB_REVISION\s*$', re.M)
+LLDB_VERSION_STRING_REGEX = re.compile(r'//\s*#define LLDB_VERSION_STRING\s*$', re.M)
+
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("input_path")
+ parser.add_argument("output_path")
+ parser.add_argument("lldb_version_major")
+ parser.add_argument("lldb_version_minor")
+ parser.add_argument("lldb_version_patch")
+ args = parser.parse_args()
+ input_path = str(args.input_path)
+ output_path = str(args.output_path)
+ lldb_version_major = args.lldb_version_major
+ lldb_version_minor = args.lldb_version_minor
+ lldb_version_patch = args.lldb_version_patch
+
+ with open(input_path, "r") as input_file:
+ lines = input_file.readlines()
+ file_buffer = ''.join(lines)
+
+ with open(output_path, "w") as output_file:
+ # For the defines in lldb-defines.h that define the major, minor and version string
+ # uncomment each define and populate its value using the arguments passed in.
+ # e.g. //#define LLDB_VERSION -> #define LLDB_VERSION <LLDB_MAJOR_VERSION>
+ file_buffer = re.sub(LLDB_VERSION_REGEX, r'#define LLDB_VERSION ' + lldb_version_major, file_buffer)
+
+ file_buffer = re.sub(LLDB_REVISION_REGEX, r'#define LLDB_REVISION ' + lldb_version_patch, file_buffer)
+ file_buffer = re.sub(LLDB_VERSION_STRING_REGEX, r'#define LLDB_VERSION_STRING "{0}.{1}.{2}"'.format(lldb_version_major, lldb_version_minor, lldb_version_patch), file_buffer)
+ output_file.write(file_buffer)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/lldb/source/API/CMakeLists.txt b/lldb/source/API/CMakeLists.txt
index 3bc569608e458..a1f2d4fee82c8 100644
--- a/lldb/source/API/CMakeLists.txt
+++ b/lldb/source/API/CMakeLists.txt
@@ -290,6 +290,40 @@ else()
endif()
endif()
+# Stage all headers in the include directory in the build dir.
+file(GLOB public_headers ${LLDB_SOURCE_DIR}/include/lldb/API/*.h)
+set(lldb_header_staging ${CMAKE_BINARY_DIR}/include/lldb)
+file(GLOB root_public_headers ${LLDB_SOURCE_DIR}/include/lldb/lldb-*.h)
+file(GLOB root_private_headers ${LLDB_SOURCE_DIR}/include/lldb/lldb-private*.h)
+list(REMOVE_ITEM root_public_headers ${root_private_headers})
+foreach(header
+ ${public_headers}
+ ${generated_public_headers}
+ ${root_public_headers})
+ get_filename_component(basename ${header} NAME)
+ set(staged_header ${lldb_header_staging}/${basename})
+
+ if(unifdef_EXECUTABLE)
+ # unifdef returns 0 when the file is unchanged and 1 if something was changed.
+ # That means if we successfully remove SWIG code, the build system believes
+ # that the command has failed and stops. This is undesirable.
+ set(copy_command ${unifdef_EXECUTABLE} -USWIG -o ${staged_header} ${header} || (exit 0))
+ else()
+ set(copy_command ${CMAKE_COMMAND} -E copy ${header} ${staged_header})
+ endif()
+
+ add_custom_command(
+ DEPENDS ${header} OUTPUT ${staged_header}
+ COMMAND ${copy_command}
+ COMMENT "LLDB headers: stage LLDB headers in include directory")
+
+ list(APPEND lldb_staged_headers ${staged_header})
+endforeach()
+
+add_custom_command(TARGET liblldb POST_BUILD
+ COMMAND ${LLDB_SOURCE_DIR}/scripts/version-header-fix.py ${LLDB_SOURCE_DIR}/include/lldb/lldb-defines.h ${lldb_header_staging}/lldb-defines.h ${LLDB_VERSION_MAJOR} ${LLDB_VERSION_MINOR} ${LLDB_VERSION_PATCH}
+)
+
if(LLDB_BUILD_FRAMEWORK)
include(LLDBFramework)
diff --git a/lldb/test/Shell/Scripts/Inputs/lldb-defines.h b/lldb/test/Shell/Scripts/Inputs/lldb-defines.h
new file mode 100644
index 0000000000000..8d3090e26d26f
--- /dev/null
+++ b/lldb/test/Shell/Scripts/Inputs/lldb-defines.h
@@ -0,0 +1,7 @@
+// This is a truncated version of lldb-defines.h used to test the script
+// that fixes up its versioning info.
+
+// The script needs to uncomment these lines and populate the info for versioning.
+// #define LLDB_VERSION
+// #define LLDB_REVISION
+// #define LLDB_VERSION_STRING
diff --git a/lldb/test/Shell/Scripts/TestFrameworkFixScriptIncludes.test b/lldb/test/Shell/Scripts/TestFrameworkFixScriptIncludes.test
new file mode 100644
index 0000000000000..e8c34254713a5
--- /dev/null
+++ b/lldb/test/Shell/Scripts/TestFrameworkFixScriptIncludes.test
@@ -0,0 +1,17 @@
+// Run the convert script on it, then run the framework include fix on it. The framework version fix script
+// expects that all lldb references have been renamed to lldb-rpc in order for it to modify the includes
+// to go into the framework.
+# RUN: %python %p/../../../scripts/framework-header-fix.py lldb_main %p/Inputs/ 21 0 0
+
+// Check the output
+# RUN: cat %p/Inputs/lldb-defines.h | FileCheck %s
+
+// The LLDB version defines must be uncommented and filled in with the values passed into the script.
+# CHECK: {{^}}#define LLDB_VERSION 21
+# CHECK: {{^}}#define LLDB_REVISION 0
+# CHECK: {{^}}#define LLDB_VERSION_STRING "21.0.0"
+
+# RUN: cat %p/Inputs/SBAddress.h | FileCheck %s
+
+// Local includes for LLDB headers must be changed to framework includes.
+# CHECK: #include "<LLDB/SBDefines.h>"
diff --git a/lldb/test/Shell/Scripts/TestVersionFixScript.test b/lldb/test/Shell/Scripts/TestVersionFixScript.test
new file mode 100644
index 0000000000000..78cc987263075
--- /dev/null
+++ b/lldb/test/Shell/Scripts/TestVersionFixScript.test
@@ -0,0 +1,11 @@
+# Create a temp dir for output and run the version fix script on the truncated version of lldb-defines.h in the inputs dir.
+RUN: mkdir -p %t/Outputs
+RUN: %python %p/../../../scripts/version-header-fix.py %p/Inputs/lldb-defines.h %t/Outputs/lldb-defines.h 21 0 12
+
+# Check the output
+RUN: cat %t/Outputs/lldb-defines.h | FileCheck %s
+
+# The LLDB version defines must be uncommented and filled in with the values passed into the script.
+CHECK: {{^}}#define LLDB_VERSION 21
+CHECK: {{^}}#define LLDB_REVISION 12
+CHECK: {{^}}#define LLDB_VERSION_STRING "21.0.12"
More information about the lldb-commits
mailing list