scripts: west-commands: Updates needed when removing ZEPHYR_BASE env

This commit includes the following fixes in order to remove environment
setting of ZEPHYR_BASE is west extension commands.

- Build command
  west build --pristine will now use the ZEPHYR_BASE variable found
  in CMakeCache.txt in the build folder.

  This ensures that the pristine command is executed from the same
  Zephyr that was used for compilation.

- Board command
  The west boards command no longer sets Zephyr base before invoking
  cmake -P cmake/boards.cmake

  Instead boards.cmake uses find_package(Zephyr) to ensure consistent
  behavior with Zephyr samples, so that the detection of Zephyr base is
  uniform across CMake commands.

  It also changes BOARD_ROOT_SPACE_SEPARATED to BOARD_ROOT in order to
  be consistent with existing user documentation.

Signed-off-by: Torsten Rasmussen <Torsten.Rasmussen@nordicsemi.no>
Signed-off-by: Martí Bolívar <marti.bolivar@nordicsemi.no>
This commit is contained in:
Torsten Rasmussen 2020-03-10 14:52:35 +01:00 committed by Carles Cufí
commit e819fa46cd
5 changed files with 22 additions and 34 deletions

View file

@ -95,18 +95,17 @@ if(CMAKE_SCRIPT_MODE_FILE AND NOT CMAKE_PARENT_LIST_FILE)
# some other script # some other script
# The options available are: # The options available are:
# BOARD_ROOT_SPACE_SEPARATED: Space-separated board roots # BOARD_ROOT: Semi-colon separated board roots
# FILE_OUT: Set to a file path to save the boards to a file. If not defined the # FILE_OUT: Set to a file path to save the boards to a file. If not defined the
# the contents will be printed to stdout # the contents will be printed to stdout
if(NOT DEFINED ZEPHYR_BASE) cmake_minimum_required(VERSION 3.13.1)
message(FATAL_ERROR "ZEPHYR_BASE not set")
endif()
if (NOT BOARD_ROOT_SPACE_SEPARATED) set(NO_BOILERPLATE TRUE)
message(FATAL_ERROR "BOARD_ROOT_SPACE_SEPARATED not defined") find_package(Zephyr HINTS $ENV{ZEPHYR_BASE})
endif()
string(REPLACE " " ";" BOARD_ROOT "${BOARD_ROOT_SPACE_SEPARATED}") # Appending Zephyr base to list of board roots, as this is also done in boilerplate.cmake.
# But as this file was executed in script mode, it must also be done here, to give same output.
list(APPEND BOARD_ROOT ${ZEPHYR_BASE})
if (NOT FILE_OUT) if (NOT FILE_OUT)
set(FILE_OUT FALSE) set(FILE_OUT FALSE)

View file

@ -4,13 +4,14 @@
import argparse import argparse
import collections import collections
import os
import re import re
import textwrap import textwrap
from west import log from west import log
from west.commands import WestCommand from west.commands import WestCommand
from zcmake import run_cmake from zcmake import run_cmake
from zephyr_ext_common import ZEPHYR_CMAKE
class Boards(WestCommand): class Boards(WestCommand):
@ -54,13 +55,7 @@ class Boards(WestCommand):
return parser return parser
def do_run(self, args, unknown_args): def do_run(self, args, unknown_args):
zb = os.environ.get('ZEPHYR_BASE') cmake_args = ['-P', f'{ZEPHYR_CMAKE}/boards.cmake']
if not zb:
log.die('Internal error: ZEPHYR_BASE not set in the environment, '
'and should have been by the main script')
cmake_args = ['-DBOARD_ROOT_SPACE_SEPARATED={}'.format(zb),
'-P', '{}/cmake/boards.cmake'.format(zb)]
lines = run_cmake(cmake_args, capture_output=True) lines = run_cmake(cmake_args, capture_output=True)
arch_re = re.compile(r'\s*([\w-]+)\:') arch_re = re.compile(r'\s*([\w-]+)\:')
board_re = re.compile(r'\s*([\w-]+)\s*') board_re = re.compile(r'\s*([\w-]+)\s*')

View file

@ -400,17 +400,12 @@ class Build(Forceable):
def _run_pristine(self): def _run_pristine(self):
_banner('making build dir {} pristine'.format(self.build_dir)) _banner('making build dir {} pristine'.format(self.build_dir))
zb = os.environ.get('ZEPHYR_BASE')
if not zb:
log.die('Internal error: ZEPHYR_BASE not set in the environment, '
'and should have been by the main script')
if not is_zephyr_build(self.build_dir): if not is_zephyr_build(self.build_dir):
log.die('Refusing to run pristine on a folder that is not a ' log.die('Refusing to run pristine on a folder that is not a '
'Zephyr build system') 'Zephyr build system')
cmake_args = ['-P', '{}/cmake/pristine.cmake'.format(zb)] cache = CMakeCache.from_build_dir(self.build_dir)
cmake_args = ['-P', cache['ZEPHYR_BASE'] + '/cmake/pristine.cmake']
run_cmake(cmake_args, cwd=self.build_dir, dry_run=self.args.dry_run) run_cmake(cmake_args, cwd=self.build_dir, dry_run=self.args.dry_run)
def _run_build(self, target): def _run_build(self, target):

View file

@ -18,9 +18,9 @@ from build_helpers import find_build_dir, is_zephyr_build, \
from runners.core import BuildConfiguration from runners.core import BuildConfiguration
from zcmake import CMakeCache from zcmake import CMakeCache
from zephyr_ext_common import Forceable, cached_runner_config, \ from zephyr_ext_common import Forceable, cached_runner_config, \
zephyr_scripts_path ZEPHYR_SCRIPTS
sys.path.append(os.path.join(zephyr_scripts_path(), 'dts')) sys.path.append(str(ZEPHYR_SCRIPTS / 'dts'))
import edtlib import edtlib

View file

@ -16,6 +16,14 @@ from west.commands import WestCommand
from runners.core import RunnerConfig from runners.core import RunnerConfig
# This relies on this file being zephyr/scripts/foo/bar.py.
# If you move this file, you'll break it, so be careful.
THIS_ZEPHYR = Path(__file__).parent.parent.parent
ZEPHYR_BASE = Path(os.environ.get('ZEPHYR_BASE', THIS_ZEPHYR))
# FIXME we need a nicer way to handle imports from scripts and cmake than this.
ZEPHYR_SCRIPTS = ZEPHYR_BASE / 'scripts'
ZEPHYR_CMAKE = ZEPHYR_BASE / 'cmake'
class Forceable(WestCommand): class Forceable(WestCommand):
'''WestCommand subclass for commands with a --force option.''' '''WestCommand subclass for commands with a --force option.'''
@ -55,12 +63,3 @@ def cached_runner_config(build_dir, cache):
elf_file, hex_file, bin_file, elf_file, hex_file, bin_file,
gdb=gdb, openocd=openocd, gdb=gdb, openocd=openocd,
openocd_search=openocd_search) openocd_search=openocd_search)
# FIXME we should think of a nicer way to manage sys.path
# for shared Zephyr code.
def zephyr_scripts_path():
# This relies on this file being zephyr/scripts/foo/bar.py.
zephyr_base = Path(os.environ.get('ZEPHYR_BASE',
Path(__file__).parent.parent.parent))
return str(zephyr_base / 'scripts')