This example illustrates how to use the CIAO static configurator for building applications statically. For an example using RTCORBA policies, see BasicSP with RTCORBA extensions. From the BasicSP directory do the following.

> cd descriptors
> $CIAO_ROOT/tools/static_configurator/Static_Assembly_Parser -a BasicSP.cad

The following files are generated -

Static_Assembly_Config.h
Static_CCM_App.cpp
Static_CCM_App.mpc

Static_Assembly_Config.h contains the intermediate representation of all the parsed component and assembly information obtained from the XML files. Static_CCM_App.cpp  contains the main driver application. Here a runtime static configuration engine is used to create containers, homes, components, etc and then establish necessary connections between the components. In the BasicSP example, an external controller  (see $CIAO_ROOT/examples/OEP/BasicSP/README) is used to start or stop a pulser. The generated main driver application (Static_CCM_App.cpp) is modified to add code to trigger the pulser object on. The generated .mpc file is modified to add all other necessary files so that the application can be built statically. Note that the static configurator only generates only certain file names in the .mpc file. These filenames are obtained from the XML descriptor files. All other necessary files have to be added manually as indicated.

Now the static build files can be generated by running the mpc utility.

> cd ..
> $ACE_ROOT/bin/mpc -static Static_CCM_App.mpc

Static_Assembly_Config.h
#include "Static_Assembly.h"

#include "CCM_ContainerC.h"
#include "Container_Base.h"

//Containers
CIAO::Static_Config::ContainerAttributes containers_table_[]=
{
 {"", 0}
};
 

extern "C" ::Components::HomeExecutorBase_ptr createECHome_Impl (void);
extern "C" ::PortableServer::Servant createECHome_Servant
  (::Components::HomeExecutorBase_ptr p,
  ::CIAO::Session_Container *c
  ACE_ENV_ARG_DECL_WITH_DEFAULTS);
extern "C" ::Components::HomeExecutorBase_ptr createBMDeviceHome_Impl (void);
extern "C" ::PortableServer::Servant createBMDeviceHome_Servant
  (::Components::HomeExecutorBase_ptr p,
  ::CIAO::Session_Container *c
  ACE_ENV_ARG_DECL_WITH_DEFAULTS);
extern "C" ::Components::HomeExecutorBase_ptr createBMClosedEDHome_Impl (void);
extern "C" ::PortableServer::Servant createBMClosedEDHome_Servant
  (::Components::HomeExecutorBase_ptr p,
  ::CIAO::Session_Container *c
  ACE_ENV_ARG_DECL_WITH_DEFAULTS);
extern "C" ::Components::HomeExecutorBase_ptr createBMDisplayHome_Impl (void);
extern "C" ::PortableServer::Servant createBMDisplayHome_Servant
  (::Components::HomeExecutorBase_ptr p,
  ::CIAO::Session_Container *c
  ACE_ENV_ARG_DECL_WITH_DEFAULTS);
//Homes
CIAO::Static_Config::HomeAttributes homes_table_[]=
{
 {"a_ECHome", "DCE:3148F760-F2ED-4204-A775-6B972C10E8CB", "createECHome_Impl", createECHome_Impl, "DCE:75309233-0E0A-4cfb-B186-3E99F69B1D40", "createECHome_Servant", createECHome_Servant, 0, 0 },
 {"a_BMDeviceHome", "DCE:82C2B032-37F0-4315-A59F-7020D3264E4D", "createBMDeviceHome_Impl", createBMDeviceHome_Impl, "DCE:93D254CF-9538-44e8-BB98-AABCD134ADD3", "createBMDeviceHome_Servant", createBMDeviceHome_Servant, 0, 0 },
 {"a_BMClosedEDHome", "DCE:8E6C468D-A39F-46b4-962B-265F1AA8D538", "createBMClosedEDHome_Impl", createBMClosedEDHome_Impl, "DCE:CDC06FCA-50FC-43ca-8ECC-BEFBD33FEE78", "createBMClosedEDHome_Servant", createBMClosedEDHome_Servant, 0, 0 },
 {"a_BMDisplayHome", "DCE:8E92655E-CA07-46C8-B127-0F0872A8CC29", "createBMDisplayHome_Impl", createBMDisplayHome_Impl, "DCE:D7984625-8561-431d-9927-4E498B317C02", "createBMDisplayHome_Servant", createBMDisplayHome_Servant, 0, 0 }
};
 

