MSYS」タグアーカイブ

JpegopitmをMinGWでコンパイルその2

Jpegoptim.cの変更なんだけど下記の変更のほうが修正個所が1か所にまとまるしいいかも。

@@ -53,6 +53,39 @@
 #define ICC_IDENT_STRING  "ICC_PROFILE\0"
 #define ICC_IDENT_STRING_SIZE 12

+#ifdef WIN32
+#define uid_t   int
+#define gid_t   int
+#define ROOT_UID	0
+#define ROOT_GID	0
+#define realpath(N,R) _fullpath((R),(N),_MAX_PATH)
+uid_t getuid(void)
+{
+	return ROOT_UID;
+}
+uid_t geteuid(void)
+{
+	return ROOT_UID;
+}
+gid_t getgid(void)
+{
+	return ROOT_GID;
+}
+gid_t getegid(void)
+{
+	return ROOT_GID;
+}
+int setuid(uid_t uid)
+{
+	return (uid == ROOT_UID ? 0 : -1);
+}
+int setgid(gid_t gid)
+{
+	return (gid == ROOT_GID ? 0 : -1);
+}
+
+#endif
+
 void fatal(const char *msg);

 struct my_error_mgr {

JpegopitmをMinGWでコンパイル

Jpegoptimのコンパイルにちょっと躓いたのでメモ。

  1. msys/src/配下にjpegoptim-1.2.3を解凍して配置
  2. msysを起動して、下記のコマンドを入力
    $ cd /src/jpegoptim-1.2.3/
    $ autoconf
    $ configure
    
  3. configureが通らず、下記のエラーが出る
    configure: error: cannot find install-sh, install.sh, or shtool in aux "."/aux
    
  4. configure.inを下記のように修正する
    @@ -3,7 +3,7 @@
     dnl Process this file with autoconf to produce a configure script.
     AC_INIT(jpegoptim.c)
     AC_CONFIG_HEADER(config.h)
    -AC_CONFIG_AUX_DIR(aux)
    +AC_CONFIG_AUX_DIR(sub)
    
     AC_CANONICAL_HOST
    
  5. subフォルダを作成し、install-sh等を適当な場所から持ってくる(例ではJpeglibから)
    $ mkdir sub
    $ cp ../jpeg-6bx/install-sh ../jpeg-6bx/config.sub ../jpeg-6bx/config.guess ./sub
    
  6. 再度、configureファイルを生成して、configureを実行
    $ autoconf
    $ configure
    
  7. configureが通ったら、makeを実行する。すると下記のエラーが出る
    jpegoptim.c:354: undefined reference to 'realpath'
    jpegoptim.c:354: undefined reference to 'realpath'
    
  8. jpegoptim.cを下記のように修正する
    @@ -351,7 +351,11 @@
           }
           break;
         case 'd':
    -      if (realpath(optarg,dest_path)==NULL || !is_directory(dest_path)) {
    +#ifdef WIN32
    +	if (_fullpath(dest_path,optarg,MAXPATHLEN)==NULL || !is_directory(dest_path)) {
    +#else
    +	if (realpath(optarg,dest_path)==NULL || !is_directory(dest_path)) {
    +#endif
     	fatal("invalid argument for option -d, --dest");
           }
           if (verbose_mode)
    @@ -441,8 +445,13 @@
     	 fatal("splitdir() failed!");
            strncpy(newname,argv[i],sizeof(newname));
          }
    -     snprintf(tmpfilename,sizeof(tmpfilename),
    +#ifdef WIN32
    +	 snprintf(tmpfilename,sizeof(tmpfilename),
    +	      "%sjpegoptim-%d.tmp", tmpdir, (int)getpid());
    +#else
    +	 snprintf(tmpfilename,sizeof(tmpfilename),
     	      "%sjpegoptim-%d-%d.tmp", tmpdir, (int)getuid(), (int)getpid());
    +#endif
        }
    
       retry_point:
    
  9. 再度、makeでコンパイルが通った。

auxというのはBSD系の名残でinstall-shなどの補助スクリプトが各のされているフォルダなのだが、
WindowsではauxというフォルダはDOSの特殊フォルダの名残で作成できない。
そこで、参照先を”sub”に変更し、新たに”sub”フォルダを作成し、GNU系ソフトに同梱されている補助スクリプト類を格納した。
また、コンパイル時にエラーになったrealpathやgetuidはPOSIX系の関数で
Windowsには存在しないため同様の動作するものに置き換えたり削除したりしている。
今回の例ではコンパイルを通すためにrealpathを_fullpathに置き換えたけれどもっときれいに書き直した方がいいな