daemon: Send back the errno as a string.
[libguestfs.git] / generator / generator_main.ml
1 (* libguestfs
2  * Copyright (C) 2009-2010 Red Hat Inc.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  *)
18
19 (* Please read generator/README first. *)
20
21 open Unix
22 open Printf
23
24 open Generator_pr
25 open Generator_structs
26
27 open Generator_c
28 open Generator_xdr
29 open Generator_daemon
30 open Generator_capitests
31 open Generator_fish
32 open Generator_ocaml
33 open Generator_perl
34 open Generator_python
35 open Generator_ruby
36 open Generator_java
37 open Generator_haskell
38 open Generator_csharp
39 open Generator_php
40 open Generator_bindtests
41 open Generator_errnostring
42
43 let perror msg = function
44   | Unix_error (err, _, _) ->
45       eprintf "%s: %s\n" msg (error_message err)
46   | exn ->
47       eprintf "%s: %s\n" msg (Printexc.to_string exn)
48
49 (* Main program. *)
50 let () =
51   let lock_fd =
52     try openfile "HACKING" [O_RDWR] 0
53     with
54     | Unix_error (ENOENT, _, _) ->
55         eprintf "\
56 You are probably running this from the wrong directory.
57 Run it from the top source directory using the command
58   make -C generator stamp-generator
59 ";
60         exit 1
61     | exn ->
62         perror "open: HACKING" exn;
63         exit 1 in
64
65   (* Acquire a lock so parallel builds won't try to run the generator
66    * twice at the same time.  Subsequent builds will wait for the first
67    * one to finish.  Note the lock is released implicitly when the
68    * program exits.
69    *)
70   (try lockf lock_fd F_LOCK 1
71    with exn ->
72      perror "lock: HACKING" exn;
73      exit 1);
74
75   output_to "src/guestfs_protocol.x" generate_xdr;
76   output_to "src/guestfs-structs.h" generate_structs_h;
77   output_to "src/guestfs-actions.h" generate_actions_h;
78   output_to "src/guestfs-internal-actions.h" generate_internal_actions_h;
79   output_to "src/actions.c" generate_client_actions;
80   output_to "src/bindtests.c" generate_bindtests;
81   output_to "src/guestfs-structs.pod" generate_structs_pod;
82   output_to "src/guestfs-actions.pod" generate_actions_pod;
83   output_to "src/guestfs-availability.pod" generate_availability_pod;
84   output_to "src/errnostring.c" generate_errnostring_c;
85   output_to "src/errnostring.h" generate_errnostring_h;
86   output_to "src/MAX_PROC_NR" generate_max_proc_nr;
87   output_to "src/libguestfs.syms" generate_linker_script;
88   output_to "daemon/actions.h" generate_daemon_actions_h;
89   output_to "daemon/stubs.c" generate_daemon_actions;
90   output_to "daemon/names.c" generate_daemon_names;
91   output_to "daemon/optgroups.c" generate_daemon_optgroups_c;
92   output_to "daemon/optgroups.h" generate_daemon_optgroups_h;
93   output_to "capitests/tests.c" generate_tests;
94   output_to "fish/cmds.c" generate_fish_cmds;
95   output_to "fish/completion.c" generate_fish_completion;
96   output_to "fish/guestfish-commands.pod" generate_fish_commands_pod;
97   output_to "fish/guestfish-actions.pod" generate_fish_actions_pod;
98   output_to "fish/prepopts.c" generate_fish_prep_options_c;
99   output_to "fish/prepopts.h" generate_fish_prep_options_h;
100   output_to "ocaml/guestfs.mli" generate_ocaml_mli;
101   output_to "ocaml/guestfs.ml" generate_ocaml_ml;
102   output_to "ocaml/guestfs_c_actions.c" generate_ocaml_c;
103   output_to "ocaml/bindtests.ml" generate_ocaml_bindtests;
104   output_to "perl/Guestfs.xs" generate_perl_xs;
105   output_to "perl/lib/Sys/Guestfs.pm" generate_perl_pm;
106   output_to "perl/bindtests.pl" generate_perl_bindtests;
107   output_to "python/guestfs-py.c" generate_python_c;
108   output_to "python/guestfs.py" generate_python_py;
109   output_to "python/bindtests.py" generate_python_bindtests;
110   output_to "ruby/ext/guestfs/_guestfs.c" generate_ruby_c;
111   output_to "ruby/bindtests.rb" generate_ruby_bindtests;
112   output_to "java/com/redhat/et/libguestfs/GuestFS.java" generate_java_java;
113
114   List.iter (
115     fun (typ, jtyp) ->
116       let cols = cols_of_struct typ in
117       let filename = sprintf "java/com/redhat/et/libguestfs/%s.java" jtyp in
118       output_to filename (generate_java_struct jtyp cols);
119   ) java_structs;
120
121   output_to "java/Makefile.inc" generate_java_makefile_inc;
122   output_to "java/com_redhat_et_libguestfs_GuestFS.c" generate_java_c;
123   output_to "java/Bindtests.java" generate_java_bindtests;
124   output_to "haskell/Guestfs.hs" generate_haskell_hs;
125   output_to "haskell/Bindtests.hs" generate_haskell_bindtests;
126   output_to "csharp/Libguestfs.cs" generate_csharp;
127   output_to "php/extension/php_guestfs_php.h" generate_php_h;
128   output_to "php/extension/guestfs_php.c" generate_php_c;
129
130   (* Always generate this file last, and unconditionally.  It's used
131    * by the Makefile to know when we must re-run the generator.
132    *)
133   let chan = open_out "generator/stamp-generator" in
134   fprintf chan "1\n";
135   close_out chan;
136
137   printf "generated %d lines of code\n" (get_lines_generated ())