xref: /aosp_15_r20/external/llvm/cmake/modules/GetSVN.cmake (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker# CMake project that writes Subversion revision information to a header.
2*9880d681SAndroid Build Coastguard Worker#
3*9880d681SAndroid Build Coastguard Worker# Input variables:
4*9880d681SAndroid Build Coastguard Worker#   FIRST_SOURCE_DIR  - First source directory
5*9880d681SAndroid Build Coastguard Worker#   FIRST_NAME        - The macro prefix for the first repository's info
6*9880d681SAndroid Build Coastguard Worker#   SECOND_SOURCE_DIR - Second source directory (opt)
7*9880d681SAndroid Build Coastguard Worker#   SECOND_NAME       - The macro prefix for the second repository's info (opt)
8*9880d681SAndroid Build Coastguard Worker#   HEADER_FILE       - The header file to write
9*9880d681SAndroid Build Coastguard Worker#
10*9880d681SAndroid Build Coastguard Worker# The output header will contain macros FIRST_REPOSITORY and FIRST_REVISION,
11*9880d681SAndroid Build Coastguard Worker# and SECOND_REPOSITORY and SECOND_REVISION if requested, where "FIRST" and
12*9880d681SAndroid Build Coastguard Worker# "SECOND" are substituted with the names specified in the input variables.
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker# Chop off cmake/modules/GetSVN.cmake
15*9880d681SAndroid Build Coastguard Workerget_filename_component(LLVM_DIR "${CMAKE_SCRIPT_MODE_FILE}" PATH)
16*9880d681SAndroid Build Coastguard Workerget_filename_component(LLVM_DIR "${LLVM_DIR}" PATH)
17*9880d681SAndroid Build Coastguard Workerget_filename_component(LLVM_DIR "${LLVM_DIR}" PATH)
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker# Handle strange terminals
20*9880d681SAndroid Build Coastguard Workerset(ENV{TERM} "dumb")
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Workermacro(get_source_info_svn path revision repository)
23*9880d681SAndroid Build Coastguard Worker  # If svn is a bat file, find_program(Subversion) doesn't find it.
24*9880d681SAndroid Build Coastguard Worker  # Explicitly search for that here; Subversion_SVN_EXECUTABLE will override
25*9880d681SAndroid Build Coastguard Worker  # the find_program call in FindSubversion.cmake.
26*9880d681SAndroid Build Coastguard Worker  find_program(Subversion_SVN_EXECUTABLE NAMES svn svn.bat)
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Worker  # FindSubversion does not work with symlinks. See PR 8437
29*9880d681SAndroid Build Coastguard Worker  if (NOT IS_SYMLINK "${path}")
30*9880d681SAndroid Build Coastguard Worker    find_package(Subversion)
31*9880d681SAndroid Build Coastguard Worker  endif()
32*9880d681SAndroid Build Coastguard Worker  if (Subversion_FOUND)
33*9880d681SAndroid Build Coastguard Worker    subversion_wc_info( ${path} Project )
34*9880d681SAndroid Build Coastguard Worker    if (Project_WC_REVISION)
35*9880d681SAndroid Build Coastguard Worker      set(${revision} ${Project_WC_REVISION} PARENT_SCOPE)
36*9880d681SAndroid Build Coastguard Worker    endif()
37*9880d681SAndroid Build Coastguard Worker    if (Project_WC_URL)
38*9880d681SAndroid Build Coastguard Worker      set(${repository} ${Project_WC_URL} PARENT_SCOPE)
39*9880d681SAndroid Build Coastguard Worker    endif()
40*9880d681SAndroid Build Coastguard Worker  endif()
41*9880d681SAndroid Build Coastguard Workerendmacro()
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Workermacro(get_source_info_git_svn path revision repository)
44*9880d681SAndroid Build Coastguard Worker  find_program(git_executable NAMES git git.exe git.cmd)
45*9880d681SAndroid Build Coastguard Worker  if (git_executable)
46*9880d681SAndroid Build Coastguard Worker    execute_process(COMMAND ${git_executable} svn info
47*9880d681SAndroid Build Coastguard Worker      WORKING_DIRECTORY ${path}
48*9880d681SAndroid Build Coastguard Worker      TIMEOUT 5
49*9880d681SAndroid Build Coastguard Worker      RESULT_VARIABLE git_result
50*9880d681SAndroid Build Coastguard Worker      OUTPUT_VARIABLE git_output)
51*9880d681SAndroid Build Coastguard Worker    if (git_result EQUAL 0)
52*9880d681SAndroid Build Coastguard Worker      string(REGEX REPLACE "^(.*\n)?Revision: ([^\n]+).*"
53*9880d681SAndroid Build Coastguard Worker        "\\2" git_svn_rev "${git_output}")
54*9880d681SAndroid Build Coastguard Worker      set(${revision} ${git_svn_rev} PARENT_SCOPE)
55*9880d681SAndroid Build Coastguard Worker      string(REGEX REPLACE "^(.*\n)?URL: ([^\n]+).*"
56*9880d681SAndroid Build Coastguard Worker        "\\2" git_url "${git_output}")
57*9880d681SAndroid Build Coastguard Worker      set(${repository} ${git_url} PARENT_SCOPE)
58*9880d681SAndroid Build Coastguard Worker    endif()
59*9880d681SAndroid Build Coastguard Worker  endif()
60*9880d681SAndroid Build Coastguard Workerendmacro()
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Workermacro(get_source_info_git path revision repository)
63*9880d681SAndroid Build Coastguard Worker  find_program(git_executable NAMES git git.exe git.cmd)
64*9880d681SAndroid Build Coastguard Worker  if (git_executable)
65*9880d681SAndroid Build Coastguard Worker    execute_process(COMMAND ${git_executable} log -1 --pretty=format:%H
66*9880d681SAndroid Build Coastguard Worker      WORKING_DIRECTORY ${path}
67*9880d681SAndroid Build Coastguard Worker      TIMEOUT 5
68*9880d681SAndroid Build Coastguard Worker      RESULT_VARIABLE git_result
69*9880d681SAndroid Build Coastguard Worker      OUTPUT_VARIABLE git_output)
70*9880d681SAndroid Build Coastguard Worker    if (git_result EQUAL 0)
71*9880d681SAndroid Build Coastguard Worker      set(${revision} ${git_output} PARENT_SCOPE)
72*9880d681SAndroid Build Coastguard Worker    endif()
73*9880d681SAndroid Build Coastguard Worker    execute_process(COMMAND ${git_executable} remote -v
74*9880d681SAndroid Build Coastguard Worker      WORKING_DIRECTORY ${path}
75*9880d681SAndroid Build Coastguard Worker      TIMEOUT 5
76*9880d681SAndroid Build Coastguard Worker      RESULT_VARIABLE git_result
77*9880d681SAndroid Build Coastguard Worker      OUTPUT_VARIABLE git_output)
78*9880d681SAndroid Build Coastguard Worker    if (git_result EQUAL 0)
79*9880d681SAndroid Build Coastguard Worker      string(REGEX REPLACE "^(.*\n)?[^ \t]+[ \t]+([^ \t\n]+)[ \t]+\\(fetch\\).*"
80*9880d681SAndroid Build Coastguard Worker        "\\2" git_url "${git_output}")
81*9880d681SAndroid Build Coastguard Worker      set(${repository} "${git_url}" PARENT_SCOPE)
82*9880d681SAndroid Build Coastguard Worker    endif()
83*9880d681SAndroid Build Coastguard Worker  endif()
84*9880d681SAndroid Build Coastguard Workerendmacro()
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Workerfunction(get_source_info path revision repository)
87*9880d681SAndroid Build Coastguard Worker  if (EXISTS "${path}/.svn")
88*9880d681SAndroid Build Coastguard Worker    get_source_info_svn("${path}" revision repository)
89*9880d681SAndroid Build Coastguard Worker  elseif (EXISTS "${path}/.git/svn")
90*9880d681SAndroid Build Coastguard Worker    get_source_info_git_svn("${path}" revision repository)
91*9880d681SAndroid Build Coastguard Worker  elseif (EXISTS "${path}/.git")
92*9880d681SAndroid Build Coastguard Worker    get_source_info_git("${path}" revision repository)
93*9880d681SAndroid Build Coastguard Worker  endif()
94*9880d681SAndroid Build Coastguard Workerendfunction()
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Workerfunction(append_info name path)
97*9880d681SAndroid Build Coastguard Worker  get_source_info("${path}" revision repository)
98*9880d681SAndroid Build Coastguard Worker  string(STRIP "${revision}" revision)
99*9880d681SAndroid Build Coastguard Worker  string(STRIP "${repository}" repository)
100*9880d681SAndroid Build Coastguard Worker  file(APPEND "${HEADER_FILE}.txt"
101*9880d681SAndroid Build Coastguard Worker    "#define ${name}_REVISION \"${revision}\"\n")
102*9880d681SAndroid Build Coastguard Worker  file(APPEND "${HEADER_FILE}.txt"
103*9880d681SAndroid Build Coastguard Worker    "#define ${name}_REPOSITORY \"${repository}\"\n")
104*9880d681SAndroid Build Coastguard Workerendfunction()
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Workerappend_info(${FIRST_NAME} "${FIRST_SOURCE_DIR}")
107*9880d681SAndroid Build Coastguard Workerif(DEFINED SECOND_SOURCE_DIR)
108*9880d681SAndroid Build Coastguard Worker  append_info(${SECOND_NAME} "${SECOND_SOURCE_DIR}")
109*9880d681SAndroid Build Coastguard Workerendif()
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Worker# Copy the file only if it has changed.
112*9880d681SAndroid Build Coastguard Workerexecute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different
113*9880d681SAndroid Build Coastguard Worker  "${HEADER_FILE}.txt" "${HEADER_FILE}")
114*9880d681SAndroid Build Coastguard Workerfile(REMOVE "${HEADER_FILE}.txt")
115*9880d681SAndroid Build Coastguard Worker
116