From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by mx.groups.io with SMTP id smtpd.web10.20067.1670430266245668301 for ; Wed, 07 Dec 2022 08:24:26 -0800 Authentication-Results: mx.groups.io; dkim=fail reason="body hash did not verify" header.i=@linux.microsoft.com header.s=default header.b=WIGqbB05; spf=pass (domain: linux.microsoft.com, ip: 13.77.154.182, mailfrom: mikuback@linux.microsoft.com) Received: from localhost.localdomain (unknown [47.201.8.94]) by linux.microsoft.com (Postfix) with ESMTPSA id 4EBA620B83E7; Wed, 7 Dec 2022 08:24:25 -0800 (PST) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 4EBA620B83E7 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1670430265; bh=a/btbBdvVGOP6W8uM2lIRVpprvWcGr7kFTgS+IE8aqE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WIGqbB05xbu3ZneBeBZRb0xR5lEBe2YI6FEFpWRUMRQTWjRJ0os3LBOhByKB/6Ngk fJOp4+spBDeG04s+57hJc8Tm5mIbjvSqKBbUFjCALWAuLJ8hTUbi4zzJ86WWjfTBZc 1Kd9ucRwJKr8xex4II8rL4gexRwFbhs/YByFrM+s= From: "Michael Kubacki" To: devel@edk2.groups.io Cc: Sean Brogan , Michael D Kinney , Liming Gao Subject: [edk2-wiki][PATCH v3 1/4] Add initial How to Build with Stuart Document Date: Wed, 7 Dec 2022 11:24:00 -0500 Message-Id: <20221207162403.337-2-mikuback@linux.microsoft.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20221207162403.337-1-mikuback@linux.microsoft.com> References: <20221207162403.337-1-mikuback@linux.microsoft.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable From: Michael Kubacki Adds a new document that comprehensively describes how to manually set up a build environment using Stuart. Covers the following topics: 1. Pre-requisites - Git, Python, compilers, SDKs, etc. 2. Initial steps - Cloning the repo, set up Python virtual env, etc. 3. Stuart command explanation and corresponding examples 4. Common developer scenarios with examples showing what to do 5. Common questions section with answers Stuart presents a relatively consistent interface to build most content in edk2 so this document is meant as a long-term starting point for new contributors to understand the basics of using Stuart for various areas they are working in within edk2. Cc: Sean Brogan Cc: Michael D Kinney Cc: Liming Gao Signed-off-by: Michael Kubacki --- How-to-Build-With-Stuart.md | 758 ++++++++++++++++++++ 1 file changed, 758 insertions(+) diff --git a/How-to-Build-With-Stuart.md b/How-to-Build-With-Stuart.md new file mode 100644 index 000000000000..1f107f5bf7c2 --- /dev/null +++ b/How-to-Build-With-Stuart.md @@ -0,0 +1,758 @@ +# How to Build in edk2 with Stuart + +EDK II packages are easy to build with set of tools called "stuart". + +>=F0=9F=92=A1 If you are familiar with the `build` command and would lik= e to learn about `build` vs `stuart`, +> [click here](Build-Instructions.md#build-option-comparison). + +Steps are split into two categories: [(1) one-time](#one-time-steps) and= [(2) regular use](#regular-use-steps). + +## One-Time Steps + +If you've already completed these steps you don't need to run them again= . + +
+ Pre-requisites (Git, Python, Compiler) +
+ +
    +
  • + Git - Source Control Management (SCM) Tool + + Git is the source control management tool used by this project. + + You need git to pull the edk2 source code onto your syste= m, make changes in the code, and submit + your changes back to the GitHub repository. + + Git Downlo= ad Page +
  • +
  • + Python + + Python is a programming language that many of the edk2 build tools are= written in. + + You will need Python to run the edk2 build tools including stuar= t, which is written in Python. + + It is recommended you install a Python version that is equal to the ve= rsion used in the + UsePythonVersion@0 step in this file + .azurepipelines/templat= es/pr-gate-steps.yml. + + That version is constantly tested against the code in the repository. + + Python= Download Page +
  • +
  • + C Compiler + + A C compiler is needed to compile the firmware code. + + Several options are available. This is an area where direct guidance c= annot be provided. + + You will need to choose a compiler supported on your host operating sy= stem and the particular firmware packages + you are building. + + However, it is common to use: +
      +
    • GCC on Li= nux
    • +
      + Ubuntu GCC Installation Instructions + apt-get update && apt-get install -y build-essential git nas= m wget m4 bison flex uuid-dev python unzip acpica-tools gcc-multilib +
      +
    • Visual Studio on Windows
    • +
      + Visual Studio Installation Instructions (Windows) +
      +
      + Visual Studio 2022 Installation Instructions +
      +

      + Click to download Visual Studio 2022 Build Tools +

      +
        +
      1. + Open an Administrator Command Prompt by rig= ht-clicking on Command Prompt + and select Run as Administrator +
      2. +
      3. + Change to the directory where you downloaded the vs_Bu= ildTools.exe file + (e.g. C:\Downloads) +
      4. +
      5. + Enter the following command: +
        + + start /w vs_BuildTools.exe --quiet --wait --norestart --no= cache --installPath C:\BuildTools ^ + --add Microsoft.VisualStudio.Component.VC.CoreBuildTools -= -add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 ^ + --add Microsoft.VisualStudio.Component.Windows11SDK.22000 = --add Microsoft.VisualStudio.Component.VC.Tools.ARM ^ + --add Microsoft.VisualStudio.Component.VC.Tools.ARM64 + +
      6. +
      +
      +
      +
      + Visual Studio 2019 Installation Instructions +
      +

      + Click to download Visual Studio 2019 Build Tools +

      +
        +
      1. + Open an Administrator Command Prompt by right= -clicking on Command Prompt + and select Run as Administrator +
      2. +
      3. + Change to the directory where you downloaded the vs_Buil= dTools.exe file + (e.g. C:\Downloads) +
      4. +
      5. + Enter the following command: +
        + + start /w vs_BuildTools.exe --quiet --wait --norestart --noca= che --installPath C:\BuildTools ^ + --add Microsoft.VisualStudio.Component.VC.CoreBuildTools --a= dd Microsoft.VisualStudio.Component.VC.Tools.x86.x64 ^ + --add Microsoft.VisualStudio.Component.Windows10SDK.19041 --= add Microsoft.VisualStudio.Component.VC.Tools.ARM ^ + --add Microsoft.VisualStudio.Component.VC.Tools.ARM64 + +
      6. +
      +
      +
      +
      + Visual Studio 2017 Installation Instructions +
      +

      + Click to download Visual Studio 2017 Build Tools +

      +
        +
      1. + Open an Administrator Command Prompt by right-c= licking on Command Prompt and + select Run as Administrator +
      2. +
      3. + Change to the directory where you downloaded the vs_BuildT= ools.exe file + (e.g. C:\Downloads) +
      4. +
      5. + Enter the following command: +
        + + start /w vs_BuildTools.exe --quiet --wait --norestart --noca= che --installPath C:\BuildTools ^ + --add Microsoft.VisualStudio.Component.VC.CoreBuildTools --a= dd Microsoft.VisualStudio.Component.VC.Tools.x86.x64 ^ + --add Microsoft.VisualStudio.Component.Windows10SDK.17763 --= add Microsoft.VisualStudio.Component.VC.Tools.ARM ^ + --add Microsoft.VisualStudio.Component.VC.Tools.ARM64 + +
      6. +
      +
      +
      +

      +

        +
      • + Note: You can find the latest version of Visual Studio support= ed by edk2 on the + CI Status section of the + repo readme file. +
      • +
      • + Note: If you still run into build problems finding tools in th= e SDK, try installing the Windows SDK manually + using the following instructions. +
      • +
      +

      +
      + Optional: Install the Windows SDK manually +
      +

      + Download the Windows Software Development Kit (SDK) from + Windows Dev Center - Windows SDK +

      +

      + Follow the default options until you reach the "Select t= he features you want to install" page. +

      + Select the following options: +
        +
      • Windows SDK Signing Tools for Desktop Apps
      • +
      • Windows SDK for UWP Managed Apps
      • +
      • Windows SDK for UWP C++ Apps
      • +
      • Windows SDK for Desktop C++ x86 Apps
      • +
      • Windows SDK for Desktop C++ amd64 Apps
      • +
      • Windows SDK for Desktop C++ arm Apps
      • +
      +

      + Click Download and complete the installation pr= ocess. +

      +
      +
      +
    +
  • +
  • + Mono (Linux) +

    Mono needs to be installed on Linux.

    + apt-get install mono-complete +
  • +
