From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2a00:1450:400c:c0c::244; helo=mail-wr0-x244.google.com; envelope-from=leif.lindholm@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-wr0-x244.google.com (mail-wr0-x244.google.com [IPv6:2a00:1450:400c:c0c::244]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 5A510211F8868 for ; Fri, 29 Jun 2018 03:52:40 -0700 (PDT) Received: by mail-wr0-x244.google.com with SMTP id c5-v6so8409187wrs.10 for ; Fri, 29 Jun 2018 03:52:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=OMvhfMfcNozsQX2AEhfFJrs1xx14uxG2gKasvVYk5cs=; b=hC96cPnWE+3SgjLvijI604r/GJw+MrygWMcXOlG/7gBnmtZuIRHFeqkatsvMBIU97O i/suuxq4lb7WghgX2vaHT1Ob9pMGpgJ9PNakWRd9MJu4fQ7vKS8P6Il4D8x2aYqjpr9U eet1PvvGXh91K0w96wadDlDnf+qTiRg5nxskU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=OMvhfMfcNozsQX2AEhfFJrs1xx14uxG2gKasvVYk5cs=; b=YY3GcYHkvi3vondwi0hGUOm3K55dPMdjtKLgZ5sLl2syjPE/AdUWrZ/CqMrOYBLSfj hr1wHVh95AGhZigUPghx4PlbVpv3BdGvNHb2mVr2HWqV5+laIC22sNflf4om8qNj/shm fEED9DlKEblJ6BQ+dTgEkWuEwGzT/g2JEOYbRwaAh6v52ZhfFf9WtxpuKLmLkJZaKtKs pEFtphsfXhozuXpLZq3YnHNCMXp58PeNiL2zFicY5IIN+0guwv9k68Z8ZMG4PyMuwxKM C3MFtSxfULFGK9rNeb2cer3/pHtBPdHi7i+K9swgG06R7sAFJtEllzh4Oz9KQJYnfHAW Md3Q== X-Gm-Message-State: APt69E3dL7jztodSxe9MmC5vmQY/xxnaHk/83Q8RC4ZrTyB5tusj9t21 SBUlvkbEMOHyyT+229FkO6IRCQ== X-Google-Smtp-Source: AAOMgpfunoh98r+pRgR+r+gpWtfJI7NR91pP2qHhrDWOlWhiKkLyNYAg7w8QUQ3cML+RgWtWw+ZixQ== X-Received: by 2002:adf:d142:: with SMTP id b2-v6mr6467564wri.17.1530269558943; Fri, 29 Jun 2018 03:52:38 -0700 (PDT) Received: from bivouac.eciton.net (bivouac.eciton.net. [2a00:1098:0:86:1000:23:0:2]) by smtp.gmail.com with ESMTPSA id 63-v6sm1693961wmv.48.2018.06.29.03.52.37 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 29 Jun 2018 03:52:37 -0700 (PDT) Date: Fri, 29 Jun 2018 11:52:35 +0100 From: Leif Lindholm To: Chris Co Cc: "edk2-devel@lists.01.org" , Ard Biesheuvel , Michael D Kinney Message-ID: <20180629105235.4hyiywrkhw3lodar@bivouac.eciton.net> References: <20180629034227.26568-1-christopher.co@microsoft.com> <20180629034227.26568-2-christopher.co@microsoft.com> MIME-Version: 1.0 In-Reply-To: <20180629034227.26568-2-christopher.co@microsoft.com> User-Agent: NeoMutt/20170113 (1.7.2) Subject: Re: [PATCH edk2-platforms v1 1/1] Readme: Add instructions to build in a Windows Environment X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 29 Jun 2018 10:52:42 -0000 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Fri, Jun 29, 2018 at 03:42:37AM +0000, Chris Co wrote: > These instructions detail how to setup a Windows build environment > and build for ARM platforms using the GCC cross-compiler toolchain. Hi Chris, This patch doesn't add Windows instructions - it deletes everything, then adds everything back (now with Windows instructions). Presumably this is because I messed up when I added the original, and you've converted the line-endings to CRLF. This is all good, but please submit the conversion as a separate preceding patch so that we can actually tell which bits of documentation you've added/modified and which remain unchanged. / Leif > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Christopher Co > Cc: Ard Biesheuvel > Cc: Leif Lindholm > Cc: Michael D Kinney > --- > Readme.md | 614 ++++++++++++-------- > 1 file changed, 387 insertions(+), 227 deletions(-) > > diff --git a/Readme.md b/Readme.md > index 3104144634b9..c9f2af9a6948 100644 > --- a/Readme.md > +++ b/Readme.md > @@ -1,227 +1,387 @@ > -This branch holds all platforms actively maintained against the > -[edk2](https://github.com/tianocore/edk2) master branch. > - > -For generic information about the edk2-platforms repository, and the process > -under which _stable_ and _devel_ branches can be added for individual platforms, > -please see > -[the introduction on the about branch](https://github.com/tianocore/edk2-platforms/blob/about/Readme.md). > - > -# INDEX > -* [Overview](#overview) > -* [How To Build (Linux Environment)](#how-to-build-linux-environment) > - * [Manual building](#manual-building) > - * [Using uefi-tools helper scripts](#using-uefi-tools-helper-scripts) > -* [How To Build (Windows Environment)](#how-to-build-windows-environment) > -* [Supported Platforms](#supported-platforms) > -* [Maintainers](#maintainers) > - > -# Overview > - > -Platform description files can be found under `Platform/{Vendor}/{Platform}`. > - > -Many platforms require additional image processing beyond the EDK2 build. > -Any such steps should be documented (as a Readme.md), and any necessary helper > -scripts be contained, under said platform directory. > - > -Any contributions to this branch should be submitted via email to the > -edk2-devel mailing list with a subject prefix of `[platforms]`. See > -[Laszlo's excellent guide](https://github.com/tianocore/tianocore.github.io/wiki/Laszlo's-unkempt-git-guide-for-edk2-contributors-and-maintainers) for details > -on how to do this successfully. > - > -# How to build (Linux Environment) > - > -## Prerequisites > -The build tools themselves depend on Python (2) and libuuid. Most Linux systems > -will come with a Python environment installed by default, but you usually need > -to install uuid-dev (or uuid-devel, depending on distribution) manually. > - > -## If cross compiling > -If building EDK2 for a different archtecture than the build machine, you need to > -obtain an appropriate cross-compiler. X64 (x86_64) compilers also support IA32, > -but the reverse may not always be true. > - > -Target architecture | Cross compilation prefix > ---------------------|------------------------- > -AARCH64 | aarch64-linux-gnu- > -ARM | arm-linux-gnueabihf- > -IA32 | i?86-linux-gnu-* _or_ x86_64-linux-gnu- > -IPF | ia64-linux-gnu > -X64 | x86_64-linux-gnu- > - > -\* i386, i486, i586 or i686 > - > -### GCC > -Linaro provides GCC toolchains for > -[aarch64-linux-gnu](https://releases.linaro.org/components/toolchain/binaries/latest/aarch64-linux-gnu/) > -and [arm-linux-gnueabihf](https://releases.linaro.org/components/toolchain/binaries/latest/arm-linux-gnueabihf/) > -compiled to run on x86_64/i686 Linux and i686 Windows. Some Linux distributions > -provide their own packaged cross-toolchains. > - > -### clang > -Clang does not require separate cross compilers, but it does need a > -target-specific binutils. These are included with any prepackaged GCC toolchain > -(see above), or can be installed or built separately. > - > -## Obtaining source code > -1. Create a new folder (directory) on your local development machine > - for use as your workspace. This example uses `/work/git/tianocore`, modify as > - appropriate for your needs. > - ``` > - $ export WORKSPACE=/work/git/tianocore > - $ mkdir -p $WORKSPACE > - $ cd $WORKSPACE > - ``` > - > -1. Into that folder, clone: > - 1. [edk2](https://github.com/tianocore/edk2) > - 1. [edk2-platforms](https://github.com/tianocore/edk2-platforms) > - 1. [edk2-non-osi](https://github.com/tianocore/edk2-non-osi) (if building > - platforms that need it) > - ``` > - $ git clone https://github.com/tianocore/edk2.git > - ... > - $ git clone https://github.com/tianocore/edk2-platforms.git > - ... > - $ git clone https://github.com/tianocore/edk2-non-osi.git > - ``` > - > -1. Set up a **PACKAGES_PATH** to point to the locations of these three > - repositories: > - > - `$ export PACKAGES_PATH=$PWD/edk2:$PWD/edk2-platforms:$PWD/edk2-non-osi` > - > -## Manual building > - > -1. Set up the build environment (this will modify your environment variables) > - > - `$ . edk2/edksetup.sh` > - > - (This step _depends_ on **WORKSPACE** being set as per above.) > -1. Build BaseTools > - > - `make -C edk2/BaseTools` > - > - (BaseTools can currently not be built in parallel, so do not specify any `-j` > - option, either on the command line or in a **MAKEFLAGS** environment > - variable.) > - > -### Build options > -There are a number of options that can (or must) be specified at the point of > -building. Their default values are set in `edk2/Conf/target.txt`. If we are > -working only on a single platform, it makes sense to just update this file. > - > -target.txt option | command line | Description > -------------------|--------------|------------ > -ACTIVE_PLATFORM | `-p` | Description file (.dsc) of platform. > -TARGET | `-b` | One of DEBUG, RELEASE or NOOPT. > -TARGET_ARCH | `-a` | Architecture to build for. > -TOOL_CHAIN_TAG | `-t` | Toolchain profile to use for building. > - > -There is also MAX_CONCURRENT_THREAD_NUMBER (`-n`), roughly equivalent to > -`make -j`. > - > -When specified on command line, `-b` can be repeated multiple times in order to > -build multiple targets sequentially. > - > -After a successful build, the resulting images can be found in > -`Build/{Platform Name}/{TARGET}_{TOOL_CHAIN_TAG}/FV`. > - > -### Build a platform > -The main build process _can_ run in parallel - so figure out how many threads we > -have available. > - > -``` > -$ getconf _NPROCESSORS_ONLN > -8 > -``` > -OK, so we have 8 CPUs - let's tell the build to use a little more than that: > -``` > -$ NUM_CPUS=$((`getconf _NPROCESSORS_ONLN` + 2)) > -``` > -For the toolchain tag, use GCC5 for gcc version 5 or later, GCC4x for > -earlier versions, or CLANG35/CLANG38 as appropriate when building with clang. > -``` > -$ build -n $NUM_CPUS -a AARCH64 -t GCC5 -p Platform/ARM/JunoPkg/ArmJuno.dsc > -``` > -(Note that the description file gets resolved by the build command through > -searching in all locations specified in **PACKAGES_PATH**.) > - > -#### If cross-compiling > -When cross-compiling, or building with a different version of the compiler than > -the default `gcc` or `clang`(/binutils), we additionally need to inform the > -build command which toolchain to use. We do this by setting the environment > -variable `{TOOL_CHAIN_TAG}_{TARGET_ARCH}_PREFIX` - in the case above, > -**GCC5_AARCH64_PREFIX**. > - > -So, referring to the cross compiler toolchain table above, we should prepend the `build` command line with `GCC5_AARCH64_PREFIX=aarch64-linux-gnu-`. > - > -## Using uefi-tools helper scripts > -uefi-tools is a completely unofficial set of helper-scripts developed by Linaro. > -They automate figuring out all of the manual options above, and store the paths > -to platform description files in a separate configuration file. Additionally, > -they simplify bulk-building large numbers of platforms. > - > -The (best effort) intent is to keep this configuration up to date with all > -platforms that exist in the edk2-platforms master branch. > - > -The equivalent of the manual example above would be > -``` > -$ git clone https://git.linaro.org/uefi/uefi-tools.git > -... > -$ ./uefi-tools/edk2-build.sh juno > -... > ------------------------------------------------------------- > - aarch64 Juno (AARCH64) RELEASE pass > ------------------------------------------------------------- > -pass 1 > -fail 0 > -``` > -The build finishes with a summary of which platforms/targets were built, which > -succeeded and which failed (and the total number of either). > - > -Like the `build` command itself, `edk2-build.sh` it supports specifying multiple > -targets on a single command line, but it also lets you specify multiple > -platforms (or `all` for building all known platforms). So in order to build all > -platforms described by the configuration file, for both DEBUG and RELEASE > -targets: > -``` > -$ ./uefi-tools/edk2-build.sh -b DEBUG -b RELEASE > -``` > - > -# How To Build (Windows Environment) > - > -(I genuinely have no idea. Please help!) > - > - > -# Supported Platforms > - > -These are the platforms currently supported by this tree - grouped by > -Processor/SoC vendor, rather than platform vendor. > - > -If there are any additional build steps beyond the generic ones listed above, > -they will be documented with the platform. > - > -## AMD > -* [Cello](Platform/LeMaker/CelloBoard) > -* [Overdrive](Platform/AMD/OverdriveBoard) > -* [Overdrive 1000](Platform/SoftIron/Overdrive1000Board) > - > -## ARM > -* [Juno](Platform/ARM/JunoPkg) > -* [Versatile Express](Platform/ARM/VExpressPkg) > - > -## Hisilicon > -* [D02](Platform/Hisilicon/D02) > -* [D03](Platform/Hisilicon/D03) > -* [D05](Platform/Hisilicon/D05) > -* [HiKey](Platform/Hisilicon/HiKey) > - > -## Marvell > -* [Armada 70x0](Platform/Marvell/Armada) > - > -## Socionext > -* [SynQuacer](Platform/Socionext/DeveloperBox) > - > -# Maintainers > - > -See [Maintainers.txt](Maintainers.txt). > +This branch holds all platforms actively maintained against the > +[edk2](https://github.com/tianocore/edk2) master branch. > + > +For generic information about the edk2-platforms repository, and the process > +under which _stable_ and _devel_ branches can be added for individual platforms, > +please see > +[the introduction on the about branch](https://github.com/tianocore/edk2-platforms/blob/about/Readme.md). > + > +# INDEX > +* [Overview](#overview) > +* [How To Build (Linux Environment)](#how-to-build-linux-environment) > + * [Manual building](#manual-building) > + * [Using uefi-tools helper scripts](#using-uefi-tools-helper-scripts) > +* [How To Build (Windows Environment)](#how-to-build-windows-environment) > +* [Supported Platforms](#supported-platforms) > +* [Maintainers](#maintainers) > + > +# Overview > + > +Platform description files can be found under `Platform/{Vendor}/{Platform}`. > + > +Many platforms require additional image processing beyond the EDK2 build. > +Any such steps should be documented (as a Readme.md), and any necessary helper > +scripts be contained, under said platform directory. > + > +Any contributions to this branch should be submitted via email to the > +edk2-devel mailing list with a subject prefix of `[platforms]`. See > +[Laszlo's excellent guide](https://github.com/tianocore/tianocore.github.io/wiki/Laszlo's-unkempt-git-guide-for-edk2-contributors-and-maintainers) for details > +on how to do this successfully. > + > +# How to build (Linux Environment) > + > +## Prerequisites > +The build tools themselves depend on Python (2) and libuuid. Most Linux systems > +will come with a Python environment installed by default, but you usually need > +to install uuid-dev (or uuid-devel, depending on distribution) manually. > + > +## If cross compiling > +If building EDK2 for a different archtecture than the build machine, you need to > +obtain an appropriate cross-compiler. X64 (x86_64) compilers also support IA32, > +but the reverse may not always be true. > + > +Target architecture | Cross compilation prefix > +--------------------|------------------------- > +AARCH64 | aarch64-linux-gnu- > +ARM | arm-linux-gnueabihf- > +IA32 | i?86-linux-gnu-* _or_ x86_64-linux-gnu- > +IPF | ia64-linux-gnu > +X64 | x86_64-linux-gnu- > + > +\* i386, i486, i586 or i686 > + > +### GCC > +Linaro provides GCC toolchains for > +[aarch64-linux-gnu](https://releases.linaro.org/components/toolchain/binaries/latest/aarch64-linux-gnu/) > +and [arm-linux-gnueabihf](https://releases.linaro.org/components/toolchain/binaries/latest/arm-linux-gnueabihf/) > +compiled to run on x86_64/i686 Linux and i686 Windows. Some Linux distributions > +provide their own packaged cross-toolchains. > + > +### clang > +Clang does not require separate cross compilers, but it does need a > +target-specific binutils. These are included with any prepackaged GCC toolchain > +(see above), or can be installed or built separately. > + > +## Obtaining source code > +1. Create a new folder (directory) on your local development machine > + for use as your workspace. This example uses `/work/git/tianocore`, modify as > + appropriate for your needs. > + ``` > + $ export WORKSPACE=/work/git/tianocore > + $ mkdir -p $WORKSPACE > + $ cd $WORKSPACE > + ``` > + > +1. Into that folder, clone: > + 1. [edk2](https://github.com/tianocore/edk2) > + 1. [edk2-platforms](https://github.com/tianocore/edk2-platforms) > + 1. [edk2-non-osi](https://github.com/tianocore/edk2-non-osi) (if building > + platforms that need it) > + ``` > + $ git clone https://github.com/tianocore/edk2.git > + ... > + $ git clone https://github.com/tianocore/edk2-platforms.git > + ... > + $ git clone https://github.com/tianocore/edk2-non-osi.git > + ``` > + > +1. Set up a **PACKAGES_PATH** to point to the locations of these three > + repositories: > + > + `$ export PACKAGES_PATH=$PWD/edk2:$PWD/edk2-platforms:$PWD/edk2-non-osi` > + > +## Manual building > + > +1. Set up the build environment (this will modify your environment variables) > + > + `$ . edk2/edksetup.sh` > + > + (This step _depends_ on **WORKSPACE** being set as per above.) > +1. Build BaseTools > + > + `make -C edk2/BaseTools` > + > + (BaseTools can currently not be built in parallel, so do not specify any `-j` > + option, either on the command line or in a **MAKEFLAGS** environment > + variable.) > + > +### Build options > +There are a number of options that can (or must) be specified at the point of > +building. Their default values are set in `edk2/Conf/target.txt`. If we are > +working only on a single platform, it makes sense to just update this file. > + > +target.txt option | command line | Description > +------------------|--------------|------------ > +ACTIVE_PLATFORM | `-p` | Description file (.dsc) of platform. > +TARGET | `-b` | One of DEBUG, RELEASE or NOOPT. > +TARGET_ARCH | `-a` | Architecture to build for. > +TOOL_CHAIN_TAG | `-t` | Toolchain profile to use for building. > + > +There is also MAX_CONCURRENT_THREAD_NUMBER (`-n`), roughly equivalent to > +`make -j`. > + > +When specified on command line, `-b` can be repeated multiple times in order to > +build multiple targets sequentially. > + > +After a successful build, the resulting images can be found in > +`Build/{Platform Name}/{TARGET}_{TOOL_CHAIN_TAG}/FV`. > + > +### Build a platform > +The main build process _can_ run in parallel - so figure out how many threads we > +have available. > + > +``` > +$ getconf _NPROCESSORS_ONLN > +8 > +``` > +OK, so we have 8 CPUs - let's tell the build to use a little more than that: > +``` > +$ NUM_CPUS=$((`getconf _NPROCESSORS_ONLN` + 2)) > +``` > +For the toolchain tag, use GCC5 for gcc version 5 or later, GCC4x for > +earlier versions, or CLANG35/CLANG38 as appropriate when building with clang. > +``` > +$ build -n $NUM_CPUS -a AARCH64 -t GCC5 -p Platform/ARM/JunoPkg/ArmJuno.dsc > +``` > +(Note that the description file gets resolved by the build command through > +searching in all locations specified in **PACKAGES_PATH**.) > + > +#### If cross-compiling > +When cross-compiling, or building with a different version of the compiler than > +the default `gcc` or `clang`(/binutils), we additionally need to inform the > +build command which toolchain to use. We do this by setting the environment > +variable `{TOOL_CHAIN_TAG}_{TARGET_ARCH}_PREFIX` - in the case above, > +**GCC5_AARCH64_PREFIX**. > + > +So, referring to the cross compiler toolchain table above, we should prepend the `build` command line with `GCC5_AARCH64_PREFIX=aarch64-linux-gnu-`. > + > +## Using uefi-tools helper scripts > +uefi-tools is a completely unofficial set of helper-scripts developed by Linaro. > +They automate figuring out all of the manual options above, and store the paths > +to platform description files in a separate configuration file. Additionally, > +they simplify bulk-building large numbers of platforms. > + > +The (best effort) intent is to keep this configuration up to date with all > +platforms that exist in the edk2-platforms master branch. > + > +The equivalent of the manual example above would be > +``` > +$ git clone https://git.linaro.org/uefi/uefi-tools.git > +... > +$ ./uefi-tools/edk2-build.sh juno > +... > +------------------------------------------------------------ > + aarch64 Juno (AARCH64) RELEASE pass > +------------------------------------------------------------ > +pass 1 > +fail 0 > +``` > +The build finishes with a summary of which platforms/targets were built, which > +succeeded and which failed (and the total number of either). > + > +Like the `build` command itself, `edk2-build.sh` it supports specifying multiple > +targets on a single command line, but it also lets you specify multiple > +platforms (or `all` for building all known platforms). So in order to build all > +platforms described by the configuration file, for both DEBUG and RELEASE > +targets: > +``` > +$ ./uefi-tools/edk2-build.sh -b DEBUG -b RELEASE > +``` > + > +# How To Build (Windows Environment) > + > +These instructions will be a summary of the > +[Windows Systems wiki entry](https://github.com/tianocore/tianocore.github.io/wiki/Windows-systems). > +The wiki entry is targeted towards using the Visual Studio compiler. The > +instructions below will have some extra steps if you are cross-compiling with GCC. > + > +## Prerequisites > +You will need Git for Windows and Visual Studio installed to build EDK2 from source. > +If you wish to build the build tools, you will also need Python 2.7 for Windows > +and CxFreeze. > + > +## If cross compiling > +If building EDK2 for a different architecture than the build machine, you need to > +obtain an appropriate cross-compiler. X64 (x86_64) compilers also support IA32, > +but the reverse may not always be true. > + > +Target architecture | Cross compilation prefix > +--------------------|------------------------- > +ARM | arm-eabi- > + > +### GCC > +Linaro provides a Windows-compatible GCC toolchain for [arm-eabi](https://releases.linaro.org/components/toolchain/binaries/latest/arm-eabi/) > +compiled to run on x86_64/i686 Windows. Select the i686 mingw32 variant. > + > +To use the GCC toolchain, you will also need a Windows-compatible GCC environment > +like [MinGW](http://mingw.org/). Specifically you will need the GNU make tool. > + > +## Obtaining source code > +1. Create a new folder (directory) on your local development machine > + for use as your workspace. This example uses `C:\git\tianocore`, modify as > + appropriate for your needs. > + > +1. In a Windows command prompt: > + ``` > + > set WORKSPACE=C:\git\tianocore > + > mkdir %WORKSPACE% > + > cd %WORKSPACE% > + ``` > + > +1. Into that folder, clone: > + 1. [edk2](https://github.com/tianocore/edk2) > + 1. [edk2-platforms](https://github.com/tianocore/edk2-platforms) > + 1. [edk2-non-osi](https://github.com/tianocore/edk2-non-osi) (if building > + platforms that need it) > + ``` > + > git clone https://github.com/tianocore/edk2.git > + ... > + > git clone https://github.com/tianocore/edk2-platforms.git > + ... > + > git clone https://github.com/tianocore/edk2-non-osi.git > + ``` > + > +1. Clone submodules > + ``` > + > pushd edk2 > + > git submodule update --init --recursive > + > popd > + ``` > + > +1. Set up a **PACKAGES_PATH** to point to the locations of these three > + repositories: > + > + `> set PACKAGES_PATH=%WORKSPACE%/edk2;%WORKSPACE%/edk2-platforms;%WORKSPACE%/edk2-non-osi` > + > +### If cross-compiling with GCC > +1. Download [MinGW](http://mingw.org/) and get the **make** executable. Copy > +make.exe and any library dependencies to a folder in your workspace. > + ``` > + > mkdir %WORKSPACE%\MinGW > + > pushd %WORKSPACE%\MinGW > + ... copy make.exe and any library dependencies into MinGW folder ... > + > popd > + ``` > +(Note sometimes the MinGW installer prepends **mingw32-** before **make.exe**. > +You should rename the exe to make before proceeding.) > + > +1. Download your GCC cross-compiler and place it in your workspace > + ``` > + > mkdir %WORKSPACE%\Toolchains > + > pushd %WORKSPACE%\Toolchains > + ... copy GCC cross-compiler into Toolchains folder ... > + > popd > + ``` > + > +## Manual building > +1. Set up the build environment (this will modify your environment variables) > + > + `> edk2\edk2setup.bat` > + > + (This step _depends_ on **WORKSPACE** being set as per above.) > + > +1. Get the BaseTools. You can either build them from source or fetch prebuilt binaries. > + * To build from source, follow the Windows instructions found [here](https://github.com/tianocore/edk2/blob/master/BaseTools/BuildNotes.txt). > + * To use prebuilt binaries, clone > + [edk2-BaseTools-win32](https://github.com/tianocore/edk2-BaseTools-win32) > + and set **EDK_TOOLS_DIR** to point to this location. > + ``` > + > git clone https://github.com/tianocore/edk2-BaseTools-win32.git > + ... > + > set EDK_TOOLS_DIR=%WORKSPACE%/edk2-BaseTools-win32 > + ``` > + > +1. Install the ASL compiler (if necessary) for your platform. Follow > +the instructions found [here](https://github.com/tianocore/tianocore.github.io/wiki/Asl-Setup). > + > +### If cross-compiling with GCC > +1. Set **PATH** to include the location of your MinGW make executable and cross-compiling toolchain bin folder. > + > + `> set PATH=%WORKSPACE%\MinGW;%WORKSPACE%\Toolchains\\bin;%PATH%` > + > +### Build options > +There are a number of options that can (or must) be specified at the point of > +building. Their default values are set in `edk2\Conf\target.txt`. If we are > +working only on a single platform, it makes sense to just update this file. > + > +target.txt option | command line | Description > +------------------|--------------|------------ > +ACTIVE_PLATFORM | `-p` | Description file (.dsc) of platform. > +TARGET | `-b` | One of DEBUG, RELEASE or NOOPT. > +TARGET_ARCH | `-a` | Architecture to build for. > +TOOL_CHAIN_TAG | `-t` | Toolchain profile to use for building. > + > +There is also MAX_CONCURRENT_THREAD_NUMBER (`-n`), roughly equivalent to > +`make -j`. > + > +When specified on command line, `-b` can be repeated multiple times in order to > +build multiple targets sequentially. > + > +After a successful build, the resulting images can be found in > +`%WORKSPACE%\Build\{Platform Name}\{TARGET}_{TOOL_CHAIN_TAG}\FV`. > + > +### Build a platform > +The main build process _can_ run in parallel - so figure out how many threads we > +have available. > + > +``` > +> echo %NUMBER_OF_PROCESSORS% > +8 > +``` > +OK, so we have 8 CPUs - let's tell the build to use a little more than that: > +``` > +> set /A NUM_CPUS=%NUMBER_OF_PROCESSORS%+2 > +``` > +For the toolchain tag, select a toolchain that is compatible with building in a Windows Environment. Search for 'Supported Tool Chains' in tools_def.txt to see the valid options for `TOOL_CHAIN_TAG`. If using Visual Studio Compiler, consult the > +[VS Toolchain Matrix](https://github.com/tianocore/tianocore.github.io/wiki/Windows-systems-ToolChain-Matrix) > +to determine the proper VS `TOOL_CHAIN_TAG`. > + > +``` > +> build -n %NUM_CPUS% -a ARM -t GCC5 -p Platform/NXP/SABRESD_IMX6Q_1GB/SABRESD_IMX6Q_1GB.dsc > +``` > + > +(Note that the description file gets resolved by the build command through > +searching in all locations specified in **PACKAGES_PATH**.) > + > +#### If cross-compiling > +When cross-compiling, we additionally need to inform the > +build command which toolchain to use. We do this by setting the environment > +variable `{TOOL_CHAIN_TAG}_{TARGET_ARCH}_PREFIX` - in the case above, > +**GCC5_ARM_PREFIX**. > + > +So, referring to the cross compiler toolchain table above, we should prepend the `build` command line with > + > + > set GCC5_ARM_PREFIX=arm-eabi- > + > +# Supported Platforms > + > +These are the platforms currently supported by this tree - grouped by > +Processor/SoC vendor, rather than platform vendor. > + > +If there are any additional build steps beyond the generic ones listed above, > +they will be documented with the platform. > + > +## AMD > +* [Cello](Platform/LeMaker/CelloBoard) > +* [Overdrive](Platform/AMD/OverdriveBoard) > +* [Overdrive 1000](Platform/SoftIron/Overdrive1000Board) > + > +## ARM > +* [Juno](Platform/ARM/JunoPkg) > +* [Versatile Express](Platform/ARM/VExpressPkg) > + > +## Hisilicon > +* [D02](Platform/Hisilicon/D02) > +* [D03](Platform/Hisilicon/D03) > +* [D05](Platform/Hisilicon/D05) > +* [HiKey](Platform/Hisilicon/HiKey) > + > +## Marvell > +* [Armada 70x0](Platform/Marvell/Armada) > + > +## Socionext > +* [SynQuacer](Platform/Socionext/DeveloperBox) > + > +# Maintainers > + > +See [Maintainers.txt](Maintainers.txt). > -- > 2.16.2.gvfs.1.33.gf5370f1 >