mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* Makefile.in (PLATFORM_DIR): add a variable for win32
directory.
* Makefile.in (clean-platform): add new target. It cleans `win32` directory. * common.mk (clean): add a dependency for `win32` directory. * common.mk (distclean): ditto. * common.mk (distclean-platform): add new target. It cleans `win32` directory. * common.mk ($(PLATFORM_D)): add new target to make `win32` directory. * common.mk (win32/win32.$(OBJEXT)): move win32.o into `win32` directory. * common.mk (win32/file.$(OBJEXT)): add new target for win32/file.c. * configure.in: move win32.o into `win32` directory and add win32/file.o to MISSING. * file.c (file_load_ok, rb_file_load_ok): replace static file_load_ok() with public rb_file_load_ok(). It's to link Windows implementation in win32/file.c. * file.c (rb_find_file_ext_safe): ditto. * file.c (rb_find_file_safe): ditto. * win32/file.c (rb_file_load_ok): new file. Add Windows specific optimized implementation of rb_file_load_ok(). We created a separated file to avoid too many #ifdef macro which is unreadable. * win32/Makefile.sub (PLATFORM_DIR): add a variable for `win32` directory. * win32/Makefile.sub (MISSING): move win32.obj into `win32` directory and add win32/file.obj to MISSING. * win32/Makefile.sub (MAKEDIRS): replace MINIRUBY with BASERUBY. It's because miniruby doesn't exist when making `win32` directory. * win32/Makefile.sub (clean-platform): add new target to clean `win32` directory. * win32/Makefile.sub ({$(srcdir)}.c{}.obj): make it not match win32/file.c to build properly. * win32/Makefile.sub (win32/win32.$(OBJEXT)): move win32.obj into `win32` directory. Patch created with Luis Lavena. [ruby-core:42480] [Feature #5999] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@34849 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
3486a98a71
commit
4b1e9f0c47
7 changed files with 105 additions and 20 deletions
44
ChangeLog
44
ChangeLog
|
@ -1,3 +1,47 @@
|
||||||
|
Tue Feb 28 23:20:01 2012 Hiroshi Shirosaki <h.shirosaki@gmail.com>
|
||||||
|
|
||||||
|
* Makefile.in (PLATFORM_DIR): add a variable for `win32` directory.
|
||||||
|
* Makefile.in (clean-platform): add new target.
|
||||||
|
It cleans `win32` directory.
|
||||||
|
|
||||||
|
* common.mk (clean): add a dependency for `win32` directory.
|
||||||
|
* common.mk (distclean): ditto.
|
||||||
|
* common.mk (distclean-platform): add new target.
|
||||||
|
It cleans `win32` directory.
|
||||||
|
* common.mk ($(PLATFORM_D)): add new target to make `win32` directory.
|
||||||
|
* common.mk (win32/win32.$(OBJEXT)): move win32.o into `win32`
|
||||||
|
directory.
|
||||||
|
* common.mk (win32/file.$(OBJEXT)): add new target for win32/file.c.
|
||||||
|
|
||||||
|
* configure.in: move win32.o into `win32` directory and add
|
||||||
|
win32/file.o to MISSING.
|
||||||
|
|
||||||
|
* file.c (file_load_ok, rb_file_load_ok): replace static
|
||||||
|
file_load_ok() with public rb_file_load_ok().
|
||||||
|
It's to link Windows implementation in win32/file.c.
|
||||||
|
* file.c (rb_find_file_ext_safe): ditto.
|
||||||
|
* file.c (rb_find_file_safe): ditto.
|
||||||
|
|
||||||
|
* win32/file.c (rb_file_load_ok): new file. Add Windows specific
|
||||||
|
optimized implementation of rb_file_load_ok(). We created a
|
||||||
|
separated file to avoid too many #ifdef macro which is unreadable.
|
||||||
|
|
||||||
|
* win32/Makefile.sub (PLATFORM_DIR): add a variable for `win32`
|
||||||
|
directory.
|
||||||
|
* win32/Makefile.sub (MISSING): move win32.obj into `win32`
|
||||||
|
directory and add win32/file.obj to MISSING.
|
||||||
|
* win32/Makefile.sub (MAKEDIRS): replace MINIRUBY with BASERUBY.
|
||||||
|
It's because miniruby doesn't exist when making `win32` directory.
|
||||||
|
* win32/Makefile.sub (clean-platform): add new target to clean `win32`
|
||||||
|
directory.
|
||||||
|
* win32/Makefile.sub ({$(srcdir)}.c{}.obj): make it not match
|
||||||
|
win32/file.c to build properly.
|
||||||
|
* win32/Makefile.sub (win32/win32.$(OBJEXT)): move win32.obj into
|
||||||
|
`win32` directory.
|
||||||
|
|
||||||
|
Patch created with Luis Lavena.
|
||||||
|
[ruby-core:42480] [Feature #5999]
|
||||||
|
|
||||||
Tue Feb 28 20:27:25 2012 Tadayoshi Funaba <tadf@dotrb.org>
|
Tue Feb 28 20:27:25 2012 Tadayoshi Funaba <tadf@dotrb.org>
|
||||||
|
|
||||||
* ext/date/date_core.c: [ruby-core:42998]
|
* ext/date/date_core.c: [ruby-core:42998]
|
||||||
|
|
|
@ -12,6 +12,7 @@ NULL = /dev/null
|
||||||
srcdir = @srcdir@
|
srcdir = @srcdir@
|
||||||
top_srcdir = $(srcdir)
|
top_srcdir = $(srcdir)
|
||||||
hdrdir = $(srcdir)/include
|
hdrdir = $(srcdir)/include
|
||||||
|
PLATFORM_DIR = win32
|
||||||
|
|
||||||
CC = @CC@
|
CC = @CC@
|
||||||
CPP = @CPP@
|
CPP = @CPP@
|
||||||
|
@ -346,6 +347,9 @@ clean-capi distclean-capi realclean-capi:
|
||||||
@echo $(@:-capi=ing) capi
|
@echo $(@:-capi=ing) capi
|
||||||
$(Q)$(RMALL) $(CAPIOUT)
|
$(Q)$(RMALL) $(CAPIOUT)
|
||||||
|
|
||||||
|
clean-platform:
|
||||||
|
@$(RM) $(PLATFORM_DIR)/.time
|
||||||
|
-$(Q) $(RMDIR) $(PLATFORM_DIR) 2> /dev/null || true
|
||||||
|
|
||||||
ext/extinit.$(OBJEXT): ext/extinit.c $(SETUP)
|
ext/extinit.$(OBJEXT): ext/extinit.c $(SETUP)
|
||||||
$(ECHO) compiling $@
|
$(ECHO) compiling $@
|
||||||
|
|
14
common.mk
14
common.mk
|
@ -24,6 +24,7 @@ EXTCONF = extconf.rb
|
||||||
RBCONFIG = ./.rbconfig.time
|
RBCONFIG = ./.rbconfig.time
|
||||||
LIBRUBY_EXTS = ./.libruby-with-ext.time
|
LIBRUBY_EXTS = ./.libruby-with-ext.time
|
||||||
REVISION_H = ./.revision.time
|
REVISION_H = ./.revision.time
|
||||||
|
PLATFORM_D = ./$(PLATFORM_DIR)/.time
|
||||||
RDOCOUT = $(EXTOUT)/rdoc
|
RDOCOUT = $(EXTOUT)/rdoc
|
||||||
CAPIOUT = doc/capi
|
CAPIOUT = doc/capi
|
||||||
ID_H_TARGET = -id.h-
|
ID_H_TARGET = -id.h-
|
||||||
|
@ -424,7 +425,7 @@ install-prereq: $(CLEAR_INSTALLED_LIST) PHONY
|
||||||
clear-installed-list: PHONY
|
clear-installed-list: PHONY
|
||||||
@> $(INSTALLED_LIST) set MAKE="$(MAKE)"
|
@> $(INSTALLED_LIST) set MAKE="$(MAKE)"
|
||||||
|
|
||||||
clean: clean-ext clean-local clean-enc clean-golf clean-rdoc clean-capi clean-extout
|
clean: clean-ext clean-local clean-enc clean-golf clean-rdoc clean-capi clean-extout clean-platform
|
||||||
clean-local:: PHONY
|
clean-local:: PHONY
|
||||||
@$(RM) $(OBJS) $(MINIOBJS) $(MAINOBJ) $(LIBRUBY_A) $(LIBRUBY_SO) $(LIBRUBY) $(LIBRUBY_ALIASES)
|
@$(RM) $(OBJS) $(MINIOBJS) $(MAINOBJ) $(LIBRUBY_A) $(LIBRUBY_SO) $(LIBRUBY) $(LIBRUBY_ALIASES)
|
||||||
@$(RM) $(PROGRAM) $(WPROGRAM) miniruby$(EXEEXT) dmyext.$(OBJEXT) $(ARCHFILE) .*.time
|
@$(RM) $(PROGRAM) $(WPROGRAM) miniruby$(EXEEXT) dmyext.$(OBJEXT) $(ARCHFILE) .*.time
|
||||||
|
@ -434,10 +435,11 @@ clean-golf: PHONY
|
||||||
@$(RM) $(GORUBY)$(EXEEXT) $(GOLFOBJS)
|
@$(RM) $(GORUBY)$(EXEEXT) $(GOLFOBJS)
|
||||||
clean-rdoc: PHONY
|
clean-rdoc: PHONY
|
||||||
clean-capi: PHONY
|
clean-capi: PHONY
|
||||||
|
clean-platform: PHONY
|
||||||
clean-extout: PHONY
|
clean-extout: PHONY
|
||||||
clean-docs: clean-rdoc clean-capi
|
clean-docs: clean-rdoc clean-capi
|
||||||
|
|
||||||
distclean: distclean-ext distclean-local distclean-enc distclean-golf distclean-extout
|
distclean: distclean-ext distclean-local distclean-enc distclean-golf distclean-extout distclean-platform
|
||||||
distclean-local:: clean-local
|
distclean-local:: clean-local
|
||||||
@$(RM) $(MKFILES) yasmdata.rb *.inc
|
@$(RM) $(MKFILES) yasmdata.rb *.inc
|
||||||
@$(RM) config.cache config.status config.status.lineno $(PRELUDES)
|
@$(RM) config.cache config.status config.status.lineno $(PRELUDES)
|
||||||
|
@ -448,6 +450,7 @@ distclean-golf: clean-golf
|
||||||
distclean-rdoc: PHONY
|
distclean-rdoc: PHONY
|
||||||
distclean-capi: PHONY
|
distclean-capi: PHONY
|
||||||
distclean-extout: clean-extout
|
distclean-extout: clean-extout
|
||||||
|
distclean-platform: clean-platform
|
||||||
|
|
||||||
realclean:: realclean-ext realclean-local realclean-enc realclean-golf realclean-extout
|
realclean:: realclean-ext realclean-local realclean-enc realclean-golf realclean-extout
|
||||||
realclean-local:: distclean-local
|
realclean-local:: distclean-local
|
||||||
|
@ -572,7 +575,12 @@ dl_os2.$(OBJEXT): {$(VPATH)}dl_os2.c
|
||||||
ia64.$(OBJEXT): {$(VPATH)}ia64.s
|
ia64.$(OBJEXT): {$(VPATH)}ia64.s
|
||||||
$(CC) $(CFLAGS) -c $<
|
$(CC) $(CFLAGS) -c $<
|
||||||
|
|
||||||
win32.$(OBJEXT): {$(VPATH)}win32.c $(RUBY_H_INCLUDES)
|
$(PLATFORM_D):
|
||||||
|
$(Q) $(MAKEDIRS) $(PLATFORM_DIR)
|
||||||
|
@exit > $@
|
||||||
|
|
||||||
|
win32/win32.$(OBJEXT): {$(VPATH)}win32/win32.c $(RUBY_H_INCLUDES) $(PLATFORM_D)
|
||||||
|
win32/file.$(OBJEXT): {$(VPATH)}win32/file.c $(RUBY_H_INCLUDES) $(PLATFORM_D)
|
||||||
|
|
||||||
###
|
###
|
||||||
|
|
||||||
|
|
|
@ -2620,7 +2620,8 @@ AS_CASE(["$target_os"],
|
||||||
fi
|
fi
|
||||||
EXPORT_PREFIX=' '
|
EXPORT_PREFIX=' '
|
||||||
DLDFLAGS="${DLDFLAGS}"' $(DEFFILE)'
|
DLDFLAGS="${DLDFLAGS}"' $(DEFFILE)'
|
||||||
AC_LIBOBJ([win32])
|
AC_LIBOBJ([win32/win32])
|
||||||
|
AC_LIBOBJ([win32/file])
|
||||||
COMMON_LIBS=m
|
COMMON_LIBS=m
|
||||||
# COMMON_MACROS="WIN32_LEAN_AND_MEAN="
|
# COMMON_MACROS="WIN32_LEAN_AND_MEAN="
|
||||||
COMMON_HEADERS="winsock2.h windows.h"
|
COMMON_HEADERS="winsock2.h windows.h"
|
||||||
|
|
20
file.c
20
file.c
|
@ -5144,8 +5144,9 @@ rb_path_check(const char *path)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
#ifndef _WIN32
|
||||||
file_load_ok(const char *path)
|
int
|
||||||
|
rb_file_load_ok(const char *path)
|
||||||
{
|
{
|
||||||
int ret = 1;
|
int ret = 1;
|
||||||
int fd = rb_cloexec_open(path, O_RDONLY, 0);
|
int fd = rb_cloexec_open(path, O_RDONLY, 0);
|
||||||
|
@ -5162,12 +5163,7 @@ file_load_ok(const char *path)
|
||||||
(void)close(fd);
|
(void)close(fd);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
int
|
|
||||||
rb_file_load_ok(const char *path)
|
|
||||||
{
|
|
||||||
return file_load_ok(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
is_explicit_relative(const char *path)
|
is_explicit_relative(const char *path)
|
||||||
|
@ -5219,7 +5215,7 @@ rb_find_file_ext_safe(VALUE *filep, const char *const *ext, int safe_level)
|
||||||
fnlen = RSTRING_LEN(fname);
|
fnlen = RSTRING_LEN(fname);
|
||||||
for (i=0; ext[i]; i++) {
|
for (i=0; ext[i]; i++) {
|
||||||
rb_str_cat2(fname, ext[i]);
|
rb_str_cat2(fname, ext[i]);
|
||||||
if (file_load_ok(RSTRING_PTR(fname))) {
|
if (rb_file_load_ok(RSTRING_PTR(fname))) {
|
||||||
*filep = copy_path_class(fname, *filep);
|
*filep = copy_path_class(fname, *filep);
|
||||||
return (int)(i+1);
|
return (int)(i+1);
|
||||||
}
|
}
|
||||||
|
@ -5247,7 +5243,7 @@ rb_find_file_ext_safe(VALUE *filep, const char *const *ext, int safe_level)
|
||||||
RB_GC_GUARD(str) = rb_get_path_check(str, safe_level);
|
RB_GC_GUARD(str) = rb_get_path_check(str, safe_level);
|
||||||
if (RSTRING_LEN(str) == 0) continue;
|
if (RSTRING_LEN(str) == 0) continue;
|
||||||
file_expand_path(fname, str, 0, tmp);
|
file_expand_path(fname, str, 0, tmp);
|
||||||
if (file_load_ok(RSTRING_PTR(tmp))) {
|
if (rb_file_load_ok(RSTRING_PTR(tmp))) {
|
||||||
*filep = copy_path_class(tmp, *filep);
|
*filep = copy_path_class(tmp, *filep);
|
||||||
return (int)(j+1);
|
return (int)(j+1);
|
||||||
}
|
}
|
||||||
|
@ -5286,7 +5282,7 @@ rb_find_file_safe(VALUE path, int safe_level)
|
||||||
if (safe_level >= 1 && !fpath_check(path)) {
|
if (safe_level >= 1 && !fpath_check(path)) {
|
||||||
rb_raise(rb_eSecurityError, "loading from unsafe path %s", f);
|
rb_raise(rb_eSecurityError, "loading from unsafe path %s", f);
|
||||||
}
|
}
|
||||||
if (!file_load_ok(f)) return 0;
|
if (!rb_file_load_ok(f)) return 0;
|
||||||
if (!expanded)
|
if (!expanded)
|
||||||
path = copy_path_class(file_expand_path_1(path), path);
|
path = copy_path_class(file_expand_path_1(path), path);
|
||||||
return path;
|
return path;
|
||||||
|
@ -5307,7 +5303,7 @@ rb_find_file_safe(VALUE path, int safe_level)
|
||||||
if (RSTRING_LEN(str) > 0) {
|
if (RSTRING_LEN(str) > 0) {
|
||||||
file_expand_path(path, str, 0, tmp);
|
file_expand_path(path, str, 0, tmp);
|
||||||
f = RSTRING_PTR(tmp);
|
f = RSTRING_PTR(tmp);
|
||||||
if (file_load_ok(f)) goto found;
|
if (rb_file_load_ok(f)) goto found;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -122,6 +122,9 @@ PLATFORM = mswin32
|
||||||
!ifdef NTVER
|
!ifdef NTVER
|
||||||
ARCHDEFS = -D_WIN32_WINNT=$(NTVER) $(ARCHDEFS)
|
ARCHDEFS = -D_WIN32_WINNT=$(NTVER) $(ARCHDEFS)
|
||||||
!endif
|
!endif
|
||||||
|
!if !defined(PLATFORM_DIR)
|
||||||
|
PLATFORM_DIR = win32
|
||||||
|
!endif
|
||||||
|
|
||||||
arch = $(ARCH)-$(PLATFORM)
|
arch = $(ARCH)-$(PLATFORM)
|
||||||
sitearch = $(ARCH)-$(RT)
|
sitearch = $(ARCH)-$(RT)
|
||||||
|
@ -225,7 +228,7 @@ LIBS = oldnames.lib user32.lib advapi32.lib shell32.lib ws2_32.lib imagehlp.lib
|
||||||
LIBS = unicows.lib $(LIBS)
|
LIBS = unicows.lib $(LIBS)
|
||||||
!endif
|
!endif
|
||||||
!if !defined(MISSING)
|
!if !defined(MISSING)
|
||||||
MISSING = acosh.obj cbrt.obj crypt.obj erf.obj ffs.obj langinfo.obj lgamma_r.obj strlcat.obj strlcpy.obj tgamma.obj win32.obj setproctitle.obj
|
MISSING = acosh.obj cbrt.obj crypt.obj erf.obj ffs.obj langinfo.obj lgamma_r.obj strlcat.obj strlcpy.obj tgamma.obj win32/win32.obj win32/file.obj setproctitle.obj
|
||||||
!endif
|
!endif
|
||||||
|
|
||||||
ARFLAGS = -machine:$(MACHINE) -out:
|
ARFLAGS = -machine:$(MACHINE) -out:
|
||||||
|
@ -286,7 +289,7 @@ DEFAULT_PRELUDES = $(NO_GEM_PRELUDE)
|
||||||
DEFAULT_PRELUDES = $(YES_GEM_PRELUDE)
|
DEFAULT_PRELUDES = $(YES_GEM_PRELUDE)
|
||||||
!endif
|
!endif
|
||||||
|
|
||||||
MAKEDIRS = $(MINIRUBY) -run -e mkdir -- -p
|
MAKEDIRS = $(BASERUBY) -run -e mkdir -- -p
|
||||||
|
|
||||||
!if !defined(STACK)
|
!if !defined(STACK)
|
||||||
!if "$(ARCH)" == "x64" || "$(ARCH)" == "ia64"
|
!if "$(ARCH)" == "x64" || "$(ARCH)" == "ia64"
|
||||||
|
@ -919,6 +922,10 @@ clean-rdoc distclean-rdoc realclean-rdoc:
|
||||||
clean-capi distclean-capi realclean-capi:
|
clean-capi distclean-capi realclean-capi:
|
||||||
-$(Q)$(RMALL) $(CAPIOUT:/=\)
|
-$(Q)$(RMALL) $(CAPIOUT:/=\)
|
||||||
|
|
||||||
|
clean-platform:
|
||||||
|
$(Q)$(RM) $(PLATFORM_DIR)\.time
|
||||||
|
-$(Q)$(RMDIR) $(PLATFORM_DIR:/=\)
|
||||||
|
|
||||||
clean-ext distclean-ext realclean-ext::
|
clean-ext distclean-ext realclean-ext::
|
||||||
!if "$(EXTS)" != ""
|
!if "$(EXTS)" != ""
|
||||||
@for %I in ($(EXTS)) \
|
@for %I in ($(EXTS)) \
|
||||||
|
@ -992,7 +999,7 @@ $(ruby_pc): $(RBCONFIG)
|
||||||
{$(win_srcdir)/sys}.c.obj:
|
{$(win_srcdir)/sys}.c.obj:
|
||||||
$(ECHO) compiling $(<:\=/)
|
$(ECHO) compiling $(<:\=/)
|
||||||
$(Q) $(CC) $(CFLAGS) $(XCFLAGS) $(CPPFLAGS) $(COUTFLAG)$@ -c -Tc$(<:\=/)
|
$(Q) $(CC) $(CFLAGS) $(XCFLAGS) $(CPPFLAGS) $(COUTFLAG)$@ -c -Tc$(<:\=/)
|
||||||
{$(srcdir)}.c.obj:
|
{$(srcdir)}.c{}.obj:
|
||||||
$(ECHO) compiling $(<:\=/)
|
$(ECHO) compiling $(<:\=/)
|
||||||
$(Q) $(CC) $(CFLAGS) $(XCFLAGS) $(CPPFLAGS) $(COUTFLAG)$@ -c -Tc$(<:\=/)
|
$(Q) $(CC) $(CFLAGS) $(XCFLAGS) $(CPPFLAGS) $(COUTFLAG)$@ -c -Tc$(<:\=/)
|
||||||
.c.obj:
|
.c.obj:
|
||||||
|
@ -1039,7 +1046,7 @@ enc/unicode/name2ctype.h: {$(srcdir)}enc/unicode/name2ctype.h.blt
|
||||||
|
|
||||||
$(OBJS): {$(hdrdir)/ruby}win32.h
|
$(OBJS): {$(hdrdir)/ruby}win32.h
|
||||||
|
|
||||||
dir.$(OBJEXT) win32.$(OBJEXT): {$(srcdir)}win32/dir.h
|
dir.$(OBJEXT) win32/win32.$(OBJEXT): {$(srcdir)}win32/dir.h
|
||||||
|
|
||||||
ext/extinit.obj: ext/extinit.c $(SETUP)
|
ext/extinit.obj: ext/extinit.c $(SETUP)
|
||||||
$(ECHO) compiling ext/extinit.c
|
$(ECHO) compiling ext/extinit.c
|
||||||
|
|
25
win32/file.c
Normal file
25
win32/file.c
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
#include "ruby/ruby.h"
|
||||||
|
#include <winbase.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
rb_file_load_ok(const char *path)
|
||||||
|
{
|
||||||
|
int ret = 1;
|
||||||
|
DWORD attr = GetFileAttributes(path);
|
||||||
|
if (attr == INVALID_FILE_ATTRIBUTES ||
|
||||||
|
attr & FILE_ATTRIBUTE_DIRECTORY) {
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
HANDLE h = CreateFile(path, GENERIC_READ,
|
||||||
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||||
|
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
|
if (h != INVALID_HANDLE_VALUE) {
|
||||||
|
CloseHandle(h);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue