From f83e4359f20034f750729e5a4123de8f54265dd9 Mon Sep 17 00:00:00 2001 From: Gregor Jasny Date: Thu, 2 May 2019 21:37:04 +0200 Subject: Apple: Preserve high resolution mtime for static libraries On macOS ranlib truncates the fractional part of the static achive file modification time. If the archive and at least one contained object file were created within the same second this will make look the archive older than the object file. On subsequent ninja runs this leads to re-achiving and updating dependent targets. As a work-around we touch the archive after ranlib. Closes: #19222 --- Source/cmNinjaNormalTargetGenerator.cxx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Source/cmNinjaNormalTargetGenerator.cxx b/Source/cmNinjaNormalTargetGenerator.cxx index cbc0103..becc424 100644 --- a/Source/cmNinjaNormalTargetGenerator.cxx +++ b/Source/cmNinjaNormalTargetGenerator.cxx @@ -537,6 +537,20 @@ std::vector cmNinjaNormalTargetGenerator::ComputeLinkCmd() std::string const& linkCmd = mf->GetRequiredDefinition(linkCmdVar); cmSystemTools::ExpandListArgument(linkCmd, linkCmds); } +#ifdef __APPLE__ + // On macOS ranlib truncates the fractional part of the static archive + // file modification time. If the archive and at least one contained + // object file were created within the same second this will make look + // the archive older than the object file. On subsequent ninja runs this + // leads to re-achiving and updating dependent targets. + // As a work-around we touch the archive after ranlib (see #19222). + { + std::string cmakeCommand = + this->GetLocalGenerator()->ConvertToOutputFormat( + cmSystemTools::GetCMakeCommand(), cmOutputConverter::SHELL); + linkCmds.push_back(cmakeCommand + " -E touch $TARGET_FILE"); + } +#endif return linkCmds; } case cmStateEnums::SHARED_LIBRARY: -- cgit v0.12