From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,XPRIO autolearn=ham autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,a45dbca8d12d7200,start X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 2004-01-27 14:02:33 PST Path: archiver1.google.com!news2.google.com!fu-berlin.de!uni-berlin.de!69.73.18.83!not-for-mail From: "Marc A. Criley" Newsgroups: comp.lang.ada Subject: Binding and linking non-withed packages into an executable Date: Tue, 27 Jan 2004 15:56:37 -0600 Message-ID: NNTP-Posting-Host: 69.73.18.83 X-Trace: news.uni-berlin.de 1075240952 25512016 69.73.18.83 ([218515]) X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2800.1158 X-MIMEOLE: Produced By Microsoft MimeOLE V6.00.2800.1165 Xref: archiver1.google.com comp.lang.ada:4942 Date: 2004-01-27T15:56:37-06:00 List-Id: (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'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, 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. Thanks for any help. Marc A. Criley