1 #define _POSIX_C_SOURCE 200809L
2 #include "ruby/internal/config.h"
11 # error This feature is unnecessary on Windows in favor of SxS.
14 #include "ruby-runner.h"
17 insert_env_path(const char *envname
, const char *paths
, size_t size
, int prepend
)
19 const char *env
= getenv(envname
);
24 while ((c
= *env
) == PATH_SEP
) ++env
;
26 while (n
> 0 && env
[n
-1] == PATH_SEP
) --n
;
29 char *e
= malloc(size
+n
+1);
32 if (size
== n
|| (size
< n
&& env
[size
] == PATH_SEP
)) {
33 if (strncmp(paths
, env
, size
) == 0) {
38 memcpy(e
, paths
, pos
= size
-1);
41 memcpy(e
+pos
, env
, n
);
44 if (size
== n
|| (size
< n
&& env
[n
-size
-1] == PATH_SEP
)) {
45 if (strncmp(paths
, &env
[n
-size
], size
) == 0) {
51 memcpy(e
+pos
, paths
, size
-1);
60 setenv(envname
, env
, 1);
63 #define insert_env_path_lit(env, path, prep) \
64 insert_env_path(env, path, sizeof(path), prep)
66 #define EXTOUT_DIR BUILDDIR"/"EXTOUT
68 main(int argc
, char **argv
)
70 static const char builddir
[] = BUILDDIR
;
71 static const char rubypath
[] = BUILDDIR
"/"STRINGIZE(RUBY_INSTALL_NAME
);
72 static const char rubylib
[] =
79 const size_t dirsize
= sizeof(builddir
);
80 const size_t namesize
= sizeof(rubypath
) - dirsize
;
81 const char *rubyname
= rubypath
+ dirsize
;
82 char *arg0
= argv
[0], *p
;
84 insert_env_path(LIBPATHENV
, builddir
, dirsize
, 1);
85 insert_env_path("RUBYLIB", rubylib
, sizeof(rubylib
), 0);
87 if (!getenv("GEM_PATH")) {
88 insert_env_path_lit("GEM_PATH", ABS_SRCDIR
"/.bundle", 1);
89 insert_env_path_lit("GEM_PATH", BUILDDIR
"/.bundle", 1);
90 setenv("GEM_HOME", BUILDDIR
"/.bundle", 0);
93 if (!(p
= strrchr(arg0
, '/'))) p
= arg0
; else p
++;
94 if (strlen(p
) < namesize
- 1) {
95 argv
[0] = malloc(p
- arg0
+ namesize
);
96 memcpy(argv
[0], arg0
, p
- arg0
);
97 p
= argv
[0] + (p
- arg0
);
99 memcpy(p
, rubyname
, namesize
);
101 execv(rubypath
, argv
);