開けるけど開けない問題についてのアレげな対処(Windows 版 emacs と unzip)

真に受けないで欲しーの。

なんも整えてないまんまの emacs Windows 版と素の MSYS の組み合わせだと、きっとこうなるのね:
canopen_but_cantopen
.tar.gz も、.zip も、「開ける」のね。多分 emacs が「独力で」(elispで)開いてる。で、.zip は「開けない」。

意味、通じてる? 「何が含まれてるかはわかるけど何が含まれてるかしかわからない」。

これは単に MSYS が、tar, g(un)zip, b(un)zip2 は添付しているけど (un)zip は含んでないから、てだけね。

数ある対処の中でも、きっと最も不毛な方法で措置してみる。ここからの流れね。

まず Info-ZIP project から unzip60 のソースをダウンロード

で、tar で展開。

で、これ:

infounzip_build.py
  1 # -*- coding: utf-8 -*-
  2 from os import path
  3 from distutils import log
  4 from distutils import ccompiler, sysconfig
  5 from distutils.dir_util import remove_tree
  6 
  7 log.set_verbosity(1)  # INFO
  8 cc = ccompiler.new_compiler()
  9 sysconfig.customize_compiler(cc)
 10 
 11 TMPDIR = "."
 12 DESTDIR = "."
 13 UNZIP_SRCDIR = "unzip60"
 14 
 15 cc.set_include_dirs([UNZIP_SRCDIR])
 16 
 17 # ==============================================================
 18 #
 19 # build funzip.exe
 20 #
 21 extra_preargs = ['-DWIN32', '-D_CONSOLE', '-DFUNZIP']
 22 tmpdir = path.join(TMPDIR, ".funzip")
 23 objs = cc.compile([path.join(UNZIP_SRCDIR, s) for s in (
 24     'crc32.c',
 25     'win32/crc_i386.c',
 26     'crypt.c',
 27     'funzip.c',
 28     'globals.c',
 29     'inflate.c',
 30     'ttyio.c',
 31     'win32/win32.c'
 32 )], tmpdir, extra_preargs=extra_preargs)
 33 cc.link(
 34     ccompiler.CCompiler.EXECUTABLE,
 35     objs,
 36     path.join(DESTDIR, "funzip.exe"), ".")
 37 remove_tree(tmpdir)
 38 
 39 # ==============================================================
 40 #
 41 # build unzip.exe
 42 #
 43 extra_preargs = ['-DWIN32', '-D_CONSOLE']
 44 tmpdir = path.join(TMPDIR, ".unzip")
 45 objs = cc.compile([path.join(UNZIP_SRCDIR, s) for s in (
 46     'crc32.c',
 47     'win32/crc_i386.c',
 48     'crypt.c',
 49     'envargs.c',
 50     'explode.c',
 51     'extract.c',
 52     'fileio.c',
 53     'globals.c',
 54     'inflate.c',
 55     'list.c',
 56     'match.c',
 57     'win32/nt.c',
 58     'process.c',
 59     'ttyio.c',
 60     'ubz2err.c',
 61     'unreduce.c',
 62     'unshrink.c',
 63     'unzip.c',
 64     'win32/win32.c',
 65     'win32/win32i64.c',
 66     'zipinfo.c'
 67 )], tmpdir, extra_preargs=extra_preargs)
 68 cc.link(
 69     ccompiler.CCompiler.EXECUTABLE,
 70     objs + ['advapi32.lib', 'user32.lib'],
 71     path.join(DESTDIR, "unzip.exe"), ".")
 72 remove_tree(tmpdir)
 73 
 74 # ==============================================================
 75 #
 76 # build unzipsfx.exe
 77 #
 78 extra_preargs = ['-DWIN32', '-D_CONSOLE', '-DSFX']
 79 tmpdir = path.join(TMPDIR, ".unzipsfx")
 80 objs = cc.compile([path.join(UNZIP_SRCDIR, s) for s in (
 81     'crc32.c',
 82     'win32/crc_i386.c',
 83     'crypt.c',
 84     'extract.c',
 85     'fileio.c',
 86     'globals.c',
 87     'inflate.c',
 88     'match.c',
 89     'win32/nt.c',
 90     'process.c',
 91     'ttyio.c',
 92     'ubz2err.c',
 93     'unzip.c',
 94     'win32/win32.c'
 95 )], tmpdir, extra_preargs=extra_preargs)
 96 cc.link(
 97     ccompiler.CCompiler.EXECUTABLE,
 98     objs + ['advapi32.lib', 'user32.lib'],
 99     path.join(DESTDIR, "unzipsfx.exe"), ".")
100 remove_tree(tmpdir)

こんなふうに置いてな:

1 ./infounzip_build.py
2 ./unzip60/

スクリプトを実行すると infounzip_build.py と同じ場所に unzip.exe、funzip.exe、unzipsfx.exe が出来ます。うまくいきゃね。これこれ前提ね。

にゃお、ほんりゃあは bzip2 開けるぜ機能ついとります、unzip60 にやあ。んなもんなんで必要だか。ばっかじゃねーの。馬鹿馬鹿しいので存在を無視したビルドになってます。(あと、dep_util てないので、一度ビルドしていても何度でも一からビルドしますよ。)












にゃ? 何が「きっと最も不毛な方法」かって? だって、バイナリ提供されとるもん。GnuWin という手もあるね。

それでもなんでこんなネタなのか? それはね。「Microsoft Visual C++ Compiler for Python 2.7しか手持ちじゃない」という、結構マゾヒスティックな環境で何かしなければならない、の時の、かなり難易度が低い良いネタだから、なの。