Cannot build example usercmodule in nrf port
Checks
- I agree to follow the MicroPython Code of Conduct to ensure a safe and respectful space for everyone.
- I've searched for existing issues matching this bug, and didn't find any.
Port, board and/or hardware
nrf port, tested with default PCA10040 board and MICROBIT board
MicroPython version
8762fe8b4c6a7608d48daa8458e6501fafd3eafc
Reproduction
git clone https://github.com/micropython/micropython.git
cd micropython/mpy-cross/
make
cd ../ports/nrf
make submodules
make USER_C_MODULES=../../examples/usercmodule
Expected behaviour
No build errors
Observed behaviour
The modules are correctly found:
Including User C Module from ../../examples/usercmodule/cexample
Including User C Module from ../../examples/usercmodule/cppexample
Including User C Module from ../../examples/usercmodule/subpackage
But it produces a build error on the cppexample/example.cpp file as it cannot find py/runtime.h:
In file included from ../../examples/usercmodule/cppexample/example.cpp:2:
../../examples/usercmodule/cppexample/examplemodule.h:2:10: fatal error: py/runtime.h: No such file or directory
2 | #include "py/runtime.h"
| ^~~~~~~~~~~~~~
compilation terminated.
Command '['arm-none-eabi-gcc', '-E', '-I../../examples/usercmodule/cppexample', '-std=c++11', '-DNO_QSTR', '../../examples/usercmodule/cppexample/example.cpp']' returned non-zero exit status 1.
make: *** [build-PCA10040/genhdr/qstr.i.last] Error 1
make: *** Deleting file `build-PCA10040/genhdr/qstr.i.last'
Looking at the limited amount of flags used to compile the file something in the nrf port could be resetting CXXFLAGS? Or maybe they are not being set at all?
<details>
<summary>Full build output</summary>
<pre>
❯ git clone https://github.com/micropython/micropython.git
Cloning into 'micropython'...
remote: Enumerating objects: 120730, done.
remote: Counting objects: 100% (64/64), done.
remote: Compressing objects: 100% (33/33), done.
remote: Total 120730 (delta 31), reused 51 (delta 30), pack-reused 120666
Receiving objects: 100% (120730/120730), 61.44 MiB | 30.37 MiB/s, done.
Resolving deltas: 100% (90584/90584), done.
❯ cd micropython/mpy-cross/
❯ make
Use make V=1 or set BUILD_VERBOSE in your environment to increase build verbosity.
mkdir -p build/genhdr
GEN build/genhdr/mpversion.h
GEN build/genhdr/qstr.i.last
GEN build/genhdr/qstr.split
GEN build/genhdr/qstrdefs.collected.h
QSTR updated
GEN build/genhdr/qstrdefs.generated.h
GEN build/genhdr/moduledefs.split
GEN build/genhdr/moduledefs.collected
Module registrations updated
GEN build/genhdr/moduledefs.h
GEN build/genhdr/root_pointers.split
GEN build/genhdr/root_pointers.collected
Root pointer registrations updated
GEN build/genhdr/root_pointers.h
mkdir -p build/py
mkdir -p build/shared/runtime
CC ../py/mpstate.c
CC ../py/nlr.c
CC ../py/nlrx86.c
CC ../py/nlrx64.c
CC ../py/nlrthumb.c
CC ../py/nlraarch64.c
CC ../py/nlrmips.c
CC ../py/nlrpowerpc.c
CC ../py/nlrxtensa.c
CC ../py/nlrsetjmp.c
CC ../py/malloc.c
CC ../py/gc.c
CC ../py/pystack.c
CC ../py/qstr.c
CC ../py/vstr.c
CC ../py/mpprint.c
CC ../py/unicode.c
CC ../py/mpz.c
CC ../py/reader.c
CC ../py/lexer.c
CC ../py/parse.c
CC ../py/scope.c
CC ../py/compile.c
CC ../py/emitcommon.c
CC ../py/emitbc.c
CC ../py/asmbase.c
CC ../py/asmx64.c
CC ../py/emitnx64.c
CC ../py/asmx86.c
CC ../py/emitnx86.c
CC ../py/asmthumb.c
CC ../py/emitnthumb.c
CC ../py/emitinlinethumb.c
CC ../py/asmarm.c
CC ../py/emitnarm.c
CC ../py/asmxtensa.c
CC ../py/emitnxtensa.c
CC ../py/emitinlinextensa.c
CC ../py/emitnxtensawin.c
CC ../py/formatfloat.c
CC ../py/parsenumbase.c
CC ../py/parsenum.c
CC ../py/emitglue.c
CC ../py/persistentcode.c
CC ../py/runtime.c
CC ../py/runtime_utils.c
CC ../py/scheduler.c
CC ../py/nativeglue.c
CC ../py/pairheap.c
CC ../py/ringbuf.c
CC ../py/stackctrl.c
CC ../py/argcheck.c
CC ../py/warning.c
CC ../py/profile.c
CC ../py/map.c
CC ../py/obj.c
CC ../py/objarray.c
CC ../py/objattrtuple.c
CC ../py/objbool.c
CC ../py/objboundmeth.c
CC ../py/objcell.c
CC ../py/objclosure.c
CC ../py/objcomplex.c
CC ../py/objdeque.c
CC ../py/objdict.c
CC ../py/objenumerate.c
CC ../py/objexcept.c
CC ../py/objfilter.c
CC ../py/objfloat.c
CC ../py/objfun.c
CC ../py/objgenerator.c
CC ../py/objgetitemiter.c
CC ../py/objint.c
CC ../py/objint_longlong.c
CC ../py/objint_mpz.c
CC ../py/objlist.c
CC ../py/objmap.c
CC ../py/objmodule.c
CC ../py/objobject.c
CC ../py/objpolyiter.c
CC ../py/objproperty.c
CC ../py/objnone.c
CC ../py/objnamedtuple.c
CC ../py/objrange.c
CC ../py/objreversed.c
CC ../py/objset.c
CC ../py/objsingleton.c
CC ../py/objslice.c
CC ../py/objstr.c
CC ../py/objstrunicode.c
CC ../py/objstringio.c
CC ../py/objtuple.c
CC ../py/objtype.c
CC ../py/objzip.c
CC ../py/opmethods.c
CC ../py/sequence.c
CC ../py/stream.c
CC ../py/binary.c
CC ../py/builtinimport.c
CC ../py/builtinevex.c
CC ../py/builtinhelp.c
CC ../py/modarray.c
CC ../py/modbuiltins.c
CC ../py/modcollections.c
CC ../py/modgc.c
CC ../py/modio.c
CC ../py/modmath.c
CC ../py/modcmath.c
CC ../py/modmicropython.c
CC ../py/modstruct.c
CC ../py/modsys.c
CC ../py/moderrno.c
CC ../py/modthread.c
CC ../py/vm.c
CC ../py/bc.c
CC ../py/showbc.c
CC ../py/repl.c
CC ../py/smallint.c
CC ../py/frozenmod.c
CC main.c
CC gccollect.c
CC ../shared/runtime/gchelper_generic.c
LINK build/mpy-cross
__TEXT __DATA __OBJC others dec hex
327680 16384 0 4295000928 4295344992 10005c360
❯ cd ../ports/nrf
❯ make submodules
Use make V=1 or set BUILD_VERBOSE in your environment to increase build verbosity.
Updating submodules: lib/nrfx lib/tinyusb lib/micropython-lib
Submodule 'lib/micropython-lib' (https://github.com/micropython/micropython-lib.git) registered for path '../../lib/micropython-lib'
Submodule 'lib/nrfx' (https://github.com/NordicSemiconductor/nrfx.git) registered for path '../../lib/nrfx'
Submodule 'lib/tinyusb' (https://github.com/hathach/tinyusb) registered for path '../../lib/tinyusb'
Cloning into '/Users/microbit-carlos/workspace/mbef/micropython/rm/micropython/lib/micropython-lib'...
Cloning into '/Users/microbit-carlos/workspace/mbef/micropython/rm/micropython/lib/nrfx'...
Cloning into '/Users/microbit-carlos/workspace/mbef/micropython/rm/micropython/lib/tinyusb'...
Submodule path '../../lib/micropython-lib': checked out 'ddb1a279578bfff8c1b18aff3baa668620684f64'
Submodule path '../../lib/nrfx': checked out '7a4c9d946cf1801771fc180acdbf7b878f270093'
Submodule path '../../lib/tinyusb': checked out '1fdf29075d4e613eacfa881166015263797db0f6'
❯ make USER_C_MODULES=../../examples/usercmodule
Use make V=1 or set BUILD_VERBOSE in your environment to increase build verbosity.
Including User C Module from ../../examples/usercmodule/cexample
Including User C Module from ../../examples/usercmodule/cppexample
Including User C Module from ../../examples/usercmodule/subpackage
mkdir -p build-PCA10040/genhdr
Create build-PCA10040/genhdr/pins.h
GEN build-PCA10040/genhdr/mpversion.h
GEN build-PCA10040/genhdr/qstr.i.last
In file included from ../../examples/usercmodule/cppexample/example.cpp:2:
../../examples/usercmodule/cppexample/examplemodule.h:2:10: fatal error: py/runtime.h: No such file or directory
2 | #include "py/runtime.h"
| ^~~~~~~~~~~~~~
compilation terminated.
Command '['arm-none-eabi-gcc', '-E', '-I../../examples/usercmodule/cppexample', '-std=c++11', '-DNO_QSTR', '../../examples/usercmodule/cppexample/example.cpp']' returned non-zero exit status 1.
make: *** [build-PCA10040/genhdr/qstr.i.last] Error 1
make: *** Deleting file `build-PCA10040/genhdr/qstr.i.last'
</pre>
</details>
Additional Information
Also tested the MICROBIT board and produces the same error.
Building the c module examples in the Unix port or the PYBV11 board does build correctly.
USER_C_MODULES for ESP32
Port, board and/or hardware
esp32
MicroPython version
Master
Reproduction
For building the example modules which come with MicroPython, set USER_C_MODULES to the examples/usercmodule directory for Make, or to examples/usercmodule/micropython.cmake for CMake.
The recent commit b65e89107c0194bfdaf92720786341a2047f36b6 enforces that USER_C_MODULES must point to a directory in the Make system. However, this causes confusion with the documentation, which mixes usage of relative paths and file references for both Make and CMake.
but that's half the battle. We can comment on this committee.
Also, they no longer work as they used to.
Observed behaviour
Examples:
- The following command no longer works with Make after the commit:
cd micropython/ports/esp32
make USER_C_MODULES=../../examples/usercmodule/micropython.cmake
- Instead, absolute paths are required:
make USER_C_MODULES=/dev_iot/opt/upy/micropython/examples/usercmodule/micropython.cmake BOARD=ESP32_GENERIC all