todo: Add note about using blktrace.
[libguestfs.git] / HACKING
diff --git a/HACKING b/HACKING
index b2fab3e..9ae20a6 100644 (file)
--- a/HACKING
+++ b/HACKING
+PLEASE LOOK AT THE TOP OF EACH FILE BEFORE EDITING TO SEE WHETHER IT
+IS AUTOMATICALLY GENERATED OR NOT.
+
 Adding a new action
 ----------------------------------------------------------------------
 
 All action functions are generated automatically, so there are only
 two files you need to edit:
 
-(1) src/generator.ml: Add your new action, parameters, description,
-etc. to the big list called 'functions' at the top of this file.
+(1) generator/generator_actions.ml: Add your new action, parameters,
+description, etc. to the big list at the top of this file.
 
 (2) Edit/create a C file in daemon/ subdirectory which implements your
 'do_action' function.  Take a look at one of the numerous examples
 there.
 
-You will need to run src/generator.ml (from the top directory) which
-regenerates all the auto-generated files, and then continue with the
-ordinary build process.
-
 Formatting
 ----------------------------------------------------------------------
 
 Try to use GNU / Emacs default formatting, following the convention
 used elsewhere in the source.
 
+Please make sure that the code compiles without warnings.
+
+Please test any changes.
+
+Useful targets:
+  make syntax-check    Checks the syntax of the C code.
+  make check           Runs the test suite.
+
+Enable warnings, and fix any you find:
+  ./configure --enable-gcc-warnings
+
+Code indentation
+----------------------------------------------------------------------
+Our C source code generally adheres to some basic code-formatting
+conventions.  The existing code base is not totally consistent on this
+front, but we do prefer that contributed code be formatted similarly.
+In short, use spaces-not-TABs for indentation, use 2 spaces for each
+indentation level, and other than that, follow the K&R style.
+
+If you use Emacs, add the following to one of one of your start-up files
+(e.g., ~/.emacs), to help ensure that you get indentation right:
+
+  ;;; In libguestfs, indent with spaces everywhere (not TABs).
+  ;;; Exceptions: Makefile and ChangeLog modes.
+  (add-hook 'find-file-hook
+      '(lambda () (if (and buffer-file-name
+                           (string-match "/libguestfs\\>" (buffer-file-name))
+                           (not (string-equal mode-name "Change Log"))
+                           (not (string-equal mode-name "Makefile")))
+                      (setq indent-tabs-mode nil))))
+
+  ;;; When editing C sources in libguestfs, use this style.
+  (defun libguestfs-c-mode ()
+    "C mode with adjusted defaults for use with libguestfs."
+    (interactive)
+    (c-set-style "K&R")
+    (setq c-indent-level 2)
+    (setq c-basic-offset 2))
+  (add-hook 'c-mode-hook
+            '(lambda () (if (string-match "/libguestfs\\>" (buffer-file-name))
+                            (libguestfs-c-mode))))
+
+Directories
+----------------------------------------------------------------------
+
+appliance/
+        The qemu appliance, build scripts and so on.
+
+capitests/
+        Automated tests of the C API.
+
+contrib/
+        Outside contributions, experimental parts.
+
+csharp/
+        Experimental C# bindings.
+
+daemon/
+        The daemon that runs inside the guest and carries out actions.
+
+examples/
+        The examples.
+
+fish/
+        Guestfish (the command-line program / shell)
+
+fuse/
+        FUSE (userspace filesystem) built on top of libguestfs.
+
+generator/
+        The crucially important generator, used to automatically
+        generate large amounts of boilerplate C code for things like
+        RPC and bindings.
+
+haskell/
+        Haskell bindings.
+
+hivex/ [removed in 1.0.85]
+       This used to contain the hivex library for reading and
+       writing Windows Registry binary hive files.  This is now
+       available as a separate upstream project.
+
+images/
+        Some guest images to test against.  These are gzipped to save
+        space.  You have to unzip them before use.
+
+        Also contains some files used by the test suite.
+
+inspector/
+        Virtual machine image inspector (virt-inspector).
+
+java/
+        Java bindings.
+
+m4/
+        M4 macros used by autoconf.
+
+ocaml/
+        OCaml bindings.
+
+po/
+        Translations of simple gettext strings.  For translations of
+        longer documents, see po-docs/.
+
+po-docs/
+        The build infrastructure and PO files for translations of
+        manpages and POD files.  Eventually this will be combined
+        with the po/ directory, but that is rather complicated.
+
+perl/
+        Perl bindings.
+
+python/
+        Python bindings.
+
+regressions/
+        Regression tests.
+
+ruby/
+        Ruby bindings.
+
+tools/
+        Command line tools like virt-cat, virt-df, virt-edit and more.
+        In versions <= 1.0.73 these were all in separate directories
+        like cat/, df/, edit/, but since then we moved them all into
+        one directory to simplify builds.
+
+src/
+        Source code to the C library.
+
+test-tool/
+        Interactive qemu/kernel test tool.
+
+Debugging
+----------------------------------------------------------------------
+
+It's a good idea to use guestfish to try out new commands.
+
+Debugging the daemon is a problem because it runs inside a minimal
+qemu environment.  However you can print messages from the daemon, and
+they will show up if you use 'guestfish -v'.
+
 Patches
 ----------------------------------------------------------------------
 
-Submit patches to the fedora-virt mailing list:
-http://www.redhat.com/mailman/listinfo/fedora-virt
+Submit patches to the mailing list:
+http://www.redhat.com/mailman/listinfo/libguestfs
+and CC to rjones@redhat.com
+
+I18N
+----------------------------------------------------------------------
+
+We support i18n (gettext anyhow) in the library.
+
+However many messages come from the daemon, and we don't translate
+those at the moment.  One reason is that the appliance generally has
+all locale files removed from it, because they take up a lot of space.
+So we'd have to readd some of those, as well as copying our PO files
+into the appliance.
+
+Debugging messages are never translated, since they are intended for
+the programmers.
+
+Extended printf
+----------------------------------------------------------------------
+
+In the daemon code we have created custom printf formatters %Q and %R,
+which are used to do shell quoting.
+
+%Q => Simple shell quoted string.  Any spaces or other shell characters
+      are escaped for you.
+
+%R => Same as %Q except the string is treated as a path which is prefixed
+      by the sysroot.
+
+eg.
+
+asprintf (&cmd, "cat %R", path);
+==> "cat /sysroot/some\ path\ with\ spaces"
+
+Note: Do NOT use these when you are passing parameters to the
+command{,r,v,rv}() functions.  These parameters do NOT need to be
+quoted because they are not passed via the shell (instead, straight to
+exec).  You probably want to use the sysroot_path() function however.