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 00000000..9cd66244 Binary files /dev/null and b/data/windows/getdate.exe differ