blob: 8045bcfa8c5125b49b5668f0f92ce57e99f12840 [file] [log] [blame]
Torsten Rasmussen81007172020-02-12 14:55:36 +01001# 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 Rasmussen81007172020-02-12 14:55:36 +010012
Torsten Rasmussen555eb9b2020-02-18 14:06:44 +010013macro(include_boilerplate location)
Torsten Rasmussen0a64b082022-03-01 09:40:17 +010014 set(Zephyr_DIR ${ZEPHYR_BASE}/share/zephyr-package/cmake CACHE PATH
15 "The directory containing a CMake configuration file for Zephyr." FORCE
16 )
Torsten Rasmussen61453e42021-12-16 17:13:54 +010017 list(PREPEND CMAKE_MODULE_PATH ${ZEPHYR_BASE}/cmake/modules)
Torsten Rasmussen8829e822020-02-26 14:28:09 +010018 if(ZEPHYR_UNITTEST)
Torsten Rasmussene4ccde32021-12-17 11:43:54 +010019 message(WARNING "The ZephyrUnittest CMake package has been deprecated.\n"
20 "ZephyrUnittest has been replaced with Zephyr CMake module 'unittest' \n"
21 "and can be loaded as: 'find_package(Zephyr COMPONENTS unittest)'"
22 )
Torsten Rasmussen8829e822020-02-26 14:28:09 +010023 set(ZephyrUnittest_FOUND True)
Torsten Rasmussene4ccde32021-12-17 11:43:54 +010024 set(Zephyr_FIND_COMPONENTS unittest)
Torsten Rasmussen8829e822020-02-26 14:28:09 +010025 else()
26 set(Zephyr_FOUND True)
Torsten Rasmussen8829e822020-02-26 14:28:09 +010027 endif()
28
Torsten Rasmussen61453e42021-12-16 17:13:54 +010029 if(NOT DEFINED APPLICATION_SOURCE_DIR)
30 set(APPLICATION_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH
31 "Application Source Directory"
32 )
33 endif()
34
35 if(NOT DEFINED APPLICATION_BINARY_DIR)
36 set(APPLICATION_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR} CACHE PATH
37 "Application Binary Directory"
38 )
39 endif()
40
41 set(__build_dir ${APPLICATION_BINARY_DIR}/zephyr)
42 set(PROJECT_BINARY_DIR ${__build_dir})
43
Torsten Rasmussen555eb9b2020-02-18 14:06:44 +010044 if(NOT NO_BOILERPLATE)
Torsten Rasmussen61453e42021-12-16 17:13:54 +010045 list(LENGTH Zephyr_FIND_COMPONENTS components_length)
Jordan Yates568fb352022-02-21 17:22:37 +100046 # The module messages are intentionally higher than STATUS to avoid the -- prefix
47 # and make them more visible to users. This does result in them being output
48 # to stderr, but that is an implementation detail of cmake.
Torsten Rasmussene4ccde32021-12-17 11:43:54 +010049 if(components_length EQUAL 0)
Jordan Yates568fb352022-02-21 17:22:37 +100050 message(NOTICE "Loading Zephyr default modules (${location}).")
Torsten Rasmussen61453e42021-12-16 17:13:54 +010051 include(zephyr_default NO_POLICY_SCOPE)
52 else()
Jordan Yates568fb352022-02-21 17:22:37 +100053 message(NOTICE "Loading Zephyr module(s) (${location}): ${Zephyr_FIND_COMPONENTS}")
Torsten Rasmussen61453e42021-12-16 17:13:54 +010054 foreach(component ${Zephyr_FIND_COMPONENTS})
Torsten Rasmussen31e90f12022-02-03 12:10:53 +010055 if(${component} MATCHES "^\([^:]*\):\(.*\)$")
56 string(REPLACE "," ";" SUB_COMPONENTS ${CMAKE_MATCH_2})
57 set(component ${CMAKE_MATCH_1})
58 endif()
Torsten Rasmussen61453e42021-12-16 17:13:54 +010059 include(${component})
60 endforeach()
61 endif()
62 else()
63 message(WARNING "The NO_BOILERPLATE setting has been deprecated.\n"
64 "Please use: 'find_package(Zephyr COMPONENTS <components>)'"
65 )
Torsten Rasmussen555eb9b2020-02-18 14:06:44 +010066 endif()
67endmacro()
68
Torsten Rasmussencaf596e2020-03-04 12:34:44 +010069set(ENV_ZEPHYR_BASE $ENV{ZEPHYR_BASE})
70if((NOT DEFINED ZEPHYR_BASE) AND (DEFINED ENV_ZEPHYR_BASE))
Torsten Rasmussen81007172020-02-12 14:55:36 +010071 # Get rid of any double folder string before comparison, as example, user provides
72 # ZEPHYR_BASE=//path/to//zephyr_base/
73 # must also work.
Torsten Rasmussencaf596e2020-03-04 12:34:44 +010074 get_filename_component(ZEPHYR_BASE ${ENV_ZEPHYR_BASE} ABSOLUTE)
75 set(ZEPHYR_BASE ${ZEPHYR_BASE} CACHE PATH "Zephyr base")
76 include_boilerplate("Zephyr base")
77 return()
78endif()
Torsten Rasmussen555eb9b2020-02-18 14:06:44 +010079
Torsten Rasmussencaf596e2020-03-04 12:34:44 +010080if (DEFINED ZEPHYR_BASE)
81 include_boilerplate("Zephyr base (cached)")
Torsten Rasmussen555eb9b2020-02-18 14:06:44 +010082 return()
Torsten Rasmussen81007172020-02-12 14:55:36 +010083endif()
84
Torsten Rasmussen555eb9b2020-02-18 14:06:44 +010085# If ZEPHYR_CANDIDATE is set, it means this file was include instead of called via find_package directly.
86if(ZEPHYR_CANDIDATE)
87 set(IS_INCLUDED TRUE)
Torsten Rasmussen8e929fd2020-03-09 15:26:21 +010088else()
89 include(${CMAKE_CURRENT_LIST_DIR}/zephyr_package_search.cmake)
Torsten Rasmussen555eb9b2020-02-18 14:06:44 +010090endif()
91
92# Find out the current Zephyr base.
93get_filename_component(CURRENT_ZEPHYR_DIR ${CMAKE_CURRENT_LIST_FILE}/${ZEPHYR_RELATIVE_DIR} ABSOLUTE)
Torsten Rasmussencaf596e2020-03-04 12:34:44 +010094get_filename_component(CURRENT_WORKSPACE_DIR ${CMAKE_CURRENT_LIST_FILE}/${WORKSPACE_RELATIVE_DIR} ABSOLUTE)
Torsten Rasmussen555eb9b2020-02-18 14:06:44 +010095
96string(FIND "${CMAKE_CURRENT_SOURCE_DIR}" "${CURRENT_ZEPHYR_DIR}/" COMMON_INDEX)
97if (COMMON_INDEX EQUAL 0)
Torsten Rasmussencaf596e2020-03-04 12:34:44 +010098 # Project is in Zephyr repository.
99 # We are in Zephyr repository.
100 set(ZEPHYR_BASE ${CURRENT_ZEPHYR_DIR} CACHE PATH "Zephyr base")
101 include_boilerplate("Zephyr repository")
Torsten Rasmussen555eb9b2020-02-18 14:06:44 +0100102 return()
103endif()
104
105if(IS_INCLUDED)
Torsten Rasmussencaf596e2020-03-04 12:34:44 +0100106 # A higher level did the checking and included us and as we are not in Zephyr repository
107 # (checked above) then we must be in Zephyr workspace.
108 set(ZEPHYR_BASE ${CURRENT_ZEPHYR_DIR} CACHE PATH "Zephyr base")
109 include_boilerplate("Zephyr workspace")
Torsten Rasmussen555eb9b2020-02-18 14:06:44 +0100110endif()
111
112if(NOT IS_INCLUDED)
Torsten Rasmussencaf596e2020-03-04 12:34:44 +0100113 string(FIND "${CMAKE_CURRENT_SOURCE_DIR}" "${CURRENT_WORKSPACE_DIR}/" COMMON_INDEX)
Torsten Rasmussen555eb9b2020-02-18 14:06:44 +0100114 if (COMMON_INDEX EQUAL 0)
Torsten Rasmussencaf596e2020-03-04 12:34:44 +0100115 # Project is in Zephyr workspace.
Torsten Rasmussen555eb9b2020-02-18 14:06:44 +0100116 # This means this Zephyr is likely the correct one, but there could be an alternative installed along-side
117 # Thus, check if there is an even better candidate.
118 # This check works the following way.
119 # CMake finds packages will look all packages registered in the user package registry.
120 # As this code is processed inside registered packages, we simply test if another package has a
Nazar Kazakov9713f0d2022-02-24 12:00:55 +0000121 # common path with the current sample.
122 # and if so, we will return here, and let CMake call into the other registered package for real
Torsten Rasmussen555eb9b2020-02-18 14:06:44 +0100123 # version checking.
Torsten Rasmussencaf596e2020-03-04 12:34:44 +0100124 check_zephyr_package(CURRENT_WORKSPACE_DIR ${CURRENT_WORKSPACE_DIR})
Torsten Rasmussen555eb9b2020-02-18 14:06:44 +0100125
Torsten Rasmussen8e929fd2020-03-09 15:26:21 +0100126 if(ZEPHYR_PREFER)
127 check_zephyr_package(SEARCH_PARENTS CANDIDATES_PREFERENCE_LIST ${ZEPHYR_PREFER})
128 endif()
129
Torsten Rasmussen555eb9b2020-02-18 14:06:44 +0100130 # We are the best candidate, so let's include boiler plate.
Torsten Rasmussencaf596e2020-03-04 12:34:44 +0100131 set(ZEPHYR_BASE ${CURRENT_ZEPHYR_DIR} CACHE PATH "Zephyr base")
132 include_boilerplate("Zephyr workspace")
Torsten Rasmussen555eb9b2020-02-18 14:06:44 +0100133 return()
134 endif()
135
Torsten Rasmussen8e929fd2020-03-09 15:26:21 +0100136 check_zephyr_package(SEARCH_PARENTS CANDIDATES_PREFERENCE_LIST ${ZEPHYR_PREFER})
Torsten Rasmussen555eb9b2020-02-18 14:06:44 +0100137
Torsten Rasmussencaf596e2020-03-04 12:34:44 +0100138 # Ending here means there were no candidates in workspace of the app.
139 # Thus, the app is built as a Zephyr Freestanding application.
Torsten Rasmussen555eb9b2020-02-18 14:06:44 +0100140 # CMake find_package has already done the version checking, so let's just include boiler plate.
141 # Previous find_package would have cleared Zephyr_FOUND variable, thus set it again.
Torsten Rasmussencaf596e2020-03-04 12:34:44 +0100142 set(ZEPHYR_BASE ${CURRENT_ZEPHYR_DIR} CACHE PATH "Zephyr base")
143 include_boilerplate("Freestanding")
Torsten Rasmussen555eb9b2020-02-18 14:06:44 +0100144endif()