-
Notifications
You must be signed in to change notification settings - Fork 15.2k
[lldb][headers] Create script to fix up versioning #141116
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,61 @@ | ||
| #!/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() |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -290,6 +290,45 @@ 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_dir ${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}) | ||
|
|
||
| find_program(unifdef_EXECUTABLE unifdef) | ||
|
|
||
| foreach(header | ||
| ${public_headers} | ||
| ${generated_public_headers} | ||
| ${root_public_headers}) | ||
| get_filename_component(basename ${header} NAME) | ||
| set(staged_header ${lldb_header_staging_dir}/${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)) | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @chelcassanova
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This looks like it works (for me, on a local build at least). I updated this line to use |
||
| 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_dir}/lldb-defines.h ${LLDB_VERSION_MAJOR} ${LLDB_VERSION_MINOR} ${LLDB_VERSION_PATCH} | ||
| ) | ||
| add_custom_target(liblldb-header-staging DEPENDS ${lldb_staged_headers}) | ||
| add_dependencies(liblldb liblldb-header-staging) | ||
|
|
||
| if(LLDB_BUILD_FRAMEWORK) | ||
| include(LLDBFramework) | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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 |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This looks very similar to some logic in
LLDBFramework.cmake. Do we need this logic in both places or could it only live here?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The logic of finding all the headers for staging them in a directory should be able to live here alone. The idea is that the framework would then use the staged headers in
<build-dir>include/lldbas its own input for when headers have to be fixed up for a framework build (seeLLDBFramework.cmakein this patch: https://github.com/llvm/llvm-project/pull/142051/files where the logic for finding headers is removed and instead uses the staged headers from the build dir)