ARMmbed/yotta

Building error

nandub opened this issue · 9 comments

After installing yotta, I'm trying to build microbit-samples to make sure everything is setup right, but after running yt build I get the following error:

info: generate for target: bbc-microbit-classic-gcc 0.2.3 at /Users/nandub/development/code/microbit/microbit-samples/yotta_targets/bbc-microbit-classic-gcc
error: Can't pickle <function Pack.runScript at 0x10d7c3820>: it's not the same object as yotta.lib.pack.Pack.runScript

Python version: 3.8.3 on a virtualenv

how can I reproduce this (step by step) ? This looks like multiprocessing error in yotta.

Steps to reproduce:

I'm using pyenv with pyenv-virtualenv to create a clean python environment. Also I'm using a Mac / OS HIgh Sierra

pyenv install 3.8.3
pyenv global 3.8.3
pyenv virtualenv microbit
pyenv activate microbit

Install yotta

pip install yotta

Compile microbit-samples

git clone https://github.com/lancaster-university/microbit-samples.git
cd microbit-samples
yt clean
yt target bbc-microbit-classic-gcc
yt build
info: generate for target: bbc-microbit-classic-gcc 0.2.3 at /Users/nandub/development/code/microbit/microbit-samples/yotta_targets/bbc-microbit-classic-gcc
error: Can't pickle <function Pack.runScript at 0x10cc4d700>: it's not the same object as yotta.lib.pack.Pack.runScript

I'm also seeing the same issue on macOS with Python 3.8.2 and 3.8.3. Following the steps indicated by @nandub:

info: generate for target: bbc-microbit-classic-gcc 0.2.3 at ...
error: Can't pickle <function Pack.runScript at 0x10f07c160>: it's not the same object as yotta.lib.pack.Pack.runScript
$ pip list
Package                       Version    
----------------------------- -----------
appdirs                       1.4.4      
argcomplete                   1.11.1     
certifi                       2020.6.20  
cffi                          1.14.0     
chardet                       3.0.4      
cmsis-pack-manager            0.2.10     
colorama                      0.3.9      
cryptography                  2.9.2      
Deprecated                    1.2.10     
future                        0.18.2     
hgapi                         1.7.4      
hidapi                        0.9.0.post3
idna                          2.10       
intelhex                      2.2.1      
intervaltree                  3.0.2      
Jinja2                        2.11.2     
jsonpointer                   1.14       
jsonschema                    2.6.0      
MarkupSafe                    1.1.1      
mbed-test-wrapper             1.0.0      
milksnake                     0.1.5      
pathlib                       1.0.1      
pip                           19.2.3     
prettytable                   0.7.2      
project-generator             0.8.17     
project-generator-definitions 0.2.40     
psutil                        5.7.0      
pycparser                     2.20       
pyelftools                    0.23       
PyGithub                      1.51       
PyJWT                         1.7.1      
pylink-square                 0.6.1      
pyocd                         0.26.1     
pyOpenSSL                     19.1.0     
pyusb                         1.0.2      
PyYAML                        5.3.1      
requests                      2.24.0     
semantic-version              2.8.5      
setuptools                    41.2.0     
six                           1.15.0     
sortedcontainers              2.2.2      
urllib3                       1.25.9     
valinor                       1.1.4      
wrapt                         1.12.1     
xmltodict                     0.12.0     
yotta                         0.20.5  

Seems to be working on Ubuntu 16.04 and Windows 10 with Python 3.8.

On macOS it works fine with Python 3.6.8.

@carlosperate awesome, thanks for testing and confirming the error. I'm able to install and use python 3.6.8.

There must be something wrong with newer version of python, not very familiar with python's internal to try to figure this error out. If someone else knows how to debug the error, please go ahead and try to figure out.

The default pickle protocol changed between python 3.6 and 3.8, so maybe something to do with that?

If you temporarily remove the @dropRootPrivs decorator from runScript , does the build fail later on a different function, or is this the only one causing a problem?

You could try changing the runScript method to make it use a new module-level function which uses the @dropRootPrivs decorator, and leave the class method undecorated.

From Python 3.9 there is support to specify the user and group to subprocess.Popen directly, so could just change the subprocess call to use that in the future, instead of the whacky dropRootPrivs decorator.

@autopulated thanks for the feedback. If I removed @dropRootPrivs I get a similar error but on a different function.

error: Can't pickle <function DerivedTarget.build at 0x10260b160>: it's not the same object as yotta.lib.target.DerivedTarget.build

If I do the same to build and removed @dropRootPrivs the yt build then succeeds.

@nandub Thanks for testing, would you be able to send a pull request fixing it? I assume the solution that would work not just with python 3.9.

@0xc0170 python is not my forte, I'd rather let someone else with more expertise on this area to come up with a pull request with the fixes.

Same error MacOs 11.1

$ yt build
info: generate for target: bbc-microbit-classic-gcc 0.2.3 at /Users/user/Documents/microbit-samples/yotta_targets/bbc-microbit-classic-gcc
error: Can't pickle <function Pack.runScript at 0x10dbaeb80>: it's not the same object as yotta.lib.pack.Pack.runScript

Install as described in http://docs.yottabuild.org/#installing

brew tap ARMmbed/homebrew-formulae
brew install python cmake ninja arm-none-eabi-gcc
pip install yotta
$ python --version
Python 3.9.1

EDIT: After I am commented all @fsutils.dropRootPrivs in /usr/local/lib/python3.9/site-packages/yotta/lib/[pack|target].py - running yt build was done with success.