//Components
CIAO::Static_Config::ComponentAttributes components_table_[]=
{
 {"a_EC", 0, 0, 0 },
 {"a_BMDevice", -1, -1, 1 },
 {"a_BMClosedED", -1, -1, 2 },
 {"a_BMDisplay", -1, -1, 3 }
};
 

//Component Registrations
CIAO::Assembly_Placement::componentinstantiation::Register_Info component_registrations_table_[]=
{
 {CIAO::Assembly_Placement::componentinstantiation::COMPONENT, CIAO::Assembly_Placement::componentinstantiation::IORFILE, "", "ec.ior" }
};
 

//Connections
CIAO::Static_Config::ConnectionAttributes connections_table_[]=
{
 {CIAO::Assembly_Connection::PUBLISHER_CONSUMER, "", "timeout", 0, 1, 0, 0 },
 {CIAO::Assembly_Connection::PUBLISHER_CONSUMER, "", "data_available", 3, 4, 0, 0 },
 {CIAO::Assembly_Connection::PUBLISHER_CONSUMER, "", "out_avail", 6, 7, 0, 0 },
 {CIAO::Assembly_Connection::INTERFACE, "", "datain", 9, 10, 0, 0 },
 {CIAO::Assembly_Connection::INTERFACE, "", "comp_data", 12, 13, 0, 0 }
};
 

//Resolver Infos
CIAO::Static_Config::ResolveInfoAttributes resolvers_table_[]=
{
 {CIAO::Assembly_Connection::COMP_IDREF, "a_EC", -1, 0 },
 {CIAO::Assembly_Connection::CONSUMER, "timeout", 2, 0 },
 {CIAO::Assembly_Connection::COMP_IDREF, "a_BMDevice", -1, 0 },
 {CIAO::Assembly_Connection::COMP_IDREF, "a_BMDevice", -1, 0 },
 {CIAO::Assembly_Connection::CONSUMER, "in_avail", 5, 0 },
 {CIAO::Assembly_Connection::COMP_IDREF, "a_BMClosedED", -1, 0 },
 {CIAO::Assembly_Connection::COMP_IDREF, "a_BMClosedED", -1, 0 },
 {CIAO::Assembly_Connection::CONSUMER, "data_ready", 8, 0 },
 {CIAO::Assembly_Connection::COMP_IDREF, "a_BMDisplay", -1, 0 },
 {CIAO::Assembly_Connection::COMP_IDREF, "a_BMClosedED", -1, 0 },
 {CIAO::Assembly_Connection::PROVIDER, "data_read", 11, 0 },
 {CIAO::Assembly_Connection::COMP_IDREF, "a_BMDevice", -1, 0 },
 {CIAO::Assembly_Connection::COMP_IDREF, "a_BMDisplay", -1, 0 },
 {CIAO::Assembly_Connection::PROVIDER, "dataout", 14, 0 },
 {CIAO::Assembly_Connection::COMP_IDREF, "a_BMClosedED", -1, 0 }
};

Static_CCM_App.cpp
#include "ComponentServer_Impl.h"
#include "CIAO_ServersC.h"
#include "Server_init.h"
#include "Static_Configurator.h"
#include "ace/SString.h"
#include "ace/Get_Opt.h"

#include "Static_Assembly_Config.h"

char *ior_file_name_ = "comp_serv.ior";

