8月10日
MSYS/MinGW from Scratch(未完成,更新中)
准备编译环境
安装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