From 2f8d848300f281c66d9154d4a7323a3f042e4e58 Mon Sep 17 00:00:00 2001 From: Edgar Velazquez-Armendariz Date: Fri, 5 Oct 2012 01:42:27 -0400 Subject: [PATCH] Use the version info methods from HDRITools to get improved data. --- CMakeLists.txt | 19 ++-- data/cmake/MtsGetVersionInfo.cmake | 160 +++++++++++++++++++++++++++++ data/windows/getdate.c | 52 ++++++++++ data/windows/getdate.exe | Bin 0 -> 14164 bytes 4 files changed, 218 insertions(+), 13 deletions(-) create mode 100644 data/cmake/MtsGetVersionInfo.cmake create mode 100644 data/windows/getdate.c create mode 100644 data/windows/getdate.exe diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d38a80a..6ba178d1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,25 +35,18 @@ endif() # Load the required modules include (MitsubaUtil) +include (MtsGetVersionInfo) include (CheckCXXSourceCompiles) include (CMakeDependentOption) -# Read version (MTS_VERSION) from include/mitsuba/core/version.h -file(STRINGS "include/mitsuba/core/version.h" MITSUBA_H REGEX "^#define MTS_VERSION \"[^\"]*\"$") -string(REGEX REPLACE "^.*MTS_VERSION \"([0-9]+).*$" "\\1" MTS_VERSION_MAJOR "${MITSUBA_H}") -string(REGEX REPLACE "^.*MTS_VERSION \"[0-9]+\\.([0-9]+).*$" "\\1" MTS_VERSION_MINOR "${MITSUBA_H}") -string(REGEX REPLACE "^.*MTS_VERSION \"[0-9]+\\.[0-9]+\\.([0-9]+).*$" "\\1" MTS_VERSION_PATCH "${MITSUBA_H}") -set(MTS_VERSION "${MTS_VERSION_MAJOR}.${MTS_VERSION_MINOR}.${MTS_VERSION_PATCH}") -set(MITSUBA_H) -if("${MTS_VERSION_MAJOR}" MATCHES "[0-9]+" AND - "${MTS_VERSION_MINOR}" MATCHES "[0-9]+" AND - "${MTS_VERSION_PATCH}" MATCHES "[0-9]+") - message(STATUS "mitsuba ${MTS_VERSION}") +# Read the version information +MTS_GET_VERSION_INFO() +if (MTS_HAS_VALID_REV) + message(STATUS "mitsuba ${MTS_VERSION}-hg${MTS_REV_ID} (${MTS_DATE})") else() - message(FATAL_ERROR "The mitsuba version could not be determined!") + message(STATUS "mitsuba ${MTS_VERSION} (${MTS_DATE})") endif() - # Find the external libraries and setup the paths include (MitsubaExternal) diff --git a/data/cmake/MtsGetVersionInfo.cmake b/data/cmake/MtsGetVersionInfo.cmake new file mode 100644 index 00000000..19092f44 --- /dev/null +++ b/data/cmake/MtsGetVersionInfo.cmake @@ -0,0 +1,160 @@ +# ============================================================================ +# HDRITools - High Dynamic Range Image Tools +# Copyright 2008-2011 Program of Computer Graphics, Cornell University +# +# Distributed under the OSI-approved MIT License (the "License"); +# see accompanying file LICENSE for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +# --------------------------------------------------------------------------- +# Primary author: +# Edgar Velazquez-Armendariz +# ============================================================================ + +# - Sets up the version info variables +# This module provides a function intended to be called ONLY from the root dir: +# MTS_GET_VERSION_INFO() +# This function will read the "include/mitsuba/core/version.h" file and execute +# "hg", setting the following variables: +# MTS_VERSION - Full version string: .. +# MTS_VERSION_MAJOR +# MTS_VERSION_MINOR +# MTS_VERSION_PATCH +# MTS_VERSION_BUILD - Simple build number based on MTS_DATE, +# encoded as YYYYMMDD +# MTS_HAS_VALID_REV - Flag to indicate whether MTS_REV_ID is set +# MTS_REV_ID - First 12 digits of the mercurial revision ID +# MTS_DATE - Represents the code date as YYYY.MM.DD +# MTS_MACLS_VERSION - A version for Mac Launch Services from the version and +# code date, in the format nnnnn.nn.nn[hgXXXXXXXXXXXX] + +function(MTS_GET_VERSION_INFO) + + # Simple, internal macro for zero padding values. Assumes that the number of + # digits is enough. Note that this method overwrites the variable! + macro(ZERO_PAD NUMBER_VAR NUM_DIGITS) + set(_val ${${NUMBER_VAR}}) + set(${NUMBER_VAR} "") + foreach(dummy_var RANGE 1 ${NUM_DIGITS}) + math(EXPR _digit "${_val} % 10") + set(${NUMBER_VAR} "${_digit}${${NUMBER_VAR}}") + math(EXPR _val "${_val} / 10") + endforeach() + unset(_val) + unset(_digit) + endmacro() + + + # Uses hg to get the version string and the date of such revision + # Based on info from: + # http://mercurial.selenic.com/wiki/VersioningWithMake (January 2011) + + # Try to directly get the information assuming the source is within a repo + find_program(HG_CMD hg DOC "Mercurial command line executable") + mark_as_advanced(HG_CMD) + if (HG_CMD) + execute_process( + COMMAND "${HG_CMD}" -R "${PROJECT_SOURCE_DIR}" + parents --template "{node|short},{date|shortdate}" + OUTPUT_VARIABLE HG_INFO + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if (HG_INFO) + # Extract the revision ID and the date + string(REGEX REPLACE "(.+),.+" "\\1" MTS_REV_ID "${HG_INFO}") + string(REGEX REPLACE ".+,(.+)-(.+)-(.+)" "\\1.\\2.\\3" + MTS_DATE "${HG_INFO}") + set(MTS_REV_ID ${MTS_REV_ID} PARENT_SCOPE) + set(MTS_DATE ${MTS_DATE} PARENT_SCOPE) + endif() + endif() + + # If that failed, try grabbing the id from .hg_archival.txt, in case a tarball + # made by "hg archive" is being used + if (NOT MTS_REV_ID) + set(HG_ARCHIVAL_FILENAME "${CMAKE_CURRENT_SOURCE_DIR}/.hg_archival.txt") + # Try to read from the file generated by "hg archive" + if (EXISTS "${HG_ARCHIVAL_FILENAME}") + file(READ "${HG_ARCHIVAL_FILENAME}" HG_ARCHIVAL_TXT) + # Extract just the first 12 characters of the node + string(REGEX REPLACE ".*node:[ \\t]+(............).*" "\\1" + MTS_REV_ID "${HG_ARCHIVAL_TXT}") + set(MTS_REV_ID ${MTS_REV_ID} PARENT_SCOPE) + endif() + endif() + + if (NOT MTS_DATE) + # The Windows "date" command output depends on the regional settings + if (WIN32) + set(GETDATE_CMD "${PROJECT_SOURCE_DIR}/data/windows/getdate.exe") + set(GETDATE_ARGS "") + else() + set(GETDATE_CMD "date") + set(GETDATE_ARGS "+'%Y.%m.%d'") + endif() + execute_process(COMMAND "${GETDATE_CMD}" ${GETDATE_ARGS} + OUTPUT_VARIABLE MTS_DATE + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if (NOT MTS_DATE) + message(FATAL_ERROR "Unable to get a build date!") + endif() + set(MTS_DATE ${MTS_DATE} PARENT_SCOPE) + endif() + + if (MTS_REV_ID) + set (MTS_HAS_VALID_REV 1) + else() + message(WARNING "Unable to find the mercurial revision id.") + set (MTS_HAS_VALID_REV 0) + endif() + set(MTS_HAS_VALID_REV ${MTS_HAS_VALID_REV} PARENT_SCOPE) + + + # Read version (MTS_VERSION) from include/mitsuba/core/version.h + file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/include/mitsuba/core/version.h" MITSUBA_H REGEX "^#define MTS_VERSION \"[^\"]*\"$") + if (MITSUBA_H MATCHES "^.*MTS_VERSION \"([0-9]+)\\.([0-9]+)\\.([0-9]+).*$") + set(MTS_VERSION_MAJOR ${CMAKE_MATCH_1}) + set(MTS_VERSION_MINOR ${CMAKE_MATCH_2}) + set(MTS_VERSION_PATCH ${CMAKE_MATCH_3}) + set(MTS_VERSION "${MTS_VERSION_MAJOR}.${MTS_VERSION_MINOR}.${MTS_VERSION_PATCH}" PARENT_SCOPE) + set(MTS_VERSION_MAJOR ${MTS_VERSION_MAJOR} PARENT_SCOPE) + set(MTS_VERSION_MINOR ${MTS_VERSION_MINOR} PARENT_SCOPE) + set(MTS_VERSION_PATCH ${MTS_VERSION_PATCH} PARENT_SCOPE) + else() + message(FATAL_ERROR "The mitsuba version could not be determined!") + endif() + + # Make a super simple build number from the date + if (MTS_DATE MATCHES "([0-9]+)\\.([0-9]+)\\.([0-9]+)") + set(MTS_VERSION_BUILD + "${CMAKE_MATCH_1}${CMAKE_MATCH_2}${CMAKE_MATCH_3}" PARENT_SCOPE) + + # Now make a Mac Launch Services version number based on version and date. + # Based on specs from: + # http://lists.apple.com/archives/carbon-dev/2006/Jun/msg00139.html (Feb 2011) + if (MTS_VERSION_MAJOR GREATER 30 OR + MTS_VERSION_MINOR GREATER 14 OR + MTS_VERSION_PATCH GREATER 14 OR + ${CMAKE_MATCH_1} GREATER 2032) + message(AUTHOR_WARNING "Mitsuba version violates the Mac LS assumptions") + endif() + math(EXPR _MACLS_MAJOR "(${MTS_VERSION_MAJOR}+1)*256 + (${MTS_VERSION_MINOR}+1)*16 + ${MTS_VERSION_PATCH}+1") + math(EXPR _MACLS_MINOR "((${CMAKE_MATCH_1}-2008)*4) + ((${CMAKE_MATCH_2}-1)*32 + ${CMAKE_MATCH_3})/100") + math(EXPR _MACLS_BUILD "((${CMAKE_MATCH_2}-1)*32 + ${CMAKE_MATCH_3})%100") + ZERO_PAD(_MACLS_MAJOR 4) + ZERO_PAD(_MACLS_MINOR 2) + ZERO_PAD(_MACLS_BUILD 2) + set(MTS_MACLS_VERSION "${_MACLS_MAJOR}.${_MACLS_MINOR}.${_MACLS_BUILD}") + if(MTS_HAS_VALID_REV) + set(MTS_MACLS_VERSION "${MTS_MACLS_VERSION}hg${MTS_REV_ID}") + endif() + set(MTS_MACLS_VERSION ${MTS_MACLS_VERSION} PARENT_SCOPE) + else() + message(FATAL_ERROR + "Mitsuba date has an unexpected format: ${MTS_DATE}") + endif() + +endfunction() diff --git a/data/windows/getdate.c b/data/windows/getdate.c new file mode 100644 index 00000000..54ce6852 --- /dev/null +++ b/data/windows/getdate.c @@ -0,0 +1,52 @@ +/*============================================================================ + HDRITools - High Dynamic Range Image Tools + Copyright 2008-2011 Program of Computer Graphics, Cornell University + + Distributed under the OSI-approved MIT License (the "License"); + see accompanying file LICENSE for details. + + This software is distributed WITHOUT ANY WARRANTY; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the License for more information. + ----------------------------------------------------------------------------- + Primary author: + Edgar Velazquez-Armendariz +============================================================================*/ + +#include +#include + +int main(int argc, char **argv) +{ + time_t ltime; + struct tm *today; + FILE *of; +#if _MSC_VER >= 1400 + struct tm timebuf; +#endif + + if (argc != 2) { + of = stdout; + } else { +#if _MSC_VER >= 1400 + if (fopen_s(&of, argv[1], "w") != 0) return 3; +#else + of = fopen(argv[1], "w"); + if (!of) return 3; +#endif + } + + time(<ime); +#if _MSC_VER >= 1400 + if (localtime_s(&timebuf, <ime) != 0) return 1; + today = &timebuf; +#else + today = localtime(<ime); + if (!today) return 1; +#endif + + fprintf(of, "%d.%02d.%02d", (today->tm_year + 1900), + (today->tm_mon + 1), today->tm_mday); + if (of != stdout) fclose(of); + return 0; +} diff --git a/data/windows/getdate.exe b/data/windows/getdate.exe new file mode 100644 index 0000000000000000000000000000000000000000..9cd66244aea40f9fc98678082612ce6a3ef39c8d GIT binary patch literal 14164 zcmeHO3se(V-oKLs5(tkVh~hJJq0$xuVvJZtqk@V>MZk(HI)r2b(U7po1aP}9v{5TX zT54NsEv?x4wf3>rTC2EN#K%_bW9wSKU0Cc&x4OlO;<_%{Ma}oW^GGrY>gws)bG~!- zo->)bzx%)c*L}>rbN`w5^Livk2ua{_xe#iCJ5E~W_s&1nP#iY;w_#{c(3i1IMAnzF zc_k*hvdm^Jw&_ZhdY#2$rIkgL(&n%zO%`SPf?Q>()j+92LxbZu*4Y^dWf5XDBxmwG zGzy_+0--J>CFF!C6)AuSUyTU0V#RjB)e0BZ4&x$LZ>YlP4>yEPz=g{oVY?7ga(Mtb zoVzilm|r{l^dJ3Ql%1c<2yBF3ULml@J5_@#fNmUvVVYfVg}~)Qr)B9X0_Syt z{^iIon}556YT9dOEv)HTc36`6Vz0da*Yx3vxoI!R_Kd7g3mB}N_RXcG zX(Iz2ztcDKln(}GOuG!awOgSGj zH&@+Mk=H*-cHKRT{JH+tX=vdr@HBfiVkmvv2V=(&x@GOmveOjm3}%DCo^7SgWO=7mIGl{KO8=0j;31HCOFRAhKl zGWNsXzkE_VxGg*EWcb=`vz`CyqDLz`{&Z`#YTK|{ZF0@RN#;kwCvDvKvsOAG`$Fi= z&nE7wM-vUE8pQ{Hzj$kJi1X}asiY?+FJ^0Rac}*$ZB3ct_iK(kAlB%5vT8=;zaPCx z@oAGTb~4diUnN`p_3B}3h{3HxyR+)+_B{B6?3JErqeZo$ry?hw?SD0Xnd{p+`oZuo zzWVm~kqu{_P2Q6;cmJV+ebli{kr5jY=+~V;{dIJN>|_!hrTk|2-gzNGYmd|8W<1m} z@3{S8P0*tuN;J8@|M-!n#tU!POaEHipncu4a8CSOI=LjZcxzobn)!YG<3GDGyIY_7 zl5@38M9XVOb{|Phe5F@;A$FeOs}P$+Zr$trRm}$R+D=*@A2(%`xhJtk9lb`nq2}

d^s%T(-F&GJgi(g>FaGbHSKh8bVI1~ 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 b89Clv_4Z?gpCDl1c{JfBT7H<*oLB!3S;63W literal 0 HcmV?d00001