int
parse_args (int argc, char *argv[])
{
  ACE_Get_Opt get_opts (argc, argv, "k:o:");
  int c;

  while ((c = get_opts ()) != -1)
    switch (c)
      {
      case 'o':  // get the file name to write to
       ior_file_name_ = get_opts.opt_arg ();
      break;

      case '?':  // display help for use of the server.
      default:
        ACE_ERROR_RETURN ((LM_ERROR,
                           "usage:  %s\n"
                           "-o <ior_output_file>\n"
                           "\n",
                           argv [0]),
                          -1);
      }

  return 0;
}
 

int
main (int argc, char *argv[])
{
  ACE_TRY_NEW_ENV
    {
      // Initialize orb
      CORBA::ORB_var orb = CORBA::ORB_init (argc,
                                            argv,
                                            0
                                            ACE_ENV_ARG_PARAMETER);
      ACE_TRY_CHECK;

      CIAO::Server_init (orb.in ());

      if (parse_args (argc, argv) != 0)
        return -1;

      // Get reference to Root POA.
      CORBA::Object_var obj
        = orb->resolve_initial_references ("RootPOA"
                                           ACE_ENV_ARG_PARAMETER);
      ACE_TRY_CHECK;

      PortableServer::POA_var poa
        = PortableServer::POA::_narrow (obj.in ()
                                        ACE_ENV_ARG_PARAMETER);
      ACE_TRY_CHECK;

      // Activate POA manager
      PortableServer::POAManager_var mgr
        = poa->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
      ACE_TRY_CHECK;

      mgr->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
      ACE_TRY_CHECK;

      CIAO::ComponentServer_Impl *comserv_servant;

      CIAO::Static_Configurator configurator;
      int containers_table_size =
        sizeof (containers_table_)/sizeof(CIAO::Static_Config::ContainerAttributes);
      int homes_table_size =
        sizeof (homes_table_)/sizeof(CIAO::Static_Config::HomeAttributes);
      int components_table_size =
        sizeof (components_table_)/sizeof(CIAO::Static_Config::ComponentAttributes);
      int component_registrations_table_size =
        sizeof (component_registrations_table_)/sizeof(CIAO::Assembly_Placement::componentinstantiation::Register_Info);
      int connections_table_size =
        sizeof (connections_table_)/sizeof(CIAO::Static_Config::ConnectionAttributes);
      int resolvers_table_size =
        sizeof (resolvers_table_)/sizeof(CIAO::Static_Config::ResolveInfoAttributes);

      CIAO::HOMECREATOR_FUNCPTR_MAP home_creator_fptr_map;
      CIAO::HOMESERVANTCREATOR_FUNCPTR_MAP homesvnt_creator_fptr_map;
      CIAO::Static_Config_EntryPoints_Maps maps;
      maps.home_creator_funcptr_map_ = &home_creator_fptr_map;
      maps.home_servant_creator_funcptr_map_ = &homesvnt_creator_fptr_map;

      int i=0;
      for (i=0; i<homes_table_size; ++i)
        {
          home_creator_fptr_map.bind (homes_table_[i].executor_entrypt_,
                                      homes_table_[i].executor_fptr_);

          homesvnt_creator_fptr_map.bind (homes_table_[i].servant_entrypt_,
                                          homes_table_[i].servant_fptr_);
        }

      ACE_NEW_RETURN (comserv_servant,
                      CIAO::ComponentServer_Impl (orb.in (),
                                                  poa.in (),
                                                  1,
                                                  &maps),
                      -1);

      PortableServer::ServantBase_var safe_servant (comserv_servant);

      Components::ConfigValues configs;

      comserv_servant->init (configs
                             ACE_ENV_ARG_PARAMETER);
      ACE_TRY_CHECK;

      // Configuring ComponentServer.
      PortableServer::ObjectId_var cs_oid
        = poa->activate_object (comserv_servant
                                ACE_ENV_ARG_PARAMETER);
      ACE_TRY_CHECK;

      obj = poa->id_to_reference (cs_oid.in ()
                                  ACE_ENV_ARG_PARAMETER);
      ACE_TRY_CHECK;

      Components::Deployment::ComponentServer_var comserv_obj =
        Components::Deployment::ComponentServer::_narrow (obj.in ()
                                                          ACE_ENV_ARG_PARAMETER);
      ACE_TRY_CHECK;

      if (CORBA::is_nil (comserv_obj.in ()))
        ACE_ERROR_RETURN ((LM_ERROR, "Unable to activate ComponentServer object\n"), -1);
 

      Components::Deployment::ServerActivator_var activator;
      Components::ConfigValues_var config = new Components::ConfigValues;

      comserv_servant->set_objref (activator.in (),
                                   config,
                                   comserv_obj.in ()
                                   ACE_ENV_ARG_PARAMETER);
      ACE_TRY_CHECK;

configurator.configure (orb.in (),
                              comserv_obj.in (),
                              containers_table_,
                              containers_table_size,
                              homes_table_,
                              homes_table_size,
                              components_table_,
                              components_table_size,
                              component_registrations_table_,
                              component_registrations_table_size,
                              connections_table_,
                              connections_table_size,
                              resolvers_table_,
                              resolvers_table_size);

      CORBA::String_var str = orb->object_to_string (comserv_obj.in ()
                                                     ACE_ENV_ARG_PARAMETER);

      CIAO::Utility::write_IOR (ior_file_name_, str.in ());
      ACE_DEBUG ((LM_INFO, "ComponentServer IOR: %s\n", str.in ()));

      ACE_DEBUG ((LM_DEBUG,
                  "Running ComponentServer...\n"));

      // Run the main event loop for the ORB.
      orb->run (ACE_ENV_SINGLE_ARG_PARAMETER);
      ACE_TRY_CHECK
    }
  ACE_CATCHANY
    {
      ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
                           "server::main \n");
      return 1;
    }
  ACE_ENDTRY;

  return 0;
}

