Unable to build Hello World sample with MCUBoot configuration on macOS with M1

I've never been able to build my application that incorporates MCUBoot under macOS, and I believe others have had issues as well. I had to buy a PC to do most of my development, but my hope springs eternal that I can continue development on my M1 MacBook Air.

Setup: SDK v2.2.0, Zephyr, macOS Monterey.

I can easily reproduce the issue with the Hello World sample app. Here is how.

- Get a Apple Silicon MacBook (M1 or newer)
- Download the Hello World sample.
- Choose the v2.2.0 SDK.
- Set a build configuration for the nrf52840 DK.
- Do a pristine build, and it will compile fine.
- Add this line to the prj.conf:

  CONFIG_BOOTLOADER_MCUBOOT=y

- Do a pristine build, and it will fail with the errors below.
- My support information is also copied in below. 

Note that I did a fresh reinstall of the SDK, Visual Studio Code, and nRF Connect before I tried the above. It fails the same way in my app, too.

It seems related to an environment variable issue with ZEPHYR_NRF_MODULE_DIR.  But that environment variable is correctly set to /opt/nordic/ncs/v2.2.0/nrf.

Hopefully someone at Nordic Semi can use this recipe and try to reproduce the issue and recommend a solution. 

Best,

Steve

*  Executing task: nRF Connect: Build [pristine]: hello_world/build (active) 

Building hello_world
west build --build-dir /Users/Steve/Projects/hello_world/build /Users/Steve/Projects/hello_world --pristine --board nrf52840dk_nrf52840 -- -DNCS_TOOLCHAIN_VERSION:STRING="NONE" -DCONF_FILE:STRING="/Users/Steve/Projects/hello_world/prj.conf"

-- west build: generating a build system
Loading Zephyr default modules (Zephyr base).
-- Application: /Users/Steve/Projects/hello_world
-- Found Python3: /opt/nordic/ncs/toolchains/v2.2.0/bin/python3.9 (found suitable exact version "3.9.6") found components: Interpreter 
-- Cache files will be written to: /Users/Steve/Library/Caches/zephyr
-- Zephyr version: 3.2.99 (/opt/nordic/ncs/v2.2.0/zephyr)
-- Found west (found suitable version "0.14.0", minimum required is "0.7.1")
-- Board: nrf52840dk_nrf52840
-- Found host-tools: zephyr 0.15.1 (/opt/nordic/ncs/toolchains/v2.2.0/opt/zephyr-sdk)
-- Found toolchain: zephyr 0.15.1 (/opt/nordic/ncs/toolchains/v2.2.0/opt/zephyr-sdk)
-- Found Dtc: /opt/nordic/ncs/toolchains/v2.2.0/bin/dtc (found suitable version "1.6.1", minimum required is "1.4.6") 
-- Found BOARD.dts: /opt/nordic/ncs/v2.2.0/zephyr/boards/arm/nrf52840dk_nrf52840/nrf52840dk_nrf52840.dts
-- Generated zephyr.dts: /Users/Steve/Projects/hello_world/build/zephyr/zephyr.dts
-- Generated devicetree_generated.h: /Users/Steve/Projects/hello_world/build/zephyr/include/generated/devicetree_generated.h
-- Including generated dts.cmake file: /Users/Steve/Projects/hello_world/build/zephyr/dts.cmake
Parsing /opt/nordic/ncs/v2.2.0/zephyr/Kconfig
Loaded configuration '/opt/nordic/ncs/v2.2.0/zephyr/boards/arm/nrf52840dk_nrf52840/nrf52840dk_nrf52840_defconfig'
Merged configuration '/Users/Steve/Projects/hello_world/prj.conf'
Configuration saved to '/Users/Steve/Projects/hello_world/build/zephyr/.config'
Kconfig header saved to '/Users/Steve/Projects/hello_world/build/zephyr/include/generated/autoconf.h'
-- The C compiler identification is GNU 12.1.0
-- The CXX compiler identification is GNU 12.1.0
-- The ASM compiler identification is GNU
-- Found assembler: /opt/nordic/ncs/toolchains/v2.2.0/opt/zephyr-sdk/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc
-- Found Python3: /opt/nordic/ncs/toolchains/v2.2.0/bin/python3.9 (found version "3.9.6") found components: Interpreter 

