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 autolearn=unavailable autolearn_force=no version=3.4.4 Path: eternal-september.org!reader01.eternal-september.org!reader02.eternal-september.org!news.eternal-september.org!mx02.eternal-september.org!feeder.eternal-september.org!aioe.org!.POSTED!not-for-mail From: "Dmitry A. Kazakov" Newsgroups: comp.lang.ada Subject: Re: Building an encapsulated library that uses GNAT sockets under Windows Date: Wed, 27 Apr 2016 10:27:21 +0200 Organization: Aioe.org NNTP Server Message-ID: References: <58a4942a-452a-4f32-b39b-f8f1fdbfe9fb@googlegroups.com> <68353b5d-94dc-4604-bdb1-00b48396ec1b@googlegroups.com> <33e880a1-df5f-450c-89e0-9b1d1a95e12f@googlegroups.com> NNTP-Posting-Host: G7MXAklp0OAVRSdfcmpxRQ.user.gioia.aioe.org Mime-Version: 1.0 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Complaints-To: abuse@aioe.org User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.0 X-Notice: Filtered by postfilter v. 0.8.2 X-Mozilla-News-Host: news://news.aioe.org Xref: news.eternal-september.org comp.lang.ada:30301 Date: 2016-04-27T10:27:21+02:00 List-Id: On 26/04/2016 23:23, Simon Wright wrote: > "Dmitry A. Kazakov" writes: > >> On 2016-04-23 23:16, Simon Wright wrote: >>> "Dmitry A. Kazakov" writes: >>> >>>> Can [gprlib] build a static equivalent too? I.e. a static library >>>> containing a closure of all referenced objects plus initialization >>>> code. >>> >>> I'm not sure it's relevant, but I posted a bug[1] on gnatmake & >>> static standalone libraries; I sent AdaCore a similar report on >>> gprbuild, no reply. >>> >>> The problem was, for a static SAL, the using Ada main program needs >>> to see all the ALIs for it to be sure to call in all the dylibs >>> required by the library; so if e.g. libgnarl was only called by >>> non-interface units it would get linked but not elaborated. >>> >>> I wanted to use SALs because they automatically populate the include >>> directory with relevant source. >> >> How do you build a static stand-alone library? In my case gprbuild >> wants it dynamic. > > I see what you mean, I've been calling it the wrong thing all these > years. > > If you provide a Library_Interface and you're building a dynamic > library, gprbuild populates the include Library_Src_Dir directory with > the library interface units and builds a dynamic library with > auto-initialization. > > If you provide a Library_Interface and you're building a static library, > gprbuild uses the same rule to populate the include directory; but this > mey be wrong if the non-visible units require elaboration (e.g. they > call in the tasking runtime). > > The patch I provided meant that if you provided a Library_Interface for > a static library, the include directory would be populated with all the > units regardless of whether they were actually listed; I now see that > using Interfaces and naming all the source files achieves the same > effect! so no need for a patch (but maybe a blog posting?) > > For the BCs this would mean > > case Library_Type is > when "relocatable" => > for Library_Src_Dir use "./include"; > for Library_Interface use Source_Units; > when "static" => > for Library_Src_Dir use "./include"; > for Interfaces use Sources; > end case; > > where I already have > > Source_Units := > ( > "BC.Containers.Bags.Bounded", > "BC.Containers.Bags.Dynamic", > ... > > and > > Sources := > ( > "bc-containers-bags-bounded.adb", > "bc-containers-bags-bounded.ads", > "bc-containers-bags-dynamic.adb", > "bc-containers-bags-dynamic.ads", > ... It is still deeply confusing to me. Does it mean that Interfaces must be the list of all source file from all projects? The case is: with "A.gpr"; with "B.gpr"; ... with "Z.gpr"; library project Foo is for Source_Files use (); -- No own sources, to stress the point for Library_Kind use "static"; for Library_Standalone use "encapsulated"; -- ?? for Library_Auto_Init use "true"; -- ?? for Library_Interface use (); for Interface use (); end Foo; > I don't really like the idea of using Library_Interface (what units > should be visible) to indicate that auto-initialization is required; > especially because there are already Library_Standalone and > Library_Auto_Init. Perhaps they weren't available at the time. > >> Another question is regarding the library interface. gprbuild rejects >> interface units from other projects. But usually the library is just a >> combination of many projects some of which providing interface units. > > You would only need to know about the interface units of other libraries > if you were going to call them yourself directly. But there is no other libraries after libFoo.a is built. The whole purpose of the exercise to have libFoo a closure containing all static libraries it depends on and GNAT RTL too. -- Regards, Dmitry A. Kazakov http://www.dmitry-kazakov.de