Static_CCM_App.mpc
project(Static_CCM_App) : ciao_server, ciao_client, rtcorba, rtportableserver, iortable, acexml {
includes += $(ACE_ROOT)/TAO/CIAO/tools/Assembly_Deployer
includes += $(ACE_ROOT)/TAO/CIAO/tools/static_configurator
libs += CIAO_XML_Helpers Static_Configurator
after += CIAO_XML_Helpers Static_Configurator
 

libs += EC_exec
after += EC_exec
libs += EC_svnt
after += EC_svnt
libs += BMDevice_exec
after += BMDevice_exec
libs += BMDevice_svnt
after += BMDevice_svnt
libs += BMClosedED_exec
after += BMClosedED_exec
libs += BMClosedED_svnt
after += BMClosedED_svnt
libs += BMDisplay_exec
after += BMDisplay_exec
libs += BMDisplay_svnt
after += BMDisplay_svnt
   Source_Files {
       Static_CCM_App.cpp
    }

    IDL_Files {
    }
}

Modified Static_CCM_App.cpp

(Highlighted text is manually added to the generated .cpp file)

#include "ComponentServer_Impl.h"
#include "CIAO_ServersC.h"
#include "Server_init.h"
#include "Static_Configurator.h"
#include "ace/SString.h"
#include "ace/Get_Opt.h"

#include "Static_Assembly_Config.h"

char *ior_file_name_ = "comp_serv.ior";
int rate = 2;

int
parse_args (int argc, char *argv[])
{
  ACE_Get_Opt get_opts (argc, argv, "k:o:");
  int c;

  while ((c = get_opts ()) != -1)
    switch (c)
      {
      case 'o':  // get the file name to write to
       ior_file_name_ = get_opts.opt_arg ();
      break;

      case '?':  // display help for use of the server.
      default:
        ACE_ERROR_RETURN ((LM_ERROR,
                           "usage:  %s\n"
                           "-o <ior_output_file>\n"
                           "\n",
                           argv [0]),
                          -1);
      }

  return 0;
}
 

