批量给cmake文件添加message

每次学习一个新项目时,总是cmake文件中的各种变量和函数弄花了眼。于是想着在每个变量和函数名下方都将此变量或函数打印出了。将需求提交给deepseek,给了我一个大概代码,修修改改之后有了可有版本。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import re
import os
from pathlib import Path
import tempfile

class FileScopeCMakeVarAnalyzer:

    def __init__(self, target_var):
        self.target_var = target_var

    def analyze_project(self, root_dir):
        """分析项目目录"""
        root_dir = os.path.abspath(root_dir)
        print(f"分析项目: {root_dir}")
        
        for root, _, files in os.walk(root_dir):
            for file in files:
                if file.lower() == "cmakelists.txt" or file.lower().endswith(".cmake"):
                    file_path = os.path.join(root, file)
                    print(file_path)
                    file_name1 = file_path.split("/", )[-2]
                    file_name_last = file_path.split("/", )[-1]
                    file_name1 = file_name1+"/"+file_name_last
                    self.analyze_file(file_path, file_name1)
        
        return self


    def analyze_file(self, file_path, file_name):
        file_path = Path(file_path)
        
        try:
            # 创建带特定前缀的临时文件(自动删除)
            with tempfile.NamedTemporaryFile(
                mode='w',
                dir='./tmp', # 指定目录
                encoding='utf-8',
                delete=False           # 不自动删除
            ) as tmp:
                # 读取原内容
                content = file_path.read_text(encoding='utf-8')
                
                # 匹配 set() 命令的正则(支持跨行和嵌套括号)
                set_pattern = re.compile(r'set\s*\(\s*([A-Za-z_][A-Za-z0-9_]*)\s+(.*)',
                    re.IGNORECASE)

                # 修改内容(示例:行号+内容)
                modified = []
                for i, line in enumerate(content.splitlines(), 1):
                    # 修改内容(示例:行号+内容)
                    modified.append(f"{line}")

                    # 1. 识别函数定义
                    if match := re.match(r'(?i)function\s*\(\s*([a-zA-Z_]\w*)', line):
                        func_name = match.group(1)
                        message = "    message(\"FFF " + file_name  + " \033[34m" + func_name
                        message_ = "() \033[0m\")"
                        message = message + message_
                        i = i + 1
                        modified.append(f"{message}")

                        print(func_name)
                        break

                    # 3. 识别变量定义
                    if match := set_pattern.match(line):
                        var_name = match.group(1)
                        print(var_name)

                        message = "    message(\"VVV " + file_name + " \033[35m" + var_name + "\033[0m = "
                        message_ = "${" + var_name + "}" + " \")"
                        message = message + message_
                        i = i + 1
                        modified.append(f"{message}")

                # 写入临时文件
                tmp.write('\n'.join(modified))
        
            # 备份原文件(可选)
            backup = file_path.with_suffix('.bak')
            if backup.exists():
                backup.unlink()
            file_path.rename(backup)

            Path(tmp.name).rename(file_path)
            
        except Exception as e:
            print(f"处理失败: {e}")
            if 'tmp' in locals() and Path(tmp.name).exists():
                Path(tmp.name).unlink()

def analyze_var_file_scope(project_path, target_var):
    """文件作用域版分析接口"""
    
    analyzer = FileScopeCMakeVarAnalyzer(target_var)
    analyzer.analyze_project(project_path)

if __name__ == "__main__":
    import sys
    
    project_path = sys.argv[1]
    target_var = "add_fun_var_mess_for_cmake"
    print(project_path)
    
    analyze_var_file_scope(project_path, target_var)

用法:

python add_fun_var_mess_for_cmake.py 项目根目录
posted @ 2025-06-26 17:31  仰望星空_22  阅读(3)  评论(0)    收藏  举报