+
+
+ +1. Clone the edk2 repo + - Open a command-prompt in the directory where you would like to keep= the edk2 repo + - Clone the repo + - Example: `git clone edk2` + +2. Change into the edk2 directory + - `cd edk` + +3. Create a Python virtual environment + - Note that the steps differ between Linux and Windows. + -
+ Linux Instructions + python -m venv .venv +
+ source .venv/bin/activate +
+ -
+ Windows Instructions + py -m venv .venv +
+ .venv\Scripts\activate.bat +
+ +4. Tell Git to ignore the Python virtual environment + + The problem: Git will try to track your Python virtual environment a= s new code changes if it is not told to + ignore it. + + - Open the file `.git/info/exclude` + - `cd .git` + - `cd info` + - Open the `exclude` file in a text editor + - Add the following line to the end of the file: + - `*venv*/**` + - Close the file + - Note: Git will no longer try to track your Python virtual environm= ents in this repository. + +That's it! + +Your terminal may now indicate that a virtual environment is active by s= howing `(.venv)` before the +current line. + +## Regular Use Steps + +These are steps you should run on a regular basis. + +The steps are split into three categories: (1) once per session, (2) whe= n dependencies are updated, and (3) before +each build. + +### Once Per Session Steps + +These assume your command prompt is in the edk2 repository directory. + +1. Activate the Python virtual environment + - Linux + - `source .venv/bin/activate` + - Windows + - `.venv\Scripts\activate.bat` + +2. Update Python PIP modules + - `pip install -r pip-requirements.txt --upgrade` + +3. Get updated code dependencies + - `stuart_setup -c .pytool/CISettings.py` + +That's it! + +### When Dependencies are Updated Steps + +The edk2 repo has a number of dependencies on external content. For exam= ple, it depends on git submodules, Python pip +modules, tools in the form of application binaries, etc. If the correspo= nding version information for these is updated +in the repo, you will need to pull the update. + +The recommended steps to update dependencies are in this section. + +#### Git Submodules + +`git submodule update --init --recursive` + +#### Python PIP Modules + +`pip install -r pip-requirements.txt --upgrade` + +#### Rebuild BaseTools + +See the [BaseTools build example](#example-i-want-to-build-basetools). + +### Before Each Build Steps + +Now every time you would like to build the code, you only need to run th= e following commands until you end this +session and return. + +1. Update other dependencies (like binaries) + - `stuart_update -c .pytool/CISettings.py` + +2. Run CI build (--help will give you options) + - `stuart_ci_build -c .pytool/CISettings.py TOOL_CHAIN_TAG=3D` + + - Common options: + - `-p `: To build only certain packages use a co= mma-separated list + - `-a `: To run only certain architectures us= e a comma-separated list + - `-t `: To run only tests related to certain t= argets use a comma-separated list + +That's it to do a basic build. + +The remainder of this page contains more details about the `stuart_ci_bu= ild` and `stuart_build` commands. + +--- + +## Examples + +
+ Example: I want to build MdeModulePkg to test a change I made= there. +
+

+ The important parameter here is the -p parameter which = specifies that MdeModulePkg + should be built. +

+

+ The example below uses: +

    +
  • + The TOOL_CHAIN_TAG parameter to specify the build s= hould use VS2019 + (Visual Studio 2019). +
  • +
  • + The -a parameter is used to specify that the = IA32 and X64 architectures + should be built. +
  • +
+

+ + stuart_ci_build -c .pytool/CISettings.py -p MdeModulePkg -a IA32,= X64 TOOL_CHAIN_TAG=3DVS2019 +
+
+ +
+ Example: I want to build OvmfPkg to test a change I made ther= e. +
+

+ OvmfPkg is considered a "platform firmware" for the + QEMU open-source= emulator. +

+ + + stuart_build -c PlatformBuild.py -p OvmfPkg -a IA32,X64 TOOL_CHAI= N_TAG=3DVS2019 + +

+ If you want to run CI checks such as CI plugins, you can use s= tuart_ci_build with the CI build file. +

+ + stuart_ci_build -c .pytool/CISettings.py -p OvmfPkg -a IA32,X64 T= OOL_CHAIN_TAG=3DVS2019 +
+
+ +
+ Example: I want to build OvmfPkg and automatically run with m= y firmware after build. +
+

+ OvmfPkg is considered a "platform firmware" for the + QEMU open-source= emulator. +

+ + + +

+ To see what parameters are supported by this platform build file (at= the time this page was written), we can pass + the --help argument to the stuart_build co= mmand: +

+ +
+    =E2=9D=AF stuart_build -c PlatformBuild.py --help
+    usage: stuart_build [-h] [--SKIPBUILD] [--SKIPPREBUILD] [--SKIPPOSTB=
UILD] [--FLASHONLY] [--FLASHROM]
+                        [--UPDATECONF] [--CLEAN] [--CLEANONLY] [--OUTPUT=
CONFIG OUTPUTCONFIG] [-a BUILD_ARCH]
+                        [--build-config BUILD_CONFIG] [--verbose]
+
+    options:
+      -h, --help            show this help message and exit
+      --SKIPBUILD, --skipbuild, --SkipBuild
+                            Skip the build process
+      --SKIPPREBUILD, --skipprebuild, --SkipPrebuild
+                            Skip prebuild process
+      --SKIPPOSTBUILD, --skippostbuild, --SkipPostBuild
+                            Skip postbuild process
+      --FLASHONLY, --flashonly, --FlashOnly
+                            Flash rom after build.
+      --FLASHROM, --flashrom, --FlashRom
+                            Flash rom. Rom must be built previously.
+      --UPDATECONF, --updateconf, --UpdateConf
+                            Update Conf. Builders Conf files will be rep=
laced with latest template files
+      --CLEAN, --clean, --CLEAN
+                            Clean. Remove all old build artifacts and in=
termediate files
+      --CLEANONLY, --cleanonly, --CleanOnly
+                            Clean Only. Do clean operation and don't bui=
ld just exit.
+      --OUTPUTCONFIG OUTPUTCONFIG, --outputconfig OUTPUTCONFIG, --Output=
Config OUTPUTCONFIG
+                            Provide shell variables in a file
+      -a BUILD_ARCH, --arch BUILD_ARCH
+                            Optional - CSV of architecture to build. IA3=
2 will use IA32 for Pei & Dxe. X64 will use
+                            X64 for both PEI and DXE. IA32,X64 will use =
IA32 for PEI and X64 for DXE. default is
+                            IA32,X64
+      --build-config BUILD_CONFIG
+                            Provide shell variables in a file
+      --verbose, --VERBOSE, -v
+                            verbose
+
+    positional arguments:
+      =3D              - Set an env variable for the pre/pos=
t build process
+      BLD_*_=3D        - Set a build flag for all build type=
s
+                                  (key=3Dvalue will get passed to build =
process)
+      BLD__=3D - Set a build flag for build type of =

+                                  (key=3Dvalue will get passed to build =
process for given build type)
+  
+

+ The --flashonly and --flashrom commands ar= e especially useful with OvmfPkg. They + automatically load QEMU with the newly built firmware. +

+

+ The example below uses: +

    +
  • + The TOOL_CHAIN_TAG parameter to specify that the bu= ild should use GCC5 + to build with GCC. +
  • +
  • + The -a parameter is used to specify the IA32<= /code> and X64 architectures should be + built. +
  • +
  • + The --flashrom parameter is used to load the firmwa= re in QEMU and boot QEMU after the firmware build + is completed. +
  • +
