CMake中add_custom_command的OUTPUT与BYPRODUCTS含同一文件有何特殊处理?
CMake中add_custom_command的OUTPUT与BYPRODUCTS共存同一文件的差异处理
先明确两个参数的基础作用:
OUTPUT:指定命令生成的主输出文件,CMake会严格追踪它的依赖关系,确保依赖它的目标构建前,这个命令先执行。而且这些文件必须被后续的add_executable、add_library这类目标引用,不然CMake会报错(除非特意设置豁免参数)。BYPRODUCTS:指定命令生成的副产品文件,CMake不强制要求这些文件被目标引用,主要是告诉Make、Ninja这类构建工具:“这文件是这个命令生成的”,避免被误清理或者触发没必要的重构建。
当同一个文件同时出现在两个列表里,和只放在OUTPUT里的区别主要有这几点:
- 依赖逻辑不变,但多了构建系统的额外标记
该文件依然保留OUTPUT的强制依赖特性——CMake还是会确保它在依赖目标前生成;同时因为在BYPRODUCTS里,构建系统会明确把它标记为命令的产物,在清理、重构建判断时更准确。 - 文件引用要求没变化
哪怕加了BYPRODUCTS,该文件还是得被某个目标引用,不然CMake照样会弹出“输出文件未被使用”的警告或错误,BYPRODUCTS不能豁免这个要求。 - 构建系统的处理更严谨
比如用Ninja时,仅放OUTPUT的文件只会被当作主输出;同时加BYPRODUCTS后,构建系统会知道这是命令的产物之一,不会因为文件存在状态异常(比如被外部临时修改)就随便触发命令重跑,也不会在清理构建产物时误删它。 - 重构建触发条件一致,但判断更精准
只要文件不存在或者依赖项更新,命令都会重新执行,但BYPRODUCTS的标记会让构建系统更准确识别该文件的来源,减少误判重构建的情况。
简单说,同时放两个列表就是让文件兼具OUTPUT的强制依赖追踪和BYPRODUCTS的构建系统产物标记特性,核心依赖规则没变,但构建工具对这个文件的处理会更严谨。
内容的提问来源于stack exchange,提问作者Neal Kruis
相关产品推荐
相关产品推荐

