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
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…