int
main (int argc, char *argv[])
{
  ACE_TRY_NEW_ENV
    {
      // Initialize orb
      CORBA::ORB_var orb = CORBA::ORB_init (argc,
                                            argv,
                                            0
                                            ACE_ENV_ARG_PARAMETER);
      ACE_TRY_CHECK;

      CIAO::Server_init (orb.in ());

      if (parse_args (argc, argv) != 0)
        return -1;

      // Get reference to Root POA.
      CORBA::Object_var obj
        = orb->resolve_initial_references ("RootPOA"
                                           ACE_ENV_ARG_PARAMETER);
      ACE_TRY_CHECK;

      PortableServer::POA_var poa
        = PortableServer::POA::_narrow (obj.in ()
                                        ACE_ENV_ARG_PARAMETER);
      ACE_TRY_CHECK;

      // Activate POA manager
      PortableServer::POAManager_var mgr
        = poa->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
      ACE_TRY_CHECK;

      mgr->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
      ACE_TRY_CHECK;

      CIAO::ComponentServer_Impl *comserv_servant;

      CIAO::Static_Configurator configurator;
      int containers_table_size =
        sizeof (containers_table_)/sizeof(CIAO::Static_Config::ContainerAttributes);
      int homes_table_size =
        sizeof (homes_table_)/sizeof(CIAO::Static_Config::HomeAttributes);
      int components_table_size =
        sizeof (components_table_)/sizeof(CIAO::Static_Config::ComponentAttributes);
      int component_registrations_table_size =
        sizeof (component_registrations_table_)/sizeof(CIAO::Assembly_Placement::componentinstantiation::Register_Info);
      int connections_table_size =
        sizeof (connections_table_)/sizeof(CIAO::Static_Config::ConnectionAttributes);
      int resolvers_table_size =
        sizeof (resolvers_table_)/sizeof(CIAO::Static_Config::ResolveInfoAttributes);

      CIAO::HOMECREATOR_FUNCPTR_MAP home_creator_fptr_map;
      CIAO::HOMESERVANTCREATOR_FUNCPTR_MAP homesvnt_creator_fptr_map;
      CIAO::Static_Config_EntryPoints_Maps maps;
      maps.home_creator_funcptr_map_ = &home_creator_fptr_map;
      maps.home_servant_creator_funcptr_map_ = &homesvnt_creator_fptr_map;

      int i=0;
      for (i=0; i<homes_table_size; ++i)
        {
          home_creator_fptr_map.bind (homes_table_[i].executor_entrypt_,
                                      homes_table_[i].executor_fptr_);

          homesvnt_creator_fptr_map.bind (homes_table_[i].servant_entrypt_,
                                          homes_table_[i].servant_fptr_);
        }

      ACE_NEW_RETURN (comserv_servant,
                      CIAO::ComponentServer_Impl (orb.in (),
                                                  poa.in (),
                                                  1,
                                                  &maps),
                      -1);

      PortableServer::ServantBase_var safe_servant (comserv_servant);

      Components::ConfigValues configs;

      comserv_servant->init (configs
                             ACE_ENV_ARG_PARAMETER);
      ACE_TRY_CHECK;

      // Configuring ComponentServer.
      PortableServer::ObjectId_var cs_oid
        = poa->activate_object (comserv_servant
                                ACE_ENV_ARG_PARAMETER);
      ACE_TRY_CHECK;

      obj = poa->id_to_reference (cs_oid.in ()
                                  ACE_ENV_ARG_PARAMETER);
      ACE_TRY_CHECK;

      Components::Deployment::ComponentServer_var comserv_obj =
        Components::Deployment::ComponentServer::_narrow (obj.in ()
                                                          ACE_ENV_ARG_PARAMETER);
      ACE_TRY_CHECK;

      if (CORBA::is_nil (comserv_obj.in ()))
        ACE_ERROR_RETURN ((LM_ERROR, "Unable to activate ComponentServer object\n"), -1);
 

      Components::Deployment::ServerActivator_var activator;
      Components::ConfigValues_var config = new Components::ConfigValues;

      comserv_servant->set_objref (activator.in (),
                                   config,
                                   comserv_obj.in ()
                                   ACE_ENV_ARG_PARAMETER);
      ACE_TRY_CHECK;

      configurator.configure (orb.in (),
                              comserv_obj.in (),
                              containers_table_,
                              containers_table_size,
                              homes_table_,
                              homes_table_size,
                              components_table_,
                              components_table_size,
                              component_registrations_table_,
                              component_registrations_table_size,
                              connections_table_,
                              connections_table_size,
                              resolvers_table_,
                              resolvers_table_size);

      CORBA::String_var str = orb->object_to_string (comserv_obj.in ()
                                                     ACE_ENV_ARG_PARAMETER);

      CIAO::Utility::write_IOR (ior_file_name_, str.in ());
      ACE_DEBUG ((LM_INFO, "ComponentServer IOR: %s\n", str.in ()));

      ACE_DEBUG ((LM_DEBUG,
                  "Running ComponentServer...\n"));

      CORBA::Object_var pulser_obj
        = orb->string_to_object ("file://ec.ior"
                                 ACE_ENV_ARG_PARAMETER);
      ACE_TRY_CHECK;

      BasicSP::EC_var pulser
        = BasicSP::EC::_narrow (pulser_obj.in ()
                                ACE_ENV_ARG_PARAMETER);
      ACE_TRY_CHECK;

      if (CORBA::is_nil (pulser.in ()))
        ACE_ERROR_RETURN ((LM_ERROR, "Unable to acquire 'EC' objref\n"), -1);

      pulser->hertz (rate
                     ACE_ENV_ARG_PARAMETER);
      ACE_TRY_CHECK;

      ACE_DEBUG ((LM_DEBUG, "Start up the Event services\n"));

      pulser->start (ACE_ENV_SINGLE_ARG_PARAMETER);
      ACE_TRY_CHECK;

      // Run the main event loop for the ORB.
      orb->run (ACE_ENV_SINGLE_ARG_PARAMETER);
      ACE_TRY_CHECK
    }
  ACE_CATCHANY
    {
      ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
                           "server::main \n");
      return 1;
    }
  ACE_ENDTRY;

  return 0;
}

