From patchwork Tue Sep 5 16:51:09 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adrian Freihofer X-Patchwork-Id: 648 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id E8C96C83F3E for ; Tue, 5 Sep 2023 16:59:43 +0000 (UTC) Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.52]) by mx.groups.io with SMTP id smtpd.web11.27498.1693933173494859693 for ; Tue, 05 Sep 2023 09:59:33 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@gmail.com header.s=20221208 header.b=poyqQ6Vp; spf=pass (domain: gmail.com, ip: 209.85.128.52, mailfrom: adrian.freihofer@gmail.com) Received: by mail-wm1-f52.google.com with SMTP id 5b1f17b1804b1-401da71b7c5so27342335e9.2 for ; Tue, 05 Sep 2023 09:59:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1693933172; x=1694537972; darn=lists.openembedded.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=198IgLhY7Zfhz8FLyAepQTZbIwZmdsq7g90qJDlZWtk=; b=poyqQ6VpGFyX6lFBKGiW7afMTKKn4vq32gjocmoa3MhettQVpKb+HPULWHpql6NK0m ZY1jenzQrGRXMH0Rsu7y+7SZHLGNpmonRtpkNVZx4001JwRvapbET6uQmU8C8ebOqIT7 pnvvAvRaq37V5PsothANdkysrx3iQ8looIM8UuinokKzv20J8wcYDoLCN+uzY/6BNBpF sc3BJgLPsxaPqkMcpx166zhz88mWHWF5lUeJYkO130SgctADWNU+bgAj2U0eG73d4NHv EUUWlp4B7prskg24MlNW9gUYmQGdiz7b9qre5OxuI0G5p5MfGWRO9CzvK1lXI2j6l2t4 1I+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693933172; x=1694537972; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=198IgLhY7Zfhz8FLyAepQTZbIwZmdsq7g90qJDlZWtk=; b=KzeCh55WKXCR/ZkgVxkPh/RIQSB1oNeU99HB1j7UvJsVD87WtEpP7ZTji8gn8ng+Vk 1F0SJFfsl/5M6GmEaXABBSG3uxP1KjoO+KjUxWLc+LgmXAXpH/cbWKAWpnH8doyHh/bb /N9rrK8eBmm5+WumQEZi6pgTVWGQenrT8DGF49xftvmB2FLZdXQ2vZv+b7WtEdIHLYRc RkoXP1OlTc5Sj8bSOQ3WbhTJ3z2hchNthTOgD70xIt0v1oykWgwyhQOrH5yqxN0DNU69 lriwL29+fqv36BkqBPl5yhDAFDHAWzNX1lexTUHxX+qbnUxBnCRD08elm528/IMEe6ho agNg== X-Gm-Message-State: AOJu0YyriGRg7SmYiLYHgnGHiL7b+R1xSIsPgrl8gFVqbsZp7reZvCYR lEjoFgJVKsKLFgtDwVTWaiwKuENJ974= X-Google-Smtp-Source: AGHT+IEvMXrChcQNLtyRTzr4gmpwitLMQ7ka7EYuY5BoyGq8OMqNU7bnAy705UUhqLvoQJDKogh8SQ== X-Received: by 2002:a5d:4404:0:b0:319:71be:9248 with SMTP id z4-20020a5d4404000000b0031971be9248mr280957wrq.19.1693933171370; Tue, 05 Sep 2023 09:59:31 -0700 (PDT) Received: from t14s-af.fritz.box ([2a02:169:59a6:0:5488:f785:9061:cf6c]) by smtp.gmail.com with ESMTPSA id c7-20020a5d4147000000b0031de43fe9bfsm18146269wrq.0.2023.09.05.09.59.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 Sep 2023 09:59:30 -0700 (PDT) From: Adrian Freihofer X-Google-Original-From: Adrian Freihofer To: openembedded-core@lists.openembedded.org Cc: Adrian Freihofer Subject: [OE-core][PATCH v5 00/14] devtool ide plugin Date: Tue, 5 Sep 2023 18:51:09 +0200 Message-ID: <20230905165913.2560907-1-adrian.freihofer@siemens.com> X-Mailer: git-send-email 2.41.0 MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Tue, 05 Sep 2023 16:59:43 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-core/message/187232 Changes in comparison to v4: - Fix the sstatetests.SStateHashSameSigs4.test_sstate_noop_samesigs This was easy to reproduce and understand --> should be fixed. - Fix devtool.DevtoolIdeTests: - Pass the Qemu IP address to devtool ide (do not use the default) - Improve error message to provide more information - Tag tests with @OETestTag("runqemu") - Improve the coverage of the meson specific devtool ide test. According to https://www.yoctoproject.org/community/yocto-project-engineering-request-for-quotation/ one of the proposed areas for development of the Yocto project is "VSCode IDE Integration - New developer tooling". One aspect of this larger topic is helping application developers configure the IDE to work on a recipe's source code using Yocto's eSDK. This patchset provides a new devtool plugin (devtool ide) that does this fully automatically for recipes inheriting the cmake or the meson bbclass. Support for more programming languages and build tools may be added in the future. Let's start with a brief introduction of how it looks like from a user's perspective. Reference setup --------------- $ . oe-init-build-env Add the following layers to bblayers.conf file: - meta - meta-poky - meta-yocto-bsp - meta-selftest Add the following to the local.conf IMAGE_CLASSES += "image-combined-dbg" IMAGE_GEN_DEBUGFS = "1" IMAGE_FEATURES += "ssh-server-dropbear debug-tweaks" IMAGE_INSTALL:append = "\ cmake-example-ptest \ meson-example-ptest \ gdbserver \ " Working on a recipe ------------------- Note for those who "hate cmake with passion": Replace cmake by meson in the following commands. 1. Add the recipe which should be modified to the workspace $ devtool modify cmake-example 2. Build the eSDK. This provides all the host tools as well as an image which can be used on the target device. Since everything is built with one bitbake command also all the debug symbols are expected to be consistent. $ devtool ide cmake-example core-image-minimal 3. Install the image on the target device or simply use Qemu $ runqemu 4. Start VSCode $ code "$BUILDDIR/workspace/sources/cmake-example" 5. Work in VSCode, after installing the proposed plugins Ctrl + Shift + p, cmake Select Configure Preset Ctrl + Shift + p, cmake Build 6. Execute the unit tests on the host works with Qemu even for cross compiled test executables. Ctrl + Shift + p, cmake Test 7. Remote debugging with GDB Ctrl + Shift + p, Run Task --> install && deploy-target cmake-example F5 (Debug configuration might be selected before) 8. Work on the recipes and call bitbake again to get the SDK updated. Building the application by calling cmake (from the IDE) or by calling bitbake or by calling devtool build is expected to produce the exact same results. To make that possible, the devtool ide plugin is designed to configure the IDE to call cmake with the exact same configuration as used by bitbake when building the recipe. Unlike the eSDK, the goal here is clearly that there is no longer a separation between the SDK and the application development process. Regardless of which tool is called, the same source files are edited and the same o-files are generated and re-used. Working with a SDK without a recipe ----------------------------------- If devtool ide is called for a recipe named none or meta-ide-support the eSDK with its generic environment file gets generated. In case of using VSCode and cmake in addition to the well known environment file a cmake-kit https://vector-of-bool.github.io/docs/vscode-cmake-tools/kits.html is added to the User-Local Kits. This allows to work with cmake calling the cross-toolchain out of VSCode or a shell with the environment file sourced. Design ------ The goal of this implementation is to create a configuration for VSCode (or other IDEs) that allows to work on the code of a recipe completely independent from bitbake. bitbake is only called if the configuration or the whole SDK has to be regenerated. But bitbake should not need to be called while working in the IDE. This has two major advantages over calling devtool build from the IDE: - The IDE provides plugins for integration with cmake, for example. These features are usable, which would not be the case if bitbake or devtool are called from within the IDE. - It is much faster. Supporting other IDEs --------------------- Focus is currently VSCode. But a paramter "--ide=none" is already supported. With this paramter passed, no VSCode specific config files are generated. Instead, simple scripts are generated, which should be suitable for integration with other IDEs. Testing ------- Reasonable but not yet complete test coverage is provided by: $ oe-selftest -r devtool.DevtoolIdeTests What's next? ------------ - There is still a lot of room for improvement. But nonetheless, it provides a first implementation that could be integrated into the core, I think. Unfortunately there was no feedback on my RFC at https://lists.openembedded.org/g/openembedded-core/message/183819 so far. - Support for more build-tools and programming languages as well as more IDEs should be possible. To prove the extendability 2 of both are already supported. Adrian Freihofer (14): vscode: add minimal configuration cmake.bbclass: refactor cmake args cmake.bbclass: cleanup spaces and tabs cmake.bbclass: support qemu devtool: new ide plugin tests: add a C++ example recipe cmake-example: workaround for pseudo breakeage refactor: make multiprocess_launch callable without d refactor: make strip_execs callable without d devtool: refactor deploy-target devtool: ide make deploy-target quicker oe-selftest devtool: refactor runqemu pre-requisites oe-selftest devtool: ide tests docs: cover devtool ide .gitignore | 2 + .vscode/settings.json | 32 + documentation/sdk-manual/extensible.rst | 97 +- meta-selftest/recipes-test/cpp/.gitignore | 1 + .../recipes-test/cpp/cmake-example.bb | 23 + .../recipes-test/cpp/cmake-example/run-ptest | 10 + .../recipes-test/cpp/cpp-example.inc | 24 + .../recipes-test/cpp/files/CMakeLists.txt | 60 + .../cpp/files/cpp-example-lib.cpp | 17 + .../cpp/files/cpp-example-lib.hpp | 16 + .../recipes-test/cpp/files/cpp-example.cpp | 16 + .../recipes-test/cpp/files/meson.build | 34 + .../cpp/files/test-cpp-example.cpp | 19 + .../recipes-test/cpp/meson-example.bb | 17 + .../recipes-test/cpp/meson-example/run-ptest | 10 + meta/classes-global/staging.bbclass | 3 +- meta/classes-recipe/cmake.bbclass | 70 +- meta/conf/bitbake.conf | 2 +- meta/lib/oe/package.py | 7 +- meta/lib/oe/utils.py | 12 +- meta/lib/oeqa/selftest/cases/devtool.py | 227 +++- scripts/lib/devtool/__init__.py | 5 +- scripts/lib/devtool/deploy.py | 230 ++-- scripts/lib/devtool/ide.py | 1185 +++++++++++++++++ 24 files changed, 1956 insertions(+), 163 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 meta-selftest/recipes-test/cpp/.gitignore create mode 100644 meta-selftest/recipes-test/cpp/cmake-example.bb create mode 100644 meta-selftest/recipes-test/cpp/cmake-example/run-ptest create mode 100644 meta-selftest/recipes-test/cpp/cpp-example.inc create mode 100644 meta-selftest/recipes-test/cpp/files/CMakeLists.txt create mode 100644 meta-selftest/recipes-test/cpp/files/cpp-example-lib.cpp create mode 100644 meta-selftest/recipes-test/cpp/files/cpp-example-lib.hpp create mode 100644 meta-selftest/recipes-test/cpp/files/cpp-example.cpp create mode 100644 meta-selftest/recipes-test/cpp/files/meson.build create mode 100644 meta-selftest/recipes-test/cpp/files/test-cpp-example.cpp create mode 100644 meta-selftest/recipes-test/cpp/meson-example.bb create mode 100644 meta-selftest/recipes-test/cpp/meson-example/run-ptest create mode 100755 scripts/lib/devtool/ide.py