You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

100 lines
3.0 KiB
CMake

#[==[
@file vtkHashSource.cmake
This module contains the @ref vtk_hash_source function which may be used to
generate a hash from a file and place that in a generated header.
#]==]
set(_vtkHashSource_script_file "${CMAKE_CURRENT_LIST_FILE}")
include(CMakeParseArguments)
#[==[
@brief Generate a header containing the hash of a file
Add a rule to turn a file into a MD5 hash and place that in a C string.
~~~
vtk_hash_source(
INPUT <input>
[NAME <name>]
[ALGORITHM <algorithm>]
[HEADER_OUTPUT <header>])
~~~
The only required variable is `INPUT`.
* `INPUT`: (Required) The path to the file to process. If a relative path
is given, it will be interpreted as being relative to
`CMAKE_CURRENT_SOURCE_DIR`.
* `NAME`: This is the base name of the header file that will be generated as
well as the variable name for the C string. It defaults to basename of the
input suffixed with `Hash`.
* `ALGORITHM`: This is the hashing algorithm to use. Supported values are
MD5, SHA1, SHA224, SHA256, SHA384, and SHA512. If not specified, MD5 is assumed.
* `HEADER_OUTPUT`: the variable to store the generated header path.
#]==]
function (vtk_hash_source)
cmake_parse_arguments(_vtk_hash_source
""
"INPUT;NAME;ALGORITHM;HEADER_OUTPUT"
""
${ARGN})
if (_vtk_hash_source_UNPARSED_ARGUMENTS)
message(FATAL_ERROR
"Unrecognized arguments to vtk_hash_source: "
"${_vtk_hash_source_UNPARSED_ARGUMENTS}")
endif ()
if (NOT DEFINED _vtk_hash_source_INPUT)
message(FATAL_ERROR
"Missing `INPUT` for vtk_hash_source.")
endif ()
if (NOT DEFINED _vtk_hash_source_NAME)
get_filename_component(_vtk_hash_source_NAME
"${_vtk_hash_source_INPUT}" NAME_WE)
set(_vtk_hash_source_NAME "${_vtk_hash_source_NAME}Hash")
endif ()
if (NOT DEFINED _vtk_hash_source_ALGORITHM)
set(_vtk_hash_source_ALGORITHM MD5)
endif ()
if (IS_ABSOLUTE "${_vtk_hash_source_INPUT}")
set(_vtk_hash_source_input
"${_vtk_hash_source_INPUT}")
else ()
set(_vtk_hash_source_input
"${CMAKE_CURRENT_SOURCE_DIR}/${_vtk_hash_source_INPUT}")
endif ()
set(_vtk_hash_source_header
"${CMAKE_CURRENT_BINARY_DIR}/${_vtk_hash_source_NAME}.h")
add_custom_command(
OUTPUT "${_vtk_hash_source_header}"
DEPENDS "${_vtkHashSource_script_file}"
"${_vtk_hash_source_input}"
COMMAND "${CMAKE_COMMAND}"
"-Dinput_file=${_vtk_hash_source_input}"
"-Doutput_file=${_vtk_hash_source_header}"
"-Doutput_name=${_vtk_hash_source_NAME}"
"-Dalgorithm=${_vtk_hash_source_ALGORITHM}"
"-D_vtk_hash_source_run=ON"
-P "${_vtkHashSource_script_file}")
if (DEFINED _vtk_hash_source_HEADER_OUTPUT)
set("${_vtk_hash_source_HEADER_OUTPUT}"
"${_vtk_hash_source_header}"
PARENT_SCOPE)
endif ()
endfunction()
if (_vtk_hash_source_run AND CMAKE_SCRIPT_MODE_FILE)
file(${algorithm} "${input_file}" file_hash)
file(WRITE "${output_file}"
"#ifndef ${output_name}\n #define ${output_name} \"${file_hash}\"\n#endif\n")
endif ()