11cmake_minimum_required (VERSION 2.8.7)
22
3- include (${PROJECT_SOURCE_DIR} /cmake /Utils.cmake)
3+ include (${CMAKE_CURRENT_LIST_DIR} /Utils.cmake)
44include (CMakeParseArguments)
55
66find_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()
6985function (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