Merge pull request #290 from rolk/290_version

Embed version string into the library
This commit is contained in:
Bård Skaflestad 2013-07-31 04:57:55 -07:00
commit 3e803a4780
9 changed files with 134 additions and 3 deletions

View File

@ -124,6 +124,7 @@ list (APPEND MAIN_SOURCE_FILES
opm/core/utility/parameters/tinyxml/tinyxmlerror.cpp
opm/core/utility/parameters/tinyxml/tinyxmlparser.cpp
opm/core/utility/parameters/tinyxml/xmltest.cpp
opm/core/version.c
opm/core/wells/InjectionSpecification.cpp
opm/core/wells/ProductionSpecification.cpp
opm/core/wells/WellCollection.cpp
@ -214,6 +215,7 @@ list (APPEND PUBLIC_HEADER_FILES
opm/core/linalg/blas_lapack.h
opm/core/linalg/call_umfpack.h
opm/core/linalg/sparse_sys.h
opm/core/version.h
opm/core/wells.h
opm/core/pressure/CompressibleTpfa.hpp
opm/core/pressure/FlowBCManager.hpp

View File

@ -89,11 +89,11 @@ function (configure_vars obj syntax filename verb)
# integer variables (specifically 0 and 1) are written as they are,
# whereas everything else (including version numbers, which could
# be interpreted as floats) are quoted as strings
if (${_var} MATCHES "[0-9]+")
if (${_var} MATCHES "^[0-9]+$")
set (_quoted "${${_var}}")
else (${_var} MATCHES "[0-9]+")
else (${_var} MATCHES "^[0-9]+$")
set (_quoted "\"${${_var}}\"")
endif (${_var} MATCHES "[0-9]+")
endif (${_var} MATCHES "^[0-9]+$")
# write to file using the correct syntax
if ("${syntax}" STREQUAL "CMAKE")

View File

@ -30,6 +30,7 @@ function (OpmInitProjVars)
OpmGetDuneModuleDirective ("Module" project "${DUNE_MODULE}")
OpmGetDuneModuleDirective ("Description" description "${DUNE_MODULE}")
OpmGetDuneModuleDirective ("Version" version "${DUNE_MODULE}")
OpmGetDuneModuleDirective ("Label" label "${DUNE_MODULE}")
# parse the version number
set (verno_regex "^([0-9]*)\\.([0-9]*).*\$")
@ -42,6 +43,7 @@ function (OpmInitProjVars)
set (${project}_DESCRIPTION "${description}" PARENT_SCOPE)
set (${project}_VERSION_MAJOR "${major}" PARENT_SCOPE)
set (${project}_VERSION_MINOR "${minor}" PARENT_SCOPE)
set (${project}_LABEL "${label}" PARENT_SCOPE)
endfunction ()
macro (OpmInitDirVars)

View File

@ -223,3 +223,13 @@ opm_dist_clean (${project})
### emulate the with-xxx feature of autotools;
include (OpmKnown)
# make sure we rebuild if dune.module changes
configure_file (
"${CMAKE_CURRENT_SOURCE_DIR}/dune.module"
"${CMAKE_CURRENT_BINARY_DIR}/dunemod.tmp"
COPYONLY
)
# make sure updated version information is available in the source code
include (UseVersion)

View File

@ -0,0 +1,41 @@
# - Write version information into the source code
#
# Add an unconditional target to the Makefile which checks the current
# SHA of the source directory and write to a header file if and *only*
# if this has changed (thus we avoid unnecessary rebuilds). By having
# this in the Makefile, we get updated version information even though
# we haven't done any reconfiguring.
#
# The time it takes to probe the VCS for this information and write it
# to the miniature file in negligable.
#
# If the build type is Debug, then we only write a static version
# information as it gets tiresome to rebuild the project everytime one
# makes changes to any of the unit tests.
string (TOUPPER "${CMAKE_BUILD_TYPE}" cmake_build_type_upper_)
if (cmake_build_type_upper_ MATCHES DEBUG)
file (WRITE "${PROJECT_BINARY_DIR}/project-version.h"
"#define PROJECT_VERSION \"${${project}_LABEL} (debug)\"\n"
)
else ()
if (NOT GIT_FOUND)
find_package (Git)
endif ()
add_custom_target (update-version ALL
COMMAND ${CMAKE_COMMAND}
-DCMAKE_HOME_DIRECTORY=${CMAKE_HOME_DIRECTORY}
-DGIT_EXECUTABLE=${GIT_EXECUTABLE}
-DPROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR}
-DPROJECT_BINARY_DIR=${PROJECT_BINARY_DIR}
-DPROJECT_LABEL=${${project}_LABEL}
-P ${PROJECT_SOURCE_DIR}/cmake/Scripts/WriteVerSHA.cmake
COMMENT "Updating version information"
)
# the target above gets built every time thanks to the "ALL" modifier,
# but it must also be done before the main library so it can pick up
# any changes it does.
add_dependencies (${${project}_TARGET} update-version)
endif ()

View File

@ -0,0 +1,63 @@
# - This script must be passed the following information
#
# GIT_EXECUTABLE Path to the Git executable
# PROJECT_SOURCE_DIR Path to the source directory
# PROJECT_BINARY_DIR Path to the build directory
# PROJECT_LABEL String that identifies the minor
# version of the project, e.g. "2013.03"
#
# get hash code
exec_program (
${GIT_EXECUTABLE} ${PROJECT_SOURCE_DIR}
ARGS rev-parse --short --verify HEAD
OUTPUT_VARIABLE sha1
RETURN_VALUE has_sha
)
# exec_program unfortunately mashes together both output
# and error streams, so we must use the return code to make
# sure that we only get the output
if (NOT ${has_sha} EQUAL 0)
set (sha1 "")
endif ()
# check for local changes
if (sha1)
# unstaged
exec_program (
${GIT_EXECUTABLE} ${PROJECT_SOURCE_DIR}
ARGS diff --no-ext-diff --quiet --exit-code
RETURN_VALUE dirty
OUTPUT_VARIABLE _dummy
)
# staged
exec_program (
${GIT_EXECUTABLE} ${PROJECT_SOURCE_DIR}
ARGS diff-index --no-ext-diff --cached --quiet --exit-code HEAD --
RETURN_VALUE staged
OUTPUT_VARIABLE _dummy
)
# if we found any changes, then append an asterisk to
# the SHA1 so we know that it cannot be trusted
if (dirty OR staged)
set (sha1 "${sha1}*")
endif ()
# make a formatted version that can be appended to the label
set (sha1 " (${sha1})")
endif ()
# write the content to a temporary file in a C compatible format
file (WRITE "${PROJECT_BINARY_DIR}/project-version.tmp"
"#define PROJECT_VERSION \"${PROJECT_LABEL}${sha1}\"\n"
)
# only commit this to source code if it actually changed. here
# we use execute_process instead of exec_program to avoid having
# it printed on the console every time
execute_process (COMMAND
${CMAKE_COMMAND} -E copy_if_different "${PROJECT_BINARY_DIR}/project-version.tmp" "${PROJECT_BINARY_DIR}/project-version.h"
)

View File

@ -1,5 +1,6 @@
Module: opm-core
Description: Open Porous Media Initiative Core Library
Version: 1.0
Label: 2013.03
Maintainer: atgeirr@sintef.no
Depends: dune-common (>= 2.2) dune-istl (>= 2.2)

8
opm/core/version.c Normal file
View File

@ -0,0 +1,8 @@
/* this file is written by the build system; don't include it anywhere else */
#include <project-version.h>
/* declaration of the externally visible symbol */
#include <opm/core/version.h>
/* initialization */
const char* const opm_core_version = PROJECT_VERSION;

4
opm/core/version.h Normal file
View File

@ -0,0 +1,4 @@
/**
* This symbol is initialized with the built version of the library.
*/
extern const char* const opm_core_version;