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
This commit is contained in:
Gregor Jasny
2019-05-02 21:37:04 +02:00
parent a6bf68141f
commit f83e4359f2

View File

@@ -537,6 +537,20 @@ std::vector<std::string> 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: