1set(dep_root "${simdjson_SOURCE_DIR}/dependencies/.cache")
2if(DEFINED ENV{simdjson_DEPENDENCY_CACHE_DIR})
3  set(dep_root "$ENV{simdjson_DEPENDENCY_CACHE_DIR}")
4endif()
5
6function(import_dependency NAME GITHUB_REPO COMMIT)
7  message(STATUS "Importing ${NAME} (${GITHUB_REPO}@${COMMIT})")
8  set(target "${dep_root}/${NAME}")
9
10  # If the folder exists in the cache, then we assume that everything is as
11  # should be and do nothing
12  if(EXISTS "${target}")
13    set("${NAME}_SOURCE_DIR" "${target}" PARENT_SCOPE)
14    return()
15  endif()
16
17  set(zip_url "https://github.com/${GITHUB_REPO}/archive/${COMMIT}.zip")
18  set(archive "${dep_root}/archive.zip")
19  set(dest "${dep_root}/_extract")
20
21  file(DOWNLOAD "${zip_url}" "${archive}")
22  file(MAKE_DIRECTORY "${dest}")
23  execute_process(
24          WORKING_DIRECTORY "${dest}"
25          COMMAND "${CMAKE_COMMAND}" -E tar xf "${archive}")
26  file(REMOVE "${archive}")
27
28  # GitHub archives only ever have one folder component at the root, so this
29  # will always match that single folder
30  file(GLOB dir LIST_DIRECTORIES YES "${dest}/*")
31
32  file(RENAME "${dir}" "${target}")
33
34  set("${NAME}_SOURCE_DIR" "${target}" PARENT_SCOPE)
35endfunction()
36
37# Delegates to the dependency
38macro(add_dependency NAME)
39  if(NOT DEFINED "${NAME}_SOURCE_DIR")
40    message(FATAL_ERROR "Missing ${NAME}_SOURCE_DIR variable")
41  endif()
42
43  add_subdirectory("${${NAME}_SOURCE_DIR}" "${PROJECT_BINARY_DIR}/_deps/${NAME}")
44endmacro()
45
46function(set_off NAME)
47  set("${NAME}" OFF CACHE INTERNAL "")
48endfunction()
49