=== child image mcuboot -  begin ===
loading initial cache file /Users/Steve/Projects/hello_world/build/mcuboot/child_image_preload.cmake
Loading Zephyr default modules (Zephyr base).
-- Application: /opt/nordic/ncs/v2.2.0/bootloader/mcuboot/boot/zephyr
-- Found Python3: /usr/local/bin/python3.9 (found suitable exact version "3.9.2") found components: Interpreter 
-- Cache files will be written to: /Users/Steve/Library/Caches/zephyr
-- Zephyr version: 3.2.99 (/opt/nordic/ncs/v2.2.0/zephyr)
-- Board: nrf52840dk_nrf52840
-- Found host-tools: zephyr 0.15.1 (/opt/nordic/ncs/toolchains/v2.2.0/opt/zephyr-sdk)
-- Found toolchain: zephyr 0.15.1 (/opt/nordic/ncs/toolchains/v2.2.0/opt/zephyr-sdk)
-- Found Dtc: /opt/nordic/ncs/toolchains/v2.2.0/bin/dtc (found suitable version "1.6.1", minimum required is "1.4.6") 
-- Found BOARD.dts: /opt/nordic/ncs/v2.2.0/zephyr/boards/arm/nrf52840dk_nrf52840/nrf52840dk_nrf52840.dts
-- Found devicetree overlay: /opt/nordic/ncs/v2.2.0/nrf/modules/mcuboot/usb.overlay
-- Found devicetree overlay: /opt/nordic/ncs/v2.2.0/bootloader/mcuboot/boot/zephyr/dts.overlay
-- Generated zephyr.dts: /Users/Steve/Projects/hello_world/build/mcuboot/zephyr/zephyr.dts
-- Generated devicetree_generated.h: /Users/Steve/Projects/hello_world/build/mcuboot/zephyr/include/generated/devicetree_generated.h
-- Including generated dts.cmake file: /Users/Steve/Projects/hello_world/build/mcuboot/zephyr/dts.cmake
Parsing /opt/nordic/ncs/v2.2.0/bootloader/mcuboot/boot/zephyr/Kconfig
/opt/nordic/ncs/v2.2.0/zephyr/scripts/kconfig/kconfig.py: /opt/nordic/ncs/v2.2.0/bootloader/mcuboot/boot/zephyr/Kconfig:11: '/modules/mcuboot/boot/zephyr/Kconfig' not found (in 'source "$(ZEPHYR_NRF_MODULE_DIR)/modules/mcuboot/boot/zephyr/Kconfig"'). Check that environment variables are set correctly (e.g. $srctree, which is set to '/opt/nordic/ncs/v2.2.0/zephyr'). Also note that unset environment variables expand to the empty string.
CMake Error at /opt/nordic/ncs/v2.2.0/zephyr/cmake/modules/kconfig.cmake:328 (message):
  command failed with return code: 1
Call Stack (most recent call first):
  /opt/nordic/ncs/v2.2.0/nrf/cmake/modules/kconfig.cmake:29 (include)
  /opt/nordic/ncs/v2.2.0/zephyr/cmake/modules/zephyr_default.cmake:108 (include)
  /opt/nordic/ncs/v2.2.0/zephyr/share/zephyr-package/cmake/ZephyrConfig.cmake:66 (include)
  /opt/nordic/ncs/v2.2.0/zephyr/share/zephyr-package/cmake/ZephyrConfig.cmake:92 (include_boilerplate)
  CMakeLists.txt:44 (find_package)


-- Configuring incomplete, errors occurred!
CMake Error at /opt/nordic/ncs/v2.2.0/nrf/cmake/multi_image.cmake:429 (message):
  CMake generation for mcuboot failed, aborting.  Command: 1
Call Stack (most recent call first):
  /opt/nordic/ncs/v2.2.0/nrf/cmake/multi_image.cmake:163 (add_child_image_from_source)
  /opt/nordic/ncs/v2.2.0/nrf/modules/mcuboot/CMakeLists.txt:234 (add_child_image)


-- Configuring incomplete, errors occurred!
See also "/Users/Steve/Projects/hello_world/build/CMakeFiles/CMakeOutput.log".
See also "/Users/Steve/Projects/hello_world/build/CMakeFiles/CMakeError.log".
FATAL ERROR: command exited with status 1: /opt/nordic/ncs/toolchains/v2.2.0/bin/cmake -DWEST_PYTHON=/opt/nordic/ncs/toolchains/v2.2.0/bin/python3 -B/Users/Steve/Projects/hello_world/build -GNinja -DBOARD=nrf52840dk_nrf52840 -DNCS_TOOLCHAIN_VERSION:STRING=NONE -DCONF_FILE:STRING=/Users/Steve/Projects/hello_world/prj.conf -S/Users/Steve/Projects/hello_world

 *  The terminal process terminated with exit code: 1. 
 *  Terminal will be reused by tasks, press any key to close it. 

