CMake实现文件超长行检查:现有配置未触发构建失败
解决CMake文本行长度检查不生效的问题
问题原因
你的代码存在两个核心问题:
- 错误使用
add_custom_command:TARGET ValidateTextFile是给已存在的目标追加命令,但你并未先创建这个目标,导致检查命令根本不会执行。 - grep命令的兼容性与逻辑隐患:部分环境(如BSD grep)中,
.\{131\}的正则语法需要启用扩展模式才能生效;且直接用grep && exit 1的写法,可能因grep输出干扰CMake对错误码的捕获。
修正后的代码
# Define the text file to be validated set(TEXT_FILE_PATH "... path to file ...") # 创建自定义目标用于执行行长度检查 add_custom_target(ValidateTextFile COMMAND bash -c "if grep -qE '.{131}' \"${TEXT_FILE_PATH}\"; then exit 1; fi" COMMENT "Checking for lines longer than 130 characters in ${TEXT_FILE_PATH}" VERBATIM ) # 确保主目标构建前先执行检查 add_dependencies(target_name ValidateTextFile)
关键修改说明
- 替换为
add_custom_target:直接创建ValidateTextFile目标,CMake会在构建主目标前自动执行其绑定的命令。 - 优化grep命令逻辑:
- 加
-q让grep静默执行,仅返回退出码,避免输出干扰构建流程。 - 用
-E启用扩展正则,确保.{131}在所有grep版本中都能正确匹配131个任意字符的行。 - 显式使用bash的
if语句判断,逻辑更清晰,避免短路运算符带来的意外问题。
- 加
- 路径加引号包裹:防止文件路径包含空格时出现解析错误。
可选排查增强方案
如果需要输出超长行的具体位置方便排查,可将COMMAND修改为:
bash -c "grep -nE '.{131}' \"${TEXT_FILE_PATH}\"; if [ \$? -eq 0 ]; then exit 1; fi"
执行时会打印超长行的行号和内容,再终止构建。
内容的提问来源于stack exchange,提问作者md2perpe
相关产品推荐
相关产品推荐

