8月10日
准备编译环境
安装MSYS,msysDTK,msysDVLPR,MinGW
建一个目录,存放我们的工具链
export $MFS=/d/mmfs
mkdir -p $MFS
关于msys:
msys(Minimal SYStem)是Cygwin的改版,针对Win32做了优化和修改,最突出的一点是根目录"/"和"/bin"根据msys-1.0.dll的位置自动mount,其他mount选项放到/etc/fstab中而不是注册表中(这表明/etc不能被mount?)。
关于target的说明:
target指示目标编译器产生的可执行文件所运行的平台,新版本的config,guess已经不支持i*86-pc-msys平台了,所以我们只能用i*86-pc-cygwin代替。
编译binutils(第一遍)
mkdir build && cd build
../configure --prefix=$MFS --disable-nls --disable-shared --disable-multilib --host=mingw32 --build=mingw32 --target=i686-pc-cygwin --with-sysroot=$MFS
编辑Makefile,MAKEINFO = makeinfo
binutils编译时仍然需要配置,检查宿主环境是否可以编译自己,这里预先进行配置,防止编译到一半出错浪费时间
make configure-host && make && make install
因为ld链接脚本搜索目录不正确,所以重新生成
make -C ld clean
make -C ld LIB_PATH=$MFS/lib
make -C ld install
最后,看一下$MFS/i686-pc-cygwin/lib/ldscripts/i386pe.*
确认库的搜索范围
编译w32api(第一遍)
./configure --prefix=$MFS
make
make install
编译MSYS-runtime(第一遍)
MSYS-runtime是不能用MinGW的gcc编译的,所以要使用官方提供的msysDVLPR
/msys/bin/msysdvlpr会打开一个新窗口
export PATH=/msys/bin:$PATH
cd /msys/rt
mkdir bld && cd bld
../src/configure --prefix=$MFS
make
make install prefix=$MFS tooldir=$MFS
编译gcc(第一遍)
修改PATH,让gcc找到我们编译的ld
export OLDPATH=$PATH
export $PATH=$MFS/bin:$PATH
首先需要禁止gcc配置时自动搜索并修正宿主系统的头文件
cp -v gcc/Makefile.in{,.orig} &&
sed 's@\./fixinc\.sh@-c true@' gcc/Makefile.in.orig > gcc/Makefile.in
修正gcc默认在/usr/include下寻找头文件的问题
修改gcc/Makefile.in
NATIVE_SYSTEM_HEADER_DIR = /include
修改gcc/cppdefault.c
#define STANDARD_INCLUDE_DIR "/include"
修正库搜索路径
gcc/collect2.c
删除add_prefix (&libpath_lib_dirs, "/usr/lib");
修正可执行文件搜索路径
gcc/gcc.c
删除八行
add_prefix (&exec_prefixes, standard_exec_prefix_1, "BINUTILS",
PREFIX_PRIORITY_LAST, 2, 0);
add_prefix (&exec_prefixes, standard_exec_prefix_2, "BINUTILS",
PREFIX_PRIORITY_LAST, 2, 0);
add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
PREFIX_PRIORITY_LAST, 1, 0);
add_prefix (&startfile_prefixes, standard_exec_prefix_2, "BINUTILS",
PREFIX_PRIORITY_LAST, 1, 0);
建立编译目录
mkdir ../gcc-build && cd ../gcc-build
../gcc-4.2.0/configure --prefix=$MFS --disable-nls --disable-shared --disable-win32-registry --enable-languages=c --enable-optimize -v --host=mingw32 --target=i686-pc-cygwin -
-build=mingw32 --disable-threads --disable-multilib --with-sysroot=$MFS
编辑一下Makefile,LD = ld,MAKEINFO = makeinfo
make all-gcc
make install-gcc
现在,需要调整一下工具链
i686-pc-cygwin-gcc -dumpspecs > $MFS/lib/gcc/i686-pc-cygwin/4.2.0/specs
修改specs:
*lib中-lcygwin改为-lmsys-1.0.dll
编译Hello World程序验证工具链正常工作
cat > test.c <<EOF
#include <stdio.h>
#include <windows.h>
int main()
{
printf("Hello World!\n");
MessageBox(NULL,"Hello World!","Test",MB_OK);
return 0;
}
EOF
i686-pc-cygwin-gcc -v test.c
./test
OK,我们的工具链已经可以工作了,下面需要编译一些基本工具
为什么需要MSYS?
因为某些GNU工具需要POSIX支持,在MinGW下是无法编译的,或者工作不正常
这样,当configure脚本或者Makefile用到它们时,就会出现错误。
(后面的部分未完成)
编译mingw-runtime
编辑configure.in,W32API = -I /d/mmfs/mingw32/include
autoconf
编辑profile/configure.in,W32API = -I /d/mmfs/mingw32/include
autoconf
编辑mingwex/configure.in,W32API = -I /d/mmfs/mingw32/include
autoconf
./configure --prefix=$MFS/mingw32 --host=mingw32 --build=mingw32 --target=mingw32
make
make install
binutils
gcc
newlib
MSYS-runtime
w32api
bash
bzip2
coreutils
diffutils
findutils
gawk
gettext
grep
gzip
m4
make
patch
perl
sed
tar
texinfo
6月14日
在Windows下编译Grub2,需要一个运行环境,我们选择msys+mingw
就这样直接编译是不行的
我们需要一个交叉编译器(Cross Compiler)
可以在msys里自己编译一个,我的放在/var下
编译的方法有很多,你可以参考我用的命令:
#编译binutils
configure --prefix=/var --target=i686-pc-elf --with-gmp=/var --with-mpfr=/var --disable-nls --disable-shared --disable-threads --with-stabs --enable-interwork --enable-multilib
#修改gcc/fixinc/mkfixinc.sh
i?86-*-mingw32 | \
下一行添加
i?86-*-elf | \
#编译gcc
configure --enable-languages=c --disable-shared --disable-threads --disable-win32-registry --disable-nls --target=i686-pc-elf --host=i686-pc-mingw32 --build=i686-pc-mingw32 --prefix=/var
对于grub2的代码需要作一些修改
1.修改grub2/aclocal.m4,将gcc符号判断相关指令删除,直接指定如下内容:
dnl Check what symbol is defined as a start symbol.
dnl Written by Yoshinori K. Okuji.
AC_DEFUN(grub_CHECK_START_SYMBOL,
[AH_TEMPLATE([START_SYMBOL], [Define it to either start or _start])
AC_DEFINE([START_SYMBOL], [_start])
])
dnl Check what symbol is defined as a bss start symbol.
dnl Written by Michael Hohmoth and Yoshinori K. Okuji.
AC_DEFUN(grub_CHECK_BSS_START_SYMBOL,
[AH_TEMPLATE([BSS_START_SYMBOL], [Define it to one of __bss_start, edata and _edata])
AC_DEFINE([BSS_START_SYMBOL], [__bss_start])
])
dnl Check what symbol is defined as an end symbol.
dnl Written by Yoshinori K. Okuji.
AC_DEFUN(grub_CHECK_END_SYMBOL,
[AH_TEMPLATE([END_SYMBOL], [Define it to either end or _end])
AC_DEFINE([END_SYMBOL], [_end])
])
2.修改grub2/conf/i386-pc.mk
删除sbin_UTILITIES等号后的内容,将bin_UTILITIES等号后的内容改为grub-mkimage.exe
3.我的ln不知为何有问题,只好手工建链接
cd grub2/include/grub
ln -s i386 cpu
ln -s i386/pc machine
修改完成后,运行以下命令即可编译:
aclocal
autoconf
autoheader
./configure --prefix=/opt --disable-nls --target=i686-pc-elf
make
安装到目标目录(前面指定了为/opt)
make install
如果要清理输出文件的话,运行以下命令:
make mostlyclean