Hello Simon,

On Sun, 2020-02-23 at 19:34 -0700, Simon Glass wrote:
> Hi Heiko,
> 
> Thanks for the hints! I pushed your things here:
> 
> https://github.com/sglass68/tbot/tree/simon
> 
> Then I try:
> tbot -l kea.py -b pcduino3.py uboot_build
> 
> and get an error:
> 
> tbot starting ...
> type <class 'module'>
> ├─Calling uboot_build ...
> │   └─Fail. (0.000s)
> ├─Exception:
> │   Traceback (most recent call last):
> │     File 
> "/home/sglass/.local/lib/python3.6/site-packages/tbot-0.8.0-py3.6.egg/tbot/main.py",
> line 318, in main
> │       func(**params)
> │     File 
> "/home/sglass/.local/lib/python3.6/site-packages/tbot-0.8.0-py3.6.egg/tbot/decorators.py",
> line 103, in wrapped
> │       result = tc(*args, **kwargs)
> │     File 
> "/home/sglass/.local/lib/python3.6/site-packages/tbot-0.8.0-py3.6.egg/tbot/tc/uboot/build.py",
> line 271, in _build
> │       builder = UBootBuilder._get_selected_builder()
> │     File 
> "/home/sglass/.local/lib/python3.6/site-packages/tbot-0.8.0-py3.6.egg/tbot/tc/uboot/build.py",
> line 160, in _get_selected_builder
> │       builder = getattr(tbot.selectable.UBootMachine, "build")
> │   AttributeError: type object 'UBootMachine' has no attribute 'build'
> 
> I'm a bit lost in all the classes and functions. A working example or
> a patch would be great!
> 
> I've pushed all my scripts here:
> 
> https://github.com/sglass68/ubtest
> 
> The top commit is your patches.

I think you mixed a few things up while adding Heiko's stuff.  Instead
of your last commit, attempt the attached patch.  It is untested of
course but should point you in the right direction; here is a short
summary of what it adds:

    1. Your `kea` lab needs to be marked as a build-host.  This means it
       needs the `toolchains` property which returns what toolchains are
       available.  I added a dummy armv7-a toolchain which might need
       a bit more adjustment to work for you.

    2. I created a UBootBuilder for pcduino3.  This builder just
       specifies what defconfig to build and what toolchain to use (need
       to be defined in the selected lab).

       Heiko's builder config is a bit more elaborate and also does some
       patching after applying the defconfig.  This is of course also
       possible if you want to.

    3. I added a U-Boot config for your board which is needed because
       its `build` property specifies which U-Boot builder to use.  This
       will make the `uboot_build` testcase work properly.  Later you
       might want to adjust this U-Boot config to actually work so you
       can make use of it for flashing the new U-Boot binary.

Some more links to documentation:

    - Build-host config: https://tbot.tools/modules/machine_linux.html#builder
    - UBootBuilder class: 
https://tbot.tools/modules/tc.html#tbot.tc.uboot.UBootBuilder

Hope this helps!
-- 
Harald

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-62  Fax: +49-8142-66989-80   Email: h...@denx.de
 
