PROCEDURE bind_object_code_utilities, bind_object_code_utility, binocu (
  unbound_component, uc: file = $system.ocu.maintenance.unbound_component
  cybil_library, cl: file = $system.cybil.cyf$run_time_library
  math_library, ml: file = $system.common.mlf$library
  use_system_ocu, uso: boolean = false
  bound_product, bp: file = $user.ocu.bound_product
  map, m: file = $user.ocu.maintenance.map
  status)

  create_variable temp_anaol_file kind=string value=$unique
  create_variable temp_buirm_file kind=string value=$unique
  create_variable temp_comol_file kind=string value=$unique
  create_variable temp_con63_file kind=string value=$unique
  create_variable temp_creol_file kind=string value=$unique
  create_variable temp_disol_file kind=string value=$unique
  create_variable temp_disot_file kind=string value=$unique
  create_variable temp_linve_file kind=string value=$unique
  create_variable temp_meape_file kind=string value=$unique
  VAR
    temp_proru_file: file = $unique(:$local)
  VAREND
  create_variable anaol_map_string kind=string value=$unique
  create_variable buirm_map_string kind=string value=$unique
  create_variable comol_map_string kind=string value=$unique
  create_variable con63_map_string kind=string value=$unique
  create_variable creol_map_string kind=string value=$unique
  create_variable disol_map_string kind=string value=$unique
  create_variable disot_map_string kind=string value=$unique
  create_variable linve_map_string kind=string value=$unique
  create_variable meape_map_string kind=string value=$unique
  VAR
    proru_map_file: file = $unique(:$local)
  VAREND
  create_variable creol_line kind=string
  create_variable ignore_status kind=status
  create_variable temp_map_file kind=(string, $max_name) value=$unique
  create_variable binary_path kind=string value=$string($value(unbound_component))
  create_variable temp_lfn_string kind=string

  create_catalog $user.ocu status=ignore_status
  create_catalog_permit $user.ocu g=public am=(read execute) status=ignore_status
  create_catalog $user.ocu.maintenance status=ignore_status

  IF NOT $specified(bound_product) THEN
    temp_lfn_string = $unique
    create_file $user.ocu.bound_product local_file_name=$name(temp_lfn_string)
    detach_file $fname(temp_lfn_string)
  IFEND

  IF NOT $specified(map) THEN
    temp_lfn_string = $unique
    create_file $user.ocu.maintenance.map local_file_name=$name(temp_lfn_string)
    detach_file $fname(temp_lfn_string)
  IFEND

  IF $value(use_system_ocu) THEN
    creol_line = 'CREATE_OBJECT_LIBRARY'
  ELSE
    creol_line = 'execute_task library=($fname(binary_path), $value(cybil_library)) starting_procedure=ocp$_create_object_library'
  IFEND

  put_line ' --   Bind_Object_Code_Utility   --' output=$response


  "Kludge ... must delete aaf$44d_library from library list to prevent loading unbound_product into ring 4"
  set_program_attributes delete_library=$local.aaf$44d_library status=ignore_status

    include_command command=creol_line

    put_line ' --     Collect modules for OCM$ANALYZE_OBJECT_LIBRARY   --' output=$response

    add_module $value(unbound_component) ocm$analyze_object_library
    satisfy_external_references ($value(unbound_component), $value(cybil_library) , $value(math_library))
    generate_library $fname(temp_anaol_file)

    put_line ' --     Collect modules for OCM$REAL_MEMORY_BUILDER   --' output=$response

    add_module $value(unbound_component) ocm$rmb_command_handlers
    satisfy_external_references ($value(unbound_component), $value(cybil_library), $value(math_library))
    generate_library $fname(temp_buirm_file)

    put_line ' --     Collect modules for OCM$COMPARE_OBJECT_LIBRARY   --' output=$response

    add_module $value(unbound_component) ocm$compare_object_library
    satisfy_external_references ($value(unbound_component), $value(cybil_library), $value(math_library))
    generate_library $fname(temp_comol_file)

    put_line ' --     Collect modules for OCM$CONVERT_64_TO_32_BITS   --' output=$response

    add_module $value(unbound_component) ocm$convert_64_to_32_bits
    satisfy_external_references ($value(unbound_component), $value(cybil_library))
    generate_library $fname(temp_con63_file)

    put_line ' --     Collect modules for OCM$OBJECT_LIBRARY_GENERATOR   --' output=$response

    add_module $value(unbound_component) ocm$create_object_library
    satisfy_external_references ($value(unbound_component), $value(cybil_library), $value(math_library))
    generate_library $fname(temp_creol_file)

    put_line ' --     Collect modules for OCM$DISPLAY_OBJECT_LIBRARY   --' output=$response

    add_module $value(unbound_component) ocm$display_object_library
    satisfy_external_references ($value(unbound_component), $value(cybil_library), $value(math_library))
    generate_library $fname(temp_disol_file)

    put_line ' --     Collect modules for OCM$LIST_OBJECT_FILE   --' output=$response

    add_module $value(unbound_component) ocm$list_object_file
    satisfy_external_references ($value(unbound_component), $value(cybil_library), $value(math_library))
    generate_library $fname(temp_disot_file)

    put_line ' --     Collect modules for OCM$PRODUCT_REFERENCE_UTILITY    --' output=$response

    add_module unbound_component m=ocm$product_reference_utility
    satisfy_external_references (unbound_component, cybil_library, math_library)
    generate_library temp_proru_file

    put_line ' --     Collect modules for OCM$VIRTUAL_ENVIRONMENT_LINKER   --' output=$response

    add_module $value(unbound_component) ocm$ve_linker_command_handlers
    satisfy_external_references ($value(unbound_component), $value(cybil_library), $value(math_library))
    generate_library $fname(temp_linve_file)

    put_line ' --     Collect modules for PMM$MEASURE_PROGRAM_EXECUTION   --' output=$response

    add_module $value(unbound_component) pmm$mpe_command_handlers
    satisfy_external_references ($value(unbound_component), $value(cybil_library), $value(math_library))
    generate_library $fname(temp_meape_file)

    put_line ' --     Bind OCM$ANALYZE_OBJECT_LIBRARY   --' output=$response

    create_module ocm$analyze_object_library  component=$fname(temp_anaol_file) starting_procedure=ocp$_analyze_object_library..
           ibsm=true preset_value=zero output=$fname(anaol_map_string)
    change_module_attribute ocm$analyze_object_library omit_non_retained_entry_points=on
    change_module_attribute ocm$analyze_object_library omit_library=cyf$run_time_library
    add_copyright ocm$analyze_object_library

    put_line ' --     Bind OCM$REAL_MEMORY_BUILDER   --' output=$response

    create_module ocm$real_memory_builder component=$fname(temp_buirm_file) starting_procedure=ocp$build_real_memory ..
           ibsm=true preset_value=zero output=$fname(buirm_map_string)
    change_module_attribute ocm$real_memory_builder omit_non_retained_entry_points=on
    change_module_attribute ocm$real_memory_builder omit_library=cyf$run_time_library
    add_copyright ocm$real_memory_builder

    put_line ' --     Bind OCM$COMPARE_OBJECT_LIBRARY   --' output=$response

    create_module ocm$compare_object_library component=$fname(temp_comol_file) starting_procedure=ocp$compare_object_library ..
          ibsm=true preset_value=zero output=$fname(comol_map_string)
    change_module_attribute ocm$compare_object_library omit_non_retained_entry_points=on
    change_module_attribute ocm$compare_object_library omit_library=cyf$run_time_library
    add_copyright ocm$compare_object_library

    put_line ' --     Bind OCM$CONVERT_64_TO_32_BITS   --' output=$response

    create_module ocm$convert_64_to_32_bits component=$fname(temp_con63_file) starting_procedure=ocp$convert_64_to_32_bits ..
          ibsm=true preset_value=zero output=$fname(con63_map_string)
    change_module_attribute ocm$convert_64_to_32_bits omit_non_retained_entry_points=on
    change_module_attribute ocm$convert_64_to_32_bits omit_library=cyf$run_time_library
    add_copyright ocm$convert_64_to_32_bits

    put_line ' --     Bind OCM$OBJECT_LIBRARY_GENERATOR   --' output=$response

    create_module ocm$object_library_generator component=$fname(temp_creol_file) starting_procedure=ocp$_create_object_library ..
          ibsm=true preset_value=zero output=$fname(creol_map_string)
    change_module_attribute ocm$object_library_generator omit_non_retained_entry_points=on
    change_module_attribute ocm$object_library_generator omit_library=(cyf$run_time_library mlf$library)
    add_copyright ocm$object_library_generator

    add_module $value(unbound_component) ocp$create_linked_module
    add_copyright ocp$create_linked_module

    put_line ' --     Bind OCM$DISPLAY_OBJECT_LIBRARY   --' output=$response

    create_module ocm$display_object_library component=$fname(temp_disol_file) starting_procedure=ocp$_display_object_library ..
          ibsm=true preset_value=zero output=$fname(disol_map_string)
    change_module_attribute ocm$display_object_library omit_non_retained_entry_points=on
    change_module_attribute ocm$display_object_library omit_library=cyf$run_time_library
    add_copyright ocm$display_object_library

    put_line ' --     Bind OCM$LIST_OBJECT_FILE   --' output=$response

    create_module ocm$list_object_file component=$fname(temp_disot_file) starting_procedure=ocp$list_object_file ..
          ibsm=true preset_value=zero output=$fname(disot_map_string)
    change_module_attribute ocm$list_object_file omit_non_retained_entry_points=on
    change_module_attribute ocm$list_object_file omit_library=cyf$run_time_library
    add_copyright ocm$list_object_file

    put_line ' --     Bind OCM$PRODUCT_REFERENCE_UTILITY   --' output=$response

    create_module ocm$product_reference_utility component=temp_proru_file starting_procedure=ocp$_product_reference_utility ..
          ibsm=true preset_value=zero output=proru_map_file
    change_module_attribute ocm$product_reference_utility omit_non_retained_entry_points=on
    change_module_attribute ocm$product_reference_utility omit_library=cyf$run_time_library
    add_copyright ocm$product_reference_utility

    put_line ' --     Bind OCM$VIRTUAL_ENVIRONMENT_LINKER   --' output=$response

    create_module ocm$virtual_environment_linker component=$fname(temp_linve_file) starting_procedure=ocp$_link_virtual_environment ..
          ibsm=true preset_value=zero output=$fname(linve_map_string)
    change_module_attribute ocm$virtual_environment_linker omit_non_retained_entry_points=on
    change_module_attribute ocm$virtual_environment_linker omit_library=cyf$run_time_library
    add_copyright ocm$virtual_environment_linker

    put_line ' --     Bind PMM$MEASURE_PROGRAM_EXECUTION   --' output=$response

    create_module pmm$measure_program_execution component=$fname(temp_meape_file) starting_procedure=pmp$measure_program_execution ..
          ibsm=true preset_value=zero output=$fname(meape_map_string)
    change_module_attribute pmm$measure_program_execution omit_non_retained_entry_points=on
    change_module_attribute pmm$measure_program_execution omit_library=cyf$run_time_library
    add_copyright pmm$measure_program_execution

    put_line ' --     Generate bound product   --' output=$response

    generate_library $value(bound_product)

  QUIT


  "Kludge ... restore aaf$44d_library to library list"
  set_program_attributes add_library=$local.aaf$44d_library status=ignore_status

  put_line ' --     Perform clean up   --' output=$response

  detach_file $fname(temp_anaol_file) status=ignore_status
  detach_file $fname(temp_buirm_file) status=ignore_status
  detach_file $fname(temp_comol_file) status=ignore_status
  detach_file $fname(temp_con63_file) status=ignore_status
  detach_file $fname(temp_creol_file) status=ignore_status
  detach_file $fname(temp_disol_file) status=ignore_status
  detach_file $fname(temp_disot_file) status=ignore_status
  detach_file $fname(temp_linve_file) status=ignore_status
  detach_file $fname(temp_meape_file) status=ignore_status
  detach_file temp_proru_file status=ignore_status

  copy_file input=$fname(anaol_map_string) output=$fname(temp_map_file//'.$eoi')
  copy_file input=$fname(buirm_map_string) output=$fname(temp_map_file//'.$eoi')
  copy_file input=$fname(comol_map_string) output=$fname(temp_map_file//'.$eoi')
  copy_file input=$fname(con63_map_string) output=$fname(temp_map_file//'.$eoi')
  copy_file input=$fname(creol_map_string) output=$fname(temp_map_file//'.$eoi')
  copy_file input=$fname(disol_map_string) output=$fname(temp_map_file//'.$eoi')
  copy_file input=$fname(disot_map_string) output=$fname(temp_map_file//'.$eoi')
  copy_file input=$fname(linve_map_string) output=$fname(temp_map_file//'.$eoi')
  copy_file input=$fname(meape_map_string) output=$fname(temp_map_file//'.$eoi')
  copy_file input=proru_map_file output=$fname(temp_map_file//'.$eoi')

  detach_file $fname(temp_map_file) status=ignore_status
  detach_file $fname(anaol_map_string) status=ignore_status
  detach_file $fname(buirm_map_string) status=ignore_status
  detach_file $fname(comol_map_string) status=ignore_status
  detach_file $fname(con63_map_string) status=ignore_status
  detach_file $fname(creol_map_string) status=ignore_status
  detach_file $fname(disol_map_string) status=ignore_status
  detach_file $fname(disot_map_string) status=ignore_status
  detach_file $fname(linve_map_string) status=ignore_status
  detach_file $fname(meape_map_string) status=ignore_status
  detach_file proru_map_file status=ignore_status

  IF use_system_ocu THEN
    display_object_library library=$value(bound_product) display_options=all output=$fname(temp_map_file//'.$eoi')
  ELSE
    execute_task library=$fname(binary_path) starting_procedure=ocp$_display_object_library ..
          parameter='library=$value(bound_product) display_options=all output=$fname(temp_map_file//''.$eoi'')'
  IFEND

  copy_file input=$fname(temp_map_file) output=$value(map)

  delete_catalog $user.ocu.maintenance status=ignore_status
  delete_catalog $user.ocu  status=ignore_status

  put_line ' --   END bind_object_code_utility   --' output=$response

PROCEND bind_object_code_utilities
