diff options
author | Brad King <brad.king@kitware.com> | 2014-06-24 17:05:10 (GMT) |
---|---|---|
committer | CMake Topic Stage <kwrobot@kitware.com> | 2014-06-24 17:05:10 (GMT) |
commit | c196b3ca023aeddfa8851477fc34a068bdd7d26f (patch) | |
tree | 6130d701b7360543be788ae721c3d8010179d464 /Source | |
parent | 24853afa87f88a307f1d3c871a30661b812e83bc (diff) | |
parent | d90be200ecdfd35395f7fdd1f82ddcd4006a256e (diff) | |
download | CMake-c196b3ca023aeddfa8851477fc34a068bdd7d26f.zip CMake-c196b3ca023aeddfa8851477fc34a068bdd7d26f.tar.gz CMake-c196b3ca023aeddfa8851477fc34a068bdd7d26f.tar.bz2 |
Merge topic 'gfortran-compressed-modules'
d90be200 Fortran: Add support for GNU >= 4.9 compressed modules (#14975)
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmDependsFortran.cxx | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/Source/cmDependsFortran.cxx b/Source/cmDependsFortran.cxx index 79cb560..f06971d 100644 --- a/Source/cmDependsFortran.cxx +++ b/Source/cmDependsFortran.cxx @@ -765,7 +765,11 @@ bool cmDependsFortran::ModulesDiffer(const char* modFile, const char* compilerId) { /* - gnu: + gnu >= 4.9: + A mod file is an ascii file compressed with gzip. + Compiling twice produces identical modules. + + gnu < 4.9: A mod file is an ascii file. <bar.mod> FORTRAN module created from /path/to/foo.f90 on Sun Dec 30 22:47:58 2007 @@ -821,21 +825,30 @@ bool cmDependsFortran::ModulesDiffer(const char* modFile, */ if (strcmp(compilerId, "GNU") == 0 ) { - const char seq[1] = {'\n'}; - const int seqlen = 1; - - if(!cmDependsFortranStreamContainsSequence(finModFile, seq, seqlen)) + // GNU Fortran 4.9 and later compress .mod files with gzip + // but also do not include a date so we can fall through to + // compare them without skipping any prefix. + unsigned char hdr[2]; + bool okay = finModFile.read(reinterpret_cast<char*>(hdr), 2)? true:false; + finModFile.seekg(0); + if(!(okay && hdr[0] == 0x1f && hdr[1] == 0x8b)) { - // The module is of unexpected format. Assume it is different. - std::cerr << compilerId << " fortran module " << modFile - << " has unexpected format." << std::endl; - return true; - } + const char seq[1] = {'\n'}; + const int seqlen = 1; - if(!cmDependsFortranStreamContainsSequence(finStampFile, seq, seqlen)) - { - // The stamp must differ if the sequence is not contained. - return true; + if(!cmDependsFortranStreamContainsSequence(finModFile, seq, seqlen)) + { + // The module is of unexpected format. Assume it is different. + std::cerr << compilerId << " fortran module " << modFile + << " has unexpected format." << std::endl; + return true; + } + + if(!cmDependsFortranStreamContainsSequence(finStampFile, seq, seqlen)) + { + // The stamp must differ if the sequence is not contained. + return true; + } } } else if(strcmp(compilerId, "Intel") == 0) |