批量给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 项目根目录

浙公网安备 33010602011771号