CMake如何判断字符串对应的路径是普通文件而非目录?
解决方案
CMake原生在if语句中提供了文件类型判断的内置条件,无需额外引入第三方工具:
- 判断路径为目录:
IS_DIRECTORY <目标路径> - 判断路径为普通文件:
IS_FILE <目标路径>
你只需要修改原有代码中标记FIXME的判断分支,加入路径类型校验即可,修改后的代码片段如下:
# 跳过许可证名称不匹配、或者是目录的条目 if((NOT match) OR IS_DIRECTORY ${path_license}) continue() endif()
如果要更严谨,排除符号链接、设备文件等特殊文件类型(你提过暂不处理特殊场景,可自选),可以直接校验是否为普通文件:
if((NOT match) OR (NOT IS_FILE ${path_license})) continue() endif()
可选优化建议(适配你后续要补充文件名列表的需求)
你现在用全路径匹配LICENSE字符串的逻辑可能出现误判,比如路径上级目录带LICENSE关键词也会被匹配到,后续可以改成仅匹配文件名,示例逻辑如下:
# 提前定义候选许可证文件名列表,后续直接在这里加即可 set(LICENSE_FILENAMES LICENSE COPYING COPYRIGHT) # 取当前路径的文件名并转大写 get_filename_component(fname ${path_license} NAME) string(TOUPPER ${fname} fname_up) # 判断文件名是否在候选列表中 if(${fname_up} IN_LIST LICENSE_FILENAMES AND IS_FILE ${path_license}) # 后续处理逻辑 endif()
内容的提问来源于stack exchange,提问作者rbaleksandar
相关产品推荐
相关产品推荐

