Index: zorg/buildbot/builders/LLVMEmbeddedToolchainForArmBuilder.py =================================================================== --- /dev/null +++ zorg/buildbot/builders/LLVMEmbeddedToolchainForArmBuilder.py @@ -0,0 +1,165 @@ +from buildbot.plugins import steps +from buildbot.process.factory import BuildFactory +from buildbot.steps.shell import ShellCommand + +from zorg.buildbot.commands.CmakeCommand import CmakeCommand +from zorg.buildbot.commands.NinjaCommand import NinjaCommand + + +def getLLVMEmbeddedToolchainForArmBuildFactory( + test=True, + env=None, # Environmental variables for all steps. + extra_configure_args=None, + **kwargs +): + # Prepare environmental variables. Set here all env we want everywhere. + merged_env = { + "TERM": "dumb", # Make sure Clang doesn't use color escape sequences. + } + if env is not None: + # Overwrite pre-set items with the given ones, so user can set anything. + merged_env.update(env) + + f = BuildFactory() + + # Check out & patch repos. + + f.addStep( + steps.Git( + name="Check out LLVM-embedded-toolchain-for-Arm", + repourl="https://github.com/ARM-software/LLVM-embedded-toolchain-for-Arm.git", + progress=True, + workdir="LLVM-embedded-toolchain-for-Arm", + retryFetch=True, + clobberOnFailure=True, + method="fresh", + ) + ) + + for repo, repourl, patch_file in [ + ( + "llvm-project", + "https://github.com/llvm/llvm-project.git", + "llvm-HEAD.patch", + ), + ( + "picolibc", + "https://github.com/picolibc/picolibc.git", + "picolibc-HEAD.patch", + ), + ]: + f.addStep( + steps.Git( + name="Check out %s" % repo, + repourl=repourl, + progress=True, + workdir=repo, + retryFetch=True, + clobberOnFailure=True, + method="fresh", + ) + ) + f.addStep( + ShellCommand( + name="Reset %s" % repo, + command=["git", "reset", "--hard"], + workdir=repo, + haltOnFailure=True, + env=merged_env, + ) + ) + f.addStep( + ShellCommand( + name="Patch %s" % repo, + command=[ + "git", + "apply", + "../LLVM-embedded-toolchain-for-Arm/patches/%s" + % patch_file, + ], + workdir=repo, + haltOnFailure=True, + env=merged_env, + ) + ) + + # Clean build directory. + f.addStep(steps.RemoveDirectory(dir="build")) + f.addStep(steps.MakeDirectory(dir="build")) + + # Install Meson. + f.addStep( + ShellCommand( + name="create-python-venv", + command=["python3", "-m", "venv", "venv"], + haltOnFailure=True, + env=merged_env, + ) + ) + + f.addStep( + ShellCommand( + name="install-meson", + command=["./venv/bin/pip", "install", "meson==0.61.5"], + haltOnFailure=True, + env=merged_env, + ) + ) + + # Configure. + cmake_options = ( + [] if extra_configure_args is None else extra_configure_args[:] + ) + + CmakeCommand.applyRequiredOptions( + cmake_options, + [ + ("-G", "Ninja"), + ("-DFETCHCONTENT_SOURCE_DIR_LLVMPROJECT=", "../llvm-project"), + ("-DFETCHCONTENT_SOURCE_DIR_PICOLIBC=", "../picolibc"), + ( + "-DMESON_EXECUTABLE=", + util.Interpolate("%(prop:builddir)s/venv/bin/meson"), + ), + ], + ) + + f.addStep( + CmakeCommand( + name="Configure", + options=cmake_options, + path="../LLVM-embedded-toolchain-for-Arm", + haltOnFailure=True, + description=["configure"], + workdir="build", + env=merged_env, + doStepIf=FileDoesNotExist("CMakeCache.txt"), + ) + ) + + # Build. + f.addStep( + NinjaCommand( + name="Build", + targets=["llvm-toolchain"], + haltOnFailure=True, + description=["build"], + workdir="build", + env=merged_env, + ) + ) + + # Test. + f.addStep( + NinjaCommand( + name="Test", + targets=["check-llvm-toolchain"], + haltOnFailure=True, + description=["check"], + workdir="build", + env=merged_env, + doStepIf=test, + ) + ) + + return f