swig bridge i'd like to checkin

As a new version of: http://pub.vestasys.org/cgi-bin/vestaweb?path=/vesta/vestasys.org/bridges/swig

current version: http://pub.vestasys.org/cgi-bin/vestaweb?path=/vesta/vestasys.org/bridges/swig/2

Just the diffs: SwigBridgeJohnDiff

// Created:     Thu Aug 26 1999
// Author:      Kenneth C. Schalk

// The SWIG bridge (for running swig as a tool under Vesta).

// For information on SWIG, see: http://www.swig.org/

// Last modified on Fri Jan  7 16:33:53 EST 2005 by ken@xorian.net

{
  // The command to invoke.
  command = ./command;

  // The root filesystem to use for this platform (which must include
  // the executable named by "command").
  root = ./root;

  bridge_name = "swig";

  // SWIG will always produce a C/C++ source file of glue code, and
  // may also produce a file of automaticall generated
  // documentation.
  type SWIGResult = binding(
    output: NamedFile,  // The glue source generated by SWIG
  );

// Functions exported by the bridge -------------------------------------------

  // ./swig/compile(name, input, [target_lang, [swiglibs]])

  // name - The name for the output source and documentation files.

  // input - A single input source file for SWIG.

  // target_lang [optional] - One the target languages SWIG supports
  // (tcl, perl, python).  Defaults to "perl".

  // swiglibs [optional] - A list of text values naming standard
  // SWIG library includes to use (i.e. "itclsh.i" or "itkwish.i").
  // These affect the behavior and output of SWIG.

  compile(name: text,                   // Name of resulting glue source file

          /**pk**/ input: NamedFile,    // SWIG input file

          includes: NamedFiles,         // Additional SWIG files which may be
                                        // included by the input file.
                                        
          target_lang: text = "perl",   // Name of the target language (i.e.
                                        // "tcl")

          libs: libFuncs = <>,          // Libraries whose headers should be made
                                        // available to SWIG

          /**pk**/ swiglibs: list(text) = <>
                                        // Standard SWIG library code
                                        // to include (alters SWIG behavior
                                        // and output)
         ): SWIGResult
  {
    // Set up the shared files in the filesystem where SWIG will
    // expect them; root can be a function
    . ++= [ root = (if _is_closure(root) then root() else root) ];

    // Add input file to "."
    . ++= [ root/.WD = _append(input,includes) ];

    // Make the library header files available
    . ++= [ root/.WD = ./Cxx/expert/lib_headers(libs) ];

    // Figure out what the output filename should be based on
    // whether we're including C++ support.
    output_name = name + "."
         + (if ./$bridge_name/options/enable_Cxx
            then ./$bridge_name/options/output_extensions/Cxx
            else ./$bridge_name/options/output_extensions/C);

    // Form the command-line (a list of texts)
    cmd = (<command>             // executable name
           + <"-" + target_lang>  // target scripting language
           + <"-o", output_name>  // Result file name
           + ./generic/binding_values(./$bridge_name/switches));

    // Add any SWIG libraries used
    foreach lib in swiglibs do
    {
      cmd += <"-l" + lib>;
    };

    // Tell SWIG to support C++ if necessary.
    cmd += if ./$bridge_name/options/enable_Cxx then <"-c++"> else <>;

    // Tell SWIG to a Tcl8 namespace if necessary.
    cmd += if ((target_lang == "tcl") &&
               ./$bridge_name/options/tcl/namespace)
           then <"-namespace">
           else <>;
            
    // Tell SWIG to generate perl proxy classes, if necessary.
    cmd += if ((target_lang == "perl") &&
               ./$bridge_name/options/perl/proxy)
           then <"-proxy">
           else <>;

    // Last argument is always the input file.
    cmd += <_n(input)>;

    // Invoke SWIG
    r = _run_tool(./target_platform, cmd);

    value if r == ERR || r/code != 0 || r/signal != 0 then ERR else
    // As long as we didn't fail, return single C/C++ source
    // file created by tool, and the generated documentation
    // (if any).
    [ output = [ $output_name = r/root/.WD/$output_name ] ]
    + (if (target_lang == "perl")
       then [ pm =
              {
                // Extract out any .pm files that were generated.
                // The name of the file is determined by the Module name
                // in the .i file, so we iterate over the working directory
                // and search for any files that have the .pm extension
                // and include them in the return value.
                tmp_pm = [];
                foreach [n = v] in r/root/.WD do
                {
                  tmp_pm += (if ./generic/extension(n) == "pm"
                             then [$n=v]
                             else []);
                };
                value tmp_pm;
              }]
       else [])
    + (if (target_lang == "python")
       then [ py =
              {
                // Extract out any .py files that were generated.
                // The name of the file is determined by the Module name
                // in the .i file, so we iterate over the working directory
                // and search for any files that have the .py extension
                // and include them in the return value.
                tmp_py = [];
                foreach [n = v] in r/root/.WD do
                {
                  tmp_py += (if ./generic/extension(n) == "py"
                             then [$n=v]
                             else []);
                };
                value tmp_py;
              }]
       else [])
    + (if (target_lang == "java")
       then [ java =
              {
                // Extract out any .java files that were generated.
                // The name of the file is determined by the Module name
                // in the .i file, so we iterate over the working directory
                // and search for any files that have the .java extension
                // and include them in the return value.
                tmp_java = [];
                foreach [n = v] in r/root/.WD do
                {
                  tmp_java += (if ./generic/extension(n) == "java"
                             then [$n=v]
                             else []);
                };
                value tmp_java;
              }]
       else []);
    };

// The bridge result itself --------------------------------------------------

    // default command-line args
    switches = [
        Wall = "-Wall",
    ];

    // Options affecting the way the bridge works
    options = [
        // Enable handling of C++ constructs in the input (on by
        // default).
        enable_Cxx = TRUE,

        output_extensions = [
            Cxx = "C",
            C = "c"
        ],

        // Options specific to the tcl8 language target
        tcl = [
            // Build module into a Tcl 8 namespace. (on by default for
            // Tcl8).
            namespace = TRUE
        ],

        // Options specific to the perl language target
        perl = [
                // Generate proxy classes
                proxy = TRUE
        ]
    ];

    return [ $bridge_name = [
      switches,
      options,

      root, // SWIG binary and associated data files.

      // exported function(s)
      compile
    ]];
}
// end common/swig/build.ves