X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fcsharpexec.c;h=e33071859823933b5c57d61a1826e5decfa45cf4;hb=8e99d1a0adfc4eb035e73219ef7001494ecb0c50;hp=604e13769ff682642689bc78233fa50697eab65f;hpb=eebfb61f448a11db04a2d5ccd96c1718cca7ef54;p=gnulib.git diff --git a/lib/csharpexec.c b/lib/csharpexec.c index 604e13769..e33071859 100644 --- a/lib/csharpexec.c +++ b/lib/csharpexec.c @@ -1,5 +1,5 @@ /* Execute a C# program. - Copyright (C) 2003-2004 Free Software Foundation, Inc. + Copyright (C) 2003-2006 Free Software Foundation, Inc. Written by Bruno Haible , 2003. This program is free software; you can redistribute it and/or modify @@ -16,9 +16,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#ifdef HAVE_CONFIG_H -# include -#endif +#include #include /* Specification. */ @@ -40,6 +38,31 @@ #define reset_classpath reset_monopath #include "classpath.h" #include "classpath.c" +#undef reset_classpath +#undef set_classpath +#undef new_classpath +#undef CLASSPATHVAR + +/* Handling of clix' PATH variable is just like Java CLASSPATH. */ +#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ + /* Win32, Cygwin */ + #define CLASSPATHVAR "PATH" +#elif defined __APPLE__ && defined __MACH__ + /* MacOS X */ + #define CLASSPATHVAR "DYLD_LIBRARY_PATH" +#else + /* Normal Unix */ + #define CLASSPATHVAR "LD_LIBRARY_PATH" +#endif +#define new_classpath new_clixpath +#define set_classpath set_clixpath +#define reset_classpath reset_clixpath +#include "classpath.h" +#include "classpath.c" +#undef reset_classpath +#undef set_classpath +#undef new_classpath +#undef CLASSPATHVAR #define _(str) gettext (str) @@ -50,6 +73,7 @@ ilrun pnet mono mono + clix sscli With Mono, the MONO_PATH is a colon separated list of pathnames. (On Windows: semicolon separated list of pathnames.) @@ -58,6 +82,8 @@ 1. "ilrun", because it is a completely free system. 2. "mono", because it is a partially free system but doesn't integrate well with Unix. + 3. "clix", although it is not free, because it is a kind of "reference + implementation" of C#. But the order can be changed through the --enable-csharp configuration option. */ @@ -194,6 +220,67 @@ execute_csharp_using_mono (const char *assembly_path, return -1; } +static int +execute_csharp_using_sscli (const char *assembly_path, + const char * const *libdirs, + unsigned int libdirs_count, + const char * const *args, unsigned int nargs, + bool verbose, bool quiet, + execute_fn *executer, void *private_data) +{ + static bool clix_tested; + static bool clix_present; + + if (!clix_tested) + { + /* Test for presence of clix: + "clix >/dev/null 2>/dev/null ; test $? = 1" */ + char *argv[2]; + int exitstatus; + + argv[0] = "clix"; + argv[1] = NULL; + exitstatus = execute ("clix", "clix", argv, false, false, true, true, + true, false); + clix_present = (exitstatus == 0 || exitstatus == 1); + clix_tested = true; + } + + if (clix_present) + { + char *old_clixpath; + char **argv = (char **) xallocsa ((2 + nargs + 1) * sizeof (char *)); + unsigned int i; + bool err; + + /* Set clix' PATH variable. */ + old_clixpath = set_clixpath (libdirs, libdirs_count, false, verbose); + + argv[0] = "clix"; + argv[1] = (char *) assembly_path; + for (i = 0; i <= nargs; i++) + argv[2 + i] = (char *) args[i]; + + if (verbose) + { + char *command = shell_quote_argv (argv); + printf ("%s\n", command); + free (command); + } + + err = executer ("clix", "clix", argv, private_data); + + /* Reset clix' PATH variable. */ + reset_clixpath (old_clixpath); + + freesa (argv); + + return err; + } + else + return -1; +} + bool execute_csharp_program (const char *assembly_path, const char * const *libdirs, @@ -247,6 +334,12 @@ execute_csharp_program (const char *assembly_path, return (bool) result; #endif + result = execute_csharp_using_sscli (assembly_path, libdirs, libdirs_count, + args, nargs, verbose, quiet, + executer, private_data); + if (result >= 0) + return (bool) result; + if (!quiet) error (0, 0, _("C# virtual machine not found, try installing pnet")); return true;