Warning, /system/qtcurve/cmake/CMakeArrayMacros.cmake is written in an unsupported language. File is not indexed.
0001 # Copyright (C) 2013~2014 by Yichao Yu
0002 # yyc1992@gmail.com
0003 #
0004 # Redistribution and use in source and binary forms, with or without
0005 # modification, are permitted provided that the following conditions
0006 # are met:
0007 #
0008 # 1. Redistributions of source code must retain the above copyright
0009 # notice, this list of conditions and the following disclaimer.
0010 # 2. Redistributions in binary form must reproduce the above copyright
0011 # notice, this list of conditions and the following disclaimer in the
0012 # documentation and/or other materials provided with the distribution.
0013 #
0014 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
0015 # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
0016 # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
0017 # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
0018 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
0019 # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
0020 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
0021 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
0022 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
0023 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
0024
0025 # Public functions and macros provided by this file
0026 # (See comment of each for more detail):
0027 # cmake_array_foreach
0028 # cmake_array_copy
0029 # cmake_array_propagate_name
0030 # cmake_array_new
0031 # cmake_array_new_len
0032 # cmake_array_append
0033 # cmake_array_clear
0034 # cmake_array_concat
0035 # cmake_array_slice
0036 # cmake_array_set_global_single
0037 # cmake_array_set_global
0038 # cmake_array_get_global
0039
0040 if(COMMAND cmake_array_foreach)
0041 return()
0042 endif()
0043
0044 include(CMakeBaseMacros)
0045
0046 macro(cmake_array_defined array res)
0047 if(DEFINED "${array}.length" AND
0048 "x${${array}.length}x" MATCHES "^x(0|[1-9][0-9]*)x\$")
0049 set("${res}" True)
0050 else()
0051 set("${res}" False)
0052 endif()
0053 endmacro()
0054
0055 function(cmake_array_abort_undefined array)
0056 cmake_array_defined("${array}" defined)
0057 if(NOT defined)
0058 message(FATAL_ERROR "Array ${array} is not defined.")
0059 endif()
0060 endfunction()
0061
0062 macro(__cmake_array_foreach_real vname fname prefix start stop)
0063 foreach(__cmake_array_foreach_${vname}_${fname}_i RANGE
0064 "${start}" "${stop}")
0065 if("${__cmake_array_foreach_${vname}_${fname}_i}" STREQUAL "${stop}")
0066 break()
0067 endif()
0068 # use foreach instead of set to prevent variable ${vname} leaking to
0069 # caller scope.
0070 foreach("${vname}"
0071 "${${prefix}${__cmake_array_foreach_${vname}_${fname}_i}}")
0072 cmake_utils_call("${fname}")
0073 endforeach()
0074 endforeach()
0075 endmacro()
0076
0077 # cmake_array_foreach(varname funcname [prefix] [start | stop | start stop])
0078 # @varname: name of the loop variable.
0079 # @funcname: name of the function or macro to be run in each loop.
0080 # @prefix: name of the array. default: ARGV
0081 # @start: the start index. default: 0
0082 # @stop: the stop index. Default to the length of the array. For ARGV this
0083 # is ARGC, otherwise it is @prefix.length
0084 #
0085 # This macro run @funcname on a variable list with variable @varname
0086 # set to the value of each variable. A variable list is a set of variables
0087 # with names prefix+number. The prefix is @prefix and the range of the
0088 # number is from @start to (@stop - 1). This can work on the arguments
0089 # of a function but CANNOT work on arguments of a macro because they are
0090 # not cmake variables.
0091 macro(cmake_array_foreach varname funcname)
0092 if("${ARGC}" STREQUAL "2")
0093 foreach(__cmake_array_foreach_${varname}_${funcname}_argc ARGC)
0094 __cmake_array_foreach_real("${varname}" "${funcname}"
0095 ARGV 0 "${${__cmake_array_foreach_${varname}_${funcname}_argc}}")
0096 endforeach()
0097 elseif("${ARGC}" STREQUAL "3")
0098 if("${ARGV2}" MATCHES "^[0-9]+\$")
0099 foreach(__cmake_array_foreach_${varname}_${funcname}_argc ARGC)
0100 __cmake_array_foreach_real("${varname}" "${funcname}"
0101 ARGV "${ARGV2}"
0102 "${${__cmake_array_foreach_${varname}_${funcname}_argc}}")
0103 endforeach()
0104 else()
0105 if("x${ARGV2}" STREQUAL "xARGV")
0106 foreach(__cmake_array_foreach_${varname}_${funcname}_argc ARGC)
0107 __cmake_array_foreach_real("${varname}" "${funcname}"
0108 ARGV 0 "${${__cmake_array_foreach_${varname}_${funcname}_argc}}")
0109 endforeach()
0110 else()
0111 cmake_array_abort_undefined("${ARGV2}")
0112 __cmake_array_foreach_real("${varname}" "${funcname}"
0113 "${ARGV2}." 0 "${${ARGV2}.length}")
0114 endif()
0115 endif()
0116 elseif("${ARGC}" STREQUAL "4")
0117 if("${ARGV2}" MATCHES "^[0-9]+\$")
0118 __cmake_array_foreach_real("${varname}" "${funcname}"
0119 ARGV "${ARGV2}" "${ARGV3}")
0120 else()
0121 cmake_array_abort_undefined("${ARGV2}")
0122 __cmake_array_foreach_real("${varname}" "${funcname}"
0123 "${ARGV2}." 0 "${ARGV3}")
0124 endif()
0125 elseif("${ARGC}" STREQUAL "5")
0126 cmake_array_abort_undefined("${ARGV2}")
0127 __cmake_array_foreach_real("${varname}" "${funcname}"
0128 "${ARGV2}." "${ARGV3}" "${ARGV4}")
0129 else()
0130 message(FATAL_ERROR "cmake_array_foreach called with wrong number of argument ${ARGC}. Expect at most 5.")
0131 endif()
0132 endmacro()
0133
0134 macro(_cmake_array_new_name ret)
0135 cmake_utils_get_unique_name(cmake_array_name "${ret}")
0136 endmacro()
0137
0138 # cmake_array_copy(from to [parent_scope])
0139 # @from: name of the source array.
0140 # @to: name of the destination array.
0141 # @parent_scope: whether copy this array to parent scope.
0142 #
0143 # This macro copies the @from array to @to. If @parent_scope is #true,
0144 # the array will also be copied to parent scope.
0145 macro(cmake_array_copy from to)
0146 cmake_array_new("${to}")
0147 if("${ARGC}" GREATER 2 AND "${ARGV2}")
0148 _cmake_array_copy("${from}" "${${to}}" PARENT_SCOPE)
0149 endif()
0150 _cmake_array_copy("${from}" "${${to}}")
0151 endmacro()
0152
0153 macro(_cmake_array_copy from to)
0154 cmake_array_abort_undefined("${from}")
0155 cmake_array_abort_undefined("${to}")
0156 set("${to}.length" "${${from}.length}" ${ARGN})
0157 # It doesn't matter to propagate one element more.
0158 foreach(__cmake_array_copy_i RANGE "${${from}.length}")
0159 set("${to}.${__cmake_array_copy_i}"
0160 "${${from}.${__cmake_array_copy_i}}" ${ARGN})
0161 endforeach()
0162 endmacro()
0163
0164 # cmake_array_propagate_name(arrarname)
0165 # @arrayname: name of the array to be propagate to parent scope.
0166 #
0167 # This macro propagate the array @arrayname to the parent scope of the
0168 # caller. Use this to return a array.
0169 macro(cmake_array_propagate name)
0170 _cmake_array_copy("${name}" "${name}" PARENT_SCOPE)
0171 endmacro()
0172
0173 macro(__cmake_array_new_foreach)
0174 set("${new_array_name}.${i}" "${__cmake_array_new_value}" PARENT_SCOPE)
0175 math(EXPR i "${i} + 1")
0176 endmacro()
0177
0178 # cmake_array_new(varname [elements...])
0179 # @varname: the name of the array to be created.
0180 # @elements: elements of the array.
0181 #
0182 # This function create a new array of name @varname from the argument of
0183 # the function (@elements) in the current scope.
0184 function(cmake_array_new varname)
0185 _cmake_array_new_name(new_array_name)
0186 math(EXPR length "${ARGC} - 1")
0187 set("${new_array_name}.length" "${length}" PARENT_SCOPE)
0188 set(i 0)
0189 cmake_array_foreach(__cmake_array_new_value __cmake_array_new_foreach 1)
0190 set("${varname}" "${new_array_name}" PARENT_SCOPE)
0191 endfunction()
0192
0193 macro(__cmake_array_new_len_foreach)
0194 math(EXPR length "${i} + 1")
0195 if(length GREATER len)
0196 return()
0197 endif()
0198 set("${new_array_name}.${i}" "${__cmake_array_new_len_value}" PARENT_SCOPE)
0199 math(EXPR i "${length}")
0200 endmacro()
0201
0202 # cmake_array_new_len(varname len [elements...])
0203 # @varname: the name of the array to be created.
0204 # @len: the maximum length of the array.
0205 # @elements: elements of the array.
0206 #
0207 # This function create a new array of name @varname from the argument of
0208 # the function (@elements) in the current scope. At most @len elements
0209 # will be added to the array.
0210 function(cmake_array_new_len varname len)
0211 _cmake_array_new_name(new_array_name)
0212 math(EXPR maxidx "${len} - 1")
0213 set(i 0)
0214 set(length 0)
0215 cmake_array_foreach(__cmake_array_new_len_value
0216 __cmake_array_new_len_foreach 1)
0217 set("${new_array_name}.length" "${length}" PARENT_SCOPE)
0218 set("${varname}" "${new_array_name}" PARENT_SCOPE)
0219 endfunction()
0220
0221 macro(__cmake_array_append_foreach)
0222 set("${varname}.${${varname}.length}" "${element}")
0223 math(EXPR "${varname}.length" "${${varname}.length} + 1")
0224 endmacro()
0225
0226 # cmake_array_append(varname [elements...])
0227 # @varname: name of the array.
0228 # @elements: elements to be appended to the array.
0229 #
0230 # This function appends @elements to @varname.
0231 function(cmake_array_append varname)
0232 cmake_array_abort_undefined("${varname}")
0233 cmake_array_foreach(element __cmake_array_append_foreach 1)
0234 cmake_array_propagate("${varname}")
0235 endfunction()
0236
0237 # cmake_array_clear(varname)
0238 # @varname: name of the array to be cleared.
0239 #
0240 # This function clears array @varname.
0241 function(cmake_array_clear varname)
0242 cmake_array_abort_undefined("${varname}")
0243 set("${varname}.length" "0" PARENT_SCOPE)
0244 endfunction()
0245
0246 # cmake_array_concat(varname [prefix] [start | stop | start stop])
0247 # @varname: name of the destination array.
0248 # @prefix: name of the source array. default: ARGV
0249 # @start: the start index. default: 0
0250 # @stop: the stop index. Default to length of the array.
0251 #
0252 # This macro append the array @prefix to array @varname. @prefix can be
0253 # the argument list of a function. Defaults are treated the same with
0254 # #cmake_array_foreach. See #cmake_array_foreach for more detail.
0255 macro(cmake_array_concat varname)
0256 # Lexical scope used here.
0257 # Do not move the definition out of the parent macro.
0258 macro(__cmake_array_concat_foreach)
0259 cmake_array_append("${varname}" "${__cmake_array_concat_value}")
0260 endmacro()
0261 cmake_array_foreach(__cmake_array_concat_value
0262 __cmake_array_concat_foreach ${ARGN})
0263 endmacro()
0264
0265 # cmake_array_slice(varname [prefix] [start | stop | start stop])
0266 # @varname: name of the destination array.
0267 # @prefix: name of the source array. default: ARGV
0268 # @start: the start index. default: 0
0269 # @stop: the stop index. Default to length of the array.
0270 #
0271 # This macro create a new array @varname from array @prefix between
0272 # @start and @stop. See #cmake_array_foreach for more detail.
0273 macro(cmake_array_slice varname)
0274 cmake_array_new("${varname}")
0275 cmake_array_concat("${${varname}}" ${ARGN})
0276 endmacro()
0277
0278 # cmake_array_set_global_single(global [prefix] [start | stop | start stop])
0279 # @global: the name of the global to save the array.
0280 # @prefix: name of the source array. default: ARGV
0281 # @start: the start index. default: 0
0282 # @stop: the stop index. Default to length of the array.
0283 #
0284 # This macro saves the array to @global. For more detail about @prefix,
0285 # @start and @stop, see #cmake_array_foreach.
0286 # See also #cmake_array_set_global and #cmake_array_get_global.
0287 macro(cmake_array_set_global_single global)
0288 macro(__cmake_array_set_global_foreach)
0289 cmake_utils_set_global("${global}.${__cmake_array_set_global_i}"
0290 "${__cmake_array_set_global_value}")
0291 math(EXPR __cmake_array_set_global_i "${__cmake_array_set_global_i} + 1")
0292 endmacro()
0293 foreach(__cmake_array_set_global_i 0)
0294 cmake_array_foreach(__cmake_array_set_global_value
0295 __cmake_array_set_global_foreach ${ARGN})
0296 cmake_utils_set_global("${global}.length" "${__cmake_array_set_global_i}")
0297 endforeach()
0298 endmacro()
0299
0300 function(_cmake_array_get_global_single global array)
0301 cmake_utils_get_global("${global}.length" "${array}.length")
0302 foreach(array_i RANGE 0 "${${array}.length}")
0303 if("x${${array}.length}x" STREQUAL "x${array_i}x")
0304 break()
0305 endif()
0306 cmake_utils_get_global("${global}.${array_i}" "${array}.${array_i}")
0307 endforeach()
0308 cmake_array_propagate("${array}")
0309 endfunction()
0310
0311 macro(__cmake_array_set_global_rec_foreach)
0312 foreach(global "${global}.${__cmake_array_i}")
0313 foreach(array "${__cmake_array_value}")
0314 _cmake_array_set_global_rec("${global}" "${array}" "${level}")
0315 endforeach()
0316 endforeach()
0317 math(EXPR __cmake_array_i "${__cmake_array_i} + 1")
0318 endmacro()
0319
0320 function(_cmake_array_set_global_rec global array level)
0321 if("${level}" LESS 2)
0322 cmake_array_set_global_single("${global}" "${array}")
0323 return()
0324 endif()
0325 math(EXPR level "${level} - 1")
0326 cmake_utils_set_global("${global}.length" "${${array}.length}")
0327 foreach(__cmake_array_i 0)
0328 cmake_array_foreach(__cmake_array_value
0329 __cmake_array_set_global_rec_foreach "${array}")
0330 endforeach()
0331 endfunction()
0332
0333 macro(__cmake_array_get_global_rec global array level)
0334 if("${level}" LESS 2)
0335 _cmake_array_get_global_single("${global}" "${array}")
0336 else()
0337 math(EXPR new_level "${level} - 1")
0338 cmake_utils_get_global("${global}.length" "${array}.length")
0339 foreach(array_i RANGE 0 "${${array}.length}")
0340 if("x${${array}.length}x" STREQUAL "x${array_i}x")
0341 break()
0342 endif()
0343 __cmake_array_get_global_rec("${global}.${array_i}"
0344 "${array}.${array_i}" "${new_level}")
0345 set("${array}.${array_i}" "${array}.${array_i}")
0346 endforeach()
0347 endif()
0348 cmake_array_propagate("${array}")
0349 endmacro()
0350
0351 function(_cmake_array_get_global_rec global array level)
0352 __cmake_array_get_global_rec("${global}" "${array}" "${level}")
0353 endfunction()
0354
0355 # cmake_array_get_global(global array [level])
0356 # @global: the name of the global to save the array.
0357 # @array: the name of the array.
0358 # @level: level of recursion. Default to 1.
0359 #
0360 # This macro retrieves a multi-level array that is previously
0361 # saved as @global to @array.
0362 # See also #cmake_array_set_global and #cmake_array_set_global_single.
0363 macro(cmake_array_get_global global array)
0364 _cmake_array_new_name("${array}")
0365 if("${ARGC}" GREATER 2)
0366 _cmake_array_get_global_rec("${global}" "${${array}}" "${ARGV2}")
0367 else()
0368 _cmake_array_get_global_single("${global}" "${${array}}")
0369 endif()
0370 endmacro()
0371
0372 # cmake_array_set_global(global array [level])
0373 # @global: the name of the global to save the array.
0374 # @array: the name of the array.
0375 # @level: level of recursion. Default to 1.
0376 #
0377 # This macro saves the multi-level @array as @global.
0378 # See also #cmake_array_get_global and #cmake_array_set_global_single.
0379 macro(cmake_array_set_global global array)
0380 if("${ARGC}" GREATER 2)
0381 _cmake_array_set_global_rec("${global}" "${array}" "${ARGV2}")
0382 else()
0383 cmake_array_set_global_single("${global}" "${array}")
0384 endif()
0385 endmacro()
0386
0387 function(cmake_array_insert array index)
0388 cmake_array_slice(array_insert_after "${array}" "${index}"
0389 "${${array}.length}")
0390 cmake_array_slice(array_insert_before "${array}" 0 "${index}")
0391 cmake_array_concat("${array_insert_before}" 2)
0392 cmake_array_concat("${array_insert_before}" "${array_insert_after}")
0393 _cmake_array_copy("${array_insert_before}" "${array}" PARENT_SCOPE)
0394 endfunction()
0395
0396 function(cmake_array_pop)
0397 endfunction()
0398
0399 function(cmake_array_remove)
0400 endfunction()
0401
0402 function(cmake_array_reverse)
0403 endfunction()