diff --git a/libc/cmake/modules/LLVMLibCHeaderRules.cmake b/libc/cmake/modules/LLVMLibCHeaderRules.cmake index a95c13389012f..288e4dade0b47 100644 --- a/libc/cmake/modules/LLVMLibCHeaderRules.cmake +++ b/libc/cmake/modules/LLVMLibCHeaderRules.cmake @@ -113,6 +113,7 @@ function(add_gen_header target_name) COMMAND ${Python3_EXECUTABLE} "${LIBC_SOURCE_DIR}/utils/hdrgen/main.py" --output ${out_file} --depfile ${dep_file} + --write-if-changed ${entry_points} ${yaml_file} DEPENDS ${yaml_file} ${fq_data_files} diff --git a/libc/utils/hdrgen/main.py b/libc/utils/hdrgen/main.py index 2bba1efa04e42..5dd392ab6662e 100755 --- a/libc/utils/hdrgen/main.py +++ b/libc/utils/hdrgen/main.py @@ -37,6 +37,12 @@ def main(): help="Path to write a depfile", type=Path, ) + parser.add_argument( + "--write-if-changed", + help="Write the output file only if its contents have changed", + action="store_true", + default=False, + ) parser.add_argument( "-e", "--entry-point", @@ -72,9 +78,13 @@ def write_depfile(): write_depfile() - args.output.parent.mkdir(parents=True, exist_ok=True) - with open(args.output, "w") as out: - out.write(contents) + if ( + not args.write_if_changed + or not args.output.exists() + or args.output.read_text() != contents + ): + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(contents) if __name__ == "__main__":