From: NODA, K. <no...@gm...> - 2012-04-22 08:58:58
|
From: "NODA, Kai" <no...@gm...> If it wasn't found, then fall back to a fixed string just as before. Signed-off-by: NODA, Kai <no...@gm...> --- https://github.com/nodakai/swig/commit/a4a0440a644c6c5e5da096efe3cf05ba309a284f Source/Modules/main.cxx | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/Source/Modules/main.cxx b/Source/Modules/main.cxx index d2f5d3b..cbb0a12 100644 --- a/Source/Modules/main.cxx +++ b/Source/Modules/main.cxx @@ -26,6 +26,11 @@ char cvsroot_main_cxx[] = "$Id$"; #include "cparse.h" #include <ctype.h> #include <limits.h> // for INT_MAX +#ifndef _WIN32 +#include <cstddef> +#include <unistd.h> // for readlink +#include <sys/stat.h> // for stat +#endif // Global variables @@ -902,9 +907,9 @@ int SWIG_main(int argc, char *argv[], Language *l) { // Check for SWIG_LIB environment variable if ((c = getenv("SWIG_LIB")) == (char *) 0) { + char *p; #if defined(_WIN32) char buf[MAX_PATH]; - char *p; if (!(GetModuleFileName(0, buf, MAX_PATH) == 0 || (p = strrchr(buf, '\\')) == 0)) { *(p + 1) = '\0'; SwigLib = NewStringf("%sLib", buf); // Native windows installation path @@ -914,7 +919,22 @@ int SWIG_main(int argc, char *argv[], Language *l) { if (Len(SWIG_LIB_WIN_UNIX) > 0) SwigLibWinUnix = NewString(SWIG_LIB_WIN_UNIX); // Unix installation path using a drive letter (for msys/mingw) #else - SwigLib = NewString(SWIG_LIB); + char buf[PATH_MAX]; + if (0 < ::readlink("/proc/self/exe", buf, sizeof(buf)) && + (p = ::strstr(buf, "/bin/swig"))) { + int major, minor, patch; + const int ret = ::sscanf(VERSION, "%d.%d.%d", &major, &minor, &patch); + if (3 == ret) { + const ::ptrdiff_t dir_part_len = p - buf; + ::snprintf(p, PATH_MAX - dir_part_len, "/share/swig/%d.%d.%d", major, minor, patch); + struct ::stat stat_res; + if (0 == ::stat(buf, &stat_res) && S_ISDIR(stat_res.st_mode)) { + SwigLib = NewString(buf); + } + } + } + if (NULL == SwigLib) + SwigLib = NewString(SWIG_LIB); #endif } else { SwigLib = NewString(c); -- 1.7.9.5 |
From: William S F. <ws...@fu...> - 2012-04-25 06:28:33
|
On 22/04/12 09:58, NODA, Kai wrote: > From: "NODA, Kai"<no...@gm...> > > If it wasn't found, then fall back to a fixed string just as before. > > Signed-off-by: NODA, Kai<no...@gm...> > --- > https://github.com/nodakai/swig/commit/a4a0440a644c6c5e5da096efe3cf05ba309a284f > > Source/Modules/main.cxx | 24 ++++++++++++++++++++++-- > 1 file changed, 22 insertions(+), 2 deletions(-) > > diff --git a/Source/Modules/main.cxx b/Source/Modules/main.cxx > index d2f5d3b..cbb0a12 100644 > --- a/Source/Modules/main.cxx > +++ b/Source/Modules/main.cxx > @@ -26,6 +26,11 @@ char cvsroot_main_cxx[] = "$Id$"; > #include "cparse.h" > #include<ctype.h> > #include<limits.h> // for INT_MAX > +#ifndef _WIN32 > +#include<cstddef> > +#include<unistd.h> // for readlink > +#include<sys/stat.h> // for stat > +#endif > > // Global variables > > @@ -902,9 +907,9 @@ int SWIG_main(int argc, char *argv[], Language *l) { > > // Check for SWIG_LIB environment variable > if ((c = getenv("SWIG_LIB")) == (char *) 0) { > + char *p; > #if defined(_WIN32) > char buf[MAX_PATH]; > - char *p; > if (!(GetModuleFileName(0, buf, MAX_PATH) == 0 || (p = strrchr(buf, '\\')) == 0)) { > *(p + 1) = '\0'; > SwigLib = NewStringf("%sLib", buf); // Native windows installation path > @@ -914,7 +919,22 @@ int SWIG_main(int argc, char *argv[], Language *l) { > if (Len(SWIG_LIB_WIN_UNIX)> 0) > SwigLibWinUnix = NewString(SWIG_LIB_WIN_UNIX); // Unix installation path using a drive letter (for msys/mingw) > #else > - SwigLib = NewString(SWIG_LIB); > + char buf[PATH_MAX]; > + if (0< ::readlink("/proc/self/exe", buf, sizeof(buf))&& > + (p = ::strstr(buf, "/bin/swig"))) { > + int major, minor, patch; > + const int ret = ::sscanf(VERSION, "%d.%d.%d",&major,&minor,&patch); > + if (3 == ret) { > + const ::ptrdiff_t dir_part_len = p - buf; > + ::snprintf(p, PATH_MAX - dir_part_len, "/share/swig/%d.%d.%d", major, minor, patch); > + struct ::stat stat_res; > + if (0 == ::stat(buf,&stat_res)&& S_ISDIR(stat_res.st_mode)) { > + SwigLib = NewString(buf); > + } > + } > + } > + if (NULL == SwigLib) > + SwigLib = NewString(SWIG_LIB); > #endif > } else { > SwigLib = NewString(c); Hi Kai What is the motivation for this patch? When SWIG is installed, this is not needed as the location of the SWIG lib just works. The Windows binary looks under the current directory because that is what is needed for the windows 'installed' version. I prefer consistent behaviour and /proc/self/exe is not portable, so I'd rather not have this differing behaviour especially amongst Unix variants unless your motivation is for something overlooked. William |
From: Kai N. <no...@gm...> - 2012-04-25 15:55:16
|
Hi William, 2012/4/25 William S Fulton <ws...@fu...>: ... > What is the motivation for this patch? When SWIG is installed, this is not > needed as the location of the SWIG lib just works. The Windows binary looks > under the current directory because that is what is needed for the windows > 'installed' version. > > I prefer consistent behaviour and /proc/self/exe is not portable, so I'd > rather not have this differing behaviour especially amongst Unix variants > unless your motivation is for something overlooked. I happened to have a need to copy an existing installation of SWIG to multiple locations on multiple Linux boxes. Please don't ask me why... I just needed to do so for my work. Think of it as a poor man's "binary package". This kind of usage might be rare, but it don't think it's very different from the idea of "relocatable RPM"[1]. I might be able to support more platforms by using different APIs on different platforms[2]. But as I didn't know how this feature was useful to everyone, I just posted my patch as is. I also admit it would be better to check availability of readlink(2), stat(2) and S_ISDIR etc by HAVE_blah macros, but I'm not very familiar with Autotools. *1) http://docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/RPM_Guide/ch10s05.html *2) http://stackoverflow.com/questions/1023306/ Regards, Kai -- 野田 開 <no...@gm...> |
From: Miles B. <mi...@gn...> - 2012-04-25 16:48:54
|
Kai NODA <no...@gm...> writes: > I might be able to support more platforms by using different APIs on > different platforms[2]. But as I didn't know how this feature was > useful to everyone, I just posted my patch as is. It seems possible to do this more portably on POSIX systems -- not _perfectly_, but such that it will usually work -- by just using argv[0] and: (1) when argv[0] an absolute filename, using it as is (2) when argv[0] has no directory components, searching PATH for it (3) when argv[0] has directory components, but is not absolute, just prepending the current working directory (which the shell won't use PATH in that case). -miles -- Bigot, n. One who is obstinately and zealously attached to an opinion that you do not entertain. |