+

+ + stuart_build -c PlatformBuild.py -p OvmfPkg -a IA32,X64 TOOL_CHAI= N_TAG=3DGCC5 --flashrom +
+
+ +
+ Example: I want to b= uild BaseTools. +
+ BaseTools has its own build script= that leverages + edk2-pytools to build the BaseT= ools applications. +
+
+
+ Linux (Ubuntu) Pre-Steps + sudo apt update +
+ sudo apt install build-essential uuid-dev +
+

+ The file BaseTools/Edk2ToolsBuild.py<= /a> + can be called as a standalone Python script. You just need to pass t= he tool chain tag you would like to build with. +

+

+ Example: + python BaseTools/Edk2ToolsBuild.py -t GCC5 +

+
+
+ +
+ Example: I just want to check if my changes will pass all the= non-compiler checks in CI. +
+

+ The NO-TARGET build target specifies that the actual fi= rmware source code should not be built for any + particular target and, instead, the other parts of the CI process wi= ll be active such as the non-compiler checks + (plugins). +

+

+ In the following example, the CI plugins will be run against all pac= kages supported by the + CISettings.py file. +

+ stuart_ci_build -c .pytool/CISettings.py -t NO-TARGET +

+ The CI checks could be run against a single package (or a selection = of packages) by passing the package names to + with the -p parameter. +

+ stuart_ci_build -c .pytool/CISettings.py -p MdePkg,UefiCpuPkg -t = NO-TARGET +
+
+ +
+ + Example: I want to fix all the spelling errors in my package. How do= I just run the spell check plugin? + +
+

+ Plugins are automatically discovered in the workspace by stuart. +

+

+ The easiest way to have stuart only one run plugin if many others ar= e present (as is the case in edk2) is to simply + delete the other plugin directories so they are not discovered. You = can then test with the remaining plugins and + then use git to restore the deleted plugin directories back when don= e testing. +

+

+ For example, to only test with the SpellCheck plugin, d= elete every other plugin folder from + .pytool/Plugin in your + workspace. +

+

+ Run the command to only perform CI checks: +
+ stuart_ci_build -c .pytool/CISettings.py -t NO-TARGET +

+

