summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/io/console/depend13
-rw-r--r--ext/io/console/extconf.rb2
-rw-r--r--ext/io/console/win32_vk.chksum1
-rwxr-xr-xtool/checksum.rb65
4 files changed, 78 insertions, 3 deletions
diff --git a/ext/io/console/depend b/ext/io/console/depend
index c961843bcc..1e485fd194 100644
--- a/ext/io/console/depend
+++ b/ext/io/console/depend
@@ -1,3 +1,5 @@
+WIN32_VK_HEADER = {$(srcdir)}win32_vk.chksum
+
$(OBJS): $(HDRS) $(ruby_headers) \
$(VK_HEADER) \
$(hdrdir)/ruby/io.h \
@@ -6,5 +8,12 @@ $(OBJS): $(HDRS) $(ruby_headers) \
win32_vk.h: win32_vk.list
-.list.h:
- gperf --ignore-case -E -C -P -p -j1 -i 1 -g -o -t -K ofs -N console_win32_vk -k* --output-file=$@ $<
+{$(srcdir)}.list.h:
+ gperf --ignore-case -E -C -P -p -j1 -i 1 -g -o -t -K ofs -N console_win32_vk -k* --output-file=$(@F) $<
+
+.SUFFIXES: .chksum .list
+
+{$(srcdir)}.list.chksum:
+ @$(RUBY) -I$(top_srcdir)/tool -rchecksum \
+ -e "Checksum.update(ARGV) {|k,f|k.copy(f) rescue k.make(f)}" \
+ -- --make=$(MAKE) -I$(srcdir) $(<F) $(@F:.chksum=.h)
diff --git a/ext/io/console/extconf.rb b/ext/io/console/extconf.rb
index 1658dc01eb..15fa798a4d 100644
--- a/ext/io/console/extconf.rb
+++ b/ext/io/console/extconf.rb
@@ -5,7 +5,7 @@ hdr = nil
case
when macro_defined?("_WIN32", "")
# rb_w32_map_errno: 1.8.7
- vk_header = "win32_vk.h"
+ vk_header = "$(WIN32_VK_HEADER)"
when hdr = %w"termios.h termio.h".find {|h| have_header(h)}
have_func("cfmakeraw", hdr)
when have_header(hdr = "sgtty.h")
diff --git a/ext/io/console/win32_vk.chksum b/ext/io/console/win32_vk.chksum
new file mode 100644
index 0000000000..bc9fff7560
--- /dev/null
+++ b/ext/io/console/win32_vk.chksum
@@ -0,0 +1 @@
+src="win32_vk.list", len=3269, checksum=34076
diff --git a/tool/checksum.rb b/tool/checksum.rb
new file mode 100755
index 0000000000..40f444efd2
--- /dev/null
+++ b/tool/checksum.rb
@@ -0,0 +1,65 @@
+#!ruby
+
+require_relative 'vpath'
+
+class Checksum
+ def initialize(vpath)
+ @vpath = vpath
+ end
+
+ def source=(source)
+ @source = source
+ @checksum = File.basename(source, ".*") + ".chksum"
+ end
+
+ def update?
+ src = @vpath.read(@source)
+ @len = src.length
+ @sum = src.sum
+ begin
+ data = @vpath.read(@checksum)
+ rescue
+ return false
+ else
+ return false unless data[/src="([0-9a-z_.-]+)",/, 1] == @source
+ return false unless @len == data[/\blen=(\d+)/, 1].to_i
+ return false unless @sum == data[/\bchecksum=(\d+)/, 1].to_i
+ return true
+ end
+ end
+
+ def update!
+ open(@checksum, "wb") {|f|
+ f.puts("src=\"#{@source}\", len=#{@len}, checksum=#{@sum}")
+ }
+ end
+
+ def update
+ return true if update?
+ update! if ret = yield(self)
+ ret
+ end
+
+ def copy(name)
+ @vpath.open(name, "rb") {|f|
+ IO.copy_stream(f, name)
+ }
+ true
+ end
+
+ def make(arg)
+ system([@make, arg].compact.join(' '))
+ end
+
+ def def_options(opt = (require 'optparse'; OptionParser.new))
+ @vpath.def_options(opt)
+ opt.on("--make=PATH") {|v| @make = v}
+ opt
+ end
+
+ def self.update(argv)
+ k = new(VPath.new)
+ k.source, *argv = k.def_options.parse(*argv)
+ k.update {|k| yield(k, *argv)}
+ end
+end