Skip to content

Commit 638d4dd

Browse files
authored
*Fix Utils.cmake search path to relative (#5)
* *Fix Utils.cmake search path to relative *Add variable with result. * Used spaces for indentation. This should fix it. * 1. Add SOURCE_DIR_VARIABLE and CLONE_RESULT_VARIABLE arguments. See description for more info. 2. Fix messages when PARGS_QUIET is set.
1 parent eea6e56 commit 638d4dd

File tree

1 file changed

+85
-14
lines changed

1 file changed

+85
-14
lines changed

cmake/GitUtils.cmake

Lines changed: 85 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
cmake_minimum_required(VERSION 2.8.7)
22

3-
include(${PROJECT_SOURCE_DIR}/cmake/Utils.cmake)
3+
include(${CMAKE_CURRENT_LIST_DIR}/Utils.cmake)
44
include(CMakeParseArguments)
55

66
find_package(Git)
@@ -49,11 +49,27 @@ endif()
4949
# optional
5050
# don't print status messages
5151
#
52+
# SOURCE_DIR_VARIABLE
53+
# optional
54+
# the variable will be set to contain the path to clonned directory.
55+
# if not set path will be set in <project name>_SOURCE_DIR
56+
#
57+
# CLONE_RESULT_VARIABLE
58+
# optional
59+
# the variable will be set to contain the clone result. TRUE - success, FALSE - error
60+
# if not set result will be set in <project name>_CLONE_RESULT
61+
#
62+
#
5263
#
5364
# OUTPUT VARIABLES:
5465
# <project name>_SOURCE_DIR
66+
# optional, exists when SOURCE_DIR_VARIABLE not set
5567
# top level source directory of the cloned project
5668
#
69+
# <project name>_CLONE_RESULT
70+
# optional, exists when CLONE_RESULT_VARIABLE not set
71+
# Result of git_clone function. TRUE - success, FALSE - error
72+
#
5773
#
5874
# EXAMPLE:
5975
# git_clone(
@@ -69,13 +85,12 @@ endif()
6985
function(git_clone)
7086

7187
cmake_parse_arguments(
72-
PARGS # prefix of output variables
73-
"QUIET" # list of names of the boolean arguments (only defined ones will be true)
74-
"PROJECT_NAME;GIT_URL;GIT_TAG;GIT_BRANCH;GIT_COMMIT;DIRECTORY" # list of names of mono-valued arguments
75-
"" # list of names of multi-valued arguments (output variables are lists)
76-
${ARGN} # arguments of the function to parse, here we take the all original ones
77-
) # remaining unparsed arguments can be found in PARGS_UNPARSED_ARGUMENTS
78-
88+
PARGS # prefix of output variables
89+
"QUIET" # list of names of the boolean arguments (only defined ones will be true)
90+
"PROJECT_NAME;GIT_URL;GIT_TAG;GIT_BRANCH;GIT_COMMIT;DIRECTORY;SOURCE_DIR_VARIABLE;CLONE_RESULT_VARIABLE" # list of names of mono-valued arguments
91+
"" # list of names of multi-valued arguments (output variables are lists)
92+
${ARGN} # arguments of the function to parse, here we take the all original ones
93+
) # remaining unparsed arguments can be found in PARGS_UNPARSED_ARGUMENTS
7994
if(NOT PARGS_PROJECT_NAME)
8095
message(FATAL_ERROR "You must provide a project name")
8196
endif()
@@ -88,11 +103,25 @@ function(git_clone)
88103
set(PARGS_DIRECTORY ${CMAKE_BINARY_DIR})
89104
endif()
90105

91-
set(${PARGS_PROJECT_NAME}_SOURCE_DIR
92-
${PARGS_DIRECTORY}/${PARGS_PROJECT_NAME}
93-
CACHE INTERNAL "" FORCE) # makes var visible everywhere because PARENT_SCOPE wouldn't include this scope
106+
if(NOT PARGS_SOURCE_DIR_VARIABLE)
107+
set(${PARGS_PROJECT_NAME}_SOURCE_DIR
108+
${PARGS_DIRECTORY}/${PARGS_PROJECT_NAME}
109+
CACHE INTERNAL "" FORCE) # makes var visible everywhere because PARENT_SCOPE wouldn't include this scope
110+
111+
set(SOURCE_DIR ${PARGS_PROJECT_NAME}_SOURCE_DIR)
112+
else()
113+
set(${PARGS_SOURCE_DIR_VARIABLE}
114+
${PARGS_DIRECTORY}/${PARGS_PROJECT_NAME}
115+
CACHE INTERNAL "" FORCE) # makes var visible everywhere because PARENT_SCOPE wouldn't include this scope
116+
117+
set(SOURCE_DIR ${PARGS_SOURCE_DIR_VARIABLE})
118+
endif()
94119

