somemo's diary

プログラマ、雑記、プログラミング関係はLinkから、数式はこっちでまとめていることが多い

【Emacs】auto-install用のwget【ツール】

auto-installでwgetを用いてダウンロードすると、SYSTEM_WGETRC関連の文字列が付加される問題がありました。これが(とりあえず)解決したので、メモしておきます。その文字列とは、以下のようなものです。

SYSTEM_WGETRC = c:/progra~1/wget/etc/wgetrc
syswgetrc = C:\usr\home\.emacs.d\wget/etc/wgetrc

バージョン

http://sourceforge.net/projects/gnuwin32/files/wget/からダウンロードできるバージョンでは、1.10.1の場合に余計な文字列が出力されないことを確認できました。ただし、使用できないオプションがあります。

HTTPS (SSL/TLS) オプション:
       --no-check-certificate   サーバ証明書を検証しない

使用箇所

auto-installでは、auto-install-download-by-wget関数で利用されています。

(defun auto-install-download-by-wget (url handle-function download-buffer)
・・・
     (start-process "auto-install-wget" (current-buffer)
                    auto-install-wget-command "-q" "-O-" "--no-check-certificate" url)

auto-installでwgetを使用しているのは、auto-install-wget-commandを使っている場所なので確かめやすいと思います。また、-O-で標準出力にダウンロード結果を出しています。このオプションを消したところ、1.10.1より上のバージョンでは余計な文字列が出ていました。

ソースからの判断

冒頭に書いた文字列を出力するようなパッチがあったので、これじゃないかなと思います。パッチの対象はsrc/init.cです。下記パッチ内容の一部のワードで検索すると実装されていることが確認できました。

以下のソースは、wget-1.11.4-src.diffの該当しそうな部分です(84~95行目)。標準エラー出力ですが、フォーマットがまったく同じです。1.11.4-1の場合は、101~112行目です。

   /* If SYSTEM_WGETRC is defined, use it.  */
 #ifdef SYSTEM_WGETRC
-  if (file_exists_p (SYSTEM_WGETRC))
-    ok &= run_wgetrc (SYSTEM_WGETRC);
+  if (opt.verbose)
+    fprintf (stderr, "SYSTEM_WGETRC = %s\n", SYSTEM_WGETRC);
+  char *syswgetrc = relocate (SYSTEM_WGETRC);
+  if (opt.verbose)
+    fprintf (stderr, "syswgetrc = %s\n", syswgetrc);
+  if (file_exists_p (syswgetrc))
+    ok &= run_wgetrc (syswgetrc);
 #endif

以下のソースは、wget-1.10.1-src.diffの該当しそうな部分です(63~77行目)。11系と同じで標準エラー出力ですが、フォーマットがまったく同じであり、コメントアウトされているので問題ないのだと思います。

   /* If SYSTEM_WGETRC is defined, use it.  */
 #ifdef SYSTEM_WGETRC
-  if (file_exists_p (SYSTEM_WGETRC))
-    ok &= run_wgetrc (SYSTEM_WGETRC);
+ syswgetrc = SYSTEM_WGETRC;
+//  printf ("syswgetrc: %s\n", syswgetrc);
+# ifdef ENABLE_RELOCATABLE
+//  printf ("INSTALLDIR: %s\n", INSTALLDIR);
+//  printf ("SYSTEM_WGETRC: %s\n", SYSTEM_WGETRC);
+ syswgetrc = relocatex (INSTALLDIR, SYSTEM_WGETRC);
+# endif /* __GW32__ */
+//  printf ("syswgetrc: %s\n", syswgetrc);
+  if (file_exists_p (syswgetrc))
+    ok &= run_wgetrc (syswgetrc);
 #endif

ソースからコンパイルすれば、サーバ証明書を検証しないオプションを使用しつつwgetを使えると思います。自分はその方法を知らないので、後々できたらなと思います。