comp.lang.ada
 help / color / mirror / Atom feed
From: Robert A Duff <bobduff@shell01.TheWorld.com>
Subject: Re: Binding and linking non-withed packages into an executable
Date: 27 Jan 2004 19:44:13 -0500
Date: 2004-01-27T19:44:13-05:00	[thread overview]
Message-ID: <wcc3ca0lx5u.fsf@shell01.TheWorld.com> (raw)
In-Reply-To: bv6n5n$oai2g$1@ID-218515.news.uni-berlin.de

"Marc A. Criley" <mcNOSPAM@mckae.com> writes:

> (I vaguely recall this topic previously being discussed in some forum
> somewhere but have been unable to locate it.)
> 
> I want to be able to have a compiled package bound and linked in with an Ada
> executable, despite there being no "with" of that package. The reason is
> that there are "access procedure variables" in the main set of code, which
> this peripheral package can set to its own procedures during the elaboration
> of the package. This is bound to be compiler-specific, so I'm using GNAT
> 3.15p on Linux.
> 
> Here's a toy illustration:
> 
> -- A package with a "callback variable"
> package Back_Caller is
>    type Callback is access procedure;
>    Cb : Callback;
> end Back_Caller;
> 
> -- The main program that invokes that callback variable.
> with Back_Caller;
> procedure Cb_Main is
> begin
>   Back_Caller.Cb.all;
> end Cb_Main;
> 
> -- The peripheral package that supplies the callback...
> package CB_Provider is
>    procedure My_Callback;
> end CB_Provider;
> 
> -- ...that the callback variable is set to during pkg elaboration.
> with Text_IO; use Text_IO;
> with Back_Caller;
> package body CB_Provider is
>    procedure My_Callback is
>    begin
>       Put_Line("Invoking callback");
>    end My_Callback;
> begin
>    Back_Caller.CB := My_Callback'access;
> end CB_Provider;
> 
> 
> Invoking gnatmake on Cb_Main compiles just the Back_Caller package and
> Cb_Main procedures, as one would expect. How can I get the CB_Provider
> package bound (so it'll be elaborated) and linked in?

I think you have to say "with CB_Provider;" somewhere in your system.

By the way, there seems to be no need to export My_Callback.  You could
declare the package spec as:
   package CB_Provider is
      pragma Elaborate_Body;
   end CB_Provider;

> I've looked at the various gnatbind options, but they're more geared for "no
> main" or "non-Ada main" situations.
> 
> Obviously I can have a "configuration package" that with's the "peripheral"
> packages and is withed by the main,

I think that's what you need to do.

>... but I'd like to make the inclusion of
> such packages a build, rather than compile, issue. This way new callback
> packages can be brought in or omitted as needed (the actual app is of course
> more sophisticated than the above toy), so no actual software would have to
> change.

Why?  Build scripts are software!

- Bob



  parent reply	other threads:[~2004-01-28  0:44 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-01-27 21:56 Binding and linking non-withed packages into an executable Marc A. Criley
2004-01-27 23:25 ` Stephen Leake
2004-01-28  0:44   ` Ludovic Brenta
2004-01-28  2:55     ` Stephen Leake
2004-01-28  0:44 ` Robert A Duff [this message]
  -- strict thread matches above, loose matches on Subject: below --
2004-02-05 18:53 Lionel.DRAGHI
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox