Tommy 碎碎念

Tommy Wu's blog

« 上一篇 | 下一篇 »

奇怪的 MSYS Make freeze 問題
post by tommy @ 07 十一月, 2012 21:59

最近因為要更新所用的 TDM64-GCC 中的 mingw64-runtime-crt (有些 function 在最近的版本才有), 結果, 玩著玩著就自己 build 起 mingw64 用的 gcc 4.7.2 來了 (這中間也有些心得, 有空再說) .

結果, 在 build gcc 的過程 (使用 MSYS 環境), 使用 make -jN 來加速編譯的速度時, 發現常常跑到一半, make 就停住了 (不過仍佔用不少 CPU 時間), 每次都要 kill 之後再重跑.

上網找了一下, 發現 mingwbuilds 這個專案的維護者之一, 最近也反應了這個問題, 不過似乎沒有什麼解決的方法.  再往久一點的時間找資料, 發現有這問題的人並不算少, 有人說用 mingw32-make 就可以解決 (不過我試了一下, 一樣會隨機停下來).... 看來並沒有什麼可以的解決方案.

由於 msys 的 make 停在 3.81 版本, 而 make 3.82 也出來一陣子了, 所以就試著自己編一個新的版本來用看看. 先抓回 msys 的 make 3.81 的 source, 解開來之後, 有 4 個 patch, 就打算套用到 3.82 上頭.... 結果... 相差太大, 無法直接套用... 手動慢慢處理時, 發現前兩個 patch 似乎可以不用了 (cygwin 用的, 不過 3.82 好像本身就支援 cygwin, 應該可以不用自己 patch), 就直接處理後面兩個小 patch (有些不同, 不過一個是不管大小寫, 一個是 configure 的設定, 我改了一下, 好像沒什麼問題)....

patch 如下:

diff -Nur make-3.82/Makefile.am make-3.82.patched/Makefile.am
--- make-3.82/Makefile.am 2010-07-13 09:20:30 +0800
+++ make-3.82.patched/Makefile.am 2012-11-07 14:15:44 +0800
@@ -173,10 +173,17 @@
case `cd $(srcdir); pwd` in `pwd`) : ;; \
*) test -d tests || mkdir tests; \
rm -f srctests; \
- if ln -s "$(srcdir)/tests" srctests; then \
+ if /bin/false && ln -s "$(srcdir)/tests" srctests; then \
for f in run_make_tests run_make_tests.pl test_driver.pl scripts; do \
rm -f tests/$$f; ln -s ../srctests/$$f tests; \
- done; fi ;; \
+ done; \
+ else \
+ mkdir srctests ;\
+ lndir $(srcdir)/tests/ srctests ;\
+ for f in run_make_tests run_make_tests.pl test_driver.pl scripts; do \
+ rm -f tests/$$f; (cd tests && ln -s ../srctests/$$f .); \
+ done; \
+ fi ;; \
esac; \
echo "cd tests && $(PERL) ./run_make_tests.pl -make ../make$(EXEEXT) $(MAKETESTFLAGS)"; \
cd tests && $(PERL) ./run_make_tests.pl -make ../make$(EXEEXT) $(MAKETESTFLAGS); \
diff -Nur make-3.82/configure.in make-3.82.patched/configure.in
--- make-3.82/configure.in 2010-07-28 13:39:50 +0800
+++ make-3.82.patched/configure.in 2012-11-07 14:16:49 +0800
@@ -41,9 +41,8 @@
 
# Specialized system macros
AC_CANONICAL_HOST
-AC_AIX
+AC_USE_SYSTEM_EXTENSIONS
AC_ISC_POSIX
-AC_MINIX
 
# Enable gettext, in "external" mode.
 
diff -Nur make-3.82/implicit.c make-3.82.patched/implicit.c
--- make-3.82/implicit.c 2010-07-13 09:20:40 +0800
+++ make-3.82.patched/implicit.c 2012-11-07 14:22:25 +0800
@@ -711,7 +711,7 @@
/* @@ dep->changed check is disabled. */
if (lookup_file (d->name) != 0
/*|| ((!dep->changed || check_lastslash) && */
- || file_exists_p (d->name))
+ || file_exists_p (d->name) || (access (d->name, F_OK) == 0))
{
(pat++)->name = d->name;
continue;
diff -Nur make-3.82/vpath.c make-3.82.patched/vpath.c
--- make-3.82/vpath.c 2010-07-19 15:10:54 +0800
+++ make-3.82.patched/vpath.c 2012-11-07 14:14:04 +0800
@@ -461,7 +461,8 @@
/* We know the directory is in the hash table now because either
construct_vpath_list or the code just above put it there.
Does the file we seek exist in it? */
- exists_in_cache = exists = dir_file_exists_p (name, filename);
+ //exists_in_cache = exists = dir_file_exists_p (name, filename);
+ exists_in_cache = exists = 1;
#endif
}

如果不打算自己 build, 也不怕我加料的話, 可以抓我自己做的這個版本:
http://www.teatime.com.tw/~tommy/files/make-3.82-1-msys-1.0.17-bin.tar.lzma

換用這個版本之後, 我試著 build gcc 幾次, 目前都很正常, 沒有再碰到 freeze 的情形了.


2012/11/12:

看來上頭的解決方法是錯的... 在另一台機器上, 一樣很頻繁的出現同樣的問題.

這兩天試著加上一些訊息在 make 上頭, 結果.... 發現錯誤似乎不是在 make 上面, 因為我在 make 一開始執行與結束時都把訊息寫到檔案上, 當出現 make freeze 的時候, 那個 pid 並沒有出現在這些檔案中, 表示系統在執行某個 make 時, 在執行到 main() 之前就已經造成該行程 freeze 了. 所以... 問題應該是出在 msys 本身.

往下追要看的東西似乎有點多, 暫時先放棄了....  目前這個 freeze 的情形似乎只會出現在比較複雜的 make 上頭. 所以.... 只好在這類的程式上, 不要用 -j 來處理了.

PS. 另外.... 轉到 cygwin 上頭, 似乎就沒有這個問題了.

Del.icio.us Furl HEMiDEMi Technorati MyShare
commons icon [1] Re:奇怪的 MSYS Make freeze 問題 [ 回覆 ]

Mozilla 這邊也有這問題很久了,他們的解法是用 python 寫一個 make 的前導 (make.py) 解決。

迴響
暱稱:
標題:
個人網頁:
電子郵件:
迴響

  

Bad Behavior 已經阻擋了 91 個過去 7 天試圖闖關的垃圾迴響與引用。
Power by LifeType. Template design by JamesHuang. Valid XHTML and CSS