Files
libguestfs/generator
Richard W.M. Jones 98757e151a generator: Allow non-optargs functions to gain optargs.
This commit adds a flag (once_had_no_optargs) which can be used to add
optargs to functions that currently don't have any.

The idea is that if 'func' currently has no optargs, we can safely add
optargs provided we are backwards compatible for existing callers.

In C that means we leave 'guestfs_func' alone and provide an extra
function 'guestfs_func_opts' that takes the optargs ('guestfs_func'
becomes a wrapper that calls 'guestfs_func_opts').

In the C generator this means there are two names for each function
(although the two names are normally identical).  'c_name' is the name
that we export publicly (eg. [guestfs_] 'func_opts').  'name' is the
internal name of the function (eg. 'func') which is used for
everything apart from the public interface, and also to generate the
no-optargs compat function.

In other languages that can add optional arguments safely, we simply
add the arguments to the existing 'func', so for example in Perl:

  $g->func (required_args)
  $g->func (required_args, optional_args)

can be used.

Note that this commit does not cause any change to the output of the
generator.  I verified this by diffing the output before and after.
2012-07-14 10:20:58 +01:00
..
2012-01-18 22:05:02 +00:00
2012-01-18 22:05:02 +00:00
2012-01-18 22:05:02 +00:00
2012-01-18 22:05:02 +00:00
2012-01-18 22:05:02 +00:00
2012-04-25 17:32:30 +01:00
2012-01-18 22:05:02 +00:00
2012-01-18 22:05:02 +00:00

This program generates a large amount of code and documentation for
all the daemon actions.

To add a new action there are only two files you need to change,
'generator_actions.ml' to describe the interface, and
daemon/<somefile>.c to write the implementation.

After editing these files, build it (make -C generator) to regenerate
all the output files.  'make' will rerun this automatically when
necessary.

IMPORTANT: This program should NOT print any warnings at compile time
or run time.  If it prints warnings, you should treat them as errors.

OCaml tips:

(1) In emacs, install tuareg-mode to display and format OCaml code
correctly.  'vim' comes with a good OCaml editing mode by default.

(2) Read the resources at http://ocaml-tutorial.org/

(3) A module called 'Generator_foo' is defined in one or two files
called 'generator_foo.mli' and 'generator_foo.ml' (NB: lowercase first
letter).  The *.mli file, if present, defines the public interface for
the module.  The *.ml file is the implementation.  If the *.mli file
is missing then everything is exported.

Some notable files in this directory:

generator_actions.ml          The libguestfs API.
generator_structs.ml          Structures returned by the API.
generator_c.ml                Generate C API.
generator_<lang>.ml           Generate bindings for <lang>.
generator_main.ml             The main generator program.

Note about long descriptions:

When referring to another action, use the format C<guestfs_other>
(ie. the full name of the C function).  This will be replaced as
appropriate in other language bindings.  Apart from that, long
descriptions are just perldoc paragraphs.

Note about extending functions:

In general you cannot change the name, number of required arguments or
type of required arguments of a function, since this would break
backwards compatibility.

You may add another optional argument, *if* the function has >= 1
optional arguments already.  Add it at the end of the list.

You may add optional arguments to a function that doesn't have any.
However you *must* set the once_had_no_optargs flag to true, so that
the relevant backwards compatibility bindings can be added.