This service is available only in Japanese-language.

Ubuntu 20.04上でdevtoolを使用するとエラーになる

Ubuntu18.04で問題なくビルド・devtoolの使用ができていたワークスペースに関して、
Ubuntu20.04にアップデートしたところ、devtool modify systemdにて下記エラーを出力するようになりました。
ビルドは問題なく可能です。

ビルド対象はOpenSTLinux,展開しようとしたレシピはsystemdです
解決策をご存知でしたらご教示いただけますでしょうか。

ERROR: Error executing a python function in exec_python_func() autogenerated:

The stack trace of python calls that resulted in this exception/failure was:
File: 'exec_python_func() autogenerated', lineno: 2, function: <module>
0001:
*** 0002:devtool_post_unpack(d)
0003:
File: '/(省略)/layers/openembedded-core/meta/classes/devtool-source.bbclass', lineno: 68, function: devtool_post_unpack
0064:}
0065:
0066:
0067:python devtool_post_unpack() {
*** 0068: import oe.recipeutils
0069: import shutil
0070: sys.path.insert(0, os.path.join(d.getVar('COREBASE'), 'scripts', 'lib'))
0071: import scriptutils
0072: from devtool import setup_git_repo
File: '/home/makita/Doc/(省略)/layers/openembedded-core/meta/lib/oe/recipeutils.py', lineno: 21, function: <module>
0017:import shutil
0018:import re
0019:import fnmatch
0020:import glob
*** 0021:import bb.tinfoil
0022:
0023:from collections import OrderedDict, defaultdict
0024:from bb.utils import vercmp_string
0025:
File: '/(省略)/layers/openembedded-core/bitbake/lib/bb/tinfoil.py', lineno: 19, function: <module>
0015:from collections import OrderedDict, defaultdict
0016:from functools import partial
0017:
0018:import bb.cache
*** 0019:import bb.cooker
0020:import bb.providers
0021:import bb.taskdata
0022:import bb.utils
0023:import bb.command
File: '/(省略)/layers/openembedded-core/bitbake/lib/bb/cooker.py', lineno: 25, function: <module>
0021:import bb, bb.exceptions, bb.command
0022:from bb import utils, data, parse, event, cache, providers, taskdata, runqueue, build
0023:import queue
0024:import signal
*** 0025:import prserv.serv
0026:import pyinotify
0027:import json
0028:import pickle
0029:import codecs
File: '/(省略)/layers/openembedded-core/bitbake/lib/prserv/serv.py', lineno: 7, function: <module>
0003:#
0004:
0005:import os,sys,logging
0006:import signal, time
*** 0007:from xmlrpc.server import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler
0008:import threading
0009:import queue
0010:import socket
0011:import io
File: '/usr/lib/python3.8/xmlrpc/server.py', lineno: 117, function: <module>
0113:import socketserver
0114:import sys
0115:import os
0116:import re
*** 0117:import pydoc
0118:import traceback
0119:try:
0120: import fcntl
0121:except ImportError:
File: '/usr/lib/python3.8/pydoc.py', lineno: 370, function: <module>
0366: return module
0367:
0368:# ---------------------------------------------------- formatter base class
0369:
*** 0370:class Doc:
0371:
0372: PYTHONDOCS = os.environ.get("PYTHONDOCS",
0373: "https://docs.python.org/%d.%d/library"
0374: % sys.version_info[:2])
File: '/usr/lib/python3.8/pydoc.py', lineno: 400, function: Doc
0396: raise TypeError(message)
0397:
0398: docmodule = docclass = docroutine = docother = docproperty = docdata = fail
0399:
*** 0400: def getdocloc(self, object, basedir=sysconfig.get_path('stdlib')):
0401: """Return the location of module docs or None"""
0402:
0403: try:
0404: file = inspect.getabsfile(object)
File: '/usr/lib/python3.8/sysconfig.py', lineno: 525, function: get_path
0521: """Return a path corresponding to the scheme.
0522:
0523: ``scheme`` is the install scheme name.
0524: """
*** 0525: return get_paths(scheme, vars, expand)[name]
0526:
0527:
0528:def get_config_vars(*args):
0529: """With no arguments, return a dictionary of all configuration
File: '/usr/lib/python3.8/sysconfig.py', lineno: 515, function: get_paths
0511: ``scheme`` is the install scheme name. If not provided, it will
0512: return the default scheme for the current platform.
0513: """
0514: if expand:
*** 0515: return _expand_vars(scheme, vars)
0516: else:
0517: return _INSTALL_SCHEMES[scheme]
0518:
0519:
File: '/usr/lib/python3.8/sysconfig.py', lineno: 177, function: _expand_vars
0173:def _expand_vars(scheme, vars):
0174: res = {}
0175: if vars is None:
0176: vars = {}
*** 0177: _extend_dict(vars, get_config_vars())
0178:
0179: for key, value in _INSTALL_SCHEMES[scheme].items():
0180: if os.name in ('posix', 'nt'):
0181: value = os.path.expanduser(value)
File: '/usr/lib/python3.8/sysconfig.py', lineno: 563, function: get_config_vars
0559:
0560: if os.name == 'nt':
0561: _init_non_posix(_CONFIG_VARS)
0562: if os.name == 'posix':
*** 0563: _init_posix(_CONFIG_VARS)
0564: # For backward compatibility, see issue19555
0565: SO = _CONFIG_VARS.get('EXT_SUFFIX')
0566: if SO is not None:
0567: _CONFIG_VARS['SO'] = SO
File: '/usr/lib/python3.8/sysconfig.py', lineno: 431, function: _init_posix
0427:def _init_posix(vars):
0428: """Initialize the module as appropriate for POSIX systems."""
0429: # _sysconfigdata is generated at build time, see _generate_posix_vars()
0430: name = _get_sysconfigdata_name()
*** 0431: _temp = __import__(name, globals(), locals(), ['build_time_vars'], 0)
0432: build_time_vars = _temp.build_time_vars
0433: vars.update(build_time_vars)
0434:
0435:def _init_non_posix(vars):
Exception: ModuleNotFoundError: No module named '_sysconfigdata'

本件、状況を整理させてください。

エラーログを貼り付けていただいておりますが、
内容がピンポイント過ぎて、サポートが難しい状況となっております。
OSをUbuntu18.04から20.04にアップデートした前後でdevtool modify systemdが失敗するとのことで、
最終的なゴールはUbuntu 20.04上でdevtool modify systemdが成功することと理解しております。

まず、最初に以下の情報をお知らせいただきたく存じます。

1. OpenSTLinuxのバージョン(Branch or Commit ID or Release)
2. Ubuntu 18.04から20.04にアップデートした手順

当方、クリーンな環境を用意し現象の再現を試みましたが、Ubuntu 20.04でdevtool modify systemdを失敗させることができませんでした。
OpenSTLinuxがバージョンがわからなかったため、暫定的にkirkstoneのqemuarm64のPokyを使用しています。

こちらで確認した際の流れを記載します。

1. クリーンなUbuntu18.04環境を作成
2. aptでYoctoProjectが使用するパッケージをインストール
3. Pokyを取得、qemuarm64向けにbitbake core-image-mininal
4. devtool modify systemd(成功)
5. do-release-upgradeコマンドにてUbuntu 18.04→20.04にアップデート
6. Ubuntu 20.04にてdevtool modify systemd(成功)

また、現時点で考えられるリカバリのワークアラウンドとしては
下記のようにUbuntu 18.04時点でのビルド生成物(中間ファイルも含む)をすべて削除し
改めて、bitbakeおよびdevtoolを実行するというものになります。

=======================
$ rm -rf bitbake-cookerdaemon.log cache sstate-cache tmp
$ devtool modify systemd
=======================

よろしければ、冒頭に記載しました情報と、ワークアラウンドの実施結果を
お知らせいただけると助かります。

よろしくお願いします。

返信が遅くなり申し訳ございません。
1. OpenSTLinuxのバージョン(Branch or Commit ID or Release)
openstlinux-5.4-dunfell-mp1-20-11-1です。
2. Ubuntu 18.04から20.04にアップデートした手順
以下手順となります
sudo do-release-upgrade
上記にてアップデート後、kernelもアップデートする意図で下記を実行しています。
sudo apt install --install-recommends linux-generic-hwe-20.04
ワークアラウンドにつきましてもご教示いただきありがとうございます。試行後追記させていただきます。

本件、回答いたします。

devtoolで内部的に使用しているpython3native.bbclassが古いために
発生する問題であることがわかりました。

エラーの直接の原因は、devtoolでのpython3コマンド実行時に
環境変数に「_PYTHON_SYSCONFIGDATA_NAME=_sysconfigdata」が定義されているかどうかで、
この値が定義されている場合にのみエラーになります。

OE-Coreのpython3native.bbclassを下記のように修正することで、現象は発生しなくなることは確認しましたが、
このクラスはbitbakeやレシピ内でも広く参照されるものであるため、この修正はお勧めしません。

=====================================
diff --git a/meta/classes/python3native.bbclass b/meta/classes/python3native.bbclass
index d98fb4c758..8da5b09b08 100644
--- a/meta/classes/python3native.bbclass
+++ b/meta/classes/python3native.bbclass
@@ -17,7 +17,7 @@ export STAGING_LIBDIR
export PYTHON_LIBRARY="${STAGING_LIBDIR}/lib${PYTHON_DIR}${PYTHON_ABI}.so"
export PYTHON_INCLUDE_DIR="${STAGING_INCDIR}/${PYTHON_DIR}${PYTHON_ABI}"

-export _PYTHON_SYSCONFIGDATA_NAME="_sysconfigdata"
+#export _PYTHON_SYSCONFIGDATA_NAME="_sysconfigdata"

# suppress host user's site-packages dirs.
export PYTHONNOUSERSITE = "1"
=====================================

少なくとも1つ新しいタグである下記のバージョンを使用することで問題は解消することは確認しております。

=====================================
repo init -u https://github.com/STMicroelectronics/oe-manifest.git -b refs/tags/openstlinux-5.4-dunfell-mp1-21-12-22
=====================================

この問題を修正するための直接の修正は下記のパッチになりますが、単体ではバックポートできないため、
関連のパッチセットをすべて適用するなどの対応が必要となります。

https://lists.openembedded.org/g/openembedded-core/message/148057

また、今回現象が発生した環境はYocto(Poky)は使用しておらず、OpenEmbedded-Coreを使用している環境でした。
今後こちらへ相談いただく場合は、やはり使用環境や再現手順を明示していただく方が時間の短縮につながるかと存じます。

## 環境情報の例

1. ホストOS(Distro + Version)
2. ターゲットボード
3. 使用中のBSPのバージョン(CommitID/branch/tag)
4. (できれば)使用中のYoctoProjectのバージョン(CommitID/branch/tag)

## 再現手順の例(これでも省略、本来は実行したコマンドラインすべてあると嬉しい)

1. クリーンなUbuntu18.04環境を作成
2. aptでYoctoProjectが使用するパッケージをインストール
3. Pokyを取得、qemuarm64向けにbitbake core-image-mininal
4. devtool modify systemd(成功)
5. do-release-upgradeコマンドにてUbuntu 18.04→20.04にアップデート
6. Ubuntu 20.04にてdevtool modify systemd(成功)

今後ともよろしくお願いいたします。

ご回答いただきありがとうございます。
>今後こちらへ相談いただく場合は、やはり使用環境や再現手順を明示していただく方が時間の短縮につながるかと存じます。
本件、承知いたしました。
ご調査いただきありがとうございました。