错误现象:
cygwin下ct-ng build去编译crosstool-ng出现:
CLi@PC-CLI-1 ~/develop/crosstool-ng/crosstool-ng-1.18.0_build
$ ct-ng build
......
[INFO ] Installing kernel headers: done in 1854.80s (at 72:22)
[EXTRA] Saving state to restart at step 'libc_start_files'...
[INFO ] =================================================================
[INFO ] Installing C library headers & start files
[EXTRA] Configuring C library
[EXTRA] Installing C library headers
[ERROR] make[2]: *** [manual/install-headers] Error 2
[ERROR] make[1]: *** [install-headers] Error 2
[ERROR]
[ERROR] >>
[ERROR] >> Build failed in step 'Installing C library headers & start files'
[ERROR] >> called in step '(top-level)'
[ERROR] >>
[ERROR] >> Error happened in: CT_DoExecLog[scripts/functions@257]
[ERROR] >> called from: do_libc_backend_once[scripts/build/libc/glibc-eglibc.sh-common@380]
[ERROR] >> called from: do_libc_backend[scripts/build/libc/glibc-eglibc.sh-common@143]
[ERROR] >> called from: do_libc_start_files[scripts/build/libc/glibc-eglibc.sh-common@60]
[ERROR] >> called from: main[scripts/crosstool-NG.sh@632]
......
对应build.log中的详细内容为:
[ALL ] make[3]: Entering directory `/home/CLi/develop/crosstool-ng/crosstool-ng-1.18.0_build/.build/src/glibc-2.9/gnulib'
[ALL ] make[3]: `install-headers' is up to date.
[ALL ] make[3]: Leaving directory `/home/CLi/develop/crosstool-ng/crosstool-ng-1.18.0_build/.build/src/glibc-2.9/gnulib'
[ALL ] /usr/bin/make subdir=wctype -C wctype ..=../ install-headers
[ALL ] make[3]: Entering directory `/home/CLi/develop/crosstool-ng/crosstool-ng-1.18.0_build/.build/src/glibc-2.9/wctype'
[ALL ] /home/CLi/develop/crosstool-ng/crosstool-ng-1.18.0_build/.build/tools/bin/install -c -m 644 wctype.h /home/CLi/develop/crosstool-ng/x-tools/arm-xscale-linux-gnueabi/arm-xscale-linux-gnueabi/sysroot/usr/include/wctype.h
[ALL ] make[3]: Leaving directory `/home/CLi/develop/crosstool-ng/crosstool-ng-1.18.0_build/.build/src/glibc-2.9/wctype'
[ALL ] /usr/bin/make subdir=manual -C manual ..=../ install-headers
[ALL ] make[3]: Entering directory `/home/CLi/develop/crosstool-ng/crosstool-ng-1.18.0_build/.build/src/glibc-2.9/manual'
[ALL ] Makefile:240: *** mixed implicit and normal rules. Stop.
[ALL ] make[3]: Leaving directory `/home/CLi/develop/crosstool-ng/crosstool-ng-1.18.0_build/.build/src/glibc-2.9/manual'
[ALL ] Makefile:207: recipe for target `manual/install-headers' failed
[ERROR] make[2]: *** [manual/install-headers] Error 2
[ALL ] make[2]: Leaving directory `/home/CLi/develop/crosstool-ng/crosstool-ng-1.18.0_build/.build/src/glibc-2.9'
[ALL ] Makefile:12: recipe for target `install-headers' failed
[ERROR] make[1]: *** [install-headers] Error 2
[ALL ] make[1]: Leaving directory `/home/CLi/develop/crosstool-ng/crosstool-ng-1.18.0_build/.build/arm-xscale-linux-gnueabi/build/build-libc-startfiles'
[ERROR]
[ERROR] >>
[ERROR] >> Build failed in step 'Installing C library headers & start files'
[ERROR] >> called in step '(top-level)'
[ERROR] >>
[ERROR] >> Error happened in: CT_DoExecLog[scripts/functions@257]
[ERROR] >> called from: do_libc_backend_once[scripts/build/libc/glibc-eglibc.sh-common@380]
[ERROR] >> called from: do_libc_backend[scripts/build/libc/glibc-eglibc.sh-common@143]
[ERROR] >> called from: do_libc_start_files[scripts/build/libc/glibc-eglibc.sh-common@60]
[ERROR] >> called from: main[scripts/crosstool-NG.sh@632]
原因:
make是3.82的,不识别,旧的,显示和隐式的规则混合在一起的混合规则
所以才报此错误。
解决办法:
而这种makefile中混合规则,老版本的make,即3.81版本的make,是支持的。
所以,总的来说,有两种解决办法:
很明显此办法,的确可以解决此类问题。
比如我之前这里:
就是这样手工改makefile的。
但是此办法的缺点是:
crosstool-ng项目中,涉及到这种混合规则的Makefile中的写法,有N多个
如果你要是每个都手动改,那就累死了。
并且需要你对Makefile的语法和规则,有足够深入的理解,也才能确保修改为正确的写法
所以:
此法,不适合,本身对于Makefile就不是很熟悉的,大部分的人
更好的办法是,下面要介绍的这个第 5.2.1.5.2 节 “把3.82的make换成3.81版本的make”把此处3.82的make想办法换成3.81版本的make,就可以了。
此法,很明显,属于:一劳永逸的办法
把make换成3.81的,之前的makefile中,N多处的混合规则,就不用手动修改,即可识别,正常编译了。
对应的,把3.82的make,换成3.81的make,其实也有两种办法:
此法,也是我之前,在Cygwin中折腾crosstool-ng时,去尝试过的:
【已解决】Cygwin下配置Linux内核出错:Makefile:419: *** mixed implicit and normal rules. Stop.
但是很明显,此法,代价太大:
使得整个系统中的make,都从3.82降级到3.81了。
总的来说,也不算好事。
并且,像是Cygwin中,去更换某个版本的软件包的话,相对来说,还比较麻烦。
而Linux系统,比如Ubuntu中,如果你用的源中没有3.81的make的话,还涉及到先换源
总之,就是很麻烦。
所以,一般来说,都还是用下面介绍的这个更好的办法:
第 5.2.1.5.2.2 节 “用crosstool-ng中提供的3.81的make(而不用更换系统环境中的3.82的make)”
最终,后来通过:
而去通过更改crosstool-ng中的配置,得以实现:
直接使用crosstool-ng中提供的那个3.81的make
而实现:
不仅解决了此处的问题:
Makefile:xxx: *** mixed implicit and normal rules. Stop.
而且,无需更改当前系统的3.82的make
也无需去手动更改出错的每一个makefile了。
对应的做法是:
ct-ng menuconfig
去如下配置:
Paths and misc options —>
[*] Try features marked as EXPERIMENTAL
Companion tools —>
[*] Build some companion tools
[*] make
Try features marked as EXPERIMENTAL对应的help帮助内容为:
┌───────────────────────── Try features marked as EXPERIMENTAL ─────────────────────────┐
│ CT_EXPERIMENTAL: │
│ │
│ If you set this to Y, then you will be able to try very experimental │
│ features. │
│ │
│ Experimental features can be one of: │
│ - working, in which case you should tell me it is! │
│ - buggy, in which case you could try patching and send me the result │
│ - unfinished, in which case you could try hacking it and send me the result │
│ - non-existant, in which case you could also try hacking it in and send me │
│ the result │
│ │
│ Symbol: EXPERIMENTAL [=y] │
│ Type : boolean │
│ Prompt: Try features marked as EXPERIMENTAL │
│ Defined at config/global/ct-behave.in:18 │
│ Location: │
│ -> Paths and misc options │
以及:
Build some companion tools对应的help帮助内容为:
┌───────────────────────────── Build some companion tools ──────────────────────────────┐
│ CT_COMP_TOOLS: │
│ │
│ Crosstool-NG relies on some external tools to be recent enough, namely: │
│ make = 3.81 (in some cases) │
│ m4 >= 1.4.12 │
│ autoconf >= 2.63 │
│ automake >= 1.10.2 │
│ libtool >= 2.2.4 │
│ │
│ If your system has older versions, we can build them for you, │
│ but you are strongly encouraged to update your system instead! │
│ │
│ Symbol: COMP_TOOLS [=y] │
│ Type : boolean │
│ Prompt: Build some companion tools │
│ Defined at config/companion_tools.in:8 │
│ Depends on: EXPERIMENTAL [=y] │
│ Location: │
│ -> Companion tools │
如此,再去继续重新编译,可以看到对应的编译输出信息:
[EXTRA] Extracting ‘make-3.81′
[EXTRA] Patching ‘make-3.81′
[EXTRA] =================================================================
[EXTRA] Installing make
[02:14] |
即,去下载并编译对应的3.81的make,供后续使用了。
至此,才算是比较完美的解决此处的问题。
详见:





