diff options
-rw-r--r-- | Help/command/string.rst | 1 | ||||
-rw-r--r-- | Help/release/dev/cpack-deb-autodep-ORIGIN-RPATH.rst | 6 | ||||
-rw-r--r-- | Help/release/dev/unix-timestamps.rst | 6 | ||||
-rw-r--r-- | Modules/CPackDeb.cmake | 6 | ||||
-rw-r--r-- | Source/CMakeVersion.cmake | 2 | ||||
-rw-r--r-- | Source/CPack/cmCPackGenerator.cxx | 3 | ||||
-rw-r--r-- | Source/cmQtAutoGenerators.cxx | 35 | ||||
-rw-r--r-- | Source/cmSystemTools.cxx | 9 | ||||
-rw-r--r-- | Source/cmTimestamp.cxx | 64 | ||||
-rw-r--r-- | Source/cmTimestamp.h | 11 | ||||
-rw-r--r-- | Tests/CMakeTests/String-TIMESTAMP-UnixTime.cmake | 22 | ||||
-rw-r--r-- | Tests/CMakeTests/StringTest.cmake.in | 6 | ||||
-rw-r--r-- | Tests/FindPackageModeMakefileTest/CMakeLists.txt | 3 | ||||
-rw-r--r-- | Tests/QtAutogen/Adir/CMakeLists.txt | 2 | ||||
-rw-r--r-- | Tests/QtAutogen/Adir/bar/foo.cpp | 4 | ||||
-rw-r--r-- | Tests/QtAutogen/Adir/bar/foo.h | 10 | ||||
-rw-r--r-- | Tests/QtAutogen/Adir/foo.cpp | 4 | ||||
-rw-r--r-- | Tests/QtAutogen/Adir/foo.h | 8 |
18 files changed, 126 insertions, 76 deletions
diff --git a/Help/command/string.rst b/Help/command/string.rst index 0361c74..3f4050e 100644 --- a/Help/command/string.rst +++ b/Help/command/string.rst @@ -277,6 +277,7 @@ specifiers: %j The day of the current year (001-366). %m The month of the current year (01-12). %M The minute of the current hour (00-59). + %s Seconds since midnight (UTC) 1-Jan-1970 (UNIX time). %S The second of the current minute. 60 represents a leap second. (00-60) %U The week number of the current year (00-53). diff --git a/Help/release/dev/cpack-deb-autodep-ORIGIN-RPATH.rst b/Help/release/dev/cpack-deb-autodep-ORIGIN-RPATH.rst new file mode 100644 index 0000000..b0d6196 --- /dev/null +++ b/Help/release/dev/cpack-deb-autodep-ORIGIN-RPATH.rst @@ -0,0 +1,6 @@ +cpack-deb-autodep-ORIGIN-RPATH +-------------------------------- + +* The "CPackDeb" module learned how to handle ``$ORIGIN`` + in ``CMAKE_INSTALL_RPATH`` when :variable:`CPACK_DEBIAN_PACKAGE_SHLIBDEPS` + is used for dependency auto detection. diff --git a/Help/release/dev/unix-timestamps.rst b/Help/release/dev/unix-timestamps.rst new file mode 100644 index 0000000..cdb0e5b --- /dev/null +++ b/Help/release/dev/unix-timestamps.rst @@ -0,0 +1,6 @@ +unix-timestamps +--------------- + +* The :command:`string(TIMESTAMP)` and :command:`file(TIMESTAMP)` + commands gained support for the ``%s`` placeholder. This is + the number of seconds since the UNIX Epoch. diff --git a/Modules/CPackDeb.cmake b/Modules/CPackDeb.cmake index 2aaef61..b41d926 100644 --- a/Modules/CPackDeb.cmake +++ b/Modules/CPackDeb.cmake @@ -504,6 +504,9 @@ function(cpack_deb_prepare_package_vars) file(MAKE_DIRECTORY ${CPACK_TEMPORARY_DIRECTORY}/debian) file(WRITE ${CPACK_TEMPORARY_DIRECTORY}/debian/control "") + # Create a DEBIAN directory so that dpkg-shlibdeps can find the package dir when resolving $ORIGIN. + file(MAKE_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}/DEBIAN") + # Add --ignore-missing-info if the tool supports it execute_process(COMMAND env LC_ALL=C ${SHLIBDEPS_EXECUTABLE} --help OUTPUT_VARIABLE _TMP_HELP @@ -544,6 +547,9 @@ function(cpack_deb_prepare_package_vars) # Remove blank control file # Might not be safe if package actual contain file or directory named debian file(REMOVE_RECURSE "${CPACK_TEMPORARY_DIRECTORY}/debian") + + # remove temporary directory that was created only for dpkg-shlibdeps execution + file(REMOVE_RECURSE "${CPACK_TEMPORARY_DIRECTORY}/DEBIAN") else() if(CPACK_DEBIAN_PACKAGE_DEBUG) message(AUTHOR_WARNING "CPackDeb Debug: Using only user-provided depends because package does not contain executable files that link to shared libraries.") diff --git a/Source/CMakeVersion.cmake b/Source/CMakeVersion.cmake index 962c9ea..b983213 100644 --- a/Source/CMakeVersion.cmake +++ b/Source/CMakeVersion.cmake @@ -1,5 +1,5 @@ # CMake version number components. set(CMake_VERSION_MAJOR 3) set(CMake_VERSION_MINOR 5) -set(CMake_VERSION_PATCH 20160219) +set(CMake_VERSION_PATCH 20160224) #set(CMake_VERSION_RC 1) diff --git a/Source/CPack/cmCPackGenerator.cxx b/Source/CPack/cmCPackGenerator.cxx index 22d4bf0..3eca280 100644 --- a/Source/CPack/cmCPackGenerator.cxx +++ b/Source/CPack/cmCPackGenerator.cxx @@ -723,10 +723,9 @@ int cmCPackGenerator::InstallProjectViaInstallCMakeProjects( cmGlobalGenerator gg(&cm); cmsys::auto_ptr<cmMakefile> mf( new cmMakefile(&gg, cm.GetCurrentSnapshot())); - std::string realInstallDirectory = tempInstallDirectory; if ( !installSubDirectory.empty() && installSubDirectory != "/" ) { - realInstallDirectory += installSubDirectory; + tempInstallDirectory += installSubDirectory; } if (componentInstall) { diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 226ab43..b16eccd 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -1104,39 +1104,10 @@ void cmQtAutoGenerators::ParseHeaders(const std::set<std::string>& absHeaders, std::cout << "AUTOGEN: Checking " << headerName << std::endl; } - std::string headerDirectory; - if (cmsys::SystemTools::IsSubDirectory(headerName, - this->ProjectSourceDir)) - { - headerDirectory = this->ProjectSourceDir; - } - else if (cmsys::SystemTools::IsSubDirectory(headerName, - this->ProjectBinaryDir)) - { - headerDirectory = this->ProjectBinaryDir; - } - else - { - cmsys::SystemTools::SplitPathRootComponent(headerName, - &headerDirectory); - } - - std::string baseHeaderName = - cmsys::SystemTools::GetFilenameWithoutLastExtension(headerName); - - headerDirectory = cmsys::SystemTools::RelativePath( - headerDirectory, cmsys::SystemTools::GetParentDirectory(headerName)); - - if (!headerDirectory.empty()) - { - headerDirectory += "/"; - } - - std::string mocName = headerDirectory + baseHeaderName; - - cmSystemTools::ReplaceString(mocName, "/", "_"); + const std::string basename = cmsys::SystemTools:: + GetFilenameWithoutLastExtension(headerName); - const std::string currentMoc = "moc_" + mocName + ".cpp"; + const std::string currentMoc = "moc_" + basename + ".cpp"; std::string macroName; if (requiresMocing(contents, macroName)) { diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 3ba7287..9af54bf 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -60,8 +60,7 @@ #endif #if defined(CMAKE_BUILD_WITH_CMAKE) -# include <fcntl.h> -# include "cmCryptoHash.h" +# include "cmCryptoHash.h" #endif #if defined(CMAKE_USE_ELF_PARSER) @@ -2184,8 +2183,10 @@ unsigned int cmSystemTools::RandomSeed() } seed; // Try using a real random source. - cmsys::ifstream fin("/dev/urandom"); - if(fin && fin.read(seed.bytes, sizeof(seed)) && + cmsys::ifstream fin; + fin.rdbuf()->pubsetbuf(0, 0); // Unbuffered read. + fin.open("/dev/urandom"); + if(fin.good() && fin.read(seed.bytes, sizeof(seed)) && fin.gcount() == sizeof(seed)) { return seed.integer; diff --git a/Source/cmTimestamp.cxx b/Source/cmTimestamp.cxx index 6fd6ab7..1c795c4 100644 --- a/Source/cmTimestamp.cxx +++ b/Source/cmTimestamp.cxx @@ -12,9 +12,11 @@ #include "cmTimestamp.h" #include <cstring> +#include <cstdlib> #include <sys/types.h> #include <sys/stat.h> +#include <sstream> //---------------------------------------------------------------------------- std::string cmTimestamp::CurrentTime( @@ -44,7 +46,7 @@ std::string cmTimestamp::FileModificationTime(const char* path, //---------------------------------------------------------------------------- std::string cmTimestamp::CreateTimestampFromTimeT(time_t timeT, - std::string formatString, bool utcFlag) + std::string formatString, bool utcFlag) const { if(formatString.empty()) { @@ -79,12 +81,12 @@ std::string cmTimestamp::CreateTimestampFromTimeT(time_t timeT, for(std::string::size_type i = 0; i < formatString.size(); ++i) { char c1 = formatString[i]; - char c2 = (i+1 < formatString.size()) ? - formatString[i+1] : static_cast<char>(0); + char c2 = (i + 1 < formatString.size()) ? + formatString[i + 1] : static_cast<char>(0); if(c1 == '%' && c2 != 0) { - result += AddTimestampComponent(c2, timeStruct); + result += AddTimestampComponent(c2, timeStruct, timeT); ++i; } else @@ -97,8 +99,40 @@ std::string cmTimestamp::CreateTimestampFromTimeT(time_t timeT, } //---------------------------------------------------------------------------- +time_t cmTimestamp::CreateUtcTimeTFromTm(struct tm &tm) const +{ +#if defined(_MSC_VER) && _MSC_VER >= 1400 + return _mkgmtime(&tm); +#else + // From Linux timegm() manpage. + + std::string tz_old = "TZ="; + if (const char* tz = cmSystemTools::GetEnv("TZ")) + { + tz_old += tz; + } + + // The standard says that "TZ=" or "TZ=[UNRECOGNIZED_TZ]" means UTC. + // It seems that "TZ=" does NOT work, at least under Windows + // with neither MSVC nor MinGW, so let's use explicit "TZ=UTC" + + cmSystemTools::PutEnv("TZ=UTC"); + + tzset(); + + time_t result = mktime(&tm); + + cmSystemTools::PutEnv(tz_old); + + tzset(); + + return result; +#endif +} + +//---------------------------------------------------------------------------- std::string cmTimestamp::AddTimestampComponent( - char flag, struct tm& timeStruct) + char flag, struct tm& timeStruct, const time_t timeT) const { std::string formatString = "%"; formatString += flag; @@ -117,6 +151,26 @@ std::string cmTimestamp::AddTimestampComponent( case 'y': case 'Y': break; + case 's': // Seconds since UNIX epoch (midnight 1-jan-1970) + { + // Build a time_t for UNIX epoch and substract from the input "timeT": + struct tm tmUnixEpoch; + memset(&tmUnixEpoch, 0, sizeof(tmUnixEpoch)); + tmUnixEpoch.tm_mday = 1; + tmUnixEpoch.tm_year = 1970-1900; + + const time_t unixEpoch = this->CreateUtcTimeTFromTm(tmUnixEpoch); + if (unixEpoch == -1) + { + cmSystemTools::Error("Error generating UNIX epoch in " + "STRING(TIMESTAMP ...). Please, file a bug report aginst CMake"); + return std::string(); + } + + std::stringstream ss; + ss << static_cast<long int>(difftime(timeT, unixEpoch)); + return ss.str(); + } default: { return formatString; diff --git a/Source/cmTimestamp.h b/Source/cmTimestamp.h index 24c1869..7c4b216 100644 --- a/Source/cmTimestamp.h +++ b/Source/cmTimestamp.h @@ -16,7 +16,7 @@ #include <time.h> /** \class cmTimestamp - * \brief Utility class to generate sting representation of a timestamp + * \brief Utility class to generate string representation of a timestamp * */ class cmTimestamp @@ -30,10 +30,13 @@ public: const std::string& formatString, bool utcFlag); private: - std::string CreateTimestampFromTimeT(time_t timeT, - std::string formatString, bool utcFlag); + time_t CreateUtcTimeTFromTm(struct tm& timeStruct) const; - std::string AddTimestampComponent(char flag, struct tm& timeStruct); + std::string CreateTimestampFromTimeT( + time_t timeT, std::string formatString, bool utcFlag) const; + + std::string AddTimestampComponent( + char flag, struct tm& timeStruct, time_t timeT) const; }; diff --git a/Tests/CMakeTests/String-TIMESTAMP-UnixTime.cmake b/Tests/CMakeTests/String-TIMESTAMP-UnixTime.cmake new file mode 100644 index 0000000..a93e7f5 --- /dev/null +++ b/Tests/CMakeTests/String-TIMESTAMP-UnixTime.cmake @@ -0,0 +1,22 @@ +string(TIMESTAMP timestamp "[%Y-%m-%d %H:%M:%S] %s" UTC) + +string(TIMESTAMP unix_time "%s") + +string(TIMESTAMP year "%Y" UTC) +string(TIMESTAMP days "%j" UTC) + +# Doing proper date calculations here to verify unix timestamps +# could be error prone. +# At the very least use some safe lower and upper bounds to +# see if we are somewhere in the right region. + +math(EXPR years_since_epoch "${year} - 1970") +math(EXPR lower_bound "((${years_since_epoch} * 365) + ${days}) * 86400") +math(EXPR upper_bound "((${years_since_epoch} * 366) + ${days}) * 86400") + + +if(unix_time GREATER lower_bound AND unix_time LESS upper_bound) + message("~${unix_time}~") +else() + message(FATAL_ERROR "${timestamp} unix time not in expected range [${lower_bound}, ${upper_bound}]") +endif() diff --git a/Tests/CMakeTests/StringTest.cmake.in b/Tests/CMakeTests/StringTest.cmake.in index 92e70c3..aba35fe 100644 --- a/Tests/CMakeTests/StringTest.cmake.in +++ b/Tests/CMakeTests/StringTest.cmake.in @@ -36,6 +36,8 @@ set(TIMESTAMP-IncompleteSpecifier-RESULT 0) set(TIMESTAMP-IncompleteSpecifier-STDERR "~foobar%~") set(TIMESTAMP-AllSpecifiers-RESULT 0) set(TIMESTAMP-AllSpecifiers-STDERR "~[0-9]+(;[0-9]+)*~") +set(TIMESTAMP-UnixTime-RESULT 0) +set(TIMESTAMP-UnixTime-STDERR "~[1-9][0-9]+~") include("@CMAKE_CURRENT_SOURCE_DIR@/CheckCMakeTest.cmake") check_cmake_test(String @@ -58,6 +60,7 @@ check_cmake_test(String TIMESTAMP-UnknownSpecifier TIMESTAMP-IncompleteSpecifier TIMESTAMP-AllSpecifiers + TIMESTAMP-UnixTime ) # Execute each test listed in StringTestScript.cmake: @@ -68,9 +71,12 @@ set(number_of_tests_expected 70) include("@CMAKE_CURRENT_SOURCE_DIR@/ExecuteScriptTests.cmake") execute_all_script_tests(${scriptname} number_of_tests_executed) +string(TIMESTAMP timestamp "[%Y-%m-%d %H:%M:%S] UTC %s" UTC) + # And verify that number_of_tests_executed is at least as many as we know # about as of this writing... # +message(STATUS "timestamp='${timestamp}'") message(STATUS "scriptname='${scriptname}'") message(STATUS "number_of_tests_executed='${number_of_tests_executed}'") message(STATUS "number_of_tests_expected='${number_of_tests_expected}'") diff --git a/Tests/FindPackageModeMakefileTest/CMakeLists.txt b/Tests/FindPackageModeMakefileTest/CMakeLists.txt index 8e21c32..56fcc5d 100644 --- a/Tests/FindPackageModeMakefileTest/CMakeLists.txt +++ b/Tests/FindPackageModeMakefileTest/CMakeLists.txt @@ -1,6 +1,7 @@ -if(UNIX AND "${CMAKE_GENERATOR}" MATCHES "Makefile") +if(UNIX AND "${CMAKE_GENERATOR}" MATCHES "Makefile" AND + NOT CMake_TEST_NO_FindPackageModeMakefileTest) # Test whether the make is GNU make, and only add the test in this case, # since the configured makefile in this test uses $(shell ...), which diff --git a/Tests/QtAutogen/Adir/CMakeLists.txt b/Tests/QtAutogen/Adir/CMakeLists.txt index 0c7848d..a1c36ff 100644 --- a/Tests/QtAutogen/Adir/CMakeLists.txt +++ b/Tests/QtAutogen/Adir/CMakeLists.txt @@ -3,6 +3,6 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON) -add_library(libA SHARED libA.cpp foo.cpp bar/foo.cpp) +add_library(libA SHARED libA.cpp) target_link_libraries(libA LINK_PUBLIC ${QT_QTCORE_TARGET}) generate_export_header(libA) diff --git a/Tests/QtAutogen/Adir/bar/foo.cpp b/Tests/QtAutogen/Adir/bar/foo.cpp deleted file mode 100644 index 3f5e0a9..0000000 --- a/Tests/QtAutogen/Adir/bar/foo.cpp +++ /dev/null @@ -1,4 +0,0 @@ -#include "foo.h" - -bar::foo::foo() {} -bar::foo::~foo() {} diff --git a/Tests/QtAutogen/Adir/bar/foo.h b/Tests/QtAutogen/Adir/bar/foo.h deleted file mode 100644 index daf2367..0000000 --- a/Tests/QtAutogen/Adir/bar/foo.h +++ /dev/null @@ -1,10 +0,0 @@ -#include <QObject> - -namespace bar { - class foo: public QObject { - Q_OBJECT - public: - foo(); - ~foo(); - }; -} diff --git a/Tests/QtAutogen/Adir/foo.cpp b/Tests/QtAutogen/Adir/foo.cpp deleted file mode 100644 index 86e4d8e..0000000 --- a/Tests/QtAutogen/Adir/foo.cpp +++ /dev/null @@ -1,4 +0,0 @@ -#include "foo.h" - -foo::foo() {} -foo::~foo() {} diff --git a/Tests/QtAutogen/Adir/foo.h b/Tests/QtAutogen/Adir/foo.h deleted file mode 100644 index a51960c..0000000 --- a/Tests/QtAutogen/Adir/foo.h +++ /dev/null @@ -1,8 +0,0 @@ -#include <QObject> - -class foo: public QObject { - Q_OBJECT -public: - foo(); - ~foo(); -}; |