95-
set(SOURCE_DIR ${PARGS_PROJECT_NAME}_SOURCE_DIR)
120+
if(NOT PARGS_CLONE_RESULT_VARIABLE)
121+
set(CLONE_RESULT ${PARGS_PROJECT_NAME}_CLONE_RESULT)
122+
else()
123+
set(CLONE_RESULT ${PARGS_CLONE_RESULT_VARIABLE})
124+
endif()
96125

97126
# check that only one of GIT_TAG xor GIT_BRANCH xor GIT_COMMIT was passed
98127
at_most_one(at_most_one_tag ${PARGS_GIT_TAG} ${PARGS_GIT_BRANCH} ${PARGS_GIT_COMMIT})
@@ -113,9 +142,29 @@ function(git_clone)
113142

114143
execute_process(
115144
COMMAND ${GIT_EXECUTABLE} pull origin master
145+
WORKING_DIRECTORY ${${SOURCE_DIR}}
146+
RESULT_VARIABLE git_result
147+
OUTPUT_VARIABLE git_output)
148+
if(git_result EQUAL "0")
149+
execute_process(
116150
COMMAND ${GIT_EXECUTABLE} submodule update --remote
117151
WORKING_DIRECTORY ${${SOURCE_DIR}}
152+
RESULT_VARIABLE git_result
118153
OUTPUT_VARIABLE git_output)
154+
if(NOT git_result EQUAL "0")
155+
set(${CLONE_RESULT} FALSE CACHE INTERNAL "" FORCE)
156+
if(NOT PARGS_QUIET)
157+
message(WARNING "${PARGS_PROJECT_NAME} submodule update error") #ToDo: maybe FATAL_ERROR?
158+
endif()
159+
return()
160+
endif()
161+
else()
162+
set(${CLONE_RESULT} FALSE CACHE INTERNAL "" FORCE)
163+
if(NOT PARGS_QUIET)
164+
message(WARNING "${PARGS_PROJECT_NAME} pull error") #ToDo: maybe FATAL_ERROR?
165+
endif()
166+
return()
167+
endif()
119168
else()
120169
if(NOT PARGS_QUIET)
121170
message(STATUS "${PARGS_PROJECT_NAME} directory not found, cloning...")
@@ -124,9 +173,18 @@ function(git_clone)
124173
execute_process(
125174
COMMAND ${GIT_EXECUTABLE} clone ${PARGS_GIT_URL} --recursive ${${SOURCE_DIR}}
126175
WORKING_DIRECTORY ${PARGS_DIRECTORY}
176+
RESULT_VARIABLE git_result
127177
OUTPUT_VARIABLE git_output)
178+
if(NOT git_result EQUAL "0")
179+
set(${CLONE_RESULT} FALSE CACHE INTERNAL "" FORCE)
180+
if(NOT PARGS_QUIET)
181+
message(WARNING "${PARGS_PROJECT_NAME} clone error") #ToDo: maybe FATAL_ERROR?
182+
endif()
183+
return()
184+
endif()
128185
endif()
129186

187+
130188
if(NOT PARGS_QUIET)
131189
message(STATUS "${git_output}")
132190
endif()
@@ -137,20 +195,33 @@ function(git_clone)
137195
COMMAND ${GIT_EXECUTABLE} fetch --all --tags --prune
138196
COMMAND ${GIT_EXECUTABLE} checkout tags/${PARGS_GIT_TAG} -b tag_${PARGS_GIT_TAG}
139197
WORKING_DIRECTORY ${${SOURCE_DIR}}
198+
RESULT_VARIABLE git_result
140199
OUTPUT_VARIABLE git_output)
141200
elseif(PARGS_GIT_BRANCH OR PARGS_GIT_COMMIT)
142201
execute_process(
143202
COMMAND ${GIT_EXECUTABLE} checkout ${PARGS_GIT_BRANCH} ${PARGS_GIT_COMMIT}
144203
WORKING_DIRECTORY ${${SOURCE_DIR}}
204+
RESULT_VARIABLE git_result
145205
OUTPUT_VARIABLE git_output)
146206
else()
147-
message(STATUS "no tag specified, defaulting to master")
207+
if(NOT PARGS_QUIET)
208+
message(STATUS "no tag specified, defaulting to master")
209+
endif()
148210
execute_process(
149211
COMMAND ${GIT_EXECUTABLE} checkout master
150212
WORKING_DIRECTORY ${${SOURCE_DIR}}
213+
RESULT_VARIABLE git_result
151214
OUTPUT_VARIABLE git_output)
152215
endif()
153-
216+
if(NOT git_result EQUAL "0")
217+
set(${CLONE_RESULT} FALSE CACHE INTERNAL "" FORCE)
218+
if(NOT PARGS_QUIET)
219+
message(WARNING "${PARGS_PROJECT_NAME} some error happens. ${git_output}") #ToDo: maybe FATAL_ERROR?
220+
endif()
221+
return()
222+
else()
223+
set(${CLONE_RESULT} TRUE CACHE INTERNAL "" FORCE)
224+
endif()
154225
if(NOT PARGS_QUIET)
155226
message(STATUS "${git_output}")
156227
endif()

0 commit comments

Comments
 (0)