You can generate menu automatically using GToolbox.build_menu.
val GToolbox.build_menu :
	GMenu.menu ->
	entries:menu_entry list -> unitThe first argument of this function is the GMenu.menu with which various menu entries will be associated. And the function takes a value of GToolbox.menu_entry type as the second argument:
type menu_entry =
  [ `I of string * (unit -> unit)
  | `C of string * bool * (bool -> unit)
  | `R of (string * bool * (bool -> unit)) list
  | `M of string * menu_entry list
  | `S ]`I: means GMenu.menu_item. It takes as arguments the label of menu_item and the callback function which is called when the menu_item is selected.
`C: means GMenu.check_menu_item. It takes as arguments the label of check_menu_item, the default state value, and the callback function which is called when the menu_item is selected.
`R: means GMenu.radio_menu_item. It takes a radio_menu_item description list as an argument. Each radio_menu_item description consists of (label, default state, callback function).
`M: means GMenu.menu. It takes as arguments the label of menu and the list of menu_entry which will be associated with this menu.
`S: means GMenu.separator_item.
You can use GToolbox.menu_entry for popup menu using GToolbox.popup_menu:
val GToolbox.popup_menu :
	entries:menu_entry list ->
	button:int ->
	time:int32 -> unit(* file: menu_entry.ml *)
let print msg () =
  print_endline msg;
  flush stdout
let print_toggle selected =
  if selected
  then print_endline "On"
  else print_endline "Off";
  flush stdout
let print_selected n selected =
  if selected then (
    print_endline (string_of_int n);
    flush stdout
  )
let file_entries = [
  `I ("New", print "New");
  `I ("Open", print "Open");
  `I ("Save", print "Save");
  `I ("Save As", print "Save As");
  `S;
  `I ("Quit", GMain.Main.quit)
]
let option_entries = [
  `C ("Check", false, print_toggle);
  `S;
  `R [("Rad1", true, print_selected 1);
      ("Rad2", false, print_selected 2);
      ("Rad3", false, print_selected 3)]
]
let help_entries = [
  `I ("About", print "About");
]
let entries = [
  `M ("File", file_entries);
  `M ("Options", option_entries);
  `M ("Help", help_entries)
]
let create_menu label menubar =
  let item = GMenu.menu_item ~label ~packing:menubar#append () in
  GMenu.menu ~packing:item#set_submenu ()
let main () =
  (* Make a window *)
  let window = GWindow.window ~title:"Menu Entry" ~border_width:10 () in
  window#connect#destroy ~callback:GMain.Main.quit;
  
  let main_vbox = GPack.vbox ~packing:window#add () in
  let menubar = GMenu.menu_bar ~packing:main_vbox#add () in
  let menu = create_menu "File" menubar in
  GToolbox.build_menu menu ~entries:file_entries;
  let menu = create_menu "Options" menubar in
  GToolbox.build_menu menu ~entries:option_entries;
  let menu = create_menu "Help" menubar in
  GToolbox.build_menu menu ~entries:help_entries;
  (* Popup menu *)
  let button = GButton.button ~label:"Popup" ~packing:main_vbox#add () in
  button#connect#clicked ~callback:(fun () ->
    GToolbox.popup_menu ~entries ~button:0
	  ~time:(GtkMain.Main.get_current_event_time ())
    );
  window#show ();
  GMain.Main.main ()
let _ = Printexc.print main ()