stk-code_catmod/lib/wiiuse/cmake/StampSourcesWithVersion.cmake

181 lines
5.4 KiB
CMake
Raw Normal View History

# - When enabled, stamp the current version on C/C++ sources
#
# To set up your source code for proper stamping, start your file
# with a Doxygen-style comment block, starting with /* and ending with */
# On a line by itself, with unimportant whitespace, add the standard Doxygen
# "version" command:
# @version xxx
# or
# \version xxx
#
# To make sure it works, please do actually put xxx as the current version:
# when you save, add one of the command below to your cmake build, and run
# cmake, it should replace xxx with the current version. (It replaces anything
# between the end of the whitespace after \version and the end of the line
# with the version that you pass in your build script, so put nothing else
# on that line!)
#
# For <version>, I recommend passing the value of a CMake variable like
# ${CPACK_PACKAGE_VERSION}
# Remember, reduced duplication of information means reduced errors!
#
# WARNING!
# This does edit your source directory, but will only execute if the
# (hidden/advanced, default OFF) variable ENABLE_VERSION_STAMPING is on.
#
# Additionally, it tries to be very careful:
# - It will not edit files that are outside your source tree
# - It will only attempt a substitution within the first C-style comment block
# of your code (that is, the first /* */), but only if // is not found first
#
# stamp_target_with_version(<version> <target_name> [HEADERS_ONLY | <source>...]) -
# If no source file is specified, all will be processed.
#
# stamp_sources_with_version(<version> <source> [<source> ...]) -
# Use for files not directly associated with a target.
#
# Original Author:
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
# http://academic.cleardefinition.com
# Iowa State University HCI Graduate Program/VRAC
#
# Copyright Iowa State University 2009-2010.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
if(__stamp_sources_with_version)
return()
endif()
set(__stamp_sources_with_version YES)
if(NOT APPLE)
option(ENABLE_VERSION_STAMPING
"Modify source files to update the version in the comment header. Maintainers only!"
OFF)
mark_as_advanced(ENABLE_VERSION_STAMPING)
endif()
# Stash where our data is, at include() time
get_filename_component(_sswv_mod_dir ${CMAKE_CURRENT_LIST_FILE} PATH)
# Internal utility function - not for outside use
function(_stamp_file_with_version version filename)
if(NOT SED_EXECUTABLE)
find_program(SED_EXECUTABLE sed)
mark_as_advanced(SED_EXECUTABLE)
endif()
# TODO: fix the sed script on Mac
if(SED_EXECUTABLE AND ENABLE_VERSION_STAMPING AND NOT APPLE)
get_source_file_property(_abs "${filename}" LOCATION)
if(NOT _abs)
get_filename_component(_abs "${filename}" ABSOLUTE)
endif()
file(RELATIVE_PATH _rel "${CMAKE_SOURCE_DIR}" "${_abs}")
if(NOT "${_rel}" MATCHES "[.][.]")
# Only if this file is in the source tree
get_filename_component(_name "${filename}" NAME)
set(_in_source_dir YES)
# Create the sed script
configure_file("${_sswv_mod_dir}/StampSourcesWithVersion.sed.in"
"${CMAKE_CURRENT_BINARY_DIR}/stamp-${_name}.sed"
@ONLY)
if(APPLE)
set(extendedre_arg -E)
else()
set(extendedre_arg -r)
endif()
set(sedargs
${extendedre_arg}
-f
"${CMAKE_CURRENT_BINARY_DIR}/stamp-${_name}.sed"
${filename})
# Run the sed script
execute_process(COMMAND
${SED_EXECUTABLE}
${sedargs}
OUTPUT_FILE
"${CMAKE_CURRENT_BINARY_DIR}/stampedoutput-${_name}.out"
WORKING_DIRECTORY
"${CMAKE_CURRENT_SOURCE_DIR}")
# Check to see if changes were made
execute_process(COMMAND
${CMAKE_COMMAND}
-E
compare_files
"${CMAKE_CURRENT_BINARY_DIR}/stampedoutput-${_name}.out"
${filename}
WORKING_DIRECTORY
"${CMAKE_CURRENT_SOURCE_DIR}"
RESULT_VARIABLE
files_different
OUTPUT_QUIET
ERROR_QUIET)
# if so, run it again, but in-place this time
if(files_different)
message(STATUS "Stamping file ${_rel} with version ${version}")
execute_process(COMMAND
${SED_EXECUTABLE}
-i
${sedargs}
OUTPUT_FILE
"${CMAKE_CURRENT_BINARY_DIR}/stampedoutput-${_name}.out"
WORKING_DIRECTORY
"${CMAKE_CURRENT_SOURCE_DIR}")
else()
message(STATUS "Version stamp up-to-date on file ${_rel}")
endif()
endif()
endif()
endfunction()
function(stamp_sources_with_version version)
foreach(_file ${ARGN})
_stamp_file_with_version("${version}" "${_file}")
endforeach()
endfunction()
function(stamp_target_with_version version target_name)
set(_target_stampables)
get_target_property(_target_sources ${target_name} SOURCES)
foreach(_source ${_target_sources})
get_source_file_property(_lang "${_source}" LANGUAGE)
get_source_file_property(_loc "${_source}" LOCATION)
if("${_lang}" MATCHES "CXX" OR "${_lang}" MATCHES "C")
list(APPEND _target_stampables "${_loc}")
endif()
endforeach()
set(_src_to_stamp)
if("${ARGN}" STREQUAL "HEADERS_ONLY")
# We were passed HEADERS_ONLY
foreach(_file ${_target_stampables})
get_filename_component(_ext "${_file}" EXT)
if("${_ext}" MATCHES "[.]([hH]|hpp|HPP|hxx|HXX)$" OR NOT _ext)
list(APPEND _src_to_stamp "${_file}")
endif()
endforeach()
elseif(ARGN)
# We were passed a list of files
set(_src_to_stamp ${ARGN})
else()
# We were passed only a target - process all source in the source tree.
set(_src_to_stamp ${_target_stampables})
endif()
stamp_sources_with_version(${version} ${_src_to_stamp})
endfunction()