Now that I have build a cross compiler, I’m trying to build the TianoCore EDK again.
In this post I list a few environment variables that need to be set in order to build the EDK. Because the build process needs to use the cross compiler, another environment variable is needed:
$ export CC=/opt/i386-tiano-pe/bin/gcc
Since I’m lazy and all, I put everything in a little script called env.sh:
export WORKSPACE=/home/phs/edk2 export JAVA_HOME=/usr/local/diablo-jdk1.5.0 export ANT_HOME=/opt/apache-ant-1.6.5 export XMLBEANS_HOME=/opt/xmlbeans-2.1.0 export PATH=$PATH:$ANT_HOME/bin:$XMLBEANS_HOME/bin export CC=/opt/i386-tiano-pe/bin/gcc
Also, the EDK build notes mention that the default build target is the Windows NT Emulation environment. However, that target cannot be built using GCC, so I needed to edit the file Tools/Conf/target.txt and change the ACTIVE_PLATFORM to:
ACTIVE_PLATFORM = EdkUnixPkg/Unix.fpd
Now, I can tip of the build process as follows:
$ cd ~/edk2 $ . env.sh $ . edksetup.sh newbuild
Note that the build script must be “sourced”, not executed. Unfortunately, the build process still fails, but now with a different error:
[cc] 1 total files to be compiled. [cc] In file included from /home/phs/edk2/Tools/CCode/Source/CompressDll/CompressDll.h:3, [cc] from /home/phs/edk2/Tools/CCode/Source/CompressDll/CompressDll.c:17: [cc] /usr/local/diablo-jdk1.5.0/include/jni.h:27:20: error: jni_md.h: No such file or directory [cc] In file included from /home/phs/edk2/Tools/CCode/Source/CompressDll/CompressDll.h:3, [cc] from /home/phs/edk2/Tools/CCode/Source/CompressDll/CompressDll.c:17: [cc] /usr/local/diablo-jdk1.5.0/include/jni.h:45: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'jsize' [cc] /usr/local/diablo-jdk1.5.0/include/jni.h:104: error: expected specifier-qualifier-list before 'jbyte' [cc] /usr/local/diablo-jdk1.5.0/include/jni.h:193: error: expected specifier-qualifier-list before 'jint' [cc] /usr/local/diablo-jdk1.5.0/include/jni.h:1834: error: expected specifier-qualifier-list before 'jint' [cc] /usr/local/diablo-jdk1.5.0/include/jni.h:1842: error: expected specifier-qualifier-list before 'jint' [cc] /usr/local/diablo-jdk1.5.0/include/jni.h:1851: error: expected specifier-qualifier-list before 'jint' [cc] /usr/local/diablo-jdk1.5.0/include/jni.h:1888: error: expected specifier-qualifier-list before 'jint' [cc] /usr/local/diablo-jdk1.5.0/include/jni.h:1927: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'jint' [cc] /usr/local/diablo-jdk1.5.0/include/jni.h:1930: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'jint' [cc] /usr/local/diablo-jdk1.5.0/include/jni.h:1933: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'jint' [cc] /usr/local/diablo-jdk1.5.0/include/jni.h:1937: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'jint' [cc] /usr/local/diablo-jdk1.5.0/include/jni.h:1940: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'void' [cc] In file included from /home/phs/edk2/Tools/CCode/Source/CompressDll/CompressDll.c:17: [cc] /home/phs/edk2/Tools/CCode/Source/CompressDll/CompressDll.h:16: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'jbyteArray' [cc] /home/phs/edk2/Tools/CCode/Source/CompressDll/CompressDll.c:29: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'jbyteArray' BUILD FAILED /home/phs/edk2/Tools/build.xml:22: The following error occurred while executing this line: /home/phs/edk2/Tools/CCode/Source/build.xml:254: The following error occurred while executing this line: /home/phs/edk2/Tools/CCode/Source/CompressDll/build.xml:45: gcc failed with return code 1
The root cause of this is that the compiler can’t find the jni_md.h header which is located in $JAVA_HOME/include/freebsd (at least on my system). I worked around this problem by editing $JAVA_HOME/include/jni.h as follows:
--- jni.h.orig 2008-02-06 11:50:05.000000000 +0100 +++ jni.h 2008-02-06 11:50:16.000000000 +0100 @@ -24,7 +24,7 @@ /* jni_md.h contains the machine-dependent typedefs for jbyte, jint and jlong */ -#include "jni_md.h" +#include "freebsd/jni_md.h" #ifdef __cplusplus extern "C" {
Now I’m stuck with yet another compilation error:
init: [echo] Building the EDK Tool Library: CompressDll Lib: [cc] 1 total files to be compiled. [cc] /home/phs/edk2/Tools/CCode/Source/CompressDll/CompressDll.c: In function 'Java_org_tianocore_framework_tasks_Compress_CallCompress': [cc] /home/phs/edk2/Tools/CCode/Source/CompressDll/CompressDll.c:57: warning: overflow in implicit constant conversion [cc] Starting link [cc] /usr/bin/ld: /home/phs/edk2/Tools/CCode/Source/Library/libCommonTools.a(EfiCompress.o): relocation R_X86_64_32S can not be used when making a shared object; recompile with -fPIC [cc] /home/phs/edk2/Tools/CCode/Source/Library/libCommonTools.a: could not read symbols: Bad value BUILD FAILED /home/phs/edk2/Tools/build.xml:22: The following error occurred while executing this line: /home/phs/edk2/Tools/CCode/Source/build.xml:254: The following error occurred while executing this line: /home/phs/edk2/Tools/CCode/Source/CompressDll/build.xml:45: gcc failed with return code 1
Well, I guess we’ll see where this ends…