mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
229cb0fcdb
Implement long path support on Windows by applying Microsoft's recommended application manifest. To make this work on both Visual C++ and MinGW, include the manifest as a resource when generating the resource files. This way it will be embedded into the executables generated by both compilers. It's important for the manifest resource to have ID 1, otherwise GCC will embed a default manifest. Note that in addition to this, the user needs to have [long paths enabled] either by modifying the registry or by enabling a group policy. [long paths enabled]: https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=cmd#enable-long-paths-in-windows-10-version-1607-and-later Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org>
96 lines
2.6 KiB
Ruby
Executable file
96 lines
2.6 KiB
Ruby
Executable file
#!./miniruby -sI.
|
|
|
|
require './rbconfig'
|
|
|
|
CONFIG = RbConfig::MAKEFILE_CONFIG
|
|
|
|
version = RUBY_VERSION.split(/\./)
|
|
patch = CONFIG['PATCHLEVEL']
|
|
nversion = (version + [patch.to_i < 0 ? '0' : patch]).join(',')
|
|
sversion = version.join('.') + (patch.to_i < 0 ? 'dev' : "p#{patch}")
|
|
|
|
$ruby_name ||= CONFIG["RUBY_INSTALL_NAME"]
|
|
$rubyw_name ||= CONFIG["RUBYW_INSTALL_NAME"] || $ruby_name.sub(/ruby/, '\&w')
|
|
$so_name ||= CONFIG["RUBY_SO_NAME"]
|
|
|
|
icons = {}
|
|
def icons.find(path)
|
|
if File.directory?(path)
|
|
Dir.open(File.expand_path(path)) do |d|
|
|
d.grep(/\.ico$/i) {|i| self[$`] = i}
|
|
end
|
|
else
|
|
self[File.basename(path, '.ico')] = path
|
|
end
|
|
self
|
|
end
|
|
|
|
if ARGV.empty?
|
|
icons.find('.')
|
|
else
|
|
ARGV.each {|i| icons.find(i)}
|
|
end
|
|
|
|
ruby_icon = rubyw_icon = nil
|
|
[$ruby_name, 'ruby'].find do |i|
|
|
if i = icons[i]
|
|
ruby_icon = "1 ICON DISCARDABLE "+i.dump+"\n"
|
|
end
|
|
end
|
|
[$rubyw_name, 'rubyw'].find do |i|
|
|
if i = icons[i]
|
|
rubyw_icon = "1 ICON DISCARDABLE "+i.dump+"\n"
|
|
end
|
|
end
|
|
dll_icons = []
|
|
icons.keys.sort.each do |i|
|
|
dll_icons << "#{dll_icons.size + 1} ICON DISCARDABLE "+icons[i].dump+"\n"
|
|
end
|
|
|
|
[ # base name extension file type desc, icons
|
|
[$ruby_name, CONFIG["EXEEXT"], 'VFT_APP', 'CUI', ruby_icon],
|
|
[$rubyw_name, CONFIG["EXEEXT"], 'VFT_APP', 'GUI', rubyw_icon || ruby_icon],
|
|
[$so_name, '.dll', 'VFT_DLL', 'DLL', dll_icons.join],
|
|
].each do |base, ext, type, desc, icon|
|
|
next if $output and $output != base
|
|
open(base + '.rc', "w") { |f|
|
|
f.binmode if /mingw/ =~ RUBY_PLATFORM
|
|
|
|
f.print <<EOF
|
|
#include <windows.h>
|
|
#include <winver.h>
|
|
|
|
#{icon || ''}
|
|
#{type == 'VFT_APP' ? "1 RT_MANIFEST ruby.manifest" : ""}
|
|
VS_VERSION_INFO VERSIONINFO
|
|
FILEVERSION #{nversion}
|
|
PRODUCTVERSION #{nversion}
|
|
FILEFLAGSMASK 0x3fL
|
|
FILEFLAGS 0x0L
|
|
FILEOS VOS__WINDOWS32
|
|
FILETYPE #{type}
|
|
FILESUBTYPE VFT2_UNKNOWN
|
|
BEGIN
|
|
BLOCK "StringFileInfo"
|
|
BEGIN
|
|
BLOCK "000004b0"
|
|
BEGIN
|
|
VALUE "Comments", "#{RUBY_RELEASE_DATE}\\0"
|
|
VALUE "CompanyName", "http://www.ruby-lang.org/\\0"
|
|
VALUE "FileDescription", "Ruby interpreter (#{desc}) #{sversion} [#{RUBY_PLATFORM}]\\0"
|
|
VALUE "FileVersion", "#{sversion}\\0"
|
|
VALUE "InternalName", "#{base + ext}\\0"
|
|
VALUE "LegalCopyright", "Copyright (C) 1993-#{RUBY_RELEASE_DATE[/\d+/]} Yukihiro Matsumoto\\0"
|
|
VALUE "OriginalFilename", "#{base + ext}\\0"
|
|
VALUE "ProductName", "Ruby interpreter #{sversion} [#{RUBY_PLATFORM}]\\0"
|
|
VALUE "ProductVersion", "#{sversion}\\0"
|
|
END
|
|
END
|
|
BLOCK "VarFileInfo"
|
|
BEGIN
|
|
VALUE "Translation", 0x0, 0x4b0
|
|
END
|
|
END
|
|
EOF
|
|
}
|
|
end
|