aboutsummaryrefslogtreecommitdiff
path: root/utils/cmake/util.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'utils/cmake/util.cmake')
-rw-r--r--utils/cmake/util.cmake156
1 files changed, 156 insertions, 0 deletions
diff --git a/utils/cmake/util.cmake b/utils/cmake/util.cmake
new file mode 100644
index 0000000..6e3a815
--- /dev/null
+++ b/utils/cmake/util.cmake
@@ -0,0 +1,156 @@
+MACRO(RECURSIVE_FIND_DIR return_list dir pattern)
+ FILE(GLOB_RECURSE new_list "${dir}/${pattern}")
+ SET(dir_list "")
+ FOREACH(file_path ${new_list})
+ GET_FILENAME_COMPONENT(dir_path ${file_path} PATH)
+ SET(dir_list ${dir_list} ${dir_path})
+ ENDFOREACH()
+ LIST(REMOVE_DUPLICATES dir_list)
+ SET(${return_list} ${dir_list})
+ENDMACRO()
+
+MACRO(RECURSIVE_FIND_FILE return_list dir pattern)
+ FILE(GLOB_RECURSE new_list "${dir}/${pattern}")
+ SET(dir_list "")
+ FOREACH(file_path ${new_list})
+ SET(dir_list ${dir_list} ${file_path})
+ ENDFOREACH()
+ LIST(REMOVE_DUPLICATES dir_list)
+ SET(${return_list} ${dir_list})
+ENDMACRO()
+
+MACRO(SOURCE_FILES return_list dir pattern)
+ FILE(GLOB new_list "${dir}/${pattern}")
+ SET(dir_list "")
+ FOREACH(file_path ${new_list})
+ LIST(APPEND dir_list ${file_path})
+ ENDFOREACH()
+ LIST(REMOVE_DUPLICATES dir_list)
+ SET(${return_list} ${dir_list})
+ENDMACRO()
+
+function(EXTRACT_JSON_ARRAY json_file json_field_path fields values)
+
+ set(VALUES "")
+ set(FIELDS "")
+
+ foreach(var ${${json_file}})
+ # extract any cmd line definitions specified in the json object, and add them
+ # if it is not prefixed by json_field_path, do not consider the key.
+ if("${var}" MATCHES "${json_field_path}")
+ string(REGEX MATCH "[^${json_field_path}]([A-Z,a-z,0-9,_,]+)" VALUE "${var}")
+
+ # never quote the value - gives more flexibility
+ list(APPEND FIELDS ${VALUE})
+ list(APPEND VALUES "${${var}}")
+ endif()
+ endforeach()
+
+ set(${fields} ${FIELDS} PARENT_SCOPE)
+ set(${values} ${VALUES} PARENT_SCOPE)
+endfunction()
+
+function(FORM_DEFINITIONS fields values definitions)
+
+ set(DEFINITIONS "")
+ list(LENGTH ${fields} LEN)
+
+ # - 1 for for loop index...
+ MATH(EXPR LEN "${LEN}-1")
+
+ foreach(i RANGE ${LEN})
+ list(GET ${fields} ${i} DEFINITION)
+ list(GET ${values} ${i} VALUE)
+
+ set(DEFINITIONS "${DEFINITIONS} #define ${DEFINITION}\t ${VALUE}\n")
+ endforeach()
+
+ set(${definitions} ${DEFINITIONS} PARENT_SCOPE)
+endfunction()
+
+function(UNIQUE_JSON_KEYS priority_fields priority_values secondary_fields secondary_values merged_fields merged_values)
+
+ # always keep the first fields and values
+ set(MERGED_FIELDS ${${priority_fields}})
+ set(MERGED_VALUES ${${priority_values}})
+
+ # measure the second set...
+ list(LENGTH ${secondary_fields} LEN)
+ # - 1 for for loop index...
+ MATH(EXPR LEN "${LEN}-1")
+
+ # iterate, dropping any duplicate fields regardless of the value
+ foreach(i RANGE ${LEN})
+ list(GET ${secondary_fields} ${i} FIELD)
+ list(GET ${secondary_values} ${i} VALUE)
+
+ list(FIND MERGED_FIELDS ${FIELD} INDEX)
+
+ if (${INDEX} GREATER -1)
+ continue()
+ endif()
+
+ list(APPEND MERGED_FIELDS ${FIELD})
+ list(APPEND MERGED_VALUES ${VALUE})
+ endforeach()
+
+ set(${merged_fields} ${MERGED_FIELDS} PARENT_SCOPE)
+ set(${merged_values} ${MERGED_VALUES} PARENT_SCOPE)
+endfunction()
+
+MACRO(HEADER_FILES return_list dir)
+ FILE(GLOB new_list "${dir}/*.h")
+ SET(${return_list} ${new_list})
+ENDMACRO()
+
+function(INSTALL_DEPENDENCY dir name url branch type)
+ if(NOT EXISTS "${CMAKE_CURRENT_LIST_DIR}/${dir}")
+ message("Creating libraries folder")
+ FILE(MAKE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/${dir}")
+ endif()
+
+ if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/${dir}/${name}")
+ message("${name} is already installed")
+ return()
+ endif()
+
+ if(${type} STREQUAL "git")
+ message("Cloning into: ${url}")
+ # git clone -b doesn't work with SHAs
+ execute_process(
+ COMMAND git clone --recurse-submodules ${url} ${name}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/${dir}
+ )
+
+ if(NOT "${branch}" STREQUAL "")
+ message("Checking out branch: ${branch}")
+ execute_process(
+ COMMAND git -c advice.detachedHead=false checkout ${branch}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/${dir}/${name}
+ )
+ execute_process(
+ COMMAND git submodule update --init
+ WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/${dir}/${name}
+ )
+ execute_process(
+ COMMAND git submodule sync
+ WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/${dir}/${name}
+ )
+ execute_process(
+ COMMAND git submodule update
+ WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/${dir}/${name}
+ )
+ endif()
+ else()
+ message("No mechanism exists to install this library.")
+ endif()
+endfunction()
+
+MACRO(SUB_DIRS return_dirs dir)
+ FILE(GLOB list "${PROJECT_SOURCE_DIR}/${dir}/*")
+ SET(dir_list "")
+ FOREACH(file_path ${list})
+ SET(dir_list ${dir_list} ${file_path})
+ ENDFOREACH()
+ set(${return_dirs} ${dir_list})
+ENDMACRO()