zephyr_package_search.cmake 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. # The purpose of this file is to provide search mechanism for locating Zephyr in-work-tree package
  2. # even when they are not installed into CMake package system
  3. # Linux/MacOS: ~/.cmake/packages
  4. # Windows: Registry database
  5. # Relative directory of workspace project dir as seen from Zephyr package file
  6. set(WORKSPACE_RELATIVE_DIR "../../../../..")
  7. # Relative directory of Zephyr dir as seen from Zephyr package file
  8. set(ZEPHYR_RELATIVE_DIR "../../../..")
  9. # This macro returns a list of parent folders to use for later searches.
  10. macro(get_search_paths START_PATH SEARCH_PATHS PREFERENCE_LIST)
  11. get_filename_component(SEARCH_PATH ${START_PATH} DIRECTORY)
  12. while(NOT (SEARCH_PATH STREQUAL SEARCH_PATH_PREV))
  13. foreach(preference ${PREFERENCE_LIST})
  14. list(APPEND SEARCH_PATHS ${SEARCH_PATH}/${preference})
  15. endforeach()
  16. list(APPEND SEARCH_PATHS ${SEARCH_PATH}/zephyr)
  17. list(APPEND SEARCH_PATHS ${SEARCH_PATH})
  18. set(SEARCH_PATH_PREV ${SEARCH_PATH})
  19. get_filename_component(SEARCH_PATH ${SEARCH_PATH} DIRECTORY)
  20. endwhile()
  21. endmacro()
  22. # This macro can check for additional Zephyr package that has a better match
  23. # Options:
  24. # - ZEPHYR_BASE : Use the specified ZEPHYR_BASE directly.
  25. # - WORKSPACE_DIR : Search for projects in specified workspace.
  26. # - SEARCH_PARENTS : Search parent folder of current source file (application)
  27. # to locate in-project-tree Zephyr candidates.
  28. # - CHECK_ONLY : Only set PACKAGE_VERSION_COMPATIBLE to false if a better candidate
  29. # is found, default is to also include the found candidate.
  30. # - VERSION_CHECK : This is the version check stage by CMake find package
  31. # - CANDIDATES_PREFERENCE_LIST : List of candidate to be preferred, if installed
  32. macro(check_zephyr_package)
  33. set(options CHECK_ONLY SEARCH_PARENTS VERSION_CHECK)
  34. set(single_args WORKSPACE_DIR ZEPHYR_BASE)
  35. set(list_args CANDIDATES_PREFERENCE_LIST)
  36. cmake_parse_arguments(CHECK_ZEPHYR_PACKAGE "${options}" "${single_args}" "${list_args}" ${ARGN})
  37. if(CHECK_ZEPHYR_PACKAGE_ZEPHYR_BASE)
  38. set(SEARCH_SETTINGS PATHS ${CHECK_ZEPHYR_PACKAGE_ZEPHYR_BASE} NO_DEFAULT_PATH)
  39. endif()
  40. if(CHECK_ZEPHYR_PACKAGE_WORKSPACE_DIR)
  41. set(SEARCH_SETTINGS PATHS ${CHECK_ZEPHYR_PACKAGE_WORKSPACE_DIR}/zephyr ${CHECK_ZEPHYR_PACKAGE_WORKSPACE_DIR} NO_DEFAULT_PATH)
  42. endif()
  43. if(CHECK_ZEPHYR_PACKAGE_SEARCH_PARENTS)
  44. get_search_paths(${CMAKE_CURRENT_SOURCE_DIR} SEARCH_PATHS "${CHECK_ZEPHYR_PACKAGE_CANDIDATES_PREFERENCE_LIST}")
  45. set(SEARCH_SETTINGS PATHS ${SEARCH_PATHS} NO_DEFAULT_PATH)
  46. endif()
  47. # Searching for version zero means there will be no match, but we obtain
  48. # a list of all potential Zephyr candidates in the tree to consider.
  49. find_package(Zephyr 0.0.0 EXACT QUIET ${SEARCH_SETTINGS})
  50. # The find package will also find ourself when searching using installed candidates.
  51. # So avoid re-including unless NO_DEFAULT_PATH is set.
  52. # NO_DEFAULT_PATH means explicit search and we could be part of a preference list.
  53. if(NOT (NO_DEFAULT_PATH IN_LIST SEARCH_SETTINGS))
  54. list(REMOVE_ITEM Zephyr_CONSIDERED_CONFIGS ${CMAKE_CURRENT_LIST_DIR}/ZephyrConfig.cmake)
  55. endif()
  56. list(REMOVE_DUPLICATES Zephyr_CONSIDERED_CONFIGS)
  57. foreach(ZEPHYR_CANDIDATE ${Zephyr_CONSIDERED_CONFIGS})
  58. if(CHECK_ZEPHYR_PACKAGE_WORKSPACE_DIR)
  59. # Check is done in Zephyr workspace already, thus check only for pure Zephyr candidates.
  60. get_filename_component(CANDIDATE_DIR ${ZEPHYR_CANDIDATE}/${ZEPHYR_RELATIVE_DIR} ABSOLUTE)
  61. else()
  62. get_filename_component(CANDIDATE_DIR ${ZEPHYR_CANDIDATE}/${WORKSPACE_RELATIVE_DIR} ABSOLUTE)
  63. endif()
  64. if(CHECK_ZEPHYR_PACKAGE_ZEPHYR_BASE)
  65. if(CHECK_ZEPHYR_PACKAGE_VERSION_CHECK)
  66. string(REGEX REPLACE "\.cmake$" "Version.cmake" ZEPHYR_VERSION_CANDIDATE ${ZEPHYR_CANDIDATE})
  67. include(${ZEPHYR_VERSION_CANDIDATE} NO_POLICY_SCOPE)
  68. return()
  69. else()
  70. include(${ZEPHYR_CANDIDATE} NO_POLICY_SCOPE)
  71. return()
  72. endif()
  73. endif()
  74. string(FIND "${CMAKE_CURRENT_SOURCE_DIR}" "${CANDIDATE_DIR}/" COMMON_INDEX)
  75. if (COMMON_INDEX EQUAL 0)
  76. if(CHECK_ZEPHYR_PACKAGE_CHECK_ONLY)
  77. # A better candidate exists, thus return
  78. set(PACKAGE_VERSION_COMPATIBLE FALSE)
  79. return()
  80. elseif(ZEPHYR_CANDIDATE STREQUAL ${CMAKE_CURRENT_LIST_DIR}/ZephyrConfig.cmake)
  81. # Current Zephyr is preferred one, let's just break the loop and continue processing.
  82. break()
  83. else()
  84. if(CHECK_ZEPHYR_PACKAGE_VERSION_CHECK)
  85. string(REGEX REPLACE "\.cmake$" "Version.cmake" ZEPHYR_VERSION_CANDIDATE ${ZEPHYR_CANDIDATE})
  86. include(${ZEPHYR_VERSION_CANDIDATE} NO_POLICY_SCOPE)
  87. return()
  88. else()
  89. include(${ZEPHYR_CANDIDATE} NO_POLICY_SCOPE)
  90. return()
  91. endif()
  92. endif()
  93. endif()
  94. endforeach()
  95. endmacro()