+ When done, restore the other plugin directories: +
+ git restore .pytool/Plugin/** +

+
+
+ +## Common Questions + +
+ What is CI? +
+

+ Continuous Integration +

+

+ Continuous integration is used in edk2 to test new contributions bef= ore they are merged to the edk2 main branch. + Stuart is used within the edk2 CI process to pull build dependencies= and build the code. +

+

+ You can use stuart to perform the same CI checks locally that are do= ne on the server (see the examples section). +

+

+ Also see EDK II Continuous = Integration. +

+
+
+ +
+ What are BaseTools? +
+

A collection of build related tools for edk2.

+

+ Examples: + +

    +
  • AutoGen
  • +
  • Build
  • +
  • GenSec
  • +
  • GenFV
  • +
  • GenFW
  • +
  • GenRds
  • +
+

+

+ Each tool has a user manual located in Base= Tools/UserManuals. +

+

+ A more complete list of BaseTools is located in the EDK II Tools List. +

+
+
+ +
+ What are edk2-pytools? +
+

A collection of Python code for working with edk2.

+
    +
  • + edk2-pytool-library - Python + library code that seeks to provide an easy way to organize and sha= re edk2 related functionality to facilitate + reuse across environments, tools, and scripts. +
  • +
  • + edk2-pytool-extensions - A + Python project that consists of command line and other tools and e= xtensions for building and maintaining an edk2 + based UEFI firmware code tree. +
  • +
+
+
+ +
+ What is CISettings.py? +
+

+ CISettings.py is a common name given to a configuration= file used with Stuart for CI. It is often + stored in a folder named .pytools in the root of a repo= sitory. So you'll likely encounter commands + like the following be used with the file: +

+ +
    +
  • + + stuart_ci_setup -c .pytool/CISettings.py TOOL_CHAIN_TAG=3DPUT_TAG_= VALUE_HERE + +
  • +
  • + + stuart_update -c .pytool/CISettings.py TOOL_CHAIN_TAG=3DPUT_TAG_VA= LUE_HERE + +
  • +
  • + + stuart_ci_build -c .pytool/CISettings.py TOOL_CHAIN_TAG=3DPUT_TAG_= VALUE_HERE + +
  • +
+
+
+ +
+ What is PlatformBuild.py? +
+

+ PlatformBuild.py is a common name given to a configurat= ion file used with Stuart for platform build. + It is often stored in the root directory of the package it builds. +

+

+ For example: +

+
    +
  • + + stuart_setup -c SomePkg/PlatformBuild.py TOOL_CHAIN_TAG=3DPUT_TAG_= VALUE_HERE + +
  • +
  • + + stuart_update -c SomePkg/PlatformBuild.py TOOL_CHAIN_TAG=3DPUT_TAG= _VALUE_HERE + +
  • +
  • + + stuart_build -c SomePkg/PlatformBuild.py TOOL_CHAIN_TAG=3DPUT_TAG_= VALUE_HERE + +
  • +
+

+ Like Stuart CI has "CI plugins", the build process has "build plugin= s". These can hook into the build in + "pre-build" or "post-build". +

+
+ Note: Build plugins will also run during CI if a CompilerPlugin is p= resent that builds the code. +
+
+
+ +
+ + What is the difference between stuart_ci_build and stuart_build? + +
+
    +
  • + stuart_ci_build - Runs CI plugins. By default, often = runs CI on several packages at once. This + includes all of the checks needed to consider the code ready for i= ntegration to the mainline. +
  • +
  • + stuart_build - Does not run CI plugins. Builds one pl= atform. Platforms often expose + platform-specific parameters as defined in their PlatformBui= ld.py file. +
  • +
+
+
+ +
+ What does stuart_ci= _build do exactly? +
+

+ The Stuart CI process is composed of "CI plugins" that get discovere= d in the code tree at CI time and hook into + the CI process. Some examples of CI plugins are a host-based unit te= st compile and execution, spell checking the + code, performing markdown lint on the code, etc. Firmware (C code) c= ompilation is performed during CI by a compiler + CI plugin. +

+

+ Each plugin reports back a pass/fail status. If any plugin fails, CI= fails. However, plugins usually provide some + level of customization in a "CI package configuration file". If this= file is present, it is in the root of the + package with the naming convention PkgName.ci.yaml. For= example, + MdePkg.ci.yaml is + the CI package configuration file for MdePkg. Sometimes= , CI plugins will allow the plugin to be set to + run in "audit mode" so the plugin will run and report results but no= t fail CI if errors are found. As an example, + some packages in edk2 currently use this file to run the spell check= er CI plugin in audit mode. +

+

+ The two main places to look for CI settings are: +

    +
  • The CISettings.py file - Usually has repo-wide CI settings +
  • The CI package configuration file - Has package-specific CI se= ttings for a given package
  • +
+

+
+
+ +
+ + How do I get more detailed information if an error happens? + +
+

+ You can pass the -v argument to Stuart commands to get = more detailed output. +

+

+ Also, look in your /Build directory. +

+

+ Each Stuart command produces a separate file. Open the file correspo= nding to the command you're using that has the + failure. +

+
    +
  • stuart_ci_setup - CISETUP.txt
  • +
  • stuart_setup - SETUPLOG.txt
  • +
  • stuart_update - UPDATE_LOG.txt
  • +
  • stuart_ci_build - CI_BUILDLOG.txt
  • +
  • stuart_build - BUILDLOG_PACKAGENAME.txt
  • +
+
+
+ +
+ What are "plugins"? +
+

+ The different types of plugins supported by Stuart and details about= each type are available in the + edk2-pytoo= l-extensions Plugin Manager + page. +

+
+
+ +
+ How do I ge= t lower-level technical details? +
+

+ Start in the + edk2-pytool-extensions User = Documentation. +

+
+
--=20 2.28.0.windows.1