> Regards,
> Simon
> 
> On Wed, 12 Feb 2020 at 22:49, Heiko Schocher <h...@denx.de> wrote:
> > Hello Simon,
> > 
> > Am 12.02.2020 um 18:14 schrieb Simon Glass:
> > > Hi Heiko,
> > > 
> > > On Wed, 12 Feb 2020 at 01:50, Heiko Schocher <h...@denx.de> wrote:
> > > > Hello Simon,
> > > > 
> > > > Am 05.02.2020 um 15:10 schrieb Simon Glass:
> > > > > Hi Tom,
> > > > > 
> > > > > On Wed, 4 Dec 2019 at 15:30, Tom Rini <tr...@konsulko.com> wrote:
> > > > > > On Fri, Nov 29, 2019 at 09:23:43PM -0700, Simon Glass wrote:
> > > > > > 
> > > > > > > Hi Tom,
> > > > > > > 
> > > > > > > I have been meaning to have a crack at setting up a little 
> > > > > > > hardware
> > > > > > > lab for a while.
> > > > > > > 
> > > > > > > I made some progress recently and hooked up a rpi_3 with sdwire 
> > > > > > > for
> > > > > > > USB/SD, ykush for power and a little computer to control it. It 
> > > > > > > builds
> > > > > > > U-Boot, sticks it on the SD card and runs pytest.
> > > > > > > 
> > > > > > > I pushed a tree here and hopefully you can see the 'hwlab' thing 
> > > > > > > at the end:
> > > > > > > 
> > > > > > > https://gitlab.denx.de/u-boot/custodians/u-boot-dm/pipelines/148
> > > > > > > 
> > > > > > > So far it is just running the 'help' test. It seems to hang with
> > > > > > > serial console problems if I try to do more. It is not 100% 
> > > > > > > reliable
> > > > > > > yet. I based it on Stephen's test hooks:
> > > > > > > 
> > > > > > > https://github.com/sglass68/uboot-test-hooks
> > > > > > > 
> > > > > > > Is it possible to share this so that others can use the lab when 
> > > > > > > they
> > > > > > > push trees? Is it as simple as adding to the .gitlab-ci.yml file 
> > > > > > > as I
> > > > > > > have done here?
> > > > > > > 
> > > > > > > https://gitlab.denx.de/u-boot/custodians/u-boot-dm/blob/gitlab-working/.gitlab-ci.yml
> > > > > > > 
> > > > > > > I also got tbot going in a similar way, to test booting into 
> > > > > > > Linux.
> > > > > > > Should we look at integrating that at the same time? It should be
> > > > > > > fairly easy to do.
> > > > > > > 
> > > > > > > I have quite a lot of random boards and in principle it should 
> > > > > > > not be
> > > > > > > too hard to hook up some more of them, with sufficient SDwires, 
> > > > > > > hubs
> > > > > > > and patience.
> > > > > 
> > > > > Bumping this thread as I have now hooked up about about 8 mostly ARM
> > > > > and x86 boards and have tbot and pytest automation mostly working for
> > > > > them.
> > > > 
> > > > Great news!
> > > > 
> > > > added Harald Seiler to cc, as he did the tbot port to python3.6.
> > > > 
> > > > Do you have somewhere your tbot integration online?
> > > 
> > > https://github.com/sglass68/ubtest
> > > 
> > > But it is tbot only.  It would be good if there were a way to upstream
> > > this stuff.
> > > 
> > > For pytest I am sending upstream to:
> > > 
> > > https://github.com/swarren/uboot-test-hooks
> > > 
> > > BTW I have not yet got tbot to build U-Boot and write it onto the
> > > board. Do you have examples for that?
> > 
> > We have them on our gitlab server, but only private as I know.
> > 
> > @Harald: Do you have some good examples somewhere online?
> > 
> > May the doc help here too:
> > 
> > http://tbot.tools/modules/tc.html#u-boot
> > 
> > and see [1]
> > 
> > > > I ask because on our ToDo list is to integrate pytest into tbot and may
> > > > we can share work?
> > > > 
> > > > > > There's two parts of this.  The first part I think is that we need 
> > > > > > some
> > > > > > good examples of how to have one private CI job poll / monitor other
> > > > > > public jobs and run.  I believe some labs do this today.  This 
> > > > > > would be
> > > > > > helpful as at least personally I'm kicking my hardware tests 
> > > > > > manually.
> > > > > > This is because as best I can tell there isn't a way to include an
> > > > > > optional stage/portion of a CI job.
> > > > > 
> > > > > So the model here is that people with a lab 'watch' various repos? I
> > > > > think that would be useful. Stephen Warren does this I think, but I'm
> > > > > not sure how the builds are kicked off.
> > > > > 
> > > > > But what about a full public lab? E.g. is it possible to add some of
> > > > > the boards I have here to every build that people do?
> > > > 
> > > > Here begins the hard game I think, because what happens if 2 builds
> > > > triggered in parallel and want to test a board in the same lab
> > > > at the same time?
> > > 
> > > The gitlab-runner thing seems to handle that.
> > 
> > Ah, so all gitlabs need to use the same gitlab runner, ok.
> > 
> > > > If you trigger the test with tbot, it should be easy to add a locking
> > > > mechanism into tbots lab specific function power_check() [1]
> > > > 
> > > > May in this power_check() function tbot waits until it get the board...
> > > > The locking mechanism itself is lab specific.
> > > > 
> > > > > > The second part is that long term, we need to most likely develop 
> > > > > > some
> > > > > > LAVA experience as that will get us easier access to various 
> > > > > > kernelci
> > > > > > labs and in turn be included in kernelci labs, when the overall SoC 
> > > > > > and
> > > > > > lab support being able to test firmware.
> > > > > 
> > > > > I wonder if these are set up for replacing firmware? It specifically
> > > > > mentions boards getting bricked, so I suspect not.
> > > > 
> > > > Unfortunately I had not yet time for looking into LAVA or kernelci.
> > > 
> > > I haven't much, but I do wonder if we could add firmware testing to it.
> > 
> > bye,
> > Heiko
> > 
> > [1] tbot u-boot build example for the aristainetos board
> > 
> > add in your board config:
> > 
> > class aristainetosUBootBuilder(lab.UBootBuilder):
> >      name = "aristainetos"
> >      defconfig = "aristainetos2_defconfig"
> >      toolchain = "linaro-gnueabi"
> >      remote = "g...@gitlab.denx.de:abb/aristainetos-uboot.git"
> > 
> >      def do_checkout(self, target: linux.Path, clean: bool) -> 
> > git.GitRepository:
> >          return git.GitRepository(
> >              target=target, url=self.remote, clean=clean, 
> > rev="aristainetos-denx"
> >          )
> > 
> > class aristainetosUBoot(lab.UBootMachine):
> >      name = "ari-ub"
> >      prompt = "=> "
> >      autoboot_prompt = None
> >      build = aristainetosUBootBuilder()
> > 
> > 
> > 
> > in your lab config (just example) you need:
> > 
> > class UBootBuilder(uboot.UBootBuilder):
> >      if tbot.selectable.LabHost.name in ["pollux", "hercules"]:
> >          remote = "/home/git/u-boot.git"
> > 
> >      def do_configure(self, bh: BH, repo: git.GitRepository[BH]) -> None:
> >          super().do_configure(bh, repo)
> > 
> >          tbot.log.message("Patching U-Boot config ...")
> > 
> >          # Add local-version tbot
> >          kconfig.set_string_value(repo / ".config", "CONFIG_LOCALVERSION", 
> > "-tbot")
> > 
> >          # Tab completion
> >          kconfig.enable(repo / ".config", "CONFIG_AUTO_COMPLETE")
> >          [...]
> > 
> > 
> > class PolluxLab(connector.ParamikoConnector, linux.Bash, linux.Lab, 
> > linux.Builder):
> > [...]
> >      def toolchains(self) -> typing.Dict[str, linux.build.Toolchain]:
> >          return {
> >              "bootlin-armv5-eabi": linux.build.EnvSetBootlinToolchain(
> >                  arch = "armv5-eabi",
> >                  libc = "glibc",
> >                  typ = "stable",
> >                  date = "2018.11-1",
> >                  ),
> >              "linaro-gnueabi": linux.build.EnvSetLinaroToolchain(
> >                  host_arch = "i686",
> >                  arch = "arm-linux-gnueabi",
> >                  date = "2018.05",
> >                  gcc_vers = "7.3",
> >                  gcc_subvers = "1",
> >                  ),
> >              "generic-armv7a": linux.build.EnvScriptToolchain(
> >                  linux.Path(
> >                      self,
> >                      
> > "/home/hs/toolchain/linaro/gcc-linaro-7.2.1-2017.11-i686_arm-linux-gnueabi",
> >                  )
> >              ),
> > 
> > for using a toolchain from bootlin or linaro, please add the attached
> > patch to tbot. If you have not installed the toolchain, this class
> > downloads it. ! This patch is development state only !
> > 
> > 
> > Now, if you want to build on the same machine add simply:
> > 
> >      def build(self) -> linux.Builder:
> >          return self
> > 
> > If you want to build on other linux machines:
> > 
> >      def build(self) -> linux.Builder:
> >          if "pollux-build" in tbot.flags:
> >              return builders.PolluxSSH(self)
> >          elif "xpert-build" in tbot.flags:
> >              return builders.XpertSSH(self)
> >          elif "hercules-build" in tbot.flags:
> >              return builders.HerculesSSH(self)
> >          elif "threadripper-build" in tbot.flags:
> >              return builders.ThreadripperSSH(self)
> > 
> > and define for example in labs/builders.py this build machines, and you
> > can select through tbot commandline flags, which build machine you
> > want to use ...
> > 
> > May we should such an example to our doc ...
> > --
> > DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
> > HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> > Phone: +49-8142-66989-52   Fax: +49-8142-66989-80   Email: h...@denx.de
From d3ba0b35ce1e6ce30874eed5a05a425c21e0e1af Mon Sep 17 00:00:00 2001
From: Harald Seiler <h...@denx.de>
Date: Mon, 24 Feb 2020 14:10:06 +0100
Subject: [PATCH] Add toolchain and builder for pcduino3

Make kea a build-host and add a cross-compiler toolchain for armv7-a.
This toolchain can be used for pcduino3.  Add a U-Boot builder config
for that board which makes use of the new toolchain.  Build using:

    tbot -l kea.py -b pcduino3.py -vv uboot_build

Signed-off-by: Harald Seiler <h...@denx.de>
---
 kea.py      | 34 ++++++++++++++++++++++++++++++++++
 pcduino3.py | 27 +++++++++++++++++++++++++++
 2 files changed, 61 insertions(+)

diff --git a/kea.py b/kea.py
index 7dd2796f333d..8c8388b5b9cf 100644
--- a/kea.py
+++ b/kea.py
@@ -1,10 +1,31 @@
 import tbot
 from tbot.machine import connector, linux
 
+
+class ArmV7Toolchain(linux.build.Toolchain):
+    def enable(self, host):
+        # Set all environment variables to "enable" this toolchain
+
+        prefix = "arm-linux-gnu-"
+        host.env("CROSS_COMPILE", prefix)
+        host.env("ARCH", "arm")
+
+        for tool in [
+            "gcc", "objdump", "size", "ar", "nm", "strings",
+            "as", "ld", "objcopy", "readelf", "strip",
+        ]:
+            host.env(tool.upper(), prefix + tool)
+
+        # Optionally set CFLAGS and LDFLAGS
+        # host.env("CFLAGS", "...")
+        # host.env("LDFLAGS", "...")
+
+
 class KeaLab(
     connector.ParamikoConnector,
     linux.Bash,
     linux.Lab,
+    linux.Builder,
 ):
     name = "sglass"
     hostname = "kea"
@@ -13,6 +34,19 @@ class KeaLab(
     def workdir(self):
         return linux.Workdir.athome(self, "tbot-workdir")
 
+    @property
+    def toolchains(self):
+        # Should return a dict of all toolchains available on this host.  Each
+        # toolchain is identified by a (unique) string.  For pcduino3 in this
+        # example, a toolchain named `armv7-a` is defined.
+        return {
+            "armv7-a": ArmV7Toolchain,
+        }
+
+    def build(self):
+        # Kea is also used as the build-host so just return (a cloned) self
+        return self.clone()
+
 
 # tbot will check for `LAB`, don't forget to set it!
 LAB = KeaLab
diff --git a/pcduino3.py b/pcduino3.py
index 9d6ad1b1bbd5..e002557f8744 100644
--- a/pcduino3.py
+++ b/pcduino3.py
@@ -2,6 +2,19 @@ import tbot
 from tbot.machine import board, channel, connector, linux
 from ykush import Ykush
 from sdwire import Sdwire
+from tbot.tc import uboot
+
+
+# The builder is a "configuration" of the U-Boot build for this board.  In its
+# simplest form you just need to configure the defconfig and toolchain which
+# should be used.
+class Pcduino3UBootBuilder(uboot.UBootBuilder):
+    name = "pcduino3"
+    # Is this the correct defconfig?
+    defconfig = "Linksprite_pcDuino3_defconfig"
+    # As defined in the lab-config (kea.py)
+    toolchain = "armv7-a"
+
 
 class Pcduino3(
     connector.ConsoleConnector,
@@ -41,6 +54,19 @@ class Pcduino3(
         # telnet, picocom or kermit do.  The minicom behavior will not work.
         return mach.open_channel("picocom", "-b", "115200", "/dev/ttyusb_port2")
 
+
+# Not sure if this the correct config for this boards U-Boot ... It does not
+# matter if you just care about building U-Boot though.
+class Pcduino3UBoot(
+    board.Connector,
+    board.UBootAutobootIntercept,
+    board.UBootShell,
+):
+    prompt = "=> "
+
+    builder = Pcduino3UBootBuilder()
+
+
 # Linux machine
 #
 # We use a config which boots directly to Linux without interaction
@@ -57,5 +83,6 @@ class Pcduino3Linux(
 
 # tbot will check for `BOARD`, don't forget to set it!
 BOARD = Pcduino3
+UBOOT = Pcduino3UBoot
 # You need to set `LINUX` now as well.
 LINUX = Pcduino3Linux
-- 
2.24.1

Reply via email to