So here’s the "sequel" to Part One. This time I’m trying to actually build a Firmware Volume with the Python-based tools.
Prerequisites for build.py
The core of the tools is build.py, a Python script which invokes the tools in order to build a Firmware Volume (FV). On FreeBSD, build.py cannot be run until the following requirements are met:
- SQLite3 for Python, which can be installed through the databases/py-sqlite3 port.
- The Python module for ANTLR, a parser generator.
- Installing the module mentioned above requires EasyInstall, or rather: I don’t know how it can be done otherwise.
Because I could not find a port for EasyInstall, I did this to install the script on FreeBSD:
$ fetch http://peak.telecommunity.com/dist/ez_setup.py
$ chmod +x ez_setup.py
$ ./ez_setup.py
Note that this isn’t the whole truth as the path to the interpreter in the script, i.e. the first line aka "shebang", must be adjusted to /usr/local/bin/python before the script can be executed.
After that, the easy_install command is available and the ANTLR module can be installed by running this:
$ eazy_install
http://www.antlr.org/download/Python/antlr_python_runtime-3.0.1-py2.5.egg
Running build.py
In theory, running build.py and thus building a Firmware Volume should be as easy as this:
$ cd path/to/edk2
$ export PYTHONPATH=/path/to/basetools/Source/Python
$ . edksetup.sh BaseTools
$ python $PYTHONPATH/build/build.py
Unfortunately, the last step initially aborted with this error:
build...
: error 5000: Please execute /home/phs/sandbox/basetools/Bin/FreeBSD-i386:/sbin:
/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:
/home/phs/bin/edksetup.bat to set /home/phs/sandbox/basetools/Bin/Freebsd7 in
environment variable: PATH!
- Failed -
After some try’n’error time, I think that the above error is caused by user error: I had previously copied the compiled C programs from Source/C/bin to bin/FreeBSD-i386 (paths relative to /path/to/basetools). After removing bin/FreeBSD-i386, I created a link to BinWrappers/PosixLike at the same location:
$ cd /path/to/basetools
$ ln -s BinWrappers/PosixLike Bin/FreeBSD-i386
I then re-ran build.py (see above) and it produced some output that didn’t look like errors:
00:44:09, Sep.21 2008 [FreeBSD-7.1-PRERELEASE-i386-32bit-ELF]
WORKSPACE = /usr/home/phs/sandbox/edk2
EDK_SOURCE = /usr/home/phs/sandbox/edk2/EdkCompatibilityPkg
EFI_SOURCE = /usr/home/phs/sandbox/edk2/EdkCompatibilityPkg
EDK_TOOLS_PATH = /home/phs/sandbox/basetools
TARGET_ARCH = IA32
TARGET = DEBUG
TOOL_CHAIN_TAG = ELFGCC
Active Platform = UnixPkg/UnixPkg.dsc
Flash Image Definition = UnixPkg/UnixPkg.fdf
Processing meta-data . . . . . . .
Unfortunately, though, right after the dots, an error occured:
build...
UnixPkg/UnixPkg.dsc(...): error 4000: Instance of library class [NetLib] is not found
in [MdeModulePkg/Universal/Network/ArpDxe/ArpDxe.inf] [IA32]
consumed by module [MdeModulePkg/Universal/Network/ArpDxe/ArpDxe.inf]
- Failed -
00:44:17, Sep.21 2008 [00:08]
Fixing the UnixPkg
The UnixPkg part of the EDK II seems to be broken as the error above indicates a dependency error between modules which is caused by an incorrect platform definition file (*.dsc). Applying this patch fixes the problem.
The patch ensures that all dependencies are met, but the build process still fails with this error:
Processing meta-data . . . . . . . . done!
make: don't know how to make pbuild. Stop
build...
: error 7000: Failed to execute command
make pbuild [/usr/home/phs/sandbox/edk2/Build/Unix/DEBUG_ELFGCC/IA32/MdePkg/Library/BaseTimerLibNullTemplate/BaseTimerLibNullTemplate]
Waiting for all build threads exit...
make: don't know how to make pbuild. Stop
build...
: error 7000: Failed to execute command
make pbuild [/usr/home/phs/sandbox/edk2/Build/Unix/DEBUG_ELFGCC/IA32/MdePkg/Library/BaseLib/BaseLib]
build...
: error F002: Failed to build module
MdePkg/Library/BaseTimerLibNullTemplate/BaseTimerLibNullTemplate.inf [IA32, ELFGCC, DEBUG]
- Failed -
01:01:43, Sep.21 2008 [00:09]
Oh, well, to be continued…