64bit版CygwinでwolをコンパイルしてWake on Lanする

creation date 2015/03/05 18:55 last date modified 2016/06/05 23:37 | category: | tags: Cygwin
スポンサード リンク

cygwinにはどうやらWakeOnLanのためのクライアントが無いようだ。そこで, wol コマンドをコンパイルして使えるようにする。なお,環境は以下のとおり。

$ uname -a
CYGWIN_NT-6.3 User-PC 1.7.34(0.285/5/3) 2015-02-04 12:14 x86_64 Cygwin

まず, wol | SourceForge.net からソースコードをダウンロードしてくる。で,configureするのだが,そのままでは

~/wol-0.7.1 $ ./configure
checking build system type... ./config.guess: unable to guess system type

This script, last modified 2004-01-05, has failed to recognize
the operating system you are using. It is advised that you
download the most up to date version of the config scripts from


If the version you run (./config.guess) is already up to date, please
send the following data and any information you think might be
pertinent to <config-patches@gnu.org> in order to provide the needed
information to handle your system.

config.guess timestamp = 2004-01-05

uname -m = x86_64
uname -r = 1.7.34(0.285/5/3)
uname -s = CYGWIN_NT-6.3
uname -v = 2015-02-04 12:14

/usr/bin/uname -p = unknown
/bin/uname -X     =

hostinfo               =
/bin/universe          =
/usr/bin/arch -k       =
/bin/arch              = x86_64
/usr/bin/oslevel       =
/usr/convex/getsysinfo =

UNAME_RELEASE = 1.7.34(0.285/5/3)
UNAME_VERSION = 2015-02-04 12:14
configure: error: cannot guess build type; you must specify one
Error : ./conifigure

となり,アーキテクチャを判定できないようだ。そこで --build オプションで明示的に64bitのCygwinだと教えてあげることにする。

~/wol-0.7.1 $ ./configure --build=x86_64-unknown-cygwin

これで configure は通るようになったが,今度は make でエラーがでた。

~/wol-0.7.1 $ make

~~~~ 上略 ~~~~

if gcc -DHAVE_CONFIG_H -I. -I. -I.. -I../intl -I../include    -g -O2 -W -Wall -Wpointer-arith -Wimplicit-function-declaration -MT realloc.o -MD -MP -MF ".deps/realloc.Tpo" \
  -c -o realloc.o `test -f 'realloc.c' || echo './'`realloc.c; \
then mv -f ".deps/realloc.Tpo" ".deps/realloc.Po"; \
else rm -f ".deps/realloc.Tpo"; exit 1; \
realloc.c:27:7: 警告: 組み込み関数 ‘malloc’ と型が競合しています
 char *malloc ();
realloc.c:28:7: 警告: 組み込み関数 ‘realloc’ と型が競合しています
 char *realloc ();
if gcc -DHAVE_CONFIG_H -I. -I. -I.. -I../intl -I../include    -g -O2 -W -Wall -Wpointer-arith -Wimplicit-function-declaration -MT getpass4.o -MD -MP -MF ".deps/getpass4.Tpo" \
  -c -o getpass4.o `test -f 'getpass4.c' || echo './'`getpass4.c; \
then mv -f ".deps/getpass4.Tpo" ".deps/getpass4.Po"; \
else rm -f ".deps/getpass4.Tpo"; exit 1; \
In file included from getpass4.c:7:0:
getline.h:32:1: エラー: ‘getline’ と型が競合しています
 getline PARAMS ((char **_lineptr, size_t *_n, FILE *_stream));
In file included from /usr/include/stdio.h:29:0,
                 from getpass4.c:3:
/usr/include/sys/stdio.h:37:9: 備考: 前の ‘getline’ の宣言はここです
 ssize_t _EXFUN(getline, (char **, size_t *, FILE *));
In file included from getpass4.c:7:0:
getline.h:35:1: エラー: ‘getdelim’ と型が競合しています
 getdelim PARAMS ((char **_lineptr, size_t *_n, int _delimiter, FILE *_stream));
In file included from /usr/include/stdio.h:29:0,
                 from getpass4.c:3:
/usr/include/sys/stdio.h:38:9: 備考: 前の ‘getdelim’ の宣言はここです
 ssize_t _EXFUN(getdelim, (char **, size_t *, int, FILE *));
Makefile:240: ターゲット 'getpass4.o' のレシピで失敗しました
make[2]: *** [getpass4.o] エラー 1
make[2]: ディレクトリ '/home/tm/wol-0.7.1/lib' から出ます
Makefile:230: ターゲット 'all-recursive' のレシピで失敗しました
make[1]: *** [all-recursive] エラー 1
make[1]: ディレクトリ '/home/tm/wol-0.7.1' から出ます
Makefile:183: ターゲット 'all' のレシピで失敗しました
make: *** [all] エラー 2
ERROR : make

どうやら stdio.h の内容と競合しているようだ。システム標準のファイルに手を加えるのは心が引けるが, /usr/include/sys/stdio.h の該当する2行をコメントアウトする。

// ssize_t  _EXFUN(getline, (char **, size_t *, FILE *));
// ssize_t  _EXFUN(getdelim, (char **, size_t *, int, FILE *));

あとはすんなりと make が通る。

~/wol-0.7.1 $ make
~/wol-0.7.1 $ make install

なお,今回のようにソースから make するときは stow を使って管理すると楽。 stowpaco のようなものだがpacoのように開発が混乱していないし,cygwinのsetup.exeでインストールできる点で優れている。 stow の使い方については別記事 stowでソースからmakeしたプログラムを管理する | 電脳手帳 に書いた。

Comments !