1*06f32e7eSjoerg# CMake script that writes version control information to a header.
2*06f32e7eSjoerg#
3*06f32e7eSjoerg# Input variables:
4*06f32e7eSjoerg#   NAMES             - A list of names for each of the source directories.
5*06f32e7eSjoerg#   <NAME>_SOURCE_DIR - A path to source directory for each name in NAMES.
6*06f32e7eSjoerg#   HEADER_FILE       - The header file to write
7*06f32e7eSjoerg#
8*06f32e7eSjoerg# The output header will contain macros <NAME>_REPOSITORY and <NAME>_REVISION,
9*06f32e7eSjoerg# where "<NAME>" is substituted with the names specified in the input variables,
10*06f32e7eSjoerg# for each of the <NAME>_SOURCE_DIR given.
11*06f32e7eSjoerg
12*06f32e7eSjoergget_filename_component(LLVM_CMAKE_DIR "${CMAKE_SCRIPT_MODE_FILE}" PATH)
13*06f32e7eSjoerg
14*06f32e7eSjoerglist(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}")
15*06f32e7eSjoerg
16*06f32e7eSjoerginclude(VersionFromVCS)
17*06f32e7eSjoerg
18*06f32e7eSjoerg# Handle strange terminals
19*06f32e7eSjoergset(ENV{TERM} "dumb")
20*06f32e7eSjoerg
21*06f32e7eSjoergfunction(append_info name path)
22*06f32e7eSjoerg  if(path)
23*06f32e7eSjoerg    get_source_info("${path}" revision repository)
24*06f32e7eSjoerg  endif()
25*06f32e7eSjoerg  if(revision)
26*06f32e7eSjoerg    file(APPEND "${HEADER_FILE}.tmp"
27*06f32e7eSjoerg      "#define ${name}_REVISION \"${revision}\"\n")
28*06f32e7eSjoerg  else()
29*06f32e7eSjoerg    file(APPEND "${HEADER_FILE}.tmp"
30*06f32e7eSjoerg      "#undef ${name}_REVISION\n")
31*06f32e7eSjoerg  endif()
32*06f32e7eSjoerg  if(repository)
33*06f32e7eSjoerg    file(APPEND "${HEADER_FILE}.tmp"
34*06f32e7eSjoerg      "#define ${name}_REPOSITORY \"${repository}\"\n")
35*06f32e7eSjoerg  else()
36*06f32e7eSjoerg    file(APPEND "${HEADER_FILE}.tmp"
37*06f32e7eSjoerg      "#undef ${name}_REPOSITORY\n")
38*06f32e7eSjoerg  endif()
39*06f32e7eSjoergendfunction()
40*06f32e7eSjoerg
41*06f32e7eSjoergforeach(name IN LISTS NAMES)
42*06f32e7eSjoerg  if(NOT DEFINED ${name}_SOURCE_DIR)
43*06f32e7eSjoerg    message(FATAL_ERROR "${name}_SOURCE_DIR is not defined")
44*06f32e7eSjoerg  endif()
45*06f32e7eSjoerg  append_info(${name} "${${name}_SOURCE_DIR}")
46*06f32e7eSjoergendforeach()
47*06f32e7eSjoerg
48*06f32e7eSjoerg# Copy the file only if it has changed.
49*06f32e7eSjoergexecute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different
50*06f32e7eSjoerg  "${HEADER_FILE}.tmp" "${HEADER_FILE}")
51*06f32e7eSjoergfile(REMOVE "${HEADER_FILE}.tmp")
52