Torsten Rasmussen | 8100717 | 2020-02-12 14:55:36 +0100 | [diff] [blame] | 1 | # SPDX-License-Identifier: Apache-2.0 |
| 2 | |
| 3 | # This file provides Zephyr Config Package functionality. |
| 4 | # |
| 5 | # The purpose of this files is to allow users to decide if they want to: |
| 6 | # - Use ZEPHYR_BASE environment setting for explicitly set select a zephyr installation |
| 7 | # - Support automatic Zephyr installation lookup through the use of find_package(ZEPHYR) |
| 8 | |
| 9 | # First check to see if user has provided a Zephyr base manually. |
| 10 | # Set Zephyr base to environment setting. |
| 11 | # It will be empty if not set in environment. |
Torsten Rasmussen | 8100717 | 2020-02-12 14:55:36 +0100 | [diff] [blame] | 12 | |
Torsten Rasmussen | 498973d | 2022-06-14 13:16:46 +0200 | [diff] [blame] | 13 | # Internal Zephyr CMake package message macro. |
| 14 | # |
| 15 | # This macro is only intended to be used within the Zephyr CMake package. |
| 16 | # The function `find_package()` supports an optional QUIET argument, and to |
| 17 | # honor that argument, the package_message() macro will not print messages when |
| 18 | # said flag has been given. |
| 19 | # |
| 20 | # Arguments to zephyr_package_message() are identical to regular CMake message() |
| 21 | # function. |
| 22 | macro(zephyr_package_message) |
| 23 | if(NOT Zephyr_FIND_QUIETLY) |
| 24 | message(${ARGN}) |
| 25 | endif() |
| 26 | endmacro() |
| 27 | |
Torsten Rasmussen | 555eb9b | 2020-02-18 14:06:44 +0100 | [diff] [blame] | 28 | macro(include_boilerplate location) |
Torsten Rasmussen | 0a64b08 | 2022-03-01 09:40:17 +0100 | [diff] [blame] | 29 | set(Zephyr_DIR ${ZEPHYR_BASE}/share/zephyr-package/cmake CACHE PATH |
| 30 | "The directory containing a CMake configuration file for Zephyr." FORCE |
| 31 | ) |
Torsten Rasmussen | 61453e4 | 2021-12-16 17:13:54 +0100 | [diff] [blame] | 32 | list(PREPEND CMAKE_MODULE_PATH ${ZEPHYR_BASE}/cmake/modules) |
Torsten Rasmussen | 8829e82 | 2020-02-26 14:28:09 +0100 | [diff] [blame] | 33 | if(ZEPHYR_UNITTEST) |
Torsten Rasmussen | 498973d | 2022-06-14 13:16:46 +0200 | [diff] [blame] | 34 | zephyr_package_message(DEPRECATION "The ZephyrUnittest CMake package has been deprecated.\n" |
| 35 | "ZephyrUnittest has been replaced with Zephyr CMake module 'unittest' \n" |
| 36 | "and can be loaded as: 'find_package(Zephyr COMPONENTS unittest)'" |
Torsten Rasmussen | e4ccde3 | 2021-12-17 11:43:54 +0100 | [diff] [blame] | 37 | ) |
Torsten Rasmussen | 8829e82 | 2020-02-26 14:28:09 +0100 | [diff] [blame] | 38 | set(ZephyrUnittest_FOUND True) |
Torsten Rasmussen | e4ccde3 | 2021-12-17 11:43:54 +0100 | [diff] [blame] | 39 | set(Zephyr_FIND_COMPONENTS unittest) |
Torsten Rasmussen | 8829e82 | 2020-02-26 14:28:09 +0100 | [diff] [blame] | 40 | else() |
| 41 | set(Zephyr_FOUND True) |
Torsten Rasmussen | 8829e82 | 2020-02-26 14:28:09 +0100 | [diff] [blame] | 42 | endif() |
| 43 | |
Torsten Rasmussen | 61453e4 | 2021-12-16 17:13:54 +0100 | [diff] [blame] | 44 | if(NOT DEFINED APPLICATION_SOURCE_DIR) |
| 45 | set(APPLICATION_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH |
| 46 | "Application Source Directory" |
| 47 | ) |
| 48 | endif() |
| 49 | |
| 50 | if(NOT DEFINED APPLICATION_BINARY_DIR) |
| 51 | set(APPLICATION_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR} CACHE PATH |
| 52 | "Application Binary Directory" |
| 53 | ) |
| 54 | endif() |
| 55 | |
| 56 | set(__build_dir ${APPLICATION_BINARY_DIR}/zephyr) |
| 57 | set(PROJECT_BINARY_DIR ${__build_dir}) |
| 58 | |
Torsten Rasmussen | 555eb9b | 2020-02-18 14:06:44 +0100 | [diff] [blame] | 59 | if(NOT NO_BOILERPLATE) |
Torsten Rasmussen | 61453e4 | 2021-12-16 17:13:54 +0100 | [diff] [blame] | 60 | list(LENGTH Zephyr_FIND_COMPONENTS components_length) |
Jordan Yates | 568fb35 | 2022-02-21 17:22:37 +1000 | [diff] [blame] | 61 | # The module messages are intentionally higher than STATUS to avoid the -- prefix |
| 62 | # and make them more visible to users. This does result in them being output |
| 63 | # to stderr, but that is an implementation detail of cmake. |
Torsten Rasmussen | e4ccde3 | 2021-12-17 11:43:54 +0100 | [diff] [blame] | 64 | if(components_length EQUAL 0) |
Torsten Rasmussen | 498973d | 2022-06-14 13:16:46 +0200 | [diff] [blame] | 65 | zephyr_package_message(NOTICE "Loading Zephyr default modules (${location}).") |
Torsten Rasmussen | 61453e4 | 2021-12-16 17:13:54 +0100 | [diff] [blame] | 66 | include(zephyr_default NO_POLICY_SCOPE) |
| 67 | else() |
Dominik Ermel | 851393f | 2022-07-19 10:19:03 +0000 | [diff] [blame] | 68 | string(JOIN " " msg_components ${Zephyr_FIND_COMPONENTS}) |
| 69 | zephyr_package_message(NOTICE "Loading Zephyr module(s) (${location}): ${msg_components}") |
Torsten Rasmussen | 61453e4 | 2021-12-16 17:13:54 +0100 | [diff] [blame] | 70 | foreach(component ${Zephyr_FIND_COMPONENTS}) |
Torsten Rasmussen | 31e90f1 | 2022-02-03 12:10:53 +0100 | [diff] [blame] | 71 | if(${component} MATCHES "^\([^:]*\):\(.*\)$") |
| 72 | string(REPLACE "," ";" SUB_COMPONENTS ${CMAKE_MATCH_2}) |
| 73 | set(component ${CMAKE_MATCH_1}) |
| 74 | endif() |
Torsten Rasmussen | 61453e4 | 2021-12-16 17:13:54 +0100 | [diff] [blame] | 75 | include(${component}) |
| 76 | endforeach() |
| 77 | endif() |
| 78 | else() |
Torsten Rasmussen | 498973d | 2022-06-14 13:16:46 +0200 | [diff] [blame] | 79 | zephyr_package_message(DEPRECATION "The NO_BOILERPLATE setting has been deprecated.\n" |
| 80 | "Please use: 'find_package(Zephyr COMPONENTS <components>)'" |
Torsten Rasmussen | 61453e4 | 2021-12-16 17:13:54 +0100 | [diff] [blame] | 81 | ) |
Torsten Rasmussen | 555eb9b | 2020-02-18 14:06:44 +0100 | [diff] [blame] | 82 | endif() |
| 83 | endmacro() |
| 84 | |
Torsten Rasmussen | caf596e | 2020-03-04 12:34:44 +0100 | [diff] [blame] | 85 | set(ENV_ZEPHYR_BASE $ENV{ZEPHYR_BASE}) |
| 86 | if((NOT DEFINED ZEPHYR_BASE) AND (DEFINED ENV_ZEPHYR_BASE)) |
Torsten Rasmussen | 8100717 | 2020-02-12 14:55:36 +0100 | [diff] [blame] | 87 | # Get rid of any double folder string before comparison, as example, user provides |
| 88 | # ZEPHYR_BASE=//path/to//zephyr_base/ |
| 89 | # must also work. |
Torsten Rasmussen | caf596e | 2020-03-04 12:34:44 +0100 | [diff] [blame] | 90 | get_filename_component(ZEPHYR_BASE ${ENV_ZEPHYR_BASE} ABSOLUTE) |
| 91 | set(ZEPHYR_BASE ${ZEPHYR_BASE} CACHE PATH "Zephyr base") |
| 92 | include_boilerplate("Zephyr base") |
| 93 | return() |
| 94 | endif() |
Torsten Rasmussen | 555eb9b | 2020-02-18 14:06:44 +0100 | [diff] [blame] | 95 | |
Torsten Rasmussen | caf596e | 2020-03-04 12:34:44 +0100 | [diff] [blame] | 96 | if (DEFINED ZEPHYR_BASE) |
| 97 | include_boilerplate("Zephyr base (cached)") |
Torsten Rasmussen | 555eb9b | 2020-02-18 14:06:44 +0100 | [diff] [blame] | 98 | return() |
Torsten Rasmussen | 8100717 | 2020-02-12 14:55:36 +0100 | [diff] [blame] | 99 | endif() |
| 100 | |
Torsten Rasmussen | 555eb9b | 2020-02-18 14:06:44 +0100 | [diff] [blame] | 101 | # If ZEPHYR_CANDIDATE is set, it means this file was include instead of called via find_package directly. |
| 102 | if(ZEPHYR_CANDIDATE) |
| 103 | set(IS_INCLUDED TRUE) |
Torsten Rasmussen | 8e929fd | 2020-03-09 15:26:21 +0100 | [diff] [blame] | 104 | else() |
| 105 | include(${CMAKE_CURRENT_LIST_DIR}/zephyr_package_search.cmake) |
Torsten Rasmussen | 555eb9b | 2020-02-18 14:06:44 +0100 | [diff] [blame] | 106 | endif() |
| 107 | |
| 108 | # Find out the current Zephyr base. |
| 109 | get_filename_component(CURRENT_ZEPHYR_DIR ${CMAKE_CURRENT_LIST_FILE}/${ZEPHYR_RELATIVE_DIR} ABSOLUTE) |
Torsten Rasmussen | caf596e | 2020-03-04 12:34:44 +0100 | [diff] [blame] | 110 | get_filename_component(CURRENT_WORKSPACE_DIR ${CMAKE_CURRENT_LIST_FILE}/${WORKSPACE_RELATIVE_DIR} ABSOLUTE) |
Torsten Rasmussen | 555eb9b | 2020-02-18 14:06:44 +0100 | [diff] [blame] | 111 | |
| 112 | string(FIND "${CMAKE_CURRENT_SOURCE_DIR}" "${CURRENT_ZEPHYR_DIR}/" COMMON_INDEX) |
| 113 | if (COMMON_INDEX EQUAL 0) |
Torsten Rasmussen | caf596e | 2020-03-04 12:34:44 +0100 | [diff] [blame] | 114 | # Project is in Zephyr repository. |
| 115 | # We are in Zephyr repository. |
| 116 | set(ZEPHYR_BASE ${CURRENT_ZEPHYR_DIR} CACHE PATH "Zephyr base") |
| 117 | include_boilerplate("Zephyr repository") |
Torsten Rasmussen | 555eb9b | 2020-02-18 14:06:44 +0100 | [diff] [blame] | 118 | return() |
| 119 | endif() |
| 120 | |
| 121 | if(IS_INCLUDED) |
Torsten Rasmussen | caf596e | 2020-03-04 12:34:44 +0100 | [diff] [blame] | 122 | # A higher level did the checking and included us and as we are not in Zephyr repository |
| 123 | # (checked above) then we must be in Zephyr workspace. |
| 124 | set(ZEPHYR_BASE ${CURRENT_ZEPHYR_DIR} CACHE PATH "Zephyr base") |
| 125 | include_boilerplate("Zephyr workspace") |
Torsten Rasmussen | 555eb9b | 2020-02-18 14:06:44 +0100 | [diff] [blame] | 126 | endif() |
| 127 | |
| 128 | if(NOT IS_INCLUDED) |
Torsten Rasmussen | caf596e | 2020-03-04 12:34:44 +0100 | [diff] [blame] | 129 | string(FIND "${CMAKE_CURRENT_SOURCE_DIR}" "${CURRENT_WORKSPACE_DIR}/" COMMON_INDEX) |
Torsten Rasmussen | 555eb9b | 2020-02-18 14:06:44 +0100 | [diff] [blame] | 130 | if (COMMON_INDEX EQUAL 0) |
Torsten Rasmussen | caf596e | 2020-03-04 12:34:44 +0100 | [diff] [blame] | 131 | # Project is in Zephyr workspace. |
Torsten Rasmussen | 555eb9b | 2020-02-18 14:06:44 +0100 | [diff] [blame] | 132 | # This means this Zephyr is likely the correct one, but there could be an alternative installed along-side |
| 133 | # Thus, check if there is an even better candidate. |
| 134 | # This check works the following way. |
| 135 | # CMake finds packages will look all packages registered in the user package registry. |
| 136 | # As this code is processed inside registered packages, we simply test if another package has a |
Nazar Kazakov | 9713f0d | 2022-02-24 12:00:55 +0000 | [diff] [blame] | 137 | # common path with the current sample. |
| 138 | # and if so, we will return here, and let CMake call into the other registered package for real |
Torsten Rasmussen | 555eb9b | 2020-02-18 14:06:44 +0100 | [diff] [blame] | 139 | # version checking. |
Ming Shao | 3c9aa92 | 2022-12-09 22:29:19 +0800 | [diff] [blame] | 140 | check_zephyr_package(WORKSPACE_DIR ${CURRENT_WORKSPACE_DIR}) |
Torsten Rasmussen | 555eb9b | 2020-02-18 14:06:44 +0100 | [diff] [blame] | 141 | |
Torsten Rasmussen | 8e929fd | 2020-03-09 15:26:21 +0100 | [diff] [blame] | 142 | if(ZEPHYR_PREFER) |
| 143 | check_zephyr_package(SEARCH_PARENTS CANDIDATES_PREFERENCE_LIST ${ZEPHYR_PREFER}) |
| 144 | endif() |
| 145 | |
Torsten Rasmussen | 555eb9b | 2020-02-18 14:06:44 +0100 | [diff] [blame] | 146 | # We are the best candidate, so let's include boiler plate. |
Torsten Rasmussen | caf596e | 2020-03-04 12:34:44 +0100 | [diff] [blame] | 147 | set(ZEPHYR_BASE ${CURRENT_ZEPHYR_DIR} CACHE PATH "Zephyr base") |
| 148 | include_boilerplate("Zephyr workspace") |
Torsten Rasmussen | 555eb9b | 2020-02-18 14:06:44 +0100 | [diff] [blame] | 149 | return() |
| 150 | endif() |
| 151 | |
Torsten Rasmussen | 8e929fd | 2020-03-09 15:26:21 +0100 | [diff] [blame] | 152 | check_zephyr_package(SEARCH_PARENTS CANDIDATES_PREFERENCE_LIST ${ZEPHYR_PREFER}) |
Torsten Rasmussen | 555eb9b | 2020-02-18 14:06:44 +0100 | [diff] [blame] | 153 | |
Torsten Rasmussen | caf596e | 2020-03-04 12:34:44 +0100 | [diff] [blame] | 154 | # Ending here means there were no candidates in workspace of the app. |
| 155 | # Thus, the app is built as a Zephyr Freestanding application. |
Torsten Rasmussen | 555eb9b | 2020-02-18 14:06:44 +0100 | [diff] [blame] | 156 | # CMake find_package has already done the version checking, so let's just include boiler plate. |
| 157 | # Previous find_package would have cleared Zephyr_FOUND variable, thus set it again. |
Torsten Rasmussen | caf596e | 2020-03-04 12:34:44 +0100 | [diff] [blame] | 158 | set(ZEPHYR_BASE ${CURRENT_ZEPHYR_DIR} CACHE PATH "Zephyr base") |
| 159 | include_boilerplate("Freestanding") |
Torsten Rasmussen | 555eb9b | 2020-02-18 14:06:44 +0100 | [diff] [blame] | 160 | endif() |