Modified Static_CCM_App.mpc

(Highlighted text is manually added to the generated .cpp file)

project(Static_CCM_App) : ciao_server, ciao_client, rtcorba, rtportableserver, iortable, acexml {
includes += $(ACE_ROOT)/TAO/CIAO/tools/Assembly_Deployer
includes += $(ACE_ROOT)/TAO/CIAO/tools/static_configurator
libs += CIAO_XML_Helpers Static_Configurator
after += CIAO_XML_Helpers Static_Configurator

libs += BasicSP_stub BasicSP_svnt
after += BasicSP_stub BasicSP_svnt
libs += EC_exec
after += EC_exec
libs += EC_svnt EC_stub
after += EC_svnt EC_stub
libs += BMDevice_exec
after += BMDevice_exec
libs += BMDevice_svnt BMDevice_stub
after += BMDevice_svnt BMDevice_stub
libs += BMClosedED_exec
after += BMClosedED_exec
libs += BMClosedED_svnt BMClosedED_stub
after += BMClosedED_svnt BMClosedED_stub
libs += BMDisplay_exec
after += BMDisplay_exec
libs += BMDisplay_svnt BMDisplay_stub
after += BMDisplay_svnt BMDisplay_stub

   Source_Files {
       Static_CCM_App.cpp
    }

    IDL_Files {
    }
}