Here is my support information: 

{
  "platform": {
    "os": "darwin",
    "osVersion": "Darwin Kernel Version 21.6.0: Mon Aug 22 20:20:05 PDT 2022; root:xnu-8020.140.49~2/RELEASE_ARM64_T8101",
    "osKernel": "21.6.0",
    "vscode": "1.75.1",
    "electron": "19.1.9",
    "node": "v16.14.2"
  },
  "system": {
    "date": "2023-02-23T05:56:15.326Z",
    "vscodeRoot": "/Applications/Visual Studio Code.app/Contents/Resources/app",
    "nrfConnectForDesktopInstalled": true,
    "vscodeUptime": "00:27:07",
    "osUptime": "249:59:45",
    "cpu": {
      "model": "Apple M1",
      "speed": "24 MHz",
      "count": 4
    },
    "memory": {
      "total": "16.00 GB",
      "free": "0.12 GB"
    }
  },
  "workspace": {
    "name": "hello_world",
    "workspaceFile": null,
    "folders": [
      "/Users/Steve/Projects/hello_world"
    ]
  },
  "extensions": {
    "internal": {
      "nordic-semiconductor.nrf-connect": {
        "version": "2023.1.44",
        "path": "/Users/Steve/.vscode/extensions/nordic-semiconductor.nrf-connect-2023.1.44-darwin-x64",
        "isActive": true
      },
      "nordic-semiconductor.nrf-terminal": {
        "version": "2022.11.29",
        "path": "/Users/Steve/.vscode/extensions/nordic-semiconductor.nrf-terminal-2022.11.29",
        "isActive": true
      },
      "nordic-semiconductor.nrf-devicetree": {
        "version": "2022.11.153",
        "path": "/Users/Steve/.vscode/extensions/nordic-semiconductor.nrf-devicetree-2022.11.153",
        "isActive": true
      },
      "nordic-semiconductor.nrf-kconfig": {
        "version": "2022.11.50",
        "path": "/Users/Steve/.vscode/extensions/nordic-semiconductor.nrf-kconfig-2022.11.50",
        "isActive": true
      }
    },
    "external": {
      "marus25.cortex-debug": null,
      "ms-vscode.cpptools": "1.14.3",
      "ms-vscode.js-debug": "1.75.1",
      "ms-vscode.js-debug-companion": "1.0.18",
      "ms-vscode.vscode-js-profile-table": "1.0.3",
      "trond-snekvik.gnu-mapfiles": "1.1.0",
      "twxs.cmake": "0.0.17"
    }
  },
  "tools": {
    "/opt/nordic/ncs/toolchains/v2.2.0/opt/zephyr-sdk/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc": "0.15.1",
    "/Applications/SEGGER/JLink/JLinkExe": "7.80c",
    "/usr/local/bin/nrfjprog": "10.19.0",
    "nrfutil": "Not found",
    "/opt/nordic/ncs/toolchains/v2.2.0/bin/cmake": "3.20.5",
    "/opt/nordic/ncs/toolchains/v2.2.0/bin/west": "0.14.0",
    "/opt/nordic/ncs/toolchains/v2.2.0/bin/python3": "3.9.6",
    "/opt/nordic/ncs/toolchains/v2.2.0/bin/ninja": "1.10.2",
    "/opt/nordic/ncs/toolchains/v2.2.0/bin/gperf": "3.1",
    "/opt/nordic/ncs/toolchains/v2.2.0/bin/dtc": "1.6.1",
    "/opt/nordic/ncs/toolchains/v2.2.0/bin/gn": "2073",
    "/opt/nordic/ncs/toolchains/v2.2.0/bin/git": "2.37.3",
    "gdbPath": "/opt/nordic/ncs/toolchains/v2.2.0/opt/zephyr-sdk/arm-zephyr-eabi/bin/arm-zephyr-eabi-gdb"
  },
  "sdks": [
    {
      "version": "2.2.0",
      "path": "/opt/nordic/ncs/v2.2.0"
    }
  ],
  "toolchains": [
    {
      "version": "2.2.0",
      "path": "/opt/nordic/ncs/toolchains/v2.2.0"
    }
  ],
  "connectedDevices": [],
  "deviceProviders": [
    "nrfjprog"
  ],
  "config": {
    "nordic-semiconductor.nrf-connect": {
      "topdir": "/opt/nordic/ncs/v2.2.0",
      "toolchain": {
        "path": "${nrf-connect.toolchain:2.2.0}"
      },
      "ozonePath": "",
      "applications": [
        "."
      ],
      "applicationOptions": {},
      "kconfig": {
        "interface": "kconfig",
        "executeInDefaultShell": false
      },
      "welcome": {
        "showOnStartup": true
      },
      "west": {
        "env": {
          "$base": "terminal"
        }
      },
      "boardRoots": [],
      "enableTelemetry": true,
      "taskBindings": {},
      "debugging": {
        "backend": "nRF Debug",
        "flash": true,
        "bindings": {}
      },
      "activeAppFollowActiveEditor": true
    },
    "nordic-semiconductor.nrf-terminal": {
      "terminalMode": "character",
      "scrollBack": 1000
    }
  },
  "environment": {
    "westExe": "west",
    "westEnv": {
      "ELECTRON_RUN_AS_NODE": "1",
      "GIT_EXEC_PATH": "/opt/nordic/ncs/toolchains/v2.2.0/Cellar/git/2.37.3/libexec/git-core",
      "HOME": "/Users/Steve",
      "PATH": "/opt/nordic/ncs/toolchains/v2.2.0/bin:/opt/nordic/ncs/toolchains/v2.2.0/opt/bin:/opt/nordic/ncs/toolchains/v2.2.0/opt/zephyr-sdk/arm-zephyr-eabi/bin:/opt/nordic/ncs/toolchains/v2.2.0/arm-zephyr-eabi/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin",
      "ZEPHYR_BASE": "/opt/nordic/ncs/v2.2.0/zephyr",
      "ZEPHYR_TOOLCHAIN_VARIANT": "zephyr",
      "ZEPHYR_SDK_INSTALL_DIR": "/opt/nordic/ncs/toolchains/v2.2.0/opt/zephyr-sdk",
      "USER": "Steve"
    },
    "inherited": {
      "ELECTRON_RUN_AS_NODE": "1",
      "HOME": "/Users/Steve",
      "PATH": "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin",
      "USER": "Steve"
    },
    "toolchainPath": "/opt/nordic/ncs/toolchains/v2.2.0",
    "toolchainBinPath": "/opt/nordic/ncs/toolchains/v2.2.0/opt/zephyr-sdk/arm-zephyr-eabi/bin",
    "toolchainVersion": "2.2.0"
  },
  "terminal": {
    "shell": null,
    "defaultProfile": null
  }
}

  • I hope so too.  

    NOTE for Nordic: This is on a clean install of nRF Connect SDK v2.5.2.  No previous Library/Application Support/nrf.... files.

  • I wanted to add one note here:  Contrary to what I said earlier, I have an M1 Mac, not an M2 Mac.  So does Mikael. 

    Øyvind tried to reproduce it on an M2 Mac, so maybe the NRF Connect installer is installing a native python3 under M2, but an Intel version under M1.  

    Steve

  • Hi  ,

    We have lots of hope that there is a solution for our MacOS M1-related inability to build a Hello World application with CONFIG_BOOTLOADER_MCUBOOT=y.  

    Mikael has narrowed it down to the fact that an Intel-based python3 was shipped with the SDK, which then fails when it tries to call Arm-based CFFI libraries to create the pubic key. 

    Is there a solution that will work for us and others? 

    Thanks,

    Steve

  • I was able to get my zephyr project with mcuboot to build under my new M3 MacBook Air.  Here's the process I went through: 

    • Restored my previous MacBook Air backup to the new M3 MacBook Air. 
    • Updated nRF Connect for Desktop to the latest version. 
    • Installed the universal version of Python.  macOS 64-bit universal2 installer
    • Attempted a build, did not work. 
    • Using the Toolchain manager, removed v2.3.0 sdk. 
    • In Toolchain manager, went to About and restored defaults. (Because I no longer saw v2.3.0 as an option.) 
    • Installed v2.3.0 again. 
    • Attempted a build, and it worked. Compiling, debugging, etc. 
    • Did the happy dance after a couple of years of using a weird Windows laptop. 

    Note that I did file command on the python3.9 executable and it is still x86 based, so that was a red herring.  

    Thanks to Mikael and Øyvind for